diff options
author | Graham Wilson <graham@mknod.org> | 2004-11-14 18:58:40 +0000 |
---|---|---|
committer | Graham Wilson <graham@mknod.org> | 2004-11-14 18:58:40 +0000 |
commit | df821496b2ef39a477c392cf1aa5efd5cf2520df (patch) | |
tree | 77743ad9c79625ab895150903e15522085a6fc8f | |
parent | b677d2e088a32227cda28496bd321c470e422246 (diff) | |
download | fetchmail-df821496b2ef39a477c392cf1aa5efd5cf2520df.tar.gz fetchmail-df821496b2ef39a477c392cf1aa5efd5cf2520df.tar.bz2 fetchmail-df821496b2ef39a477c392cf1aa5efd5cf2520df.zip |
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
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | interface.c | 25 |
2 files changed, 16 insertions, 11 deletions
@@ -41,6 +41,8 @@ snprintf or vsnprintf. * Clean up the horrible #ifdef HAVE_[V]SNPRINTF that made the code unreadable. Use Trio where [v]snprintf is/are missing. Matthias Andree. +* 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. fetchmail-6.2.5 (Wed Oct 15 18:39:22 EDT 2003), 23079 lines: diff --git a/interface.c b/interface.c index 4c9dde32..c264f22b 100644 --- a/interface.c +++ b/interface.c @@ -14,6 +14,10 @@ #include <sys/types.h> #include <sys/param.h> +#if defined(linux) +#include <sys/utsname.h> +#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"; } } |