[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [patch] netcfg get_all_ifs()



On 06/07/2009, Frans Pop <elendil@planet.nl> wrote:
> On Monday 06 July 2009, Luca Favatella wrote:
>> This patch substitutes Linux-specific code in get_all_ifs() using
>> getifaddrs().
>
> -        if (!strcmp(ibuf, "lo"))        /* ignore the loopback */
> [...]
> +        if (!strncmp(ibuf, "lo", 2))        /* ignore the loopback */
>
> Please do not include random changes that are unrelated to what you
> document in the changelog in the patch. This _does_ change functionality,
> even if in practice it will not make a difference.
>
> The old code would not match on an (unlikely) interface named "loop", the
> new code will.
>
> Cheers,
> FJP

Solved in the attached version 2 of the patch.

Thanks,
Luca Favatella
Index: debian/changelog
===================================================================
--- debian/changelog	(.../trunk/packages/netcfg)	(revisione 59247)
+++ debian/changelog	(.../branches/d-i/kfreebsd/packages/netcfg)	(revisione 59252)
@@ -8,6 +8,7 @@
   * If wireless is disabled, don't build and link wireless related stuff.
   * Disable by default wireless on non-linux architectures.
   * Inverse the logic about building without wireless support (WIRELESS=0).
+  * Substitute Linux-specific code in get_all_ifs() using getifaddrs().
 
   [ Colin Watson ]
   * check_kill_switch is Linux-specific; provide a stub implementation for
Index: netcfg-common.c
===================================================================
--- netcfg-common.c	(.../trunk/packages/netcfg)	(revisione 59247)
+++ netcfg-common.c	(.../branches/d-i/kfreebsd/packages/netcfg)	(revisione 59252)
@@ -45,6 +45,8 @@
 #include <time.h>
 #include <netdb.h>
 
+#include <ifaddrs.h>
+
 /* Set if there is currently a progress bar displayed. */
 int netcfg_progress_displayed = 0;
 
@@ -227,53 +233,24 @@
     return ((ifr.ifr_flags & IFF_UP) ? 1 : 0);
 }
 
-void get_name(char *name, char *p)
-{
-    while (isspace(*p))
-        p++;
-    while (*p) {
-        if (isspace(*p))
-            break;
-        if (*p == ':') {	/* could be an alias */
-            char *dot = p, *dotname = name;
-            *name++ = *p++;
-            while (isdigit(*p))
-                *name++ = *p++;
-            if (*p != ':') {	/* it wasn't, backup */
-                p = dot;
-                name = dotname;
-            }
-            if (*p == '\0')
-                return;
-            p++;
-            break;
-        }
-        *name++ = *p++;
-    }
-    *name++ = '\0';
-    return;
-}
-
 int get_all_ifs (int all, char*** ptr)
 {
-    FILE *ifs = NULL;
-    char ibuf[512], rbuf[512];
+    struct ifaddrs *ifap, *ifa;
+    char ibuf[512];
     char** list = NULL;
     size_t len = 0;
     
-    if ((ifs = fopen("/proc/net/dev", "r")) != NULL) {
-        fgets(ibuf, sizeof(ibuf), ifs); /* eat header */
-        fgets(ibuf, sizeof(ibuf), ifs); /* ditto */
-    }
-    else
+    if (getifaddrs(&ifap) == -1)
         return 0;
 
-    while (fgets(rbuf, sizeof(rbuf), ifs) != NULL) {
-        get_name(ibuf, rbuf);
+    for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+        strncpy(ibuf, ifa->ifa_name, sizeof(ibuf));
         if (!strcmp(ibuf, "lo"))        /* ignore the loopback */
             continue;
+#if defined(__linux__)
         if (!strncmp(ibuf, "sit", 3))        /* ignore tunnel devices */
             continue;
+#endif
 #if defined(WIRELESS)
         if (is_raw_80211(ibuf))
             continue;
@@ -290,7 +267,7 @@
         list = realloc(list, sizeof(char*) * (len + 1));
         list[len] = NULL;
     }
-    fclose (ifs);
+    freeifaddrs(ifap);
     
     *ptr = list;
     

Reply to: