summaryrefslogtreecommitdiffstats
path: root/src/ifstatus.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ifstatus.c')
-rw-r--r--src/ifstatus.c49
1 files changed, 18 insertions, 31 deletions
diff --git a/src/ifstatus.c b/src/ifstatus.c
index 35a0b48..655d16f 100644
--- a/src/ifstatus.c
+++ b/src/ifstatus.c
@@ -45,7 +45,7 @@ int handle(char *iface) {
int fd, r = 0;
interface_status_t s;
- if ((fd = interface_open(iface)) < 0)
+ if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
return -1;
if (verbose > 0) {
@@ -189,45 +189,32 @@ int main(int argc, char *argv[]) {
return r+1;
} else {
- struct ifconf ifconf;
- struct ifreq *ifr;
- int m, n, s, fd;
+ FILE *f;
+ char ln[256];
- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- fprintf(stderr, "socket(): %s\n", strerror(errno));
+ if (!(f = fopen("/proc/net/dev", "r"))) {
+ fprintf(stderr, "Failed to open /proc/net/dev: %s\n", strerror(errno));
return 1;
}
- s = sizeof(struct ifreq)*5;
- for (;;) {
- ifr = malloc(s);
+ fgets(ln, sizeof(ln), f);
+ fgets(ln, sizeof(ln), f);
- ifconf.ifc_len = s;
- ifconf.ifc_req = ifr;
-
- if (ioctl(fd, SIOCGIFCONF, &ifconf) < 0) {
- fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));
- free(ifr);
- close(fd);
+ while (fgets(ln, sizeof(ln), f)) {
+ char *p, *e;
+
+ p = ln+strspn(ln, " \t");
+ if (!(e = strchr(p, ':'))) {
+ fprintf(stderr, "Parse failure in /proc/net/dev.\n");
+ fclose(f);
return 1;
}
-
-
- if (ifconf.ifc_len != s)
- break;
-
- free(ifr);
- s *= 2;
- }
- close(fd);
+ *e = 0;
+ handle(p);
+ }
- m = ifconf.ifc_len/sizeof(struct ifreq);
- for (n = 0; n < m; n++)
- if (strcmp(ifconf.ifc_req[n].ifr_name, "lo"))
- handle(ifconf.ifc_req[n].ifr_name);
-
- free(ifr);
+ fclose(f);
}
return 0;