diff --git a/wmnet/drivers.c b/wmnet/drivers.c index a6ab0a0..4b798e7 100644 --- a/wmnet/drivers.c +++ b/wmnet/drivers.c @@ -316,25 +316,36 @@ int updateStats_ipchains(void) { int updateStats_dev(void) { FILE *dev; + char *ptr; + unsigned int flag = 0; + static char interface[16]; rx = False; tx = False; - dev = fopen("/proc/net/dev", "r"); - if (!dev) { - fprintf(stderr, "/proc/net/dev does not exist\n"); + + if ((dev = fopen("/proc/net/dev", "r")) == NULL) { + fprintf(stderr, "/proc/net/dev does not exist?\n" + "Perhaps we are not running Linux?\n"); exit(4); } - /* the first two lines we can skip */ fgets(buffer, 256, dev); fgets(buffer, 256, dev); - while(fgets(buffer, 256, dev)) { + /* IP Chain Rules for Linux kernel 2_1.x */ + while(flag != (ACCOUNT_IN_FOUND|ACCOUNT_OUT_FOUND) && fgets(buffer, 256, dev)) { - if (strcmp(buffer, device) > 0){ + sscanf(buffer, "%16s %llu %llu %*d %*d %*d %*d %*d %*d %llu %llu %*d %*d %*d %*d %*d %*d", + interface, &totalbytes_in, &totalpackets_in, &totalbytes_out, &totalpackets_out); - sscanf(buffer, "%*s %llu %llu %*d %*d %*d %*d %*d %*d %llu %llu %*d %*d %*d %*d %*d %*d", - &totalbytes_in, &totalpackets_in, &totalbytes_out, &totalpackets_out); + /* strip trailing colon */ + ptr = interface; + while(*ptr != ':') ptr++; + *ptr = '\0'; + + if (!strcmp(interface, device)) { + + flag = (ACCOUNT_IN_FOUND|ACCOUNT_OUT_FOUND); if (totalpackets_in != lastpackets_in) { diffbytes_in += totalbytes_in - lastbytes_in; @@ -349,8 +360,6 @@ int updateStats_dev(void) { lastbytes_out = totalbytes_out; tx = True; } - - break; } }