r26468: Match getifaddrs more closely, add trivial test.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 16 Dec 2007 01:49:52 +0000 (02:49 +0100)
committerMichael Adam <obnox@samba.org>
Tue, 19 Feb 2008 20:56:41 +0000 (21:56 +0100)
(cherry picked from commit 92898c043b5a2649a2e423d02bcdaea78ae55737)
(This used to be commit 3f9c0c210022905c7811b2e07b3b655929daf930)

source3/lib/replace/getifaddrs.c
source3/lib/replace/test/testsuite.c

index 3969535a0b86dc03275fd3e37614d3807475e19f..a4f16ddb76913a3d12986e358a163bf271f8a00b 100644 (file)
@@ -112,7 +112,6 @@ int getifaddrs(struct ifaddrs **ifap)
                }
 
                curif->ifa_name = strdup(ifr[i].ifr_name);
-               curif->ifa_flags = ifreq.ifr_flags;
                curif->ifa_addr = sockaddr_dup(&ifr[i].ifr_addr);
                curif->ifa_dstaddr = NULL;
                curif->ifa_data = NULL;
@@ -124,10 +123,7 @@ int getifaddrs(struct ifaddrs **ifap)
                        return -1;
                }  
 
-               if (!(ifr[i].ifr_flags & IFF_UP)) {
-                       freeifaddrs(curif);
-                       continue;
-               }
+               curif->ifa_flags = ifr[i].ifr_flags;
 
                if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != 0) {
                        freeifaddrs(*ifap);
@@ -201,6 +197,13 @@ int getifaddrs(struct ifaddrs **ifap)
        for (i = 0; i<n && total < max_interfaces; i++) {
                ifreq = ifr[i];
   
+               curif = calloc(1, sizeof(struct ifaddrs));
+               if (lastif == NULL) {
+                       *ifap = curif;
+               } else {
+                       lastif->ifa_next = (*ifap);
+               }
+
                strioctl.ic_cmd = SIOCGIFFLAGS;
                strioctl.ic_dp  = (char *)&ifreq;
                strioctl.ic_len = sizeof(struct ifreq);
@@ -208,11 +211,9 @@ int getifaddrs(struct ifaddrs **ifap)
                        freeifaddrs(*ifap);
                        return -1;
                }
-               
-               if (!(ifreq.ifr_flags & IFF_UP)) {
-                       continue;
-               }
 
+               curif->ifa_flags = ifreq.ifr_flags;
+               
                strioctl.ic_cmd = SIOCGIFADDR;
                strioctl.ic_dp  = (char *)&ifreq;
                strioctl.ic_len = sizeof(struct ifreq);
@@ -221,15 +222,7 @@ int getifaddrs(struct ifaddrs **ifap)
                        return -1;
                }
 
-               curif = calloc(1, sizeof(struct ifaddrs));
-               if (lastif == NULL) {
-                       *ifap = curif;
-               } else {
-                       lastif->ifa_next = (*ifap);
-               }
-
                curif->ifa_name = strdup(ifreq.ifr_name);
-               curif->ifa_flags = ifreq.ifr_flags;
                curif->ifa_addr = sockaddr_dup(&ifreq.ifr_addr);
                curif->ifa_dstaddr = NULL;
                curif->ifa_data = NULL;
@@ -310,7 +303,6 @@ int getifaddrs(struct ifaddrs **ifap)
                }
 
                curif->ifa_name = strdup(ifr->ifr_name);
-               curif->ifa_flags = ifr->ifr_flags;
                curif->ifa_addr = sockaddr_dup(&ifr->ifr_addr);
                curif->ifa_dstaddr = NULL;
                curif->ifa_data = NULL;
@@ -322,10 +314,7 @@ int getifaddrs(struct ifaddrs **ifap)
                        return -1;
                }
 
-               if (!(ifr->ifr_flags & IFF_UP)) {
-                       freeaddrinfo(curif);
-                       continue;
-               }
+               curif->ifa_flags = ifr->ifr_flags;
 
                if (ioctl(fd, SIOCGIFNETMASK, ifr) != 0) {
                        freeaddrinfo(*ifap);
index 5b95ae395ce3b19d634c25174d056790148f5ef5..c9f330100555d39bbe205948d4cfea21357a768d 100644 (file)
@@ -856,6 +856,25 @@ static int test_strptime(void)
        return libreplace_test_strptime();
 }
 
+static int test_getifaddrs(void)
+{
+       struct ifaddrs *ifa;
+       int ret;
+
+       printf("test: getifaddrs\n");
+
+       ret = getifaddrs(&ifa);
+       if (ret != 0) {
+               printf("failure: getifaddrs\n");
+               return false;
+       }
+
+       freeifaddrs(ifa);
+
+       printf("success: getifaddrs\n");
+       return true;
+}
+
 struct torture_context;
 bool torture_local_replace(struct torture_context *ctx)
 {
@@ -903,6 +922,7 @@ bool torture_local_replace(struct torture_context *ctx)
        ret &= test_MAX();
        ret &= test_socketpair();
        ret &= test_strptime();
+       ret &= test_getifaddrs();
 
        return ret;
 }