267 lines · 5.3 KB · C
RawDownload
#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}; voidxapm(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)); }	voidxloadavg(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));} voidxmeminfo(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);		}	}} voidxnet(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);} voidxstat(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]));	}} voidxvmstat(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]));	}} voidxwireless(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]));	}}