Annotation of researchv10no/cmd/ops/ps.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.