Merge branch 'master' of ssh://git.samba.org/data/git/samba into regsrv
[tprouty/samba.git] / source3 / lib / interfaces.c
index 48fe2490345ee34315d3d9dbaee6c84db1fca762..4567fe457b83b0cc083aa22006606dc4d513ff37 100644 (file)
@@ -84,8 +84,9 @@
 #include <net/if.h>
 #endif
 
+#define SOCKET_WRAPPER_NOT_REPLACE
 #include "interfaces.h"
-#include "lib/replace/replace.h"
+#include "../replace/replace.h"
 
 /****************************************************************************
  Utility functions.
@@ -140,7 +141,7 @@ bool make_netmask(struct sockaddr_storage *pss_out,
 static void make_bcast_or_net(struct sockaddr_storage *pss_out,
                        const struct sockaddr_storage *pss_in,
                        const struct sockaddr_storage *nmask,
-                       bool make_bcast)
+                       bool make_bcast_p)
 {
        unsigned int i = 0, len = 0;
        char *pmask = NULL;
@@ -162,7 +163,7 @@ static void make_bcast_or_net(struct sockaddr_storage *pss_out,
        }
 
        for (i = 0; i < len; i++, p++, pmask++) {
-               if (make_bcast) {
+               if (make_bcast_p) {
                        *p = (*p & *pmask) | (*pmask ^ 0xff);
                } else {
                        /* make_net */
