if there are no objections, I will push this one: >From ab21a4a2c5a4b4c382b683a6c45cf554acf74d43 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano <gscriv...@gnu.org> Date: Sun, 1 Aug 2010 22:08:44 +0200 Subject: [PATCH] Under GNU/Linux ifconfig -a includes interfaces without an address
* bootstrap.conf (gnulib_modules): Add module `read-file'. * NEWS: Mention the new change. * ifconfig/system/linux.h (HAVE_SYSTEM_IF_NAMEINDEX): New macro. (system_if_nameindex): Add declaration. * ifconfig/system/linux.c (system_if_nameindex): New function. * ifconfig/if_index.c (if_nameindex) [HAVE_SYSTEM_IF_NAMEINDEX]: Use system_if_nameindex. --- ChangeLog | 17 ++++++++++ NEWS | 8 +++++ bootstrap.conf | 1 + ifconfig/if_index.c | 18 ++++++++--- ifconfig/system/linux.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ ifconfig/system/linux.h | 6 +++- 6 files changed, 123 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 052daee..9c8a355 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2010-08-01 Giuseppe Scrivano <gscriv...@gnu.org> + + Under GNU/Linux ifconfig -a includes interfaces without an address + + * bootstrap.conf (gnulib_modules): Add module `read-file'. + + * NEWS: Mention the new change. + + * ifconfig/system/linux.h (HAVE_SYSTEM_IF_NAMEINDEX): New macro. + (system_if_nameindex): Add declaration. + Include <net/if.> for "struct if_nameindex". + + * ifconfig/system/linux.c (system_if_nameindex): New function. + + * ifconfig/if_index.c (if_nameindex) [HAVE_SYSTEM_IF_NAMEINDEX]: Use + system_if_nameindex. + 2010-07-30 Giuseppe Scrivano <gscriv...@gnu.org> * ifconfig/if_index.c (if_nameindex): Remove local variable `len'. diff --git a/NEWS b/NEWS index 4583586..08f8ac3 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,14 @@ See the end of this file for for license conditions. Please send inetutils bug reports to <bug-inetutils@gnu.org>. +XXX YY, ZZ +Version A.B: + +* ifconfig + +Under GNU/Linux ifconfig -a includes interfaces without an address. + + May 15, 2010 Version 1.8: diff --git a/bootstrap.conf b/bootstrap.conf index bbb5c2e..facab0a 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -53,6 +53,7 @@ minmax obstack poll progname +read-file readline readutmp realloc diff --git a/ifconfig/if_index.c b/ifconfig/if_index.c index 3062bf7..03072cd 100644 --- a/ifconfig/if_index.c +++ b/ifconfig/if_index.c @@ -94,10 +94,17 @@ if_freenameindex (struct if_nameindex *ifn) free (ifn); } +#ifdef HAVE_SYSTEM_IF_NAMEINDEX struct if_nameindex * if_nameindex (void) { -#if defined(SIOCGIFCONF) + return system_if_nameindex (); +} +#else +struct if_nameindex * +if_nameindex (void) +{ +# if defined(SIOCGIFCONF) int fd = socket (AF_INET, SOCK_DGRAM, 0); struct ifconf ifc; unsigned int i = 0; @@ -165,11 +172,11 @@ if_nameindex (void) return NULL; } -# if defined(SIOCGIFINDEX) +# if defined(SIOCGIFINDEX) if (ioctl (fd, SIOCGIFINDEX, cur) >= 0) idx[i].if_index = cur->ifr_index; else -# endif +# endif idx[i].if_index = i + 1; i++; } @@ -193,8 +200,9 @@ if_nameindex (void) close (fd); return idx; -#else +# else errno = ENOSYS; return NULL; -#endif +# endif } +#endif diff --git a/ifconfig/system/linux.c b/ifconfig/system/linux.c index fd5a1b2..58f0bcd 100644 --- a/ifconfig/system/linux.c +++ b/ifconfig/system/linux.c @@ -46,6 +46,8 @@ #include <net/if_arp.h> #include <linux/if_ether.h> +#include <read-file.h> + #include "../ifconfig.h" @@ -846,3 +848,80 @@ system_configure (int sfd, struct ifreq *ifr, struct system_ifconfig *ifs) } return 0; } + +struct if_nameindex * +system_if_nameindex (void) +{ + char *content, *it; + size_t length, index; + struct if_nameindex *idx = NULL; + int fd; + + fd = socket (AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + return NULL; + + content = read_file (PATH_PROCNET_DEV, &length); + if (content == NULL) + return NULL; + + /* Count how many interfaces we have. */ + { + size_t n = 0; + it = content; + do + { + it = memchr (it + 1, ':', length - (it - content)); + n++; + } + while (it); + + idx = malloc (n * sizeof (*idx)); + if (idx == NULL) + { + int saved_errno = errno; + close (fd); + free (content); + errno = saved_errno; + return NULL; + } + } + + for (it = memchr (content, ':', length), index = 0; it; + it = memchr (it, ':', it - content), index++) + { + char *start = it - 1; + *it = '\0'; + + while (*start != ' ' && *start != '\n') + start--; + + idx[index].if_name = strdup (start + 1); + idx[index].if_index = index + 1; + +# if defined(SIOCGIFINDEX) + { + struct ifreq cur; + strcpy (cur.ifr_name, idx[index].if_name); + cur.ifr_index = -1; + if (ioctl (fd, SIOCGIFINDEX, &cur) >= 0) + idx[index].if_index = cur.ifr_index; + } +# endif + + if (idx[index].if_name == NULL) + { + int saved_errno = errno; + close (fd); + free (content); + errno = saved_errno; + return NULL; + } + } + + idx[index].if_index = 0; + idx[index].if_name = NULL; + + free (content); + return idx; +} diff --git a/ifconfig/system/linux.h b/ifconfig/system/linux.h index 5b03581..dff1293 100644 --- a/ifconfig/system/linux.h +++ b/ifconfig/system/linux.h @@ -24,6 +24,7 @@ # include "../printif.h" # include "../options.h" +#include <net/if.h> /* Option support. */ @@ -86,7 +87,10 @@ void system_fh_txqlen_query (format_data_t form, int argc, char *argv[]); void system_fh_txqlen (format_data_t form, int argc, char *argv[]); void system_fh_ifstat_query (format_data_t form, int argc, char *argv[]); - + +#define HAVE_SYSTEM_IF_NAMEINDEX 1 +struct if_nameindex *system_if_nameindex (void); + _IU_EXTRN (rx_packets) _IU_EXTRN (tx_packets) _IU_EXTRN (rx_bytes) -- 1.7.1