Annotation of researchv10no/cmd/ps/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: 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: }

unix.superglobalmegacorp.com

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