| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include "dat.h" |
| |
| void xapm(int); |
| void xloadavg(int); |
| void xmeminfo(int); |
| void xnet(int); |
| void xstat(int); |
| void xvmstat(int); |
| void xwireless(int); |
| |
| void (*statfn[])(int) = |
| { |
| xapm, |
| xloadavg, |
| xmeminfo, |
| xnet, |
| xstat, |
| xvmstat, |
| xwireless, |
| 0 |
| }; |
| |
| void |
| xapm(int first) |
| { |
| static int fd = -1, fdb = -1; |
| int i, last = -1, curr = -1; |
| |
| if(first){ |
| fd = open("/proc/acpi/battery/BAT0/info", OREAD); |
| fdb = open("/proc/acpi/battery/BAT0/state", OREAD); |
| return; |
| } |
| if(fd == -1 || fdb == -1) |
| return; |
| |
| readfile(fd); |
| for(i=0; i<nline; i++){ |
| tokens(i); |
| if(ntok < 3) |
| continue; |
| if(strcmp(tok[0], "last") == 0 && strcmp(tok[1], "full") == 0) |
| last = atoi(tok[3]); |
| } |
| readfile(fdb); |
| for(i = 0; i < nline; i++) { |
| tokens(i); |
| if(ntok < 3) |
| continue; |
| if(strcmp(tok[0], "remaining") == 0 && strcmp(tok[1], "capacity:") == 0) |
| curr = atoi(tok[2]); |
| } |
| |
| if(curr != -1 && last != -1) |
| Bprint(&bout, "battery =%d 100\n", (int)(((float)curr/(float)last)*100.0)); |
| |
| } |
| |
| void |
| xloadavg(int first) |
| { |
| static int fd = -1; |
| |
| if(first){ |
| fd = open("/proc/loadavg", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| tokens(0); |
| if(ntok >= 1) |
| Bprint(&bout, "load =%d 1000\n", (int)(atof(tok[0])*1000)); |
| } |
| |
| void |
| xmeminfo(int first) |
| { |
| int i; |
| vlong tot, used; |
| vlong mtot, mfree; |
| vlong stot, sfree; |
| static int fd = -1; |
| |
| if(first){ |
| fd = open("/proc/meminfo", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| mtot = 0; |
| stot = 0; |
| mfree = 0; |
| sfree = 0; |
| for(i=0; i<nline; i++){ |
| tokens(i); |
| if(ntok < 3) |
| continue; |
| tot = atoll(tok[1]); |
| used = atoll(tok[2]); |
| if(strcmp(tok[0], "Mem:") == 0) |
| Bprint(&bout, "mem =%lld %lld\n", used/1024, tot/1024); |
| else if(strcmp(tok[0], "Swap:") == 0) |
| Bprint(&bout, "swap =%lld %lld\n", used/1024, tot/1024); |
| else if(strcmp(tok[0], "MemTotal:") == 0) |
| mtot = atoll(tok[1]); /* kb */ |
| else if(strcmp(tok[0], "MemFree:") == 0) |
| mfree += atoll(tok[1]); |
| else if(strcmp(tok[0], "Buffers:") == 0) |
| mfree += atoll(tok[1]); |
| else if(strcmp(tok[0], "Cached:") == 0){ |
| mfree += atoll(tok[1]); |
| if(mtot < mfree) |
| continue; |
| Bprint(&bout, "mem =%lld %lld\n", mtot-mfree, mtot); |
| }else if(strcmp(tok[0], "SwapTotal:") == 0) |
| stot = atoll(tok[1]); /* kb */ |
| else if(strcmp(tok[0], "SwapFree:") == 0){ |
| sfree = atoll(tok[1]); |
| if(stot < sfree) |
| continue; |
| Bprint(&bout, "swap =%lld %lld\n", stot-sfree, stot); |
| } |
| } |
| } |
| |
| void |
| xnet(int first) |
| { |
| int i, n; |
| vlong totb, totp, tote, totin, totou, totinb, totoub, b, p, e, in, ou, inb, oub; |
| char *q; |
| static int fd = -1; |
| |
| if(first){ |
| fd = open("/proc/net/dev", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| n = 0; |
| totb = 0; |
| tote = 0; |
| totp = 0; |
| totin = 0; |
| totou = 0; |
| totinb = 0; |
| totoub = 0; |
| for(i=0; i<nline; i++){ |
| if((q = strchr(line[i], ':')) != nil) |
| *q = ' '; |
| tokens(i); |
| if(ntok < 8+8) |
| continue; |
| if(strncmp(tok[0], "eth", 3) != 0 && strncmp(tok[0], "wlan", 4) != 0) |
| continue; |
| inb = atoll(tok[1]); |
| oub = atoll(tok[9]); |
| in = atoll(tok[2]); |
| ou = atoll(tok[10]); |
| b = inb+oub; |
| p = in+ou; |
| e = atoll(tok[3])+atoll(tok[11]); |
| totb += b; |
| totp += p; |
| tote += e; |
| totin += in; |
| totou += ou; |
| totinb += inb; |
| totoub += oub; |
| n++; |
| } |
| Bprint(&bout, "etherb %lld %d\n", totb, n*1000000); |
| Bprint(&bout, "ether %lld %d\n", totp, n*1000); |
| Bprint(&bout, "ethererr %lld %d\n", tote, n*1000); |
| Bprint(&bout, "etherin %lld %d\n", totin, n*1000); |
| Bprint(&bout, "etherout %lld %d\n", totou, n*1000); |
| Bprint(&bout, "etherinb %lld %d\n", totinb, n*1000); |
| Bprint(&bout, "etheroutb %lld %d\n", totoub, n*1000); |
| } |
| |
| void |
| xstat(int first) |
| { |
| static int fd = -1; |
| int i; |
| |
| if(first){ |
| fd = open("/proc/stat", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| for(i=0; i<nline; i++){ |
| tokens(i); |
| if(ntok < 2) |
| continue; |
| if(strcmp(tok[0], "cpu") == 0 && ntok >= 5){ |
| Bprint(&bout, "user %lld 100\n", atoll(tok[1])); |
| Bprint(&bout, "sys %lld 100\n", atoll(tok[3])); |
| Bprint(&bout, "cpu %lld 100\n", atoll(tok[1])+atoll(tok[3])); |
| Bprint(&bout, "idle %lld 100\n", atoll(tok[4])); |
| } |
| /* |
| if(strcmp(tok[0], "page") == 0 && ntok >= 3){ |
| Bprint(&bout, "pagein %lld 500\n", atoll(tok[1])); |
| Bprint(&bout, "pageout %lld 500\n", atoll(tok[2])); |
| Bprint(&bout, "page %lld 1000\n", atoll(tok[1])+atoll(tok[2])); |
| } |
| if(strcmp(tok[0], "swap") == 0 && ntok >= 3){ |
| Bprint(&bout, "swapin %lld 500\n", atoll(tok[1])); |
| Bprint(&bout, "swapout %lld 500\n", atoll(tok[2])); |
| Bprint(&bout, "swap %lld 1000\n", atoll(tok[1])+atoll(tok[2])); |
| } |
| */ |
| if(strcmp(tok[0], "intr") == 0) |
| Bprint(&bout, "intr %lld 1000\n", atoll(tok[1])); |
| if(strcmp(tok[0], "ctxt") == 0) |
| Bprint(&bout, "context %lld 10000\n", atoll(tok[1])); |
| if(strcmp(tok[0], "processes") == 0) |
| Bprint(&bout, "fork %lld 1000\n", atoll(tok[1])); |
| } |
| } |
| |
| void |
| xvmstat(int first) |
| { |
| static int fd = -1; |
| int i; |
| |
| if(first){ |
| fd = open("/proc/vmstat", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| for(i=0; i<nline; i++){ |
| tokens(i); |
| if(ntok < 2) |
| continue; |
| if(strcmp(tok[0], "pgfault") == 0) |
| Bprint(&bout, "fault %lld 100000\n", atoll(tok[1])); |
| } |
| } |
| |
| void |
| xwireless(int first) |
| { |
| static int fd = -1; |
| int i; |
| |
| if(first){ |
| fd = open("/proc/net/wireless", OREAD); |
| return; |
| } |
| |
| readfile(fd); |
| for(i=0; i<nline; i++){ |
| tokens(i); |
| if(ntok < 3) |
| continue; |
| if(strcmp(tok[0], "wlan0:") == 0) |
| Bprint(&bout, "802.11 =%lld 100\n", atoll(tok[2])); |
| } |
| } |