summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ps.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/ps.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ps.c')
-rwxr-xr-xsys/src/cmd/ps.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/sys/src/cmd/ps.c b/sys/src/cmd/ps.c
new file mode 100755
index 000000000..9ad1305a3
--- /dev/null
+++ b/sys/src/cmd/ps.c
@@ -0,0 +1,163 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+void ps(char*);
+void error(char*);
+int cmp(void*, void*);
+
+Biobuf bout;
+int pflag;
+int aflag;
+int rflag;
+
+void
+main(int argc, char *argv[])
+{
+ int fd, i, tot, none = 1;
+ Dir *dir, **mem;
+
+
+ ARGBEGIN {
+ case 'a':
+ aflag++;
+ break;
+ case 'p':
+ pflag++;
+ break;
+ case 'r':
+ rflag++;
+ break;
+ } ARGEND;
+ Binit(&bout, 1, OWRITE);
+ if(chdir("/proc")==-1)
+ error("/proc");
+ 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; i<tot; i++)
+ mem[i] = dir++;
+
+ qsort(mem, tot, sizeof(Dir*), cmp);
+ for(i=0; i<tot; i++){
+ ps(mem[i]->name);
+ none = 0;
+ }
+
+ if(none)
+ error("no processes; bad #p");
+ exits(0);
+}
+
+void
+ps(char *s)
+{
+ ulong utime, stime, rtime, size;
+ int argc, basepri, fd, i, n, pri;
+ char args[256], *argv[16], buf[64], pbuf[8], rbuf[20], rbuf1[20], status[4096];
+
+ sprint(buf, "%s/status", s);
+ fd = open(buf, OREAD);
+ if(fd<0)
+ return;
+ n = read(fd, status, sizeof status-1);
+ close(fd);
+ if(n <= 0)
+ return;
+ status[n] = '\0';
+
+ if((argc = tokenize(status, argv, nelem(argv)-1)) < 12)
+ return;
+ argv[argc] = 0;
+
+ /*
+ * 0 text
+ * 1 user
+ * 2 state
+ * 3 cputime[6]
+ * 9 memory
+ * 10 basepri
+ * 11 pri
+ */
+ utime = strtoul(argv[3], 0, 0)/1000;
+ stime = strtoul(argv[4], 0, 0)/1000;
+ rtime = strtoul(argv[5], 0, 0)/1000;
+ size = strtoul(argv[9], 0, 0);
+ if(pflag){
+ basepri = strtoul(argv[10], 0, 0);
+ pri = strtoul(argv[11], 0, 0);
+ sprint(pbuf, " %2d %2d", basepri, pri);
+ } else
+ pbuf[0] = 0;
+
+ if(rflag){
+ if(rtime >= 86400)
+ sprint(rbuf, " %lud:%02lud:%02lud:%02lud", rtime/86400, (rtime/3600)%24, (rtime/60)%60, rtime%60);
+ else if(rtime >= 3600)
+ sprint(rbuf, " %lud:%02lud:%02lud", rtime/3600, (rtime/60)%60, rtime%60);
+ else
+ sprint(rbuf, " %lud:%02lud", rtime/60, rtime%60);
+ sprint(rbuf1, "%12s", rbuf);
+ }else
+ rbuf1[0] = 0;
+
+ Bprint(&bout, "%-10s %8s%s %4lud:%.2lud %3lud:%.2lud %s %7ludK %-8.8s ",
+ argv[1],
+ s,
+ rbuf1,
+ utime/60, utime%60,
+ stime/60, stime%60,
+ pbuf,
+ size,
+ argv[2]);
+
+ if(aflag == 0){
+ Noargs:
+ Bprint(&bout, "%s\n", argv[0]);
+ return;
+ }
+
+ sprint(buf, "%s/args", s);
+ fd = open(buf, OREAD);
+ if(fd < 0)
+ goto Badargs;
+ n = read(fd, args, sizeof args-1);
+ close(fd);
+ if(n < 0)
+ goto Badargs;
+ if(n == 0)
+ goto Noargs;
+ args[n] = '\0';
+ for(i=0; i<n; i++)
+ if(args[i] == '\n')
+ args[i] = ' ';
+ Bprint(&bout, "%s\n", args);
+ return;
+
+ Badargs:
+ Bprint(&bout, "%s ?\n", argv[0]);
+}
+
+void
+error(char *s)
+{
+ fprint(2, "ps: %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);
+}