|
|
1.1 root 1: #include <stdio.h>
2: #include "ps.h"
3:
4: struct proc proc;
5:
6: union { struct user user; char userchars[UPAGES*NBPG]; } usp;
7: #define u usp.user
8: #define upages usp.userchars
9:
10: static char tmpstr[4096]; static Xflag;
11:
12: char *memf;
13: char *drumf;
14: char *nlistf;
15:
16: main(argc, argv)
17: int argc; char **argv;
18: {
19: register Entry *ep;
20: register Psline *ps; Psline *psbegin, *psend;
21: register char *cp; register ncp, fd;
22:
23: progname=argv[0];
24: initttys();
25: myuid = getuid();
26: mypid = getpid();
27: if (argc > 1)
28: selbeg = selend = Malloc(Select, argc-1);
29: doarg(*++argv); /* eh? */
30: Xflag = xflag && !tflag;
31: while (--argc > 1)
32: doarg(*++argv);
33: openfiles();
34: if (hflag)
35: hprint();
36: if (Nflag && !tflag && !Fflag) {
37: register Select *sp;
38: Nflag = tflag = 0;
39: ++aflag; ++xflag;
40: for (sp=selbeg; sp<selend; sp++) {
41: if ((fd = doselect(sp->id, &proc, &u)) < 0)
42: continue;
43: if (printp(tmpstr, fd, &proc, &u) > tmpstr)
44: printf("%s", tmpstr);
45: }
46: exit(0);
47: }
48:
49: if ((prlist = getprlist()) == 0)
50: error("can't getdir /proc");
51: if ((psbegin = Malloc(Psline, prlist->nentry)) == 0)
52: error("can't malloc ps line table");
53:
54: for (ps = psbegin, ep = prlist->begin; ep; ep = ep->next) {
55: if ((fd = doselect(ep->e_name, &proc, &u)) < 0)
56: continue;
57: if ((cp = printp(tmpstr, fd, &proc, &u)) <= tmpstr)
58: continue;
59: if (nflag) {
60: printf("%s", tmpstr);
61: continue;
62: }
63: ncp = cp - tmpstr + 1;
64: ps->string = memcpy(malloc(ncp), tmpstr, ncp);
65: ps->weight = proc.p_pid;
66: if (uflag)
67: ps->weight += (1001 - (int)(1000.0*proc.p_pctcpu+0.5))<<16;
68: ps++;
69: }
70: if (!nflag) {
71: if((psend = ps) > psbegin)
72: qsort((char *)psbegin, psend - psbegin, sizeof(Psline), Pslcomp);
73: for (ps = psbegin; ps < psend; ps++)
74: printf("%s", ps->string);
75: }
76: exit(0);
77: }
78:
79: doarg(cp)
80: register char *cp;
81: {
82: struct stat fds;
83: register Select *sp;
84: char *strdup();
85: xflag = 0;
86: if (cp) do switch (*cp) {
87: case 0:
88: cp = 0; break;
89: case '-':
90: break;
91: case 't':
92: if (*++cp == '.') {
93: if (fstat(0, &fds) == 0) {
94: cp = gettty(fds.st_dev, fds.st_ino);
95: if (*cp == '?')
96: cp = 0;
97: else
98: cp = strdup(cp);
99: } else {
100: fprintf(stderr, "0: cannot fstat\n");
101: cp = 0;
102: }
103: }
104: if (cp) {
105: ++tflag;
106: sp = selend++;
107: sp->flag = SELTTY;
108: if (Xflag || xflag)
109: sp->flag |= SELXFL;
110: sp->id = cp;
111: cp = 0;
112: }
113: break;
114: case 'a':
115: aflag++; break;
116: case 'F':
117: if (stat(++cp, &fds) == 0) {
118: Fflag++;
119: sp = selend++;
120: sp->flag = SELFIL;
121: sp->id = cp;
122: sp->dev = fds.st_dev;
123: sp->ino = fds.st_ino;
124: } else
125: fprintf(stderr, "%s: cannot stat\n", cp);
126: cp = 0;
127: break;
128: case 'f':
129: fflag++, getfstab();
130: break;
131: case 'h':
132: hflag++; break;
133: case 'l':
134: lflag++; break;
135: case 'n':
136: nflag++; break;
137: case 'r':
138: rflag++; break;
139: case 'u':
140: uflag++; getlogins(); break;
141: case 'x':
142: xflag++; break;
143: case 'T':
144: Tflag++; break;
145:
146: case 'o':
147: mode = 1;
148: break;
149:
150: case 'M':
151: memf = cp+1;
152: cp = 0;
153: break;
154:
155: case 'D':
156: drumf = cp+1;
157: cp = 0;
158: break;
159:
160: case 'N':
161: nlistf = cp+1;
162: cp = 0;
163: break;
164:
165: default:
166: if (*cp < '0' || *cp > '9')
167: usage();
168: ++Nflag;
169: sp = selend++;
170: sp->flag = SELXFL;
171: sp->id = cp;
172: cp = 0;
173: } while (cp++);
174: return 0;
175: }
176:
177: Pslcomp(a, b)
178: Psline *a, *b;
179: {
180: return a->weight - b->weight;
181: }
182:
183: error(s)
184: char *s;
185: {
186: fprintf(stderr, "%s: %s\n", progname, s);
187: exit(1);
188: }
189:
190: usage()
191: {
192: fprintf(stderr, "Usage: %s [afhlnruxFt#] ...\n", progname);
193: exit(1);
194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.