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*);
77dd7cddfSDavid du Colombier int cmp(void*, void*);
83e12c5d1SDavid du Colombier
99a747e4fSDavid du Colombier Biobuf bout;
107dd7cddfSDavid du Colombier int pflag;
119a747e4fSDavid du Colombier int aflag;
12*3b56890dSDavid du Colombier int rflag;
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier void
main(int argc,char * argv[])153e12c5d1SDavid du Colombier main(int argc, char *argv[])
163e12c5d1SDavid du Colombier {
179a747e4fSDavid du Colombier int fd, i, tot, none = 1;
189a747e4fSDavid du Colombier Dir *dir, **mem;
193e12c5d1SDavid du Colombier
207dd7cddfSDavid du Colombier
217dd7cddfSDavid du Colombier ARGBEGIN {
229a747e4fSDavid du Colombier case 'a':
239a747e4fSDavid du Colombier aflag++;
249a747e4fSDavid du Colombier break;
257dd7cddfSDavid du Colombier case 'p':
267dd7cddfSDavid du Colombier pflag++;
277dd7cddfSDavid du Colombier break;
28*3b56890dSDavid du Colombier case 'r':
29*3b56890dSDavid du Colombier rflag++;
30*3b56890dSDavid du Colombier break;
317dd7cddfSDavid du Colombier } ARGEND;
329a747e4fSDavid du Colombier Binit(&bout, 1, OWRITE);
333e12c5d1SDavid du Colombier if(chdir("/proc")==-1)
343e12c5d1SDavid du Colombier error("/proc");
353e12c5d1SDavid du Colombier fd=open(".", OREAD);
363e12c5d1SDavid du Colombier if(fd<0)
373e12c5d1SDavid du Colombier error("/proc");
389a747e4fSDavid du Colombier tot = dirreadall(fd, &dir);
399a747e4fSDavid du Colombier if(tot <= 0){
409a747e4fSDavid du Colombier fprint(2, "ps: empty directory /proc\n");
419a747e4fSDavid du Colombier exits("empty");
423e12c5d1SDavid du Colombier }
439a747e4fSDavid du Colombier mem = malloc(tot*sizeof(Dir*));
449a747e4fSDavid du Colombier for(i=0; i<tot; i++)
459a747e4fSDavid du Colombier mem[i] = dir++;
469a747e4fSDavid du Colombier
479a747e4fSDavid du Colombier qsort(mem, tot, sizeof(Dir*), cmp);
489a747e4fSDavid du Colombier for(i=0; i<tot; i++){
499a747e4fSDavid du Colombier ps(mem[i]->name);
503e12c5d1SDavid du Colombier none = 0;
513e12c5d1SDavid du Colombier }
523e12c5d1SDavid du Colombier
533e12c5d1SDavid du Colombier if(none)
543e12c5d1SDavid du Colombier error("no processes; bad #p");
553e12c5d1SDavid du Colombier exits(0);
563e12c5d1SDavid du Colombier }
573e12c5d1SDavid du Colombier
583e12c5d1SDavid du Colombier void
ps(char * s)593e12c5d1SDavid du Colombier ps(char *s)
603e12c5d1SDavid du Colombier {
61*3b56890dSDavid du Colombier ulong utime, stime, rtime, size;
626c0bae65SDavid du Colombier int argc, basepri, fd, i, n, pri;
63*3b56890dSDavid du Colombier char args[256], *argv[16], buf[64], pbuf[8], rbuf[20], rbuf1[20], status[4096];
643e12c5d1SDavid du Colombier
653e12c5d1SDavid du Colombier sprint(buf, "%s/status", s);
663e12c5d1SDavid du Colombier fd = open(buf, OREAD);
673e12c5d1SDavid du Colombier if(fd<0)
683e12c5d1SDavid du Colombier return;
699a747e4fSDavid du Colombier n = read(fd, status, sizeof status-1);
709a747e4fSDavid du Colombier close(fd);
719a747e4fSDavid du Colombier if(n <= 0)
729a747e4fSDavid du Colombier return;
739a747e4fSDavid du Colombier status[n] = '\0';
746c0bae65SDavid du Colombier
756c0bae65SDavid du Colombier if((argc = tokenize(status, argv, nelem(argv)-1)) < 12)
769a747e4fSDavid du Colombier return;
776c0bae65SDavid du Colombier argv[argc] = 0;
786c0bae65SDavid du Colombier
796c0bae65SDavid du Colombier /*
806c0bae65SDavid du Colombier * 0 text
816c0bae65SDavid du Colombier * 1 user
826c0bae65SDavid du Colombier * 2 state
836c0bae65SDavid du Colombier * 3 cputime[6]
846c0bae65SDavid du Colombier * 9 memory
856c0bae65SDavid du Colombier * 10 basepri
866c0bae65SDavid du Colombier * 11 pri
876c0bae65SDavid du Colombier */
886c0bae65SDavid du Colombier utime = strtoul(argv[3], 0, 0)/1000;
896c0bae65SDavid du Colombier stime = strtoul(argv[4], 0, 0)/1000;
90*3b56890dSDavid du Colombier rtime = strtoul(argv[5], 0, 0)/1000;
916c0bae65SDavid du Colombier size = strtoul(argv[9], 0, 0);
927dd7cddfSDavid du Colombier if(pflag){
936c0bae65SDavid du Colombier basepri = strtoul(argv[10], 0, 0);
946c0bae65SDavid du Colombier pri = strtoul(argv[11], 0, 0);
957dd7cddfSDavid du Colombier sprint(pbuf, " %2d %2d", basepri, pri);
967dd7cddfSDavid du Colombier } else
977dd7cddfSDavid du Colombier pbuf[0] = 0;
98*3b56890dSDavid du Colombier
99*3b56890dSDavid du Colombier if(rflag){
100*3b56890dSDavid du Colombier if(rtime >= 86400)
101*3b56890dSDavid du Colombier sprint(rbuf, " %lud:%02lud:%02lud:%02lud", rtime/86400, (rtime/3600)%24, (rtime/60)%60, rtime%60);
102*3b56890dSDavid du Colombier else if(rtime >= 3600)
103*3b56890dSDavid du Colombier sprint(rbuf, " %lud:%02lud:%02lud", rtime/3600, (rtime/60)%60, rtime%60);
104*3b56890dSDavid du Colombier else
105*3b56890dSDavid du Colombier sprint(rbuf, " %lud:%02lud", rtime/60, rtime%60);
106*3b56890dSDavid du Colombier sprint(rbuf1, "%12s", rbuf);
107*3b56890dSDavid du Colombier }else
108*3b56890dSDavid du Colombier rbuf1[0] = 0;
109*3b56890dSDavid du Colombier
110*3b56890dSDavid du Colombier Bprint(&bout, "%-10s %8s%s %4lud:%.2lud %3lud:%.2lud %s %7ludK %-8.8s ",
1116c0bae65SDavid du Colombier argv[1],
1123e12c5d1SDavid du Colombier s,
113*3b56890dSDavid du Colombier rbuf1,
1143e12c5d1SDavid du Colombier utime/60, utime%60,
1153e12c5d1SDavid du Colombier stime/60, stime%60,
1167dd7cddfSDavid du Colombier pbuf,
1173e12c5d1SDavid du Colombier size,
1186c0bae65SDavid du Colombier argv[2]);
1199a747e4fSDavid du Colombier
1209a747e4fSDavid du Colombier if(aflag == 0){
1219a747e4fSDavid du Colombier Noargs:
1226c0bae65SDavid du Colombier Bprint(&bout, "%s\n", argv[0]);
1239a747e4fSDavid du Colombier return;
1243e12c5d1SDavid du Colombier }
1259a747e4fSDavid du Colombier
1269a747e4fSDavid du Colombier sprint(buf, "%s/args", s);
1279a747e4fSDavid du Colombier fd = open(buf, OREAD);
1289a747e4fSDavid du Colombier if(fd < 0)
1299a747e4fSDavid du Colombier goto Badargs;
1309a747e4fSDavid du Colombier n = read(fd, args, sizeof args-1);
1313e12c5d1SDavid du Colombier close(fd);
1329a747e4fSDavid du Colombier if(n < 0)
1339a747e4fSDavid du Colombier goto Badargs;
1349a747e4fSDavid du Colombier if(n == 0)
1359a747e4fSDavid du Colombier goto Noargs;
1369a747e4fSDavid du Colombier args[n] = '\0';
1379a747e4fSDavid du Colombier for(i=0; i<n; i++)
1389a747e4fSDavid du Colombier if(args[i] == '\n')
1399a747e4fSDavid du Colombier args[i] = ' ';
1409a747e4fSDavid du Colombier Bprint(&bout, "%s\n", args);
1419a747e4fSDavid du Colombier return;
1429a747e4fSDavid du Colombier
1439a747e4fSDavid du Colombier Badargs:
1446c0bae65SDavid du Colombier Bprint(&bout, "%s ?\n", argv[0]);
1453e12c5d1SDavid du Colombier }
1463e12c5d1SDavid du Colombier
1473e12c5d1SDavid du Colombier void
error(char * s)1483e12c5d1SDavid du Colombier error(char *s)
1493e12c5d1SDavid du Colombier {
1503e12c5d1SDavid du Colombier fprint(2, "ps: %s: ", s);
1513e12c5d1SDavid du Colombier perror("error");
1523e12c5d1SDavid du Colombier exits(s);
1533e12c5d1SDavid du Colombier }
154219b2ee8SDavid du Colombier
155219b2ee8SDavid du Colombier int
cmp(void * va,void * vb)1567dd7cddfSDavid du Colombier cmp(void *va, void *vb)
157219b2ee8SDavid du Colombier {
1589a747e4fSDavid du Colombier Dir **a, **b;
1597dd7cddfSDavid du Colombier
1607dd7cddfSDavid du Colombier a = va;
1617dd7cddfSDavid du Colombier b = vb;
1629a747e4fSDavid du Colombier return atoi((*a)->name) - atoi((*b)->name);
163219b2ee8SDavid du Colombier }
164