aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--interface.c25
2 files changed, 16 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index c521dc4d..95b36ae7 100644
--- a/NEWS
+++ b/NEWS
@@ -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";
}
}