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