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