plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

Linux.c (5143B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bio.h>
      4 #include <regexp.h>
      5 #include "dat.h"
      6 
      7 void xapm(int);
      8 void xloadavg(int);
      9 void xmeminfo(int);
     10 void xnet(int);
     11 void xstat(int);
     12 void xvmstat(int);
     13 void xwireless(int);
     14 
     15 void (*statfn[])(int) =
     16 {
     17 	xapm,
     18 	xloadavg,
     19 	xmeminfo,
     20 	xnet,
     21 	xstat,
     22 	xvmstat,
     23 	xwireless,
     24 	0
     25 };
     26 
     27 void
     28 xapm(int first)
     29 {
     30 	static int fd = -1;
     31 	int curr = -1;
     32 
     33 	if(first){
     34 		fd = open("/sys/class/power_supply/BAT0/capacity", OREAD);
     35 		return;
     36 	}
     37 	if(fd == -1)
     38 		return;
     39 
     40 	readfile(fd);
     41 	tokens(0);
     42 	curr = atoi(tok[0]);
     43 
     44 	if(curr != -1)
     45 		Bprint(&bout, "battery =%d 100\n", curr);
     46 
     47 }
     48 
     49 void
     50 xloadavg(int first)
     51 {
     52 	static int fd = -1;
     53 
     54 	if(first){
     55 		fd = open("/proc/loadavg", OREAD);
     56 		return;
     57 	}
     58 
     59 	readfile(fd);
     60 	tokens(0);
     61 	if(ntok >= 1)
     62 		Bprint(&bout, "load =%d 1000\n", (int)(atof(tok[0])*1000));
     63 }
     64 
     65 void
     66 xmeminfo(int first)
     67 {
     68 	int i;
     69 	vlong tot, used;
     70 	vlong mtot, mfree;
     71 	vlong stot, sfree;
     72 	static int fd = -1;
     73 
     74 	if(first){
     75 		fd = open("/proc/meminfo", OREAD);
     76 		return;
     77 	}
     78 
     79 	readfile(fd);
     80 	mtot = 0;
     81 	stot = 0;
     82 	mfree = 0;
     83 	sfree = 0;
     84 	for(i=0; i<nline; i++){
     85 		tokens(i);
     86 		if(ntok < 3)
     87 			continue;
     88 		tot = atoll(tok[1]);
     89 		used = atoll(tok[2]);
     90 		if(strcmp(tok[0], "Mem:") == 0)
     91 			Bprint(&bout, "mem =%lld %lld\n", used/1024, tot/1024);
     92 		else if(strcmp(tok[0], "Swap:") == 0)
     93 			Bprint(&bout, "swap =%lld %lld\n", used/1024, tot/1024);
     94 		else if(strcmp(tok[0], "MemTotal:") == 0)
     95 			mtot = atoll(tok[1]);	/* kb */
     96 		else if(strcmp(tok[0], "MemFree:") == 0)
     97 			mfree += atoll(tok[1]);
     98 		else if(strcmp(tok[0], "Buffers:") == 0)
     99 			mfree += atoll(tok[1]);
    100 		else if(strcmp(tok[0], "Cached:") == 0){
    101 			mfree += atoll(tok[1]);
    102 			if(mtot < mfree)
    103 				continue;
    104 			Bprint(&bout, "mem =%lld %lld\n", mtot-mfree, mtot);
    105 		}else if(strcmp(tok[0], "SwapTotal:") == 0)
    106 			stot = atoll(tok[1]);	/* kb */
    107 		else if(strcmp(tok[0], "SwapFree:") == 0){
    108 			sfree = atoll(tok[1]);
    109 			if(stot < sfree)
    110 				continue;
    111 			Bprint(&bout, "swap =%lld %lld\n", stot-sfree, stot);
    112 		}
    113 	}
    114 }
    115 
    116 void
    117 xnet(int first)
    118 {
    119 	int i, n;
    120 	vlong totb, totp, tote, totin, totou, totinb, totoub, b, p, e, in, ou, inb, oub;
    121 	char *q;
    122 	static int fd = -1;
    123 	static Reprog *netdev = nil;
    124 
    125 	if(first){
    126 		fd = open("/proc/net/dev", OREAD);
    127 		netdev = regcomp("^(eth[0-9]+|wlan[0-9]+|enp[0-9]+s[0-9]+f[0-9]+|wlp[0-9]+s[0-9]+)$");
    128 		return;
    129 	}
    130 
    131 	readfile(fd);
    132 	n = 0;
    133 	totb = 0;
    134 	tote = 0;
    135 	totp = 0;
    136 	totin = 0;
    137 	totou = 0;
    138 	totinb = 0;
    139 	totoub = 0;
    140 	for(i=0; i<nline; i++){
    141 		if((q = strchr(line[i], ':')) != nil)
    142 			*q = ' ';
    143 		tokens(i);
    144 		if(ntok < 8+8)
    145 			continue;
    146 		if(regexec(netdev, tok[0], nil, 0) != 1)
    147 			continue;
    148 		inb = atoll(tok[1]);
    149 		oub = atoll(tok[9]);
    150 		in = atoll(tok[2]);
    151 		ou = atoll(tok[10]);
    152 		b = inb+oub;
    153 		p = in+ou;
    154 		e = atoll(tok[3])+atoll(tok[11]);
    155 		totb += b;
    156 		totp += p;
    157 		tote += e;
    158 		totin += in;
    159 		totou += ou;
    160 		totinb += inb;
    161 		totoub += oub;
    162 		n++;
    163 	}
    164 	Bprint(&bout, "etherb %lld %d\n", totb, n*1000000);
    165 	Bprint(&bout, "ether %lld %d\n", totp, n*1000);
    166 	Bprint(&bout, "ethererr %lld %d\n", tote, n*1000);
    167 	Bprint(&bout, "etherin %lld %d\n", totin, n*1000);
    168 	Bprint(&bout, "etherout %lld %d\n", totou, n*1000);
    169 	Bprint(&bout, "etherinb %lld %d\n", totinb, n*1000);
    170 	Bprint(&bout, "etheroutb %lld %d\n", totoub, n*1000);
    171 }
    172 
    173 void
    174 xstat(int first)
    175 {
    176 	static int fd = -1;
    177 	int i;
    178 
    179 	if(first){
    180 		fd = open("/proc/stat", OREAD);
    181 		return;
    182 	}
    183 
    184 	readfile(fd);
    185 	for(i=0; i<nline; i++){
    186 		tokens(i);
    187 		if(ntok < 2)
    188 			continue;
    189 		if(strcmp(tok[0], "cpu") == 0 && ntok >= 5){
    190 			Bprint(&bout, "user %lld 100\n", atoll(tok[1]));
    191 			Bprint(&bout, "sys %lld 100\n", atoll(tok[3]));
    192 			Bprint(&bout, "cpu %lld 100\n", atoll(tok[1])+atoll(tok[3]));
    193 			Bprint(&bout, "idle %lld 100\n", atoll(tok[4]));
    194 		}
    195 	/*
    196 		if(strcmp(tok[0], "page") == 0 && ntok >= 3){
    197 			Bprint(&bout, "pagein %lld 500\n", atoll(tok[1]));
    198 			Bprint(&bout, "pageout %lld 500\n", atoll(tok[2]));
    199 			Bprint(&bout, "page %lld 1000\n", atoll(tok[1])+atoll(tok[2]));
    200 		}
    201 		if(strcmp(tok[0], "swap") == 0 && ntok >= 3){
    202 			Bprint(&bout, "swapin %lld 500\n", atoll(tok[1]));
    203 			Bprint(&bout, "swapout %lld 500\n", atoll(tok[2]));
    204 			Bprint(&bout, "swap %lld 1000\n", atoll(tok[1])+atoll(tok[2]));
    205 		}
    206 	*/
    207 		if(strcmp(tok[0], "intr") == 0)
    208 			Bprint(&bout, "intr %lld 1000\n", atoll(tok[1]));
    209 		if(strcmp(tok[0], "ctxt") == 0)
    210 			Bprint(&bout, "context %lld 10000\n", atoll(tok[1]));
    211 		if(strcmp(tok[0], "processes") == 0)
    212 			Bprint(&bout, "fork %lld 1000\n", atoll(tok[1]));
    213 	}
    214 }
    215 
    216 void
    217 xvmstat(int first)
    218 {
    219 	static int fd = -1;
    220 	int i;
    221 
    222 	if(first){
    223 		fd = open("/proc/vmstat", OREAD);
    224 		return;
    225 	}
    226 
    227 	readfile(fd);
    228 	for(i=0; i<nline; i++){
    229 		tokens(i);
    230 		if(ntok < 2)
    231 			continue;
    232 		if(strcmp(tok[0], "pgfault") == 0)
    233 			Bprint(&bout, "fault %lld 100000\n", atoll(tok[1]));
    234 	}
    235 }
    236 
    237 void
    238 xwireless(int first)
    239 {
    240 	static int fd = -1;
    241 	static Reprog *wlan = nil;
    242 	int i;
    243 
    244 	if(first){
    245 		fd = open("/proc/net/wireless", OREAD);
    246 		wlan = regcomp("^(wlan[0-9]+|wlp[0-9]+s[0-9]+):$");
    247 		return;
    248 	}
    249 
    250 	readfile(fd);
    251 	for(i=0; i<nline; i++){
    252 		tokens(i);
    253 		if(ntok < 3)
    254 			continue;
    255 		if(regexec(wlan, tok[0], nil, 0) == 1)
    256 			Bprint(&bout, "802.11 =%lld 100\n", atoll(tok[2]));
    257 	}
    258 }