#include #include #include #define NAMELEN 28 void lsof(char*); void error(char*); int cmp(void*, void*); Biobuf bout; void main(int argc, char *argv[]) { int fd, i, tot, none = 1; Dir *dir, **mem; Binit(&bout, 1, OWRITE); if(chdir("/proc")==-1) error("/proc"); if(argc > 1) { while(--argc && ++argv) lsof(*argv); exits(0); } fd=open(".", OREAD); if(fd<0) error("/proc"); tot = dirreadall(fd, &dir); if(tot <= 0){ fprint(2, "ps: empty directory /proc\n"); exits("empty"); } mem = malloc(tot*sizeof(Dir*)); for(i=0; iname); none = 0; } if(none) error("no processes; bad #p"); exits(0); } void lsof(char *s) { char buf[64]; Biobuf *bfd; char *p; sprint(buf, "%s/fd", s); bfd = Bopen(buf, OREAD); if(bfd == 0) return; if((p = Brdstr(bfd, '\n', 0)) != nil) /* skip cwd */ free(p); while((p = Brdstr(bfd, '\n', 0)) != nil) { Bprint(&bout, "%-8s %s", s, p+2); free(p); } Bterm(bfd); } void error(char *s) { fprint(2, "lsof: %s: ", s); perror("error"); exits(s); } int cmp(void *va, void *vb) { Dir **a, **b; a = va; b = vb; return atoi((*a)->name) - atoi((*b)->name); }