henesyinit from p9f47575dc5 years agoHistory
228 lines · 3.6 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <bio.h>#include <ip.h>#include <ndb.h> void	pip(char*, char*);void	pdk(char*, char*);void	nstat(char*, void (*)(char*, char*)); Ndb 	*ndb;Biobuf	out; voidmain(void){	ndb = ndbopen(0); 	Binit(&out, 1, OWRITE); 	nstat("tcp", pip);	nstat("udp", pip);	nstat("il", pip);	nstat("dk", pdk);	exits(0);} voidnstat(char *net, void (*f)(char*, char*)){	int fdir, i, n, tot;	char dir[500*DIRLEN], *mem; 	sprint(dir, "/net/%s", net);	fdir = open(dir, OREAD);	if(fdir < 0)		return; 	mem = sbrk(0);	tot = 0;	while((n = read(fdir, dir, sizeof dir)) > 0){		if(brk((void*)(mem + tot + n)) == -1) {			fprint(2, "netstat: out of memory");			return;		}		memmove(mem+tot, dir, n);		tot += n;	}	for(i = 0; i < tot; i += DIRLEN) {		(*f)(net, mem+i);		Bflush(&out);	}	close(fdir);} voidpdk(char *net, char *entry){	Dir db;	int n, fd;	char buf[128], *p, *t; 	if(strcmp(entry, "clone") == 0)		return; 	sprint(buf, "/net/%s/%s/ctl", net, entry);	if(dirstat(buf, &db) < 0)		return; 	sprint(buf, "/net/%s/%s/status", net, entry);	fd = open(buf, OREAD);	if(fd < 0)		return;	n = read(fd, buf, sizeof(buf));	if(n < 0)		return;	buf[n] = 0;	close(fd); 	p = strchr(buf, ' ');	if(p == 0)		return;	p = strchr(p+1, ' ');	if(p == 0)		return;	t = strchr(p+1, ' ');	if(t == 0)		return;	*t = 0;	Bprint(&out, "%-4s %-4s %-10s %-12s ", net, entry, db.uid, p); 	sprint(buf, "/net/%s/%s/local", net, entry);	fd = open(buf, OREAD);	if(fd < 0) {		Bprint(&out, "\n");		return;	}	n = read(fd, buf, sizeof(buf));	if(n < 0) {		Bprint(&out, "\n");		return;	}	buf[n-1] = 0;	p = strchr(buf, '!');	if(p == 0) {		Bprint(&out, "\n");		return;	}	Bprint(&out, "%-10s ", p+1); 	sprint(buf, "/net/%s/%s/remote", net, entry);	fd = open(buf, OREAD);	if(fd < 0) {		Bprint(&out, "\n", buf);		return;	}	n = read(fd, buf, sizeof(buf));	if(n < 0) {		Bprint(&out, "\n");		return;	}	buf[n-1] = 0;	Bprint(&out, "%s\n", buf);} char*getport(char *net, char *p){	Ndbs s;	static Ndbtuple *t;	static Ndbtuple *nt; 	t = ndbsearch(ndb, &s, "port", p);	while(t){		for(nt = t; nt; nt = nt->entry) {			if(strcmp(nt->attr, net) == 0)				return nt->val;		}		ndbfree(t);		t = ndbsnext(&s, "port", p);	}	return p;} voidpip(char *net, char *entry){	Dir db;	Ipinfo ipi;	int n, fd;	char buf[128], *p, *t; 	if(strcmp(entry, "clone") == 0)		return; 	sprint(buf, "/net/%s/%s/ctl", net, entry);	if(dirstat(buf, &db) < 0)		return; 	sprint(buf, "/net/%s/%s/status", net, entry);	fd = open(buf, OREAD);	if(fd < 0)		return;	n = read(fd, buf, sizeof(buf));	if(n < 0)		return;	buf[n] = 0;	close(fd); 	p = " Dgram";	if(strcmp(net, "udp") != 0) {		p = strchr(buf, ' ');		if(p == 0)			return;		p = strchr(p+1, ' ');		if(p == 0)			return;		t = strchr(p+1, ' ');		if(t == 0)			return;		*t = 0;	}	Bprint(&out, "%-4s %-4s %-10s %-12s ", net, entry, db.uid, p); 	sprint(buf, "/net/%s/%s/local", net, entry);	fd = open(buf, OREAD);	if(fd < 0) {		Bprint(&out, "\n");		return;	}	n = read(fd, buf, sizeof(buf));	if(n < 0) {		Bprint(&out, "\n");		return;	}	buf[n-1] = 0;	close(fd);	p = strchr(buf, '!');	if(p == 0) {		Bprint(&out, "\n");		return;	}	*p = '\0';	Bprint(&out, "%-10s ", getport(net, p+1)); 	sprint(buf, "/net/%s/%s/remote", net, entry);	fd = open(buf, OREAD);	if(fd < 0) {		print("\n");		return;	}	n = read(fd, buf, sizeof(buf));	if(n < 0) {		print("\n");		return;	}	buf[n-1] = 0;	close(fd);	p = strchr(buf, '!');	*p++ = '\0'; 	n = ipinfo(ndb, 0, buf, 0, &ipi);	if(n < 0) {		Bprint(&out, "%-10s %s\n", getport(net, p), buf);		return;	}	Bprint(&out, "%-10s %s\n", getport(net, p), ipi.domain);}