@@ -190,7 +191,6 @@ void make_net(struct sockaddr_storage *pss_out,
  Also gets IPv6 interfaces.
 ****************************************************************************/
 
-#if HAVE_IFACE_GETIFADDRS
 /****************************************************************************
  Get the netmask address for a local interface.
 ****************************************************************************/
@@ -236,19 +236,9 @@ static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
                memcpy(&ifaces[total].netmask, ifptr->ifa_netmask, copy_size);
 
                if (ifaces[total].flags & (IFF_BROADCAST|IFF_LOOPBACK)) {
-                       if (ifptr->ifa_broadaddr) {
-                               memcpy(&ifaces[total].bcast,
-                                       ifptr->ifa_broadaddr,
-                                       copy_size);
-                       } else {
-                               /* For some reason ifptr->ifa_broadaddr
-                                * is null. Make one from ifa_addr and
-                                * ifa_netmask.
-                                */
-                               make_bcast(&ifaces[total].bcast,
-                                       &ifaces[total].ip,
-                                       &ifaces[total].netmask);
-                       }
+                       make_bcast(&ifaces[total].bcast,
+                               &ifaces[total].ip,
+                               &ifaces[total].netmask);
                } else if ((ifaces[total].flags & IFF_POINTOPOINT) &&
                               ifptr->ifa_dstaddr ) {
                        memcpy(&ifaces[total].bcast,
@@ -268,339 +258,6 @@ static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
        return total;
 }
 
-#define _FOUND_IFACE_ANY
-#endif /* HAVE_IFACE_GETIFADDRS */
-#if HAVE_IFACE_IFCONF
-
-/* this works for Linux 2.2, Solaris 2.5, SunOS4, HPUX 10.20, OSF1
-   V4.0, Ultrix 4.4, SCO Unix 3.2, IRIX 6.4 and FreeBSD 3.2.
-
-   It probably also works on any BSD style system.  */
-
-/****************************************************************************
- Get the netmask address for a local interface.
-****************************************************************************/
-
-static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
-{
-       struct ifconf ifc;
-       char buff[8192];
-       int fd, i, n;
-       struct ifreq *ifr=NULL;
-       int total = 0;
-
-       if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-               return -1;
-       }
-
-       ifc.ifc_len = sizeof(buff);
-       ifc.ifc_buf = buff;
-
-       if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) {
-               close(fd);
-               return -1;
-       }
-
-       ifr = ifc.ifc_req;
-
-       n = ifc.ifc_len / sizeof(struct ifreq);
-
-       /* Loop through interfaces, looking for given IP address */
-       for (i=n-1;i>=0 && total < max_interfaces;i--) {
-
-               memset(&ifaces[total], '\0', sizeof(ifaces[total]));
-
-               /* Check the interface is up. */
-               if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) != 0) {
-                       continue;
-               }
-
-               ifaces[total].flags = ifr[i].ifr_flags;
-
-               if (!(ifaces[total].flags & IFF_UP)) {
-                       continue;
-               }
-
-               if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != 0) {
-                       continue;
-               }
-
-               strlcpy(ifaces[total].name, ifr[i].ifr_name,
-                       sizeof(ifaces[total].name));
-
-               memcpy(&ifaces[total].ip, &ifr[i].ifr_addr,
-                               sizeof(struct sockaddr_in));
-
-               if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != 0) {
-                       continue;
-               }
-
-               memcpy(&ifaces[total].netmask, &ifr[i].ifr_netmask,
-                               sizeof(struct sockaddr_in));
-
-               if (ifaces[total].flags & IFF_BROADCAST) {
-                       if (ioctl(fd, SIOCGIFBRDADDR, &ifr[i]) != 0) {
-                               continue;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifr[i].ifr_broadaddr,
-                               sizeof(struct sockaddr_in));
-               } else if (ifaces[total].flags & IFF_POINTOPOINT) {
-                       if (ioctl(fd, SIOCGIFDSTADDR, &ifr[i]) != 0) {
-                               continue;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifr[i].ifr_dstaddr,
-                               sizeof(struct sockaddr_in));
-               } else {
-                       continue;
-               }
-
-               total++;
-       }
-
-       close(fd);
-
-       return total;
-}
-
-#define _FOUND_IFACE_ANY
-#endif /* HAVE_IFACE_IFCONF */
-#ifdef HAVE_IFACE_IFREQ
-
-#ifndef I_STR
-#include <sys/stropts.h>
-#endif
-
-/****************************************************************************
- This should cover most of the streams based systems.
- Thanks to Andrej.Borsenkow@mow.siemens.ru for several ideas in this code.
-****************************************************************************/
-
-static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
-{
-       struct ifreq ifreq;
-       struct strioctl strioctl;
-       char buff[8192];
-       int fd, i, n;
-       struct ifreq *ifr=NULL;
-       int total = 0;
-
-       if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-               return -1;
-       }
-
-       strioctl.ic_cmd = SIOCGIFCONF;
-       strioctl.ic_dp  = buff;
-       strioctl.ic_len = sizeof(buff);
-       if (ioctl(fd, I_STR, &strioctl) < 0) {
-               close(fd);
-               return -1;
-       }
-
-       /* we can ignore the possible sizeof(int) here as the resulting
-          number of interface structures won't change */
-       n = strioctl.ic_len / sizeof(struct ifreq);
-
-       /* we will assume that the kernel returns the length as an int
-           at the start of the buffer if the offered size is a
-           multiple of the structure size plus an int */
-       if (n*sizeof(struct ifreq) + sizeof(int) == strioctl.ic_len) {
-               ifr = (struct ifreq *)(buff + sizeof(int));
-       } else {
-               ifr = (struct ifreq *)buff;
-       }
-
-       /* Loop through interfaces */
-
-       for (i = 0; i<n && total < max_interfaces; i++) {
-
-               memset(&ifaces[total], '\0', sizeof(ifaces[total]));
-
-               ifreq = ifr[i];
-
-               strioctl.ic_cmd = SIOCGIFFLAGS;
-               strioctl.ic_dp  = (char *)&ifreq;
-               strioctl.ic_len = sizeof(struct ifreq);
-               if (ioctl(fd, I_STR, &strioctl) != 0) {
-                       continue;
-               }
-
-               ifaces[total].flags = ifreq.ifr_flags;
-
-               if (!(ifaces[total].flags & IFF_UP)) {
-                       continue;
-               }
-
-               strioctl.ic_cmd = SIOCGIFADDR;
-               strioctl.ic_dp  = (char *)&ifreq;
-               strioctl.ic_len = sizeof(struct ifreq);
-               if (ioctl(fd, I_STR, &strioctl) != 0) {
-                       continue;
-               }
-
-               strlcpy(ifaces[total].name,
-                               ifreq.ifr_name,
-                               sizeof(ifaces[total].name));
-
-               memcpy(&ifaces[total].ip, &ifreq.ifr_addr,
-                               sizeof(struct sockaddr_in));
-
-               strioctl.ic_cmd = SIOCGIFNETMASK;
-               strioctl.ic_dp  = (char *)&ifreq;
-               strioctl.ic_len = sizeof(struct ifreq);
-               if (ioctl(fd, I_STR, &strioctl) != 0) {
-                       continue;
-               }
-
-               memcpy(&ifaces[total].netmask, &ifreq.ifr_addr,
-                               sizeof(struct sockaddr_in));
-
-               if (ifaces[total].flags & IFF_BROADCAST) {
-                       strioctl.ic_cmd = SIOCGIFBRDADDR;
-                       strioctl.ic_dp  = (char *)&ifreq;
-                       strioctl.ic_len = sizeof(struct ifreq);
-                       if (ioctl(fd, I_STR, &strioctl) != 0) {
-                               continue;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifreq.ifr_broadaddr,
-                               sizeof(struct sockaddr_in));
-               } else if (ifaces[total].flags & IFF_POINTOPOINT) {
-                       strioctl.ic_cmd = SIOCGIFDSTADDR;
-                       strioctl.ic_dp  = (char *)&ifreq;
-                       strioctl.ic_len = sizeof(struct ifreq);
-                       if (ioctl(fd, I_STR, &strioctl) != 0) {
-                               continue;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifreq.ifr_dstaddr,
-                               sizeof(struct sockaddr_in));
-               } else {
-                       continue;
-               }
-
-               total++;
-       }
-
-       close(fd);
-
-       return total;
-}
-
-#define _FOUND_IFACE_ANY
-#endif /* HAVE_IFACE_IFREQ */
-#ifdef HAVE_IFACE_AIX
-
-/****************************************************************************
- This one is for AIX (tested on 4.2).
-****************************************************************************/
-
-static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
-{
-       char buff[8192];
-       int fd, i;
-       struct ifconf ifc;
-       struct ifreq *ifr=NULL;
-       int total = 0;
-
-       if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-               return -1;
-       }
-
-
-       ifc.ifc_len = sizeof(buff);
-       ifc.ifc_buf = buff;
-
-       if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) {
-               close(fd);
-               return -1;
-       }
-
-       ifr = ifc.ifc_req;
-
-       /* Loop through interfaces */
-       i = ifc.ifc_len;
-
-       while (i > 0 && total < max_interfaces) {
-               uint_t inc;
-
-               memset(&ifaces[total], '\0', sizeof(ifaces[total]));
-
-               inc = ifr->ifr_addr.sa_len;
-
-               if (ioctl(fd, SIOCGIFFLAGS, ifr) != 0) {
-                       goto next;
-               }
-
-               ifaces[total].flags = ifr->ifr_flags;
-
-               if (!(ifaces[total].flags & IFF_UP)) {
-                       goto next;
-               }
-
-               if (ioctl(fd, SIOCGIFADDR, ifr) != 0) {
-                       goto next;
-               }
-
-               memcpy(&ifaces[total].ip, &ifr->ifr_addr,
-                               sizeof(struct sockaddr_in));
-
-               strlcpy(ifaces[total].name, ifr->ifr_name,
-                       sizeof(ifaces[total].name));
-
-               if (ioctl(fd, SIOCGIFNETMASK, ifr) != 0) {
-                       goto next;
-               }
-
-               memcpy(&ifaces[total].netmask, &ifr->ifr_addr,
-                               sizeof(struct sockaddr_in));
-
-               if (ifaces[total].flags & IFF_BROADCAST) {
-                       if (ioctl(fd, SIOCGIFBRDADDR, ifr) != 0) {
-                               goto next;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifr->ifr_broadaddr,
-                               sizeof(struct sockaddr_in));
-               } else if (ifaces[total].flags & IFF_POINTOPOINT) {
-                       if (ioctl(fd, SIOCGIFDSTADDR, ifr) != 0) {
-                               goto next;
-                       }
-                       memcpy(&ifaces[total].bcast, &ifr->ifr_dstaddr,
-                               sizeof(struct sockaddr_in));
-               } else {
-                       goto next;
-               }
-
-
-               total++;
-
-       next:
-               /*
-                * Patch from Archie Cobbs (archie@whistle.com).  The
-                * addresses in the SIOCGIFCONF interface list have a
-                * minimum size. Usually this doesn't matter, but if
-                * your machine has tunnel interfaces, etc. that have
-                * a zero length "link address", this does matter.  */
-
-               if (inc < sizeof(ifr->ifr_addr))
-                       inc = sizeof(ifr->ifr_addr);
-               inc += IFNAMSIZ;
-
-               ifr = (struct ifreq*) (((char*) ifr) + inc);
-               i -= inc;
-       }
-
-       close(fd);
-       return total;
-}
-
-#define _FOUND_IFACE_ANY
-#endif /* HAVE_IFACE_AIX */
-#ifndef _FOUND_IFACE_ANY
-static int _get_interfaces(struct iface_struct *ifaces, int max_interfaces)
-{
-       return -1;
-}
-#endif
-
-
 static int iface_comp(struct iface_struct *i1, struct iface_struct *i2)
 {
        int r;
@@ -692,44 +349,3 @@ int get_interfaces(struct iface_struct *ifaces, int max_interfaces)
        return total;
 }
 
