|
|
1.1 root 1: #include <stdio.h>
2: #include "ps.h"
3: #include <sys/text.h>
4: #include <sys/inode.h>
5: #include <sys/file.h>
6:
7: #define Error(msg) return (fprintf(stderr, "%s %s: %s\n", progname, s, msg), \
8: close(fd), -1)
9: #define Reject return (close(fd), -1)
10: #define Accept return fd
11:
12: doselect(s, pp, up)
13: char *s; register struct proc *pp; register struct user *up;
14: {
15: char sstr[32], *error, *getuarea(); register Select *sp;
16: register fd;
17:
18: up->u_procp = 0;
19:
20: if ((fd = open(strcat(strcpy(sstr, "/proc/"), s), 0)) < 0)
21: return -1;
22: if (!Ioctl(fd, PIOCGETPR, pp))
23: Error("/proc ioctl error");
24:
25: if (!Nflag && !tflag && !Fflag) {
26: if (!aflag && !rflag && pp->p_uid != myuid && pp->p_pid != mypid)
27: Reject;
28: if (error = getuarea(fd, pp, up))
29: Error(error);
30: if (!aflag && rflag && up->u_uid != myuid && up->u_ruid != myuid)
31: Reject;
32: if (!xflag && xreject(pp, up))
33: Reject;
34: Accept;
35: }
36: for (sp=selbeg; sp<selend; sp++) {
37: if (sp->flag & SELTTY) {
38: if (error = getuarea(fd, pp, up))
39: Error(error);
40: if (strncmp(sp->id, gettty(up->u_ttyino), 5))
41: continue;
42: if (!(sp->flag & SELXFL) && xreject(pp, up))
43: continue;
44: Accept;
45: } else if (sp->flag & SELFIL) {
46: if (error = getuarea(fd, pp, up))
47: Error(error);
48: if (fdselect(sp->dev, sp->ino, pp, up))
49: Accept;
50: } else if (atoi(sp->id) == pp->p_pid) {
51: if (error = getuarea(fd, pp, up))
52: Error(error);
53: Accept;
54: }
55: }
56: Reject;
57: }
58:
59: char *
60: getuarea(fd, pp, up)
61: register struct proc *pp; register struct user *up;
62: {
63: extern errno;
64: struct { char block[ctob(btoc(sizeof(struct user)))];} block, *bp;
65:
66: if (up->u_procp)
67: return 0;
68: if (pp->p_flag & SLOAD) {
69: register ntry = 4;
70: do
71: if (Sread(fd, UBASE, up))
72: return 0;
73: while (errno == EBUSY && --ntry > 0);
74: return "/proc read error";
75: }
76: bp = █
77: if (Sread(drum, pp->p_swaddr*NBPG/ctod(1), bp)) {
78: *up = *(struct user *)█
79: return 0;
80: }
81: return "drum read error";
82: }
83:
84: xreject(pp, up)
85: register struct proc *pp; register struct user *up;
86: {
87: return (pp->p_stat != SSTOP &&
88: (strcmp(up->u_comm, "sh") == 0 ||
89: strcmp(up->u_comm, "csh") == 0 ||
90: strcmp(up->u_comm, "init") == 0 ||
91: up->u_comm[0] == 0));
92: }
93:
94: fdselect(dev, ino, pp, up)
95: register struct proc *pp; register struct user *up;
96: {
97: register k;
98: struct text x; struct file f; struct inode i;
99:
100: if (Kread(pp->p_textp, &x) && Kread(x.x_iptr, &i) &&
101: dev == i.i_dev && ino == i.i_number)
102: return 1;
103: if (Kread(up->u_cdir, &i) && dev == i.i_dev && ino == i.i_number)
104: return 1;
105: if (Kread(up->u_rdir, &i) && dev == i.i_dev && ino == i.i_number)
106: return 1;
107:
108: for (k = 0; k < NOFILE; k++) {
109: if (!Kread(up->u_ofile[k], &f) || !Kread(f.f_inode, &i))
110: continue;
111: if (dev == i.i_dev && ino == i.i_number)
112: return 1;
113: }
114: return 0;
115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.