$NetBSD: patch-ah,v 1.2 2008/10/25 18:12:34 jmcneill Exp $

--- src/ptlib/unix/socket.cxx.orig	2008-10-01 03:03:56.000000000 -0400
+++ src/ptlib/unix/socket.cxx	2008-10-25 13:26:34.000000000 -0400
@@ -67,6 +67,10 @@
 #include <netinet/if_ether.h>
 #endif
 
+#if defined(P_NETBSD)
+#include <ifaddrs.h>
+#endif
+
 #define ROUNDUP(a) \
         ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
@@ -471,6 +475,12 @@
   PBYTEArray buffer;
   struct ifconf ifConf;
 
+#if defined(P_NETBSD)
+  struct ifaddrs *ifap, *ifa;
+
+  PAssert(getifaddrs(&ifap) == 0, "getifaddrs failed");
+  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+#else
 #ifdef SIOCGIFNUM
   int ifNum;
   PAssert(::ioctl(sock.GetHandle(), SIOCGIFNUM, &ifNum) >= 0, "could not do ioctl for ifNum");
@@ -486,8 +496,14 @@
     ifreq * ifName = ifConf.ifc_req;
 
     while (ifName < ifEndList) {
+#endif
       struct ifreq ifReq;
+#if !defined(P_NETBSD)
       memcpy(&ifReq, ifName, sizeof(ifreq));
+#else
+      memset(&ifReq, 0, sizeof(ifReq));
+      strncpy(ifReq.ifr_name, ifa->ifa_name, sizeof(ifReq.ifr_name) - 1);
+#endif
       
       if (ioctl(sock.GetHandle(), SIOCGIFFLAGS, &ifReq) >= 0) {
         int flags = ifReq.ifr_flags;
@@ -499,14 +515,16 @@
         }
       }
       
-#if defined(P_FREEBSD) || defined(P_OPENBSD) || defined(P_NETBSD) || defined(P_MACOSX) || defined(P_VXWORKS) || defined(P_RTEMS) || defined(P_QNX)
+#if defined(P_FREEBSD) || defined(P_OPENBSD) || defined(P_MACOSX) || defined(P_VXWORKS) || defined(P_RTEMS) || defined(P_QNX)
       // move the ifName pointer along to the next ifreq entry
       ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName));
-#else
+#elif !defined(P_NETBSD)
       ifName++;
 #endif
     }
+#if !defined(P_NETBSD)
   }
+#endif
   
   return PFalse;
 }
@@ -1559,7 +1577,13 @@
   PBYTEArray buffer;
   struct ifconf ifConf;
   
+#if defined(P_NETBSD)
+  struct ifaddrs *ifap, *ifa;
 
+  PAssert(getifaddrs(&ifap) == 0, "getifaddrs failed");
+
+  for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+#else
   // HERE
 #if defined(SIOCGIFNUM)
   int ifNum;
@@ -1575,9 +1599,14 @@
     void * ifEndList = (char *)ifConf.ifc_req + ifConf.ifc_len;
     ifreq * ifName = ifConf.ifc_req;
     while (ifName < ifEndList) {
-
+#endif
       struct ifreq ifReq;
+#if !defined(P_NETBSD)
       memcpy(&ifReq, ifName, sizeof(ifreq));
+#else
+      memset(&ifReq, 0, sizeof(ifReq));
+      strncpy(ifReq.ifr_name, ifa->ifa_name, sizeof(ifReq.ifr_name) - 1);
+#endif
 
       if (ioctl(sock.GetHandle(), SIOCGIFFLAGS, &ifReq) >= 0) {
         int flags = ifReq.ifr_flags;
@@ -1593,13 +1622,25 @@
           }
 #endif
 
+#if !defined(P_NETBSD)
           memcpy(&ifReq, ifName, sizeof(ifreq));
+#else
+          memset(&ifReq, 0, sizeof(ifReq));
+          strncpy(ifReq.ifr_name, ifa->ifa_name, sizeof(ifReq.ifr_name) - 1);
+#endif
+
           if (ioctl(sock.GetHandle(), SIOCGIFADDR, &ifReq) >= 0) {
 
             sockaddr_in * sin = (sockaddr_in *)&ifReq.ifr_addr;
             PIPSocket::Address addr = sin->sin_addr;
 
+#if !defined(P_NETBSD)
             memcpy(&ifReq, ifName, sizeof(ifreq));
+#else
+            memset(&ifReq, 0, sizeof(ifReq));
+            strncpy(ifReq.ifr_name, ifa->ifa_name, sizeof(ifReq.ifr_name) - 1);
+#endif
+
             if (ioctl(sock.GetHandle(), SIOCGIFNETMASK, &ifReq) >= 0) {
               PIPSocket::Address mask = 
 #ifndef P_BEOS
@@ -1637,15 +1678,17 @@
         }
       }
 
-#if defined(P_FREEBSD) || defined(P_OPENBSD) || defined(P_NETBSD) || defined(P_MACOSX) || defined(P_VXWORKS) || defined(P_RTEMS) || defined(P_QNX)
+#if defined(P_FREEBSD) || defined(P_OPENBSD) || defined(P_MACOSX) || defined(P_VXWORKS) || defined(P_RTEMS) || defined(P_QNX)
       // move the ifName pointer along to the next ifreq entry
       ifName = (struct ifreq *)((char *)ifName + _SIZEOF_ADDR_IFREQ(*ifName));
-#else
+#elif !defined(P_NETBSD)
       ifName++;
 #endif
 
     }
+#if !defined(P_NETBSD)
   }
+#endif
   return PTrue;
 }
 
