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