Commit | Line | Data |
---|---|---|
a299af2c KT |
1 | # |
2 | ||
3 | /* | |
4 | * ps - process status | |
5 | * examine and print certain things about processes | |
6 | */ | |
7 | ||
8 | #include "/usr/sys/param.h" | |
9 | #include "/usr/sys/proc.h" | |
10 | #include "/usr/sys/tty.h" | |
11 | #include "/usr/sys/user.h" | |
12 | ||
13 | struct { | |
14 | char name[8]; | |
15 | int type; | |
16 | char *value; | |
17 | } nl[3]; | |
18 | ||
19 | struct proc proc[NPROC]; | |
20 | struct tty tty; | |
21 | struct user u; | |
22 | int lflg; | |
23 | int kflg; | |
24 | int xflg; | |
25 | int tflg; | |
26 | int aflg; | |
27 | int mem; | |
28 | int swap; | |
29 | ||
30 | int stbuf[257]; | |
31 | int ndev; | |
32 | char devc[65]; | |
33 | int devl[65]; | |
34 | int devt[65]; | |
35 | char *coref; | |
36 | struct ibuf { | |
37 | char idevmin, idevmaj; | |
38 | int inum; | |
39 | int iflags; | |
40 | char inl; | |
41 | char iuid; | |
42 | char igid; | |
43 | char isize0; | |
44 | int isize; | |
45 | int iaddr[8]; | |
46 | char *ictime[2]; | |
47 | char *imtime[2]; | |
48 | int fill; | |
49 | }; | |
50 | int obuf[259]; | |
51 | ||
52 | ||
53 | main(argc, argv) | |
54 | char **argv; | |
55 | { | |
56 | struct proc *p; | |
57 | int n, b; | |
58 | int i, c, mtty; | |
59 | char *ap; | |
60 | int uid, puid; | |
61 | ||
62 | obuf[0] = 1; | |
63 | if (argc>1) { | |
64 | ap = argv[1]; | |
65 | while (*ap) switch (*ap++) { | |
66 | case 'a': | |
67 | aflg++; | |
68 | break; | |
69 | ||
70 | case 't': | |
71 | tflg++; | |
72 | break; | |
73 | ||
74 | case 'x': | |
75 | xflg++; | |
76 | break; | |
77 | ||
78 | case 'l': | |
79 | lflg++; | |
80 | break; | |
81 | ||
82 | case 'k': | |
83 | kflg++; | |
84 | break; | |
85 | ||
86 | } | |
87 | } | |
88 | ||
89 | if(chdir("/dev") < 0) { | |
90 | printf("cannot change to /dev\n"); | |
91 | done(); | |
92 | } | |
93 | setup(&nl[0], "_proc"); | |
94 | setup(&nl[1], "_swapdev"); | |
95 | nlist(argc>2? argv[2]:"/unix", nl); | |
96 | if (nl[0].type==0) { | |
97 | printf("No namelist\n"); | |
98 | return; | |
99 | } | |
100 | coref = "/dev/mem"; | |
101 | if(kflg) | |
102 | coref = "/usr/sys/core"; | |
103 | if ((mem = open(coref, 0)) < 0) { | |
104 | printf("No mem\n"); | |
105 | done(); | |
106 | } | |
107 | seek(mem, nl[1].value, 0); | |
108 | read(mem, &nl[1].value, 2); | |
109 | seek(mem, nl[0].value, 0); | |
110 | read(mem, proc, sizeof proc); | |
111 | getdev(); | |
112 | mtty = ttyn(0); | |
113 | uid = getuid() & 0377; | |
114 | if(lflg) | |
115 | printf("TTY F S UID PID PRI ADDR SZ WCHAN COMMAND\n"); else | |
116 | printf("TTY PID COMMAND\n"); | |
117 | for (i=0; i<NPROC; i++) { | |
118 | if (proc[i].p_stat==0) | |
119 | continue; | |
120 | if (proc[i].p_ttyp==0) { | |
121 | if (xflg==0) | |
122 | continue; | |
123 | c = '?'; | |
124 | } else { | |
125 | for(c=0; c<ndev; c++) | |
126 | if(devt[c] == proc[i].p_ttyp) { | |
127 | c = devc[c]; | |
128 | goto out; | |
129 | } | |
130 | seek(mem, proc[i].p_ttyp, 0); | |
131 | read(mem, &tty, sizeof tty); | |
132 | for(c=0; c<ndev; c++) | |
133 | if(devl[c] == tty.t_dev) { | |
134 | devt[c] = proc[i].p_ttyp; | |
135 | c = devc[c]; | |
136 | goto out; | |
137 | } | |
138 | c = '?'; | |
139 | out:; | |
140 | } | |
141 | puid = proc[i].p_uid & 0377; | |
142 | if (uid != puid && aflg==0) | |
143 | continue; | |
144 | if (lflg || c!=mtty) | |
145 | printf("%c:", c); | |
146 | else | |
147 | printf(" "); | |
148 | if (lflg) { | |
149 | printf("%3o %c%4d", proc[i].p_flag, | |
150 | "0SWRIZT"[proc[i].p_stat], puid); | |
151 | } | |
152 | printf("%6l", proc[i].p_pid); | |
153 | if (lflg) { | |
154 | printf("%4d%5o%4d", proc[i].p_pri, proc[i].p_addr, | |
155 | (proc[i].p_size+7)>>3); | |
156 | if (proc[i].p_wchan) | |
157 | printf("%7o", proc[i].p_wchan); else | |
158 | printf(" "); | |
159 | } | |
160 | if (proc[i].p_stat==5) | |
161 | printf(" <defunct>"); | |
162 | else | |
163 | prcom(i); | |
164 | printf("\n"); | |
165 | } | |
166 | done(); | |
167 | } | |
168 | ||
169 | getdev() | |
170 | { | |
171 | register struct { int dir_ino; char dir_n[14]; } *p; | |
172 | register i, c; | |
173 | int f; | |
174 | char dbuf[512]; | |
175 | int sbuf[20]; | |
176 | ||
177 | f = open("/dev"); | |
178 | if(f < 0) { | |
179 | printf("cannot open /dev\n"); | |
180 | done(); | |
181 | } | |
182 | swap = -1; | |
183 | c = 0; | |
184 | ||
185 | loop: | |
186 | i = read(f, dbuf, 512); | |
187 | if(i <= 0) { | |
188 | close(f); | |
189 | if(swap < 0) { | |
190 | printf("no swap device\n"); | |
191 | done(); | |
192 | } | |
193 | ndev = c; | |
194 | return; | |
195 | } | |
196 | while(i < 512) | |
197 | dbuf[i++] = 0; | |
198 | for(p = dbuf; p < dbuf+512; p++) { | |
199 | if(p->dir_ino == 0) | |
200 | continue; | |
201 | if(p->dir_n[0] == 't' && | |
202 | p->dir_n[1] == 't' && | |
203 | p->dir_n[2] == 'y' && | |
204 | p->dir_n[4] == 0 && | |
205 | p->dir_n[3] != 0) { | |
206 | if(stat(p->dir_n, sbuf) < 0) | |
207 | continue; | |
208 | devc[c] = p->dir_n[3]; | |
209 | devl[c] = sbuf->iaddr[0]; | |
210 | c++; | |
211 | continue; | |
212 | } | |
213 | if(swap >= 0) | |
214 | continue; | |
215 | if(stat(p->dir_n, sbuf) < 0) | |
216 | continue; | |
217 | if((sbuf->iflags & 060000) != 060000) | |
218 | continue; | |
219 | if(sbuf->iaddr[0] == nl[1].value) | |
220 | swap = open(p->dir_n, 0); | |
221 | } | |
222 | goto loop; | |
223 | } | |
224 | ||
225 | setup(p, s) | |
226 | char *p, *s; | |
227 | { | |
228 | while (*p++ = *s++); | |
229 | } | |
230 | ||
231 | prcom(i) | |
232 | { | |
233 | int baddr, laddr, mf; | |
234 | register int *ip; | |
235 | register char *cp, *cp1; | |
236 | int c, nbad; | |
237 | ||
238 | baddr = 0; | |
239 | laddr = 0; | |
240 | if (proc[i].p_flag&SLOAD) { | |
241 | laddr = proc[i].p_addr; | |
242 | mf = mem; | |
243 | } else { | |
244 | baddr = proc[i].p_addr; | |
245 | mf = swap; | |
246 | } | |
247 | laddr =+ proc[i].p_size - 8; | |
248 | baddr =+ laddr>>3; | |
249 | laddr = (laddr&07)<<6; | |
250 | seek(mf, baddr, 3); | |
251 | seek(mf, laddr, 1); | |
252 | if (read(mf, stbuf, 512) != 512) | |
253 | return(0); | |
254 | for (ip = &stbuf[256]; ip > &stbuf[0];) { | |
255 | if (*--ip == -1) { | |
256 | cp = ip+1; | |
257 | if (*cp==0) | |
258 | cp++; | |
259 | nbad = 0; | |
260 | for (cp1 = cp; cp1 < &stbuf[256]; cp1++) { | |
261 | c = *cp1; | |
262 | if (c==0) | |
263 | *cp1 = ' '; | |
264 | else if (c < ' ' || c > 0176) { | |
265 | if (++nbad >= 5) { | |
266 | *cp1++ = ' '; | |
267 | break; | |
268 | } | |
269 | *cp1 = '?'; | |
270 | } | |
271 | } | |
272 | while (*--cp1==' ') | |
273 | *cp1 = 0; | |
274 | printf(lflg?" %.16s":" %.64s", cp); | |
275 | return(1); | |
276 | } | |
277 | } | |
278 | return(0); | |
279 | } | |
280 | ||
281 | done() | |
282 | { | |
283 | ||
284 | fflush(obuf); | |
285 | exit(); | |
286 | } | |
287 | ||
288 | putchar(c) | |
289 | { | |
290 | ||
291 | putc(c, obuf); | |
292 | } |