OpenBSD: fix lookup of network interfaces
[openafs.git] / src / rx / rx_getaddr.c
index bcf9add..928ae17 100644 (file)
@@ -142,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)
 {
@@ -168,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) {
@@ -254,6 +283,9 @@ rx_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;
@@ -429,11 +461,14 @@ int
 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