OpenBSD: fix lookup of network interfaces
[openafs.git] / src / rx / rx_getaddr.c
index 57740e9..928ae17 100644 (file)
@@ -10,8 +10,6 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #ifndef KERNEL
 #ifndef AFS_NT40_ENV
@@ -45,6 +43,11 @@ RCSID
 
 #define NIFS           512
 
+#if defined(AFS_USR_DFBSD_ENV)
+#include <net/if.h>
+#include <sys/sockio.h>
+#endif
+
 #ifdef KERNEL
 /* only used for generating random noise */
 
@@ -139,6 +142,32 @@ rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
 ** the buffer has to be passed in by the caller
 */
 #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+#if defined(AFS_OBSD42_ENV)
+void
+ifm_fixversion(char *buffer, size_t *size) {
+    struct if_msghdr *ifm;
+    char *b = buffer;
+    char *s, *t;
+
+    if ((t = malloc(*size)) != NULL) {
+       memcpy(t, buffer, *size);
+
+       for (s = t; s < t + *size; s += ifm->ifm_msglen) {
+           ifm = (struct if_msghdr *)s;
+
+           if (ifm->ifm_version == RTM_VERSION) {
+               memcpy(b, ifm, ifm->ifm_msglen);
+               b += ifm->ifm_msglen;
+           }
+       }
+
+       free(t);
+
+       *size = b - buffer;
+    }
+}
+#endif
+
 int
 rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks)
 {
@@ -165,6 +194,9 @@ rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks)
        free(buf);
        return 0;
     }
+#if defined(AFS_OBSD42_ENV)
+    ifm_fixversion(buf, &needed);
+#endif
     lim = buf + needed;
     next = buf;
     while (next < lim) {
@@ -223,8 +255,8 @@ rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks)
 }
 
 int
-rxi_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
-                     afs_uint32 mtuBuffer[], int maxSize)
+rx_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
+                    afs_uint32 mtuBuffer[], int maxSize)
 {
     int s;
 
@@ -251,6 +283,9 @@ rxi_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
        free(buf);
        return 0;
     }
+#if defined(AFS_OBSD42_ENV)
+    ifm_fixversion(buf, &needed);
+#endif
     s = socket(PF_INET, SOCK_DGRAM, 0);
     if (s < 0)
        return 0;
@@ -332,7 +367,7 @@ rx_getAllAddr(afs_uint32 buffer[], int maxSize)
 /* this function returns the total number of interface addresses
 ** the buffer has to be passed in by the caller
 */
-#else
+#else /* UKERNEL indirectly, on DARWIN or XBSD */
 static int
 rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks)
 {
@@ -341,6 +376,7 @@ rx_getAllAddr_internal(afs_uint32 buffer[], int maxSize, int loopbacks)
     struct ifconf ifc;
     struct ifreq ifs[NIFS], *ifr;
     struct sockaddr_in *a;
+    /* can't ever be AFS_DARWIN_ENV or AFS_XBSD_ENV, no? */
 #if    defined(AFS_AIX41_ENV) || defined (AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
     char *cp, *cplim, *cpnext; /* used only for AIX 41 */
 #endif
@@ -422,14 +458,17 @@ rx_getAllAddr(afs_uint32 buffer[], int maxSize)
  * by afsi_SetServerIPRank().
  */
 int
-rxi_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
-                     afs_uint32 mtuBuffer[], int maxSize)
+rx_getAllAddrMaskMtu(afs_uint32 addrBuffer[], afs_uint32 maskBuffer[],
+                     afs_uint32 mtuBuffer[], int maxSize)
 {
-    int s;
-    int i, len, count = 0;
+    int i, count = 0;
+#if defined(AFS_USERSPACE_IP_ADDR)
+    int s, len;
     struct ifconf ifc;
     struct ifreq ifs[NIFS], *ifr;
     struct sockaddr_in *a;
+#endif
+
 #if     defined(AFS_AIX41_ENV) || defined(AFS_USR_AIX_ENV)
     char *cp, *cplim;          /* used only for AIX 41 */
 #endif