-
-#ifdef AUTOCONF_TEST
-/* this is the autoconf driver to test get_interfaces() */
-
- int main()
-{
-       struct iface_struct ifaces[MAX_INTERFACES];
-       int total = get_interfaces(ifaces, MAX_INTERFACES);
-       int i;
-
-       printf("got %d interfaces:\n", total);
-       if (total <= 0) {
-               exit(1);
-       }
-
-       for (i=0;i<total;i++) {
-               char addr[INET6_ADDRSTRLEN];
-               int ret;
-               printf("%-10s ", ifaces[i].name);
-               addr[0] = '\0';
-               ret = getnameinfo((struct sockaddr *)&ifaces[i].ip,
-                               sizeof(ifaces[i].ip),
-                               addr, sizeof(addr),
-                               NULL, 0, NI_NUMERICHOST);
-               printf("IP=%s ", addr);
-               addr[0] = '\0';
-               ret = getnameinfo((struct sockaddr *)&ifaces[i].netmask,
-                               sizeof(ifaces[i].netmask),
-                               addr, sizeof(addr),
-                               NULL, 0, NI_NUMERICHOST);
-               printf("NETMASK=%s ", addr);
-               addr[0] = '\0';
-               ret = getnameinfo((struct sockaddr *)&ifaces[i].bcast,
-                               sizeof(ifaces[i].bcast),
-                               addr, sizeof(addr),
-                               NULL, 0, NI_NUMERICHOST);
-               printf("BCAST=%s\n", addr);
-       }
-       return 0;
-}
-#endif