ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/cmd/ps.b/
implement Ps;
include "sys.m";
include "draw.m";
FD, Dir: import Sys;
Context: import Draw;
Ps: module
{
init: fn(ctxt: ref Context, argv: list of string);
};
sys: Sys;
stderr: ref FD;
init(nil: ref Context, nil: list of string)
{
sys = load Sys Sys->PATH;
stderr = sys->fildes(2);
sys->pctl(Sys->FORKNS, nil);
if(sys->chdir("/prog") < 0){
sys->fprint(stderr, "ps: can't chdir to /prog: %r\n");
raise "fail:no /prog";
}
fd := sys->open(".", sys->OREAD);
if(fd == nil) {
sys->fprint(stderr, "ps: cannot open /prog: %r\n");
raise "fail:no /prog";
}
for(;;) {
(n, d) := sys->dirread(fd);
if(n <= 0){
if(n < 0) {
sys->fprint(stderr, "ps: error reading /prog: %r\n");
raise "fail:error on /prog";
}
break;
}
for(i := 0; i < n; i++)
if(d[i].name[0] >= '0' && d[i].name[0] <= '9')
ps(int d[i].name);
}
}
ps(pid: int)
{
proc := string pid+"/status";
fd := sys->open(proc, sys->OREAD);
if(fd == nil) { # process must have died
# sys->fprint(stderr, "ps: /prog/%s: %r\n", proc);
return;
}
buf := array[128] of byte;
n := sys->read(fd, buf, len buf);
if(n > 0)
sys->print("%s\n", string buf[0:n]);
}