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