xref: /inferno-os/appl/cmd/netstat.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Netstat;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsythsys: Sys;
5*37da2899SCharles.ForsythFD, Dir: import sys;
6*37da2899SCharles.Forsythfildes, open, fstat, read, dirread, fprint, print, tokenize: import sys;
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "draw.m";
9*37da2899SCharles.ForsythContext: import Draw;
10*37da2899SCharles.Forsyth
11*37da2899SCharles.ForsythNetstat: module
12*37da2899SCharles.Forsyth{
13*37da2899SCharles.Forsyth	init:	fn(ctxt: ref Context, argv: list of string);
14*37da2899SCharles.Forsyth};
15*37da2899SCharles.Forsyth
16*37da2899SCharles.Forsythstderr: ref FD;
17*37da2899SCharles.Forsyth
18*37da2899SCharles.Forsythinit(nil: ref Context, nil: list of string)
19*37da2899SCharles.Forsyth{
20*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
21*37da2899SCharles.Forsyth
22*37da2899SCharles.Forsyth	stderr = fildes(2);
23*37da2899SCharles.Forsyth
24*37da2899SCharles.Forsyth	nstat("/net/tcp", 1);
25*37da2899SCharles.Forsyth	nstat("/net/udp", 1);
26*37da2899SCharles.Forsyth	nstat("/net/il", 0);
27*37da2899SCharles.Forsyth}
28*37da2899SCharles.Forsyth
29*37da2899SCharles.Forsythnstat(file: string, whine: int)
30*37da2899SCharles.Forsyth{
31*37da2899SCharles.Forsyth	dir: Dir;
32*37da2899SCharles.Forsyth 	i, ok: int;
33*37da2899SCharles.Forsyth
34*37da2899SCharles.Forsyth	fd := open(file, sys->OREAD);
35*37da2899SCharles.Forsyth	if(fd == nil) {
36*37da2899SCharles.Forsyth		if(whine)
37*37da2899SCharles.Forsyth			fprint(stderr, "netstat: %s: %r\n", file);
38*37da2899SCharles.Forsyth		return;
39*37da2899SCharles.Forsyth	}
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsyth	(ok, dir) = fstat(fd);
42*37da2899SCharles.Forsyth	if(ok == -1) {
43*37da2899SCharles.Forsyth		fprint(stderr, "netstat: fstat %s: %r\n", file);
44*37da2899SCharles.Forsyth		fd = nil;
45*37da2899SCharles.Forsyth		return;
46*37da2899SCharles.Forsyth	}
47*37da2899SCharles.Forsyth	if((dir.mode&Sys->DMDIR) == 0) {
48*37da2899SCharles.Forsyth		fprint(stderr, "netstat: not a protocol directory: %s\n", file);
49*37da2899SCharles.Forsyth		return;
50*37da2899SCharles.Forsyth	}
51*37da2899SCharles.Forsyth	for(;;) {
52*37da2899SCharles.Forsyth		(n, d) := dirread(fd);
53*37da2899SCharles.Forsyth		if(n <= 0)
54*37da2899SCharles.Forsyth			break;
55*37da2899SCharles.Forsyth		for(i = 0; i < n; i++)
56*37da2899SCharles.Forsyth			if(d[i].name[0] <= '9')
57*37da2899SCharles.Forsyth				nsprint(file+"/"+d[i].name, d[i].uid);
58*37da2899SCharles.Forsyth	}
59*37da2899SCharles.Forsyth}
60*37da2899SCharles.Forsyth
61*37da2899SCharles.Forsythfc(file: string): string
62*37da2899SCharles.Forsyth{
63*37da2899SCharles.Forsyth	fd := open(file, sys->OREAD);
64*37da2899SCharles.Forsyth	if(fd == nil)
65*37da2899SCharles.Forsyth		return "??";
66*37da2899SCharles.Forsyth
67*37da2899SCharles.Forsyth	buf := array[64] of byte;
68*37da2899SCharles.Forsyth	n := read(fd, buf, len buf);
69*37da2899SCharles.Forsyth	if(n <= 1)
70*37da2899SCharles.Forsyth		return "??";
71*37da2899SCharles.Forsyth	if(int buf[n-1] == '\n')
72*37da2899SCharles.Forsyth		n--;
73*37da2899SCharles.Forsyth
74*37da2899SCharles.Forsyth	return string buf[0:n];
75*37da2899SCharles.Forsyth}
76*37da2899SCharles.Forsyth
77*37da2899SCharles.Forsythnsprint(name, user: string)
78*37da2899SCharles.Forsyth{
79*37da2899SCharles.Forsyth	n: int;
80*37da2899SCharles.Forsyth	s: list of string;
81*37da2899SCharles.Forsyth
82*37da2899SCharles.Forsyth	sr := fc(name+"/status");
83*37da2899SCharles.Forsyth	(n, s) = tokenize(sr, " ");
84*37da2899SCharles.Forsyth
85*37da2899SCharles.Forsyth	print("%-10s %-10s %-12s %-20s %s\n",
86*37da2899SCharles.Forsyth		name[5:],
87*37da2899SCharles.Forsyth		user,
88*37da2899SCharles.Forsyth		hd s,
89*37da2899SCharles.Forsyth		fc(name+"/local"),
90*37da2899SCharles.Forsyth		fc(name+"/remote"));
91*37da2899SCharles.Forsyth}
92