|
|
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.