13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier void ps(char*); 63e12c5d1SDavid du Colombier void error(char*); 73e12c5d1SDavid du Colombier int cmp(char*, char*); 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier Biobuf bin; 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier void 123e12c5d1SDavid du Colombier main(int argc, char *argv[]) 133e12c5d1SDavid du Colombier { 143e12c5d1SDavid du Colombier int fd, i, n, tot, none = 1; 153e12c5d1SDavid du Colombier char dir[500*DIRLEN], *mem; 163e12c5d1SDavid du Colombier 173e12c5d1SDavid du Colombier USED(argc, argv); 183e12c5d1SDavid du Colombier Binit(&bin, 1, OWRITE); 193e12c5d1SDavid du Colombier if(chdir("/proc")==-1) 203e12c5d1SDavid du Colombier error("/proc"); 213e12c5d1SDavid du Colombier fd=open(".", OREAD); 223e12c5d1SDavid du Colombier if(fd<0) 233e12c5d1SDavid du Colombier error("/proc"); 243e12c5d1SDavid du Colombier mem = sbrk(0); 253e12c5d1SDavid du Colombier tot = 0; 263e12c5d1SDavid du Colombier while((n = read(fd, dir, sizeof dir)) > 0){ 273e12c5d1SDavid du Colombier if(brk((void*)(mem + tot + n)) == -1) 283e12c5d1SDavid du Colombier error("out of memory"); 293e12c5d1SDavid du Colombier memmove(mem+tot, dir, n); 303e12c5d1SDavid du Colombier tot += n; 313e12c5d1SDavid du Colombier } 323e12c5d1SDavid du Colombier qsort(mem, tot/DIRLEN, DIRLEN, cmp); 333e12c5d1SDavid du Colombier for(i=0; i<tot; i+=DIRLEN){ 343e12c5d1SDavid du Colombier ps(mem+i); 353e12c5d1SDavid du Colombier none = 0; 363e12c5d1SDavid du Colombier } 373e12c5d1SDavid du Colombier 383e12c5d1SDavid du Colombier if(none) 393e12c5d1SDavid du Colombier error("no processes; bad #p"); 403e12c5d1SDavid du Colombier exits(0); 413e12c5d1SDavid du Colombier } 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier void 443e12c5d1SDavid du Colombier ps(char *s) 453e12c5d1SDavid du Colombier { 463e12c5d1SDavid du Colombier int fd; 473e12c5d1SDavid du Colombier char buf[64]; 483e12c5d1SDavid du Colombier long utime, stime, size; 493e12c5d1SDavid du Colombier char status[2*NAMELEN+12+7*12]; 503e12c5d1SDavid du Colombier char *p; 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier sprint(buf, "%s/status", s); 533e12c5d1SDavid du Colombier fd = open(buf, OREAD); 543e12c5d1SDavid du Colombier if(fd<0) 553e12c5d1SDavid du Colombier return; 563e12c5d1SDavid du Colombier memset(status, 0, sizeof status); 573e12c5d1SDavid du Colombier if(read(fd, status, sizeof status) > 0){ 583e12c5d1SDavid du Colombier p = strchr(status, ' '); 593e12c5d1SDavid du Colombier if(!p) 603e12c5d1SDavid du Colombier goto Return; 613e12c5d1SDavid du Colombier *p = 0; 623e12c5d1SDavid du Colombier p = strchr(status+NAMELEN, ' '); 633e12c5d1SDavid du Colombier if(!p) 643e12c5d1SDavid du Colombier goto Return; 653e12c5d1SDavid du Colombier *p = 0; 663e12c5d1SDavid du Colombier status[2*NAMELEN+12-1] = 0; 673e12c5d1SDavid du Colombier utime = atol(status+2*NAMELEN+12)/1000; 683e12c5d1SDavid du Colombier stime = atol(status+2*NAMELEN+12+1*12)/1000; 693e12c5d1SDavid du Colombier size = atol(status+2*NAMELEN+12+6*12); 703e12c5d1SDavid du Colombier Bprint(&bin, "%-8s %6s %4ld:%.2ld %3ld:%.2ld %5ldK %-.8s %s\n", 713e12c5d1SDavid du Colombier status+NAMELEN, 723e12c5d1SDavid du Colombier s, 733e12c5d1SDavid du Colombier utime/60, utime%60, 743e12c5d1SDavid du Colombier stime/60, stime%60, 753e12c5d1SDavid du Colombier size, 763e12c5d1SDavid du Colombier status+2*NAMELEN, 773e12c5d1SDavid du Colombier status); 783e12c5d1SDavid du Colombier } 793e12c5d1SDavid du Colombier Return: 803e12c5d1SDavid du Colombier close(fd); 813e12c5d1SDavid du Colombier } 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier void 843e12c5d1SDavid du Colombier error(char *s) 853e12c5d1SDavid du Colombier { 863e12c5d1SDavid du Colombier fprint(2, "ps: %s: ", s); 873e12c5d1SDavid du Colombier perror("error"); 883e12c5d1SDavid du Colombier exits(s); 893e12c5d1SDavid du Colombier } 90*219b2ee8SDavid du Colombier 91*219b2ee8SDavid du Colombier int 92*219b2ee8SDavid du Colombier cmp(char *a, char *b) 93*219b2ee8SDavid du Colombier { 94*219b2ee8SDavid du Colombier return atoi(a) - atoi(b); 95*219b2ee8SDavid du Colombier } 96