]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ps.c
vga: fix type in vga.font, make vga/unicode.font file
[plan9front.git] / sys / src / cmd / ps.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4
5 void    ps(char*);
6 void    error(char*);
7 int     cmp(void*, void*);
8
9 Biobuf  bout;
10 int     pflag;
11 int     aflag;
12 int     rflag;
13
14 void
15 main(int argc, char *argv[])
16 {
17         int fd, i, tot, none = 1;
18         Dir *dir, **mem;
19
20
21         ARGBEGIN {
22         case 'a':
23                 aflag++;
24                 break;
25         case 'p':
26                 pflag++;
27                 break;
28         case 'r':
29                 rflag++;
30                 break;
31         } ARGEND;
32         Binit(&bout, 1, OWRITE);
33         if(chdir("/proc")==-1)
34                 error("/proc");
35         fd=open(".", OREAD);
36         if(fd<0)
37                 error("/proc");
38         tot = dirreadall(fd, &dir);
39         if(tot <= 0){
40                 fprint(2, "ps: empty directory /proc\n");
41                 exits("empty");
42         }
43         mem = malloc(tot*sizeof(Dir*));
44         for(i=0; i<tot; i++)
45                 mem[i] = dir++;
46
47         qsort(mem, tot, sizeof(Dir*), cmp);
48         for(i=0; i<tot; i++){
49                 ps(mem[i]->name);
50                 none = 0;
51         }
52
53         if(none)
54                 error("no processes; bad #p");
55         exits(0);
56 }
57
58 void
59 ps(char *s)
60 {
61         ulong utime, stime, rtime, size;
62         int argc, basepri, fd, i, n, pri;
63         char args[256], *argv[16], buf[64], pbuf[8], rbuf[20], rbuf1[20], status[4096];
64
65         sprint(buf, "%s/status", s);
66         fd = open(buf, OREAD);
67         if(fd<0)
68                 return;
69         n = read(fd, status, sizeof status-1);
70         close(fd);
71         if(n <= 0)
72                 return;
73         status[n] = '\0';
74
75         if((argc = tokenize(status, argv, nelem(argv)-1)) < 12)
76                 return;
77         argv[argc] = 0;
78
79         /*
80          * 0  text
81          * 1  user
82          * 2  state
83          * 3  cputime[6]
84          * 9  memory
85          * 10 basepri
86          * 11 pri
87          */
88         utime = strtoul(argv[3], 0, 0)/1000;
89         stime = strtoul(argv[4], 0, 0)/1000;
90         rtime = strtoul(argv[5], 0, 0)/1000;
91         size  = strtoul(argv[9], 0, 0);
92         if(pflag){
93                 basepri = strtoul(argv[10], 0, 0);
94                 pri = strtoul(argv[11], 0, 0);
95                 sprint(pbuf, " %2d %2d", basepri, pri);
96         } else
97                 pbuf[0] = 0;
98
99         if(rflag){
100                 if(rtime >= 86400)
101                         sprint(rbuf, " %lud:%02lud:%02lud:%02lud", rtime/86400, (rtime/3600)%24, (rtime/60)%60, rtime%60);
102                 else if(rtime >= 3600)
103                         sprint(rbuf, " %lud:%02lud:%02lud", rtime/3600, (rtime/60)%60, rtime%60);
104                 else
105                         sprint(rbuf, " %lud:%02lud", rtime/60, rtime%60);
106                 sprint(rbuf1, "%12s", rbuf);
107         }else
108                 rbuf1[0] = 0;
109
110         Bprint(&bout, "%-10s %8s%s %4lud:%.2lud %3lud:%.2lud %s %7ludK %-8.8s ",
111                         argv[1],
112                         s,
113                         rbuf1,
114                         utime/60, utime%60,
115                         stime/60, stime%60,
116                         pbuf,
117                         size,
118                         argv[2]);
119
120         if(aflag == 0){
121     Noargs:
122                 Bprint(&bout, "%s\n", argv[0]);
123                 return;
124         }
125
126         sprint(buf, "%s/args", s);
127         fd = open(buf, OREAD);
128         if(fd < 0)
129                 goto Badargs;
130         n = read(fd, args, sizeof args-1);
131         close(fd);
132         if(n < 0)
133                 goto Badargs;
134         if(n == 0)
135                 goto Noargs;
136         args[n] = '\0';
137         for(i=0; i<n; i++)
138                 if(args[i] == '\n')
139                         args[i] = ' ';
140         Bprint(&bout, "%s\n", args);
141         return;
142
143     Badargs:
144         Bprint(&bout, "%s ?\n", argv[0]);
145 }
146
147 void
148 error(char *s)
149 {
150         fprint(2, "ps: %s: ", s);
151         perror("error");
152         exits(s);
153 }
154
155 int
156 cmp(void *va, void *vb)
157 {
158         Dir **a, **b;
159
160         a = va;
161         b = vb;
162         return atoi((*a)->name) - atoi((*b)->name);
163 }