267 lines
5.3 KiB
C
267 lines
5.3 KiB
C
#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]));
|
|
}
|
|
}
|