-/* $Id: system.c,v 1.14 2000/08/09 09:50:29 reinelt Exp $
+/* $Id: system.c,v 1.15 2000/08/09 11:03:07 reinelt Exp $
*
* system status retreivement
*
*
*
* $Log: system.c,v $
+ * Revision 1.15 2000/08/09 11:03:07 reinelt
+ *
+ * fixed a bug in system.c where the format of /proc/net/dev was not correctly
+ * detected and parsed with different kernels
+ *
* Revision 1.14 2000/08/09 09:50:29 reinelt
*
* opened 0.98 development
int Net (int *rx, int *tx, int *bytes)
{
char buffer[4096], *p, *s;
+ static char *proc_net_dev_fmt=NULL;
+ static int proc_net_dev_bytes=0;
static int fd=-2;
unsigned long pkg_rx, pkg_tx;
if (fd==-1) return -1;
if (fd==-2) {
+ struct utsname ubuf;
+ if (uname(&ubuf)==-1) {
+ perror ("uname() failed");
+ fd=-1;
+ return -1;
+ }
+ if (strncmp(ubuf.release,"2.0.",4)==0) {
+ debug ("using old /proc/net/dev format\n");
+ proc_net_dev_fmt=" eth%*d: %ld %*d %*d %*d %*d %ld";
+ proc_net_dev_bytes=0;
+ } else {
+ debug ("using new /proc/net/dev format\n");
+ proc_net_dev_fmt=" eth%*d: %ld %*d %*d %*d %*d %*d %*d %*d %ld";
+ proc_net_dev_bytes=1;
+ }
+
fd = open("/proc/net/dev", O_RDONLY | O_NDELAY);
if (fd==-1) {
perror ("open(/proc/net/dev) failed");
p=buffer;
while ((s=strsep(&p, "\n"))) {
unsigned long r, t;
-
- if (sscanf (s, " eth%*d:%ld %*d %*d %*d %*d %*d %*d %*d %ld %*d %*d %*d %*d %*d %*d %*d", &r, &t)==2) {
+ if (sscanf (s, proc_net_dev_fmt, &r, &t)==2) {
pkg_rx+=r;
pkg_tx+=t;
- *bytes=1;
- } else {
- if (sscanf (s, " eth%*d:%*d: %ld %*d %*d %*d %*d %ld %*d %*d %*d %*d %*d", &r, &t)==2 ||
- sscanf (s, " eth%*d:%ld %*d %*d %*d %*d %ld %*d %*d %*d %*d %*d", &r, &t)==2) {
- pkg_rx+=r;
- pkg_tx+=t;
- *bytes=0;
- }
}
}
-
+
*rx=smooth("net_rx", 500, pkg_rx);
*tx=smooth("net_tx", 500, pkg_tx);
-
+ *bytes=proc_net_dev_bytes;
+
return 0;
}