Annotation of 3BSD/cmd/ps.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     ps - process status
        !             3:  *     This is the augmented UCB ps for UCB/VM Unix (9/79)
        !             4:  *     examine and print certain things about processes
        !             5:  *     usage: ps [acgklrt#uvwx] [corefile] [swapfile] [system]
        !             6:  */
        !             7: 
        !             8: #include <stdio.h>
        !             9: #include <a.out.h>
        !            10: #include <pwd.h>
        !            11: #include <sys/param.h>
        !            12: #include <sys/proc.h>
        !            13: #include <sys/tty.h>
        !            14: #include <sys/dir.h>
        !            15: #include <sys/user.h>
        !            16: #include <sys/pte.h>
        !            17: #include <sys/vm.h>
        !            18: #include <sys/text.h>
        !            19: #include <psout.h>
        !            20: 
        !            21: struct nlist nl[] = {
        !            22:        { "_proc" },
        !            23: #define        X_PROC          0
        !            24:        { "_swapdev" },
        !            25: #define        X_SWAPDEV       1
        !            26:        { "_swplo" },
        !            27: #define        X_SWPLO         2
        !            28:        { "_Usrptma" },
        !            29: #define        X_USRPTMA       3
        !            30:        { "_usrpt" },
        !            31: #define        X_USRPT         4
        !            32:        { "_text" },
        !            33: #define        X_TEXT          5
        !            34:        { "_nswap" },
        !            35: #define        X_NSWAP         6
        !            36:        { 0 },
        !            37: };
        !            38: 
        !            39: struct proc mproc;
        !            40: struct text text[NTEXT];
        !            41: 
        !            42: #define INTPPG         (NBPG/sizeof(int))              /* ints per page */
        !            43: union {
        !            44:        struct user yy;
        !            45:        int xx[INTPPG][UPAGES];
        !            46:       } zz;
        !            47: #define clear(x)       ((int)x & 0x7fffffff)
        !            48: #define u zz.yy
        !            49: int    chkpid = 0;
        !            50: int    aflg;   /* -a: all processes, not just mine */
        !            51: int    cflg;   /* -c: complete listing of args, not just comm. */
        !            52: int    gflg;   /* -g: complete listing including group headers, etc */
        !            53: int    kflg;   /* -k: read from core file instead of real memory */
        !            54: int    lflg;   /* -l: long listing form */
        !            55: int    rflg;   /* -r: raw output in style <psout.h> */
        !            56: int    sflg;   /* -s: stack depth */
        !            57: int    uflg;   /* -u: user name */
        !            58: int     vflg;  /* -v: virtual memory statistics */
        !            59: int    wflg;   /* -w[w]: wide terminal */
        !            60: int    xflg;   /* -x: ALL processes, even those without ttys */
        !            61: int    login;  /* -: this is a login shell */
        !            62: char   *tptr;
        !            63: char   *gettty();
        !            64: int    pscomp();
        !            65: struct pte pagetbl[NPTEPG];
        !            66: int    kmem;
        !            67: int    mem;
        !            68: int    swap;
        !            69: daddr_t        swplo;
        !            70: int    nswap;
        !            71: int    Usrptma;
        !            72: int    usrpt;
        !            73: 
        !            74: int    ndev;
        !            75: struct devl {
        !            76:        char    dname[DIRSIZ];
        !            77:        dev_t   dev;
        !            78: } devl[256];
        !            79: 
        !            80: struct psout outargs[NPROC];   /* info for first npr processes */
        !            81: int npr;       /* number of processes found so far */
        !            82: int argwidth;  /* number of chars of args to print */
        !            83: 
        !            84: char   *coref;
        !            85: 
        !            86: main(argc, argv)
        !            87: char **argv;
        !            88: {
        !            89:        int i;
        !            90:        char *ap;
        !            91:        int uid, puid;
        !            92:        char obuf[BUFSIZ];
        !            93:        register struct nlist *nlp;
        !            94: 
        !            95:        setbuf(stdout, obuf);
        !            96:        argc--, argv++;
        !            97:        if (argc>0) {
        !            98:                ap = argv[0];
        !            99:                while (*ap) switch (*ap++) {
        !           100:                case '-':
        !           101:                        break;
        !           102: 
        !           103:                case 'a':
        !           104:                        aflg++;
        !           105:                        break;
        !           106: 
        !           107:                case 'c':
        !           108:                        cflg++;
        !           109:                        break;
        !           110: 
        !           111:                case 'g':
        !           112:                        gflg++;
        !           113:                        break;
        !           114: 
        !           115:                case 'k':
        !           116:                        kflg++;
        !           117:                        break;
        !           118: 
        !           119:                case 'l':
        !           120:                        lflg++;
        !           121:                        break;
        !           122: 
        !           123:                case 'r':
        !           124:                        rflg++;
        !           125:                        break;
        !           126: 
        !           127:                case 's':
        !           128:                        sflg++;
        !           129:                        break;
        !           130: 
        !           131:                case 't':
        !           132:                        if(*ap)
        !           133:                                tptr = ap;
        !           134:                        aflg++;
        !           135:                        gflg++;
        !           136:                        if (*tptr == '?')
        !           137:                                xflg++;
        !           138:                        while (*ap)
        !           139:                                ap++;
        !           140:                        break;
        !           141: 
        !           142:                case 'u':
        !           143:                        uflg++;
        !           144:                        break;
        !           145: 
        !           146:                case 'v':
        !           147:                        vflg++;
        !           148:                        break;
        !           149: 
        !           150:                case 'w':
        !           151:                        wflg++;
        !           152:                        break;
        !           153: 
        !           154:                case 'x':
        !           155:                        xflg++;
        !           156:                        break;
        !           157: 
        !           158:                default:
        !           159:                        chkpid=atoi(--ap);
        !           160:                        *ap = '\0';
        !           161:                        aflg++;
        !           162:                        xflg++;
        !           163:                        break;
        !           164:                }
        !           165:        }
        !           166:        coref = "/dev/kmem";
        !           167:        if(kflg)
        !           168:                coref = argc > 1 ? argv[1] : "/vmcore";
        !           169: 
        !           170:        if ((kmem = open(coref, 0)) < 0) {
        !           171:                perror(coref);
        !           172:                done(1);
        !           173:        }
        !           174:        if ((mem = open("/dev/mem", 0)) < 0) {
        !           175:                fprintf(stderr, "No mem\n");
        !           176:                done(1);
        !           177:        }
        !           178:        if (kflg) 
        !           179:                mem = kmem;
        !           180: 
        !           181:        if ((swap = open(argc>2 ? argv[2]: "/dev/drum", 0)) < 0) {
        !           182:                fprintf(stderr, "Can't open /dev/drum\n");
        !           183:                done(1);
        !           184:        }
        !           185: 
        !           186:        nlist(argc>3 ? argv[3] : "/vmunix", nl);
        !           187:        if (nl[0].n_type==0) {
        !           188:                fprintf(stderr, "No namelist\n");
        !           189:                done(1);
        !           190:        }
        !           191: 
        !           192:        if(chdir("/dev") < 0) {
        !           193:                fprintf(stderr, "Can't change to /dev\n");
        !           194:                done(1);
        !           195:        }
        !           196:        if (kflg)
        !           197:                for (nlp= nl; nlp < &nl[sizeof (nl)/sizeof (nl[0])]; nlp++)
        !           198:                        nlp->n_value &= 0x7ffffffff;
        !           199:        Usrptma = nl[X_USRPTMA].n_value;
        !           200:        usrpt = nl[X_USRPT].n_value;
        !           201:        /*
        !           202:         * read kmem to find swap dev.
        !           203:         */
        !           204:        lseek(kmem, (long)nl[X_SWAPDEV].n_value, 0);
        !           205:        read(kmem, &nl[X_SWAPDEV].n_value, sizeof(nl[X_SWAPDEV].n_value));
        !           206:        /*
        !           207:         * Find base and size of swap
        !           208:         */
        !           209:        lseek(kmem, (long)nl[X_SWPLO].n_value, 0);
        !           210:        read(kmem, &swplo, sizeof(swplo));
        !           211:        lseek(kmem, (long)nl[X_NSWAP].n_value, 0);
        !           212:        read(kmem, &nswap, sizeof (nswap));
        !           213:        /*
        !           214:         * If v flag get text table
        !           215:         */
        !           216:        if (vflg) {
        !           217:                lseek(kmem, (long)nl[X_TEXT].n_value, 0);
        !           218:                read(kmem, text, sizeof (text));
        !           219:        }
        !           220:        if (kflg)
        !           221:                swplo = 0;
        !           222:        getdev();
        !           223:        uid = getuid();
        !           224:        if (sflg + lflg + vflg + uflg > 1) {
        !           225:                printf("Cannot combine s, l, v, and/or u.\n");
        !           226:                exit(1);
        !           227:        }
        !           228:        /* different psout widths depending on how much printed & w flag */
        !           229:        if (wflg <= 1) {
        !           230:                argwidth = 63;
        !           231:                if (wflg) argwidth += 52;       /* 132 col term */
        !           232:                if (lflg) argwidth -= 49;       /* extra junk printed */
        !           233:                if (vflg) argwidth -= 48;       /* extra junk for -v */
        !           234:                if (sflg) argwidth -= 4;        /* 4 cols of stack size */
        !           235:                if (uflg) argwidth -= 27;       /* user name */
        !           236:        } else  argwidth = 127;
        !           237:        if (rflg)
        !           238:                ;       /* No heading for raw output */
        !           239:        else if (lflg)
        !           240:                printf("   F S UID   PID  PPID CPU PRI NICE ADDR  SZ  RSS WCHAN TTY TIME COMMAND\n");
        !           241:        else if (vflg)
        !           242:                printf("F    PID TT  TIME TIM SL MINFLT MAJFLT SIZE RSS SRS TSIZ TRS PF COMMAND\n");
        !           243:        else if (uflg)
        !           244:                printf("USER       PID %%CPU NICE  SZ  RSS TTY TIME COMMAND\n");
        !           245:        else if (chkpid==0) {
        !           246:                if (sflg)
        !           247:                        printf(" SSIZ");
        !           248:                printf("   PID TTY TIME COMMAND\n");
        !           249:        }
        !           250:        fflush(stdout);
        !           251:        for (i=0; i<NPROC; i++) {
        !           252:                lseek(kmem, (long)(nl[X_PROC].n_value+i*(sizeof mproc)), 0);
        !           253:                read(kmem, &mproc, sizeof mproc);
        !           254:                /* skip processes that don't exist */
        !           255:                if (mproc.p_stat==0)
        !           256:                        continue;
        !           257:                /* skip those without a tty unless -x */
        !           258:                if (mproc.p_pgrp==0 && xflg==0)
        !           259:                        continue;
        !           260:                /* skip group leaders on a tty unless -g, -x, or -t.. */
        !           261:                if (!gflg && !xflg && !tptr && mproc.p_pid == mproc.p_pgrp)
        !           262:                        continue;
        !           263:                /* -g also skips those where **argv is "-" - see savcom */
        !           264:                puid = mproc.p_uid;
        !           265:                /* skip other peoples processes unless -a or a specific pid */
        !           266:                if ((uid != puid && aflg==0) ||
        !           267:                    (chkpid!=0 && chkpid!=mproc.p_pid))
        !           268:                        continue;
        !           269:                if (savcom(puid))
        !           270:                        npr++;
        !           271:        }
        !           272:        fixup(npr);
        !           273:        for (i=0; i<npr; i++)
        !           274:                if (prcom(&outargs[i])) {
        !           275:                        putchar('\n');
        !           276:                        fflush(stdout);
        !           277:                }
        !           278:        done(!npr);
        !           279: }
        !           280: 
        !           281: getdev()
        !           282: {
        !           283: #include <sys/stat.h>
        !           284:        register FILE *df;
        !           285:        struct stat sbuf;
        !           286:        struct direct dbuf;
        !           287: 
        !           288:        if ((df = fopen("/dev", "r")) == NULL) {
        !           289:                fprintf(stderr, "Can't open /dev\n");
        !           290:                done(1);
        !           291:        }
        !           292:        ndev = 0;
        !           293:        while (fread(&dbuf, sizeof(dbuf), 1, df) == 1) {
        !           294:                if(dbuf.d_ino == 0)
        !           295:                        continue;
        !           296:                if(stat(dbuf.d_name, &sbuf) < 0)
        !           297:                        continue;
        !           298:                if ((sbuf.st_mode&S_IFMT) != S_IFCHR)
        !           299:                        continue;
        !           300:                strcpy(devl[ndev].dname, dbuf.d_name);
        !           301:                devl[ndev].dev = sbuf.st_rdev;
        !           302:                ndev++;
        !           303:        }
        !           304:        fclose(df);
        !           305: }
        !           306: 
        !           307: savcom(puid)
        !           308: {
        !           309:        int abuf[INTPPG];
        !           310:        long addr;
        !           311:        register int *ip;
        !           312:        register struct psout *a;
        !           313:        register char *cp, *cp1;
        !           314:        long tm;
        !           315:        int cc, nbad;
        !           316:        int szpt, p0br;
        !           317:        register char *tp;
        !           318:        struct dblock db;
        !           319:        struct pte apte;
        !           320: 
        !           321:        /* skip long sleeping or dead processes if -v unless -g or -x */
        !           322:        if (!gflg && vflg && !xflg) {
        !           323:                switch (mproc.p_stat) {
        !           324: 
        !           325:                case SSLEEP:
        !           326:                case SSTOP:
        !           327:                        if (mproc.p_slptime > MAXSLP)
        !           328:                                return (0);
        !           329:                        break;
        !           330: 
        !           331:                case SRUN:
        !           332:                case SIDL:
        !           333:                        break;
        !           334: 
        !           335:                case SZOMB:
        !           336:                        return (0);
        !           337:                }
        !           338:        }
        !           339:        /* read in the user structure */
        !           340:        if ((mproc.p_flag& SLOAD ) == 0) {
        !           341:                /* not loaded - get from swap */
        !           342:                addr = (mproc.p_swaddr+swplo)<<9;
        !           343:                lseek(swap, addr, 0);
        !           344:                if (read(swap, &u, sizeof(u)) != sizeof(u))
        !           345:                        return(0);
        !           346:        } else {
        !           347:                /* loaded, get each page from memory separately */
        !           348:                for(cc=0; cc<UPAGES; cc++) {    /* get u area */
        !           349:                        int upage = ctob(mproc.p_addr[cc]);
        !           350:                        lseek(mem,upage,0);
        !           351:                        if (read(mem,((int *)&u)+INTPPG*cc,NBPG) != NBPG)       
        !           352:                                return(0);
        !           353:                }
        !           354:        }
        !           355:        tp = gettty();
        !           356:        if (tptr && strcmpn(tptr, tp, 2))
        !           357:                return(0);
        !           358:        a = &outargs[npr];
        !           359:        /* saving com starts here */
        !           360:        a->o_uid = puid;
        !           361:        a->o_pid = mproc.p_pid;
        !           362:        a->o_flag = mproc.p_flag;
        !           363:        a->o_ppid = mproc.p_ppid;
        !           364:        a->o_cpu  = mproc.p_cpu;
        !           365:        a->o_pctcpu = 0.0;      /* This needs to be fixed later */
        !           366:        a->o_pri  = mproc.p_pri;
        !           367:        a->o_nice = mproc.p_nice;
        !           368:        a->o_addr0 = mproc.p_addr[0];
        !           369:        a->o_dsize = mproc.p_dsize;
        !           370:        a->o_ssize = mproc.p_ssize;
        !           371:        a->o_rssize = mproc.p_rssize;
        !           372:        a->o_swrss = mproc.p_swrss;
        !           373:        a->o_wchan = mproc.p_wchan;
        !           374:        a->o_pgrp = mproc.p_pgrp;
        !           375:        a->o_tty[0] = tp[0];
        !           376:        a->o_tty[1] = tp[1] ? tp[1] : ' ';
        !           377:        a->o_ttyd = u.u_ttyd;
        !           378:        a->o_stat = mproc.p_stat;
        !           379:        a->o_flag = mproc.p_flag;
        !           380:        if (a->o_stat==SZOMB) return(1);
        !           381:        a->o_utime = u.u_utime;
        !           382:        a->o_stime = u.u_stime;
        !           383:        a->o_cutime = u.u_cutime;
        !           384:        a->o_cstime = u.u_cstime;
        !           385:        a->o_sigs = u.u_signal[SIGINT] + u.u_signal[SIGQUIT];
        !           386:        a->o_time = mproc.p_time;
        !           387:        a->o_slptime = mproc.p_slptime;
        !           388:        a->o_uname[0] = 0;
        !           389:        if (sflg) {
        !           390:                for (cp = (char *)u.u_stack; cp < (char *)&u + ctob(UPAGES); cp++)
        !           391:                        if (*cp)
        !           392:                                break;
        !           393:                a->o_stksize = (int) ((char *)&u + ctob(UPAGES) - cp);
        !           394:        }
        !           395:        if (mproc.p_stat==SZOMB) return(1);
        !           396:        if (vflg) {
        !           397:                register struct text *xp;
        !           398: 
        !           399:                if (mproc.p_textp) {
        !           400:                        xp = &text[mproc.p_textp - (struct text *)nl[5].n_value];
        !           401:                        a->o_xsize = xp->x_size;
        !           402:                        a->o_xrssize = xp->x_rssize;
        !           403:                } else {
        !           404:                        a->o_xsize = 0;
        !           405:                        a->o_xrssize = 0;
        !           406:                }
        !           407:                a->o_aveflt = mproc.p_aveflt;
        !           408:                a->o_minorflt = u.u_minorflt;
        !           409:                a->o_majorflt = u.u_majorflt;
        !           410:        }
        !           411:        strcpy(a->o_comm, u.u_comm);
        !           412:        if (cflg)
        !           413:                return (1);
        !           414:        a->o_args[0] = 0;       /* in case of early return */
        !           415:        if ((mproc.p_flag & SLOAD) == 0) {
        !           416:                vstodb(0, 1, &u.u_smap, &db, 1);
        !           417:                addr = ctob(swplo + db.db_base);
        !           418:                lseek(swap, addr, 0);
        !           419:                if (read(swap, abuf, sizeof(abuf)) != sizeof(abuf))
        !           420:                        goto garbage;
        !           421:        } else {
        !           422:                szpt = u.u_pcb.pcb_szpt;
        !           423:                p0br = kflg ? clear((int)mproc.p_p0br) : (int)mproc.p_p0br;
        !           424:                cc = Usrptma + (p0br + NBPG*(szpt-1) - usrpt)/NPTEPG;
        !           425:                lseek(kmem, cc, 0);
        !           426:                if (read(kmem, &apte, sizeof(apte)) != sizeof(apte))
        !           427:                        goto garbage;
        !           428:                lseek(mem, ctob(apte.pg_pfnum), 0);
        !           429:                if (read(mem,pagetbl,sizeof(pagetbl)) != sizeof(pagetbl))   
        !           430:                        goto garbage;
        !           431:                if (pagetbl[NPTEPG-1].pg_fod == 0 && pagetbl[NPTEPG-1].pg_pfnum) {
        !           432:                        lseek(mem,ctob((pagetbl[NPTEPG-1].pg_pfnum)),0);
        !           433:                        if (read(mem,abuf,sizeof(abuf)) != sizeof(abuf))
        !           434:                                goto garbage;
        !           435:                } else {
        !           436:                        vstodb(0, 1, &u.u_smap, &db, 1);
        !           437:                        addr = ctob(swplo + db.db_base);
        !           438:                        lseek(swap, addr, 0);
        !           439:                        if (read(swap, abuf, sizeof(abuf)) != sizeof(abuf))
        !           440:                                goto garbage;
        !           441:                }
        !           442:        }
        !           443:        abuf[INTPPG] = 0;
        !           444:        for (ip = &abuf[INTPPG-2]; ip > abuf;) {
        !           445:                if (*--ip == -1 || *ip == 0) {
        !           446:                        cp = (char *)(ip+1);
        !           447:                        if (*cp==0)
        !           448:                                cp++;
        !           449:                        nbad = 0;
        !           450:                        for (cp1 = cp; cp1 < (char *)&abuf[INTPPG]; cp1++) {
        !           451:                                cc = *cp1&0177;
        !           452:                                if (cc==0)
        !           453:                                        *cp1 = ' ';
        !           454:                                else if (cc < ' ' || cc > 0176) {
        !           455:                                        if (++nbad >= 5) {
        !           456:                                                *cp1++ = ' ';
        !           457:                                                break;
        !           458:                                        }
        !           459:                                        *cp1 = '?';
        !           460:                                } else if (cc=='=') {
        !           461:                                        *cp1 = 0;
        !           462:                                        while (cp1>cp && *--cp1!=' ')
        !           463:                                                *cp1 = 0;
        !           464:                                        break;
        !           465:                                }
        !           466:                        }
        !           467:                        while (*--cp1==' ')
        !           468:                                *cp1 = 0;
        !           469:                        strcpy(a->o_args, cp);
        !           470: garbage:
        !           471:                        cp = a->o_args;
        !           472:                        if (cp[0]=='-'&&cp[1]<=' ' || cp[0]=='?' || cp[0]<=' ') {
        !           473:                                strcat(cp, " (");
        !           474:                                strcat(cp, u.u_comm);
        !           475:                                strcat(cp, ")");
        !           476:                        }
        !           477:                        cp[127] = 0;    /* max room in psout is 128 chars */
        !           478:                        if (xflg || gflg || tptr || cp[0]!='-')
        !           479:                                return(1);
        !           480:                        return(0);
        !           481:                }
        !           482:        }
        !           483:        goto garbage;
        !           484: }
        !           485: 
        !           486: prcom(a)
        !           487:        register struct psout *a;
        !           488: {
        !           489:        long tm;
        !           490: 
        !           491:        if (rflg) {
        !           492:                write(1, a, sizeof (*a));
        !           493:                return(0);
        !           494:        }
        !           495:        if (lflg) {
        !           496:                printf("%4x %c", 0xffff & a->o_flag,
        !           497:                        "0SWRIZT"[a->o_stat]);
        !           498:                printf("%4d", a->o_uid);
        !           499:        } else if (vflg) {
        !           500:                switch (a->o_stat) {
        !           501: 
        !           502:                case SSLEEP:
        !           503:                case SSTOP:
        !           504:                        if ((a->o_flag & SLOAD) == 0)
        !           505:                                printf("W");
        !           506:                        else if (a->o_pri >= PZERO)
        !           507:                                printf("S");
        !           508:                        else if (a->o_flag & SPAGE)
        !           509:                                printf("P");
        !           510:                        else
        !           511:                                printf("D");
        !           512:                        break;
        !           513: 
        !           514:                case SRUN:
        !           515:                case SIDL:
        !           516:                        if (a->o_flag & SLOAD)
        !           517:                                printf("R");
        !           518:                        else
        !           519:                                printf("W");
        !           520:                        break;
        !           521:                }
        !           522:                if (a->o_nice > NZERO)
        !           523:                        printf("N");
        !           524:                else
        !           525:                        printf(" ");
        !           526:        } else if (uflg) {
        !           527:                printf("%-8.8s", a->o_uname);
        !           528:        }
        !           529:        if (sflg) {
        !           530:                printf("%5d", a->o_stksize);
        !           531:        }
        !           532:        printf("%6u", a->o_pid);
        !           533:        if (lflg)
        !           534:                printf("%6u%4d%4d%4d%6x", a->o_ppid, a->o_cpu&0377,
        !           535:                        a->o_pri, a->o_nice, a->o_addr0);
        !           536:        else if (uflg)
        !           537:                printf("%5.1f%4d ", a->o_pctcpu, a->o_nice);
        !           538:        if (lflg || uflg)
        !           539:                printf("%4d%5d", a->o_dsize+a->o_ssize, a->o_rssize);
        !           540:        if (lflg)
        !           541:                if (a->o_wchan)
        !           542:                        printf("%6x", clear(a->o_wchan));
        !           543:                else
        !           544:                        printf("      ");
        !           545:        printf(" %-2.2s", a->o_tty);
        !           546:        if (a->o_stat==SZOMB) {
        !           547:                printf("  <defunct>");
        !           548:                return(1);
        !           549:        }
        !           550:        tm = (a->o_utime + a->o_stime + 30)/60;
        !           551:        printf("%3ld:", tm/60);
        !           552:        tm %= 60;
        !           553:        printf(tm<10?"0%ld":"%ld", tm);
        !           554:        if (vflg) {
        !           555: /*
        !           556:                tm = (a->o_stime + 30) / 60;
        !           557:                printf(" %2ld:", tm/60);
        !           558:                tm %= 60;
        !           559:                printf(tm<10?"0%ld":"%ld", tm);
        !           560: */
        !           561:                printf("%4d%3d", a->o_time, a->o_slptime);
        !           562:        }
        !           563: #ifdef notdef
        !           564:        if (0 && lflg==0) {     /* 0 == old tflg (print long times) */
        !           565:                tm = (a->o_cstime + 30)/60;
        !           566:                printf(" %2ld:", tm/60);
        !           567:                tm %= 60;
        !           568:                printf(tm<10?"0%ld":"%ld", tm);
        !           569:                tm = (a->o_cutime + 30)/60;
        !           570:                printf(" %2ld:", tm/60);
        !           571:                tm %= 60;
        !           572:                printf(tm<10?"0%ld":"%ld", tm);
        !           573:        }
        !           574: #endif
        !           575:        if (vflg) {
        !           576:                printf("%7d%7d",a->o_minorflt,a->o_majorflt);
        !           577:                printf("%5d%4d%4d", a->o_dsize+a->o_ssize, a->o_rssize, a->o_swrss);
        !           578:                printf("%5d%4d", a->o_xsize, a->o_xrssize);
        !           579:                printf("%3d", a->o_aveflt);
        !           580:        }
        !           581:        if (a->o_pid == 0) {
        !           582:                printf(" swapper");
        !           583:                return(1);
        !           584:        }
        !           585:        if (a->o_pid == 2) {
        !           586:                printf(" pagedaemon");
        !           587:                return(1);
        !           588:        }
        !           589:        if (cflg) {
        !           590:                printf(" %s", a->o_comm);
        !           591:                return(1);
        !           592:        }
        !           593:        a -> o_args[argwidth] = 0;      /* force it to quit early */
        !           594:        printf(" %s", a->o_args);
        !           595:        return (1);
        !           596: }
        !           597: 
        !           598: char *
        !           599: gettty()
        !           600: {
        !           601:        register i;
        !           602:        register char *p;
        !           603: 
        !           604:        if (u.u_ttyp==0)
        !           605:                return("?");
        !           606:        for (i=0; i<ndev; i++) {
        !           607:                if (devl[i].dev == u.u_ttyd) {
        !           608:                        p = devl[i].dname;
        !           609:                        if (p[0]=='t' && p[1]=='t' && p[2]=='y')
        !           610:                                p += 3;
        !           611:                        return(p);
        !           612:                }
        !           613:        }
        !           614:        return("?");
        !           615: }
        !           616: 
        !           617: /*
        !           618:  * Given a base/size pair in virtual swap area,
        !           619:  * return a physical base/size pair which is the
        !           620:  * (largest) initial, physically contiguous block.
        !           621:  */
        !           622: vstodb(vsbase, vssize, dmp, dbp, rev)
        !           623:        register int vsbase;
        !           624:        int vssize;
        !           625:        struct dmap *dmp;
        !           626:        register struct dblock *dbp;
        !           627: {
        !           628:        register int blk = DMMIN;
        !           629:        register swblk_t *ip = dmp->dm_map;
        !           630: 
        !           631:        if (vsbase < 0 || vsbase + vssize > dmp->dm_size)
        !           632:                panic("vstodb");
        !           633:        while (vsbase >= blk) {
        !           634:                vsbase -= blk;
        !           635:                if (blk < DMMAX)
        !           636:                        blk *= 2;
        !           637:                ip++;
        !           638:        }
        !           639:        if (*ip <= 0 || *ip + blk > nswap)
        !           640:                panic("vstodb *ip");
        !           641:        dbp->db_size = min(vssize, blk - vsbase);
        !           642:        dbp->db_base = *ip + (rev ? blk - (vsbase + dbp->db_size) : vsbase);
        !           643: }
        !           644: 
        !           645: panic(cp)
        !           646:        char *cp;
        !           647: {
        !           648: 
        !           649: #ifdef DEBUG
        !           650:        printf("%s\n", cp);
        !           651: #endif
        !           652: }
        !           653: 
        !           654: min(a, b)
        !           655: {
        !           656: 
        !           657:        return (a < b ? a : b);
        !           658: }
        !           659: 
        !           660: done(exitno)
        !           661: {
        !           662:        if (login) {
        !           663:                printf("Press return when done: ");
        !           664:                getchar();
        !           665:        }
        !           666:        exit(exitno);
        !           667: }
        !           668: 
        !           669: /*
        !           670:  * fixup figures out everybodys name and sorts into a nice order.
        !           671:  */
        !           672: fixup(np) int np; {
        !           673:        register int i;
        !           674:        register struct passwd *pw;
        !           675:        struct passwd *getpwent();
        !           676: 
        !           677:        if (uflg) {
        !           678:                /*
        !           679:                 * If we want names, traverse the password file. For each
        !           680:                 * passwd entry, look for it in the processes.
        !           681:                 * In case of multiple entries in /etc/passwd, we believe
        !           682:                 * the first one (same thing ls does).
        !           683:                 */
        !           684:                while ((pw=getpwent()) != NULL) {
        !           685:                        for (i=0; i<np; i++)
        !           686:                                if (outargs[i].o_uid == pw -> pw_uid) {
        !           687:                                        if (outargs[i].o_uname[0] == 0)
        !           688:                                                strcpy(outargs[i].o_uname, pw -> pw_name);
        !           689:                                }
        !           690:                }
        !           691:        }
        !           692: 
        !           693:        qsort(outargs, np, sizeof(outargs[0]), pscomp);
        !           694: }
        !           695: 
        !           696: pscomp(x1, x2) struct psout *x1, *x2; {
        !           697:        register int c;
        !           698: 
        !           699:        c = (x1)->o_ttyd - (x2)->o_ttyd;
        !           700:        if (c==0) c = (x1)->o_pid - (x2)->o_pid;
        !           701:        return(c);
        !           702: }

unix.superglobalmegacorp.com

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