|
|
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: -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 *error; register Select *sp; ! 16: register int fd; ! 17: ! 18: up->u_procp = 0; ! 19: ! 20: if ((fd = getproc(s, pp)) == -1) ! 21: return -1; ! 22: ! 23: if (!Nflag && !tflag && !Fflag) { ! 24: if (!aflag && !rflag && pp->p_uid != myuid && pp->p_pid != mypid) ! 25: Reject; ! 26: if (error = getuarea(fd, pp, up)) ! 27: Error(error); ! 28: if (!aflag && rflag && up->u_uid != myuid && up->u_ruid != myuid) ! 29: Reject; ! 30: if (!xflag && xreject(pp, up)) ! 31: Reject; ! 32: Accept; ! 33: } ! 34: for (sp=selbeg; sp<selend; sp++) { ! 35: if (sp->flag & SELTTY) { ! 36: if (error = getuarea(fd, pp, up)) ! 37: Error(error); ! 38: if (strncmp(sp->id, gettty(up->u_ttydev, up->u_ttyino), 5)) ! 39: continue; ! 40: if (!(sp->flag & SELXFL) && xreject(pp, up)) ! 41: continue; ! 42: Accept; ! 43: } else if (sp->flag & SELFIL) { ! 44: if (error = getuarea(fd, pp, up)) ! 45: Error(error); ! 46: if (fdselect(sp->dev, sp->ino, pp, up)) ! 47: Accept; ! 48: } else if (atoi(sp->id) == pp->p_pid) { ! 49: if (error = getuarea(fd, pp, up)) ! 50: Error(error); ! 51: Accept; ! 52: } ! 53: } ! 54: Reject; ! 55: } ! 56: ! 57: xreject(pp, up) ! 58: register struct proc *pp; register struct user *up; ! 59: { ! 60: return (pp->p_stat != SSTOP && ! 61: (strcmp(up->u_comm, "sh") == 0 || ! 62: strcmp(up->u_comm, "csh") == 0 || ! 63: strcmp(up->u_comm, "init") == 0 || ! 64: up->u_comm[0] == 0)); ! 65: } ! 66: ! 67: fdselect(dev, ino, pp, up) ! 68: register struct proc *pp; register struct user *up; ! 69: { ! 70: register k; ! 71: struct text x; struct file f; struct inode i; ! 72: ! 73: if (Kread(pp->p_textp, &x) && Kread(x.x_iptr, &i) && ! 74: dev == i.i_dev && ino == i.i_number) ! 75: return 1; ! 76: if (Kread(up->u_cdir, &i) && dev == i.i_dev && ino == i.i_number) ! 77: return 1; ! 78: if (Kread(up->u_rdir, &i) && dev == i.i_dev && ino == i.i_number) ! 79: return 1; ! 80: ! 81: for (k = 0; k < NOFILE; k++) { ! 82: if (!Kread(up->u_ofile[k], &f) || !Kread(f.f_inode, &i)) ! 83: continue; ! 84: if (dev == i.i_dev && ino == i.i_number) ! 85: return 1; ! 86: } ! 87: return 0; ! 88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.