From df821496b2ef39a477c392cf1aa5efd5cf2520df Mon Sep 17 00:00:00 2001 From: Graham Wilson Date: Sun, 14 Nov 2004 18:58:40 +0000 Subject: Default to Linux 2.2 /proc/net/dev format, and use uname(2) to determine the kernel version instead of calling uname(1). Thanks to Paul Slootman. svn path=/trunk/; revision=4007 --- interface.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'interface.c') diff --git a/interface.c b/interface.c index 4c9dde32..c264f22b 100644 --- a/interface.c +++ b/interface.c @@ -14,6 +14,10 @@ #include #include +#if defined(linux) +#include +#endif + #if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) #include "config.h" @@ -73,24 +77,23 @@ static char *netdevfmt; #if defined(linux) void interface_init(void) -/* figure out which /proc/dev/net format to use */ +/* figure out which /proc/net/dev format to use */ { - FILE *fp = popen("uname -r", "r"); /* still wins if /proc is out */ + struct utsname utsname; - /* pre-linux-2.2 format -- transmit packet count in 8th field */ - netdevfmt = "%d %d %*d %*d %*d %d %*d %d %*d %*d %*d %*d %d"; + /* Linux 2.2 -- transmit packet count in 10th field */ + netdevfmt = "%d %d %*d %*d %*d %d %*d %*d %*d %d %*d %*d %d"; - if (!fp) - return; + if (uname(&utsname) < 0) + return; else { int major, minor; - if (fscanf(fp, "%d.%d.%*d", &major, &minor) >= 2 - && major >= 2 && minor >= 2) - /* Linux 2.2 -- transmit packet count in 10th field */ - netdevfmt = "%d %d %*d %*d %*d %d %*d %*d %*d %d %*d %*d %d"; - pclose(fp); + if (sscanf(utsname.release, "%d.%d.%*d", &major, &minor) >= 2 + && !(major >= 2 && minor >= 2)) + /* pre-linux-2.2 format -- transmit packet count in 8th field */ + netdevfmt = "%d %d %*d %*d %*d %d %*d %d %*d %*d %*d %*d %d"; } } -- cgit v1.2.3