static int irq_stats(const char *ifname, struct ifstat *s) { int i; char *ptr, *ptr2; char buff[4096]; FILE *fp; /* We exclude lo! */ if (!strncmp("lo", ifname, strlen("lo"))) return 0; fp = fopen("/proc/interrupts", "r"); if (!fp) { whine("Cannot open /proc/interrupts!\n"); return -ENOENT; } stats_check_alloc(s); memset(buff, 0, sizeof(buff)); while (fgets(buff, sizeof(buff), fp) != NULL) { buff[sizeof(buff) - 1] = 0; if (strstr(buff, ifname) == NULL) continue; ptr = buff; while (*ptr != ':') ptr++; *ptr = 0; s->irq_nr = atoi(buff); bug_on(s->irq_nr == 0); for (i = 0; i < s->irqs_len; ++i) { ptr++; ptr2 = ptr; while (*ptr == ' ') ptr++; while (*ptr != ' ' && *ptr != 0) ptr++; *ptr = 0; s->irqs[i] = atoi(ptr2); } memset(buff, 0, sizeof(buff)); } fclose(fp); return 0; }
static int irq_sstats(struct ifstat *s) { int i, rx = 0; char *ptr, *ptr2; char buff[4096]; FILE *fp = fopen("/proc/softirqs", "r"); if (!fp) { whine("Cannot open /proc/softirqs!\n"); return -ENOENT; } stats_check_alloc(s); memset(buff, 0, sizeof(buff)); while (fgets(buff, sizeof(buff), fp) != NULL) { buff[sizeof(buff) - 1] = 0; if ((ptr = strstr(buff, "NET_TX:")) == NULL) { ptr = strstr(buff, "NET_RX:"); if (ptr == NULL) continue; rx = 1; } else { rx = 0; } ptr += strlen("NET_TX:"); for (i = 0; i < s->irqs_len; ++i) { ptr++; while (*ptr == ' ') ptr++; ptr2 = ptr; while (*ptr != ' ' && *ptr != 0) ptr++; *ptr = 0; if (rx) s->irqs_srx[i] = atoi(ptr2); else s->irqs_stx[i] = atoi(ptr2); } memset(buff, 0, sizeof(buff)); } fclose(fp); return 0; }
static int sys_stats(struct ifstat *s) { int ret, cpu; char *ptr, *ptr2; char buff[4096]; FILE *fp = fopen("/proc/stat", "r"); if (!fp) { whine("Cannot open /proc/stat!\n"); return -ENOENT; } stats_check_alloc(s); memset(buff, 0, sizeof(buff)); while (fgets(buff, sizeof(buff), fp) != NULL) { buff[sizeof(buff) - 1] = 0; if ((ptr = strstr(buff, "cpu")) != NULL) { ptr += strlen("cpu"); if (*ptr == ' ') goto next; ptr2 = ptr; while (*ptr != ' ' && *ptr != 0) ptr++; *ptr = 0; cpu = atoi(ptr2); if (cpu < 0 || cpu >= s->irqs_len) goto next; ptr++; ret = sscanf(ptr, "%lu%lu%lu%lu%lu", &s->cpu_user[cpu], &s->cpu_nice[cpu], &s->cpu_sys[cpu], &s->cpu_idle[cpu], &s->cpu_iow[cpu]); if (ret != 5) goto next; } else if ((ptr = strstr(buff, "ctxt")) != NULL) { ptr += strlen("ctxt"); ptr++; while (*ptr == ' ') ptr++; ret = sscanf(ptr, "%lu", &s->ctxt); if (ret != 1) s->ctxt = 0; } else if ((ptr = strstr(buff, "processes")) != NULL) { ptr += strlen("processes"); ptr++; while (*ptr == ' ') ptr++; ret = sscanf(ptr, "%lu", &s->forks); if (ret != 1) s->forks = 0; } else if ((ptr = strstr(buff, "procs_running")) != NULL) { ptr += strlen("procs_running"); ptr++; while (*ptr == ' ') ptr++; ret = sscanf(ptr, "%lu", &s->procs_run); if (ret != 1) s->procs_run = 0; } else if ((ptr = strstr(buff, "procs_blocked")) != NULL) { ptr += strlen("procs_blocked"); ptr++; while (*ptr == ' ') ptr++; ret = sscanf(ptr, "%lu", &s->procs_iow); if (ret != 1) s->procs_iow = 0; } next: memset(buff, 0, sizeof(buff)); } fclose(fp); return 0; }