|
|
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: main(argc, argv)
13: int argc; char **argv;
14: {
15: register struct direct *dp;
16: register Psline *ps; Psline *psbegin, *psend;
17: register char *cp; register ncp, fd;
18: Dirnode *nlist;
19:
20: progname=argv[0];
21:
22: if ((nlist = getdir("/dev", devlist)) != 0)
23: devlist = nlist;
24: if ((nlist = getdir("/dev/dk", devlist)) != 0)
25: devlist = nlist;
26: if ((nlist = getdir("/dev/pt", devlist)) != 0)
27: devlist = nlist;
28: if ((drum = open("/dev/drum", 0)) < 0)
29: error("can't open /dev/drum");
30:
31: myuid = getuid(); mypid = getpid();
32:
33: if (argc > 1)
34: selbeg = selend = Malloc(Select, argc-1);
35: doarg(*++argv), Xflag = xflag && !tflag;
36: while (--argc > 1)
37: doarg(*++argv);
38:
39: if (hflag) {
40: if (uflag) printf("User %%cpu ");
41: if (lflag) printf("size rss ppid wchan ");
42: printf(" pid tty stat time command\n");
43: }
44:
45: if (Nflag && !tflag && !Fflag) {
46: register Select *sp;
47: Nflag = tflag = 0;
48: ++aflag; ++xflag;
49: for (sp=selbeg; sp<selend; sp++) {
50: if ((fd = doselect(sp->id, &proc, &u)) < 0)
51: continue;
52: if (printp(tmpstr, fd, &proc, &u) > tmpstr)
53: printf("%s", tmpstr);
54: }
55: return 0;
56: }
57:
58: if ((prlist = getdir("/proc", 0)) == 0)
59: error("can't getdir /proc");
60: if ((psbegin = Malloc(Psline, prlist->end - prlist->begin)) == 0)
61: error("can't malloc ps line table");
62:
63: for (ps = psbegin, dp = prlist->begin; dp < prlist->end; dp++) {
64: if (dp->d_ino == 0 || dp->d_name[0] == '.')
65: continue;
66: if ((fd = doselect(dp->d_name, &proc, &u)) < 0)
67: continue;
68: if ((cp = printp(tmpstr, fd, &proc, &u)) <= tmpstr)
69: continue;
70: if (nflag) {
71: printf("%s", tmpstr);
72: continue;
73: }
74: ncp = cp - tmpstr + 1;
75: ps->string = memcpy(malloc(ncp), tmpstr, ncp);
76: ps->weight = proc.p_pid;
77: if (uflag)
78: ps->weight += (1001 - (int)(1000.0*proc.p_pctcpu+0.5))<<16;
79: ps++;
80: }
81: if (!nflag) {
82: ptsort(psbegin, psend = --ps);
83: for (ps=psbegin; ps<=psend; ps++)
84: printf("%s", ps->string);
85: }
86: exit(0);
87: }
88:
89: doarg(cp)
90: register char *cp;
91: {
92: struct stat fds;
93: register Select *sp;
94: char *strdup();
95: xflag = 0;
96: if (cp) do switch (*cp) {
97: case 0:
98: cp = 0; break;
99: case '-':
100: break;
101: case 't':
102: if (*++cp == '.') {
103: if (fstat(0, &fds) == 0) {
104: cp = gettty(fds.st_dev, fds.st_ino);
105: if (*cp == '?')
106: cp = 0;
107: else
108: cp = strdup(cp);
109: } else {
110: fprintf(stderr, "0: cannot fstat\n");
111: cp = 0;
112: }
113: }
114: if (cp) {
115: ++tflag;
116: sp = selend++;
117: sp->flag = SELTTY;
118: if (Xflag || xflag)
119: sp->flag |= SELXFL;
120: sp->id = cp;
121: cp = 0;
122: }
123: break;
124: case 'a':
125: aflag++; break;
126: case 'F':
127: if (stat(++cp, &fds) == 0) {
128: Fflag++;
129: sp = selend++;
130: sp->flag = SELFIL;
131: sp->id = cp;
132: sp->dev = fds.st_dev;
133: sp->ino = fds.st_ino;
134: if (kernel <= 0)
135: kernel = open("/dev/kmem", 0);
136: } else
137: fprintf(stderr, "%s: cannot stat\n", cp);
138: cp = 0;
139: break;
140: case 'f':
141: if (kernel <= 0)
142: kernel = open("/dev/kmem", 0);
143: if (kernel)
144: fflag++, getfstab();
145: break;
146: case 'h':
147: hflag++; break;
148: case 'l':
149: lflag++; break;
150: case 'n':
151: nflag++; break;
152: case 'r':
153: rflag++; break;
154: case 'u':
155: uflag++; getlogins(); break;
156: case 'x':
157: xflag++; break;
158: case 'T':
159: Tflag++; break;
160: default:
161: if (*cp < '0' || *cp > '9')
162: usage();
163: ++Nflag;
164: sp = selend++;
165: sp->flag = SELXFL;
166: sp->id = cp;
167: cp = 0;
168: } while (cp++);
169: return 0;
170: }
171:
172: error(s)
173: char *s;
174: {
175: fprintf(stderr, "%s: %s\n", progname, s);
176: exit(1);
177: }
178:
179: usage()
180: {
181: fprintf(stderr, "Usage: %s [afhlnruxFt#] ...\n", progname);
182: exit(1);
183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.