Annotation of 40BSD/cmd/pstat.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)pstat.c     4.3 (Berkeley) 11/15/80";
        !             2: /*
        !             3:  * Print system stuff
        !             4:  */
        !             5: 
        !             6: #define mask(x) (x&0377)
        !             7: #define        clear(x) ((int)x&0x7fffffff)
        !             8: 
        !             9: #include <sys/param.h>
        !            10: #include <sys/dir.h>
        !            11: #include <sys/file.h>
        !            12: #include <sys/user.h>
        !            13: #include <sys/proc.h>
        !            14: #include <sys/text.h>
        !            15: #include <sys/inode.h>
        !            16: #include <sys/map.h>
        !            17: #include <sys/tty.h>
        !            18: #include <sys/conf.h>
        !            19: #include <sys/vm.h>
        !            20: #include <nlist.h>
        !            21: #include <sys/pte.h>
        !            22: 
        !            23: char   *fcore  = "/dev/kmem";
        !            24: char   *fnlist = "/vmunix";
        !            25: int    fc;
        !            26: 
        !            27: struct nlist nl[] = {
        !            28: #define        SINODE  0
        !            29:        { "_inode" },
        !            30: #define        STEXT   1
        !            31:        { "_text" },
        !            32: #define        SPROC   2
        !            33:        { "_proc" },
        !            34: #define        SDZ     3
        !            35:        { "_dz_tty" },
        !            36: #define        SNDZ    4
        !            37:        { "_dz_cnt" },
        !            38: #define        SKL     5
        !            39:        { "_cons" },
        !            40: #define        SFIL    6
        !            41:        { "_file" },
        !            42: #define        USRPTMA 7
        !            43:        { "_Usrptmap" },
        !            44: #define        USRPT   8
        !            45:        { "_usrpt" },
        !            46: #define        SNSWAP  9
        !            47:        { "_nswap" },
        !            48: #define        SWAPMAP 10
        !            49:        { "_swapmap" },
        !            50: #define        SDH     11
        !            51:        { "_dh11" },
        !            52: #define        SNDH    12
        !            53:        { "_ndh11" },
        !            54:        0,
        !            55: };
        !            56: 
        !            57: int    inof;
        !            58: int    txtf;
        !            59: int    prcf;
        !            60: int    ttyf;
        !            61: int    usrf;
        !            62: long   ubase;
        !            63: int    filf;
        !            64: int    swpf;
        !            65: int    totflg;
        !            66: char   partab[1];
        !            67: struct cdevsw  cdevsw[1];
        !            68: struct bdevsw  bdevsw[1];
        !            69: int    allflg;
        !            70: int    kflg;
        !            71: struct pte *Usrptma;
        !            72: struct pte *usrpt;
        !            73: 
        !            74: main(argc, argv)
        !            75: char **argv;
        !            76: {
        !            77:        register char *argp;
        !            78: 
        !            79:        argc--, argv++;
        !            80:        while (argc > 0 && **argv == '-') {
        !            81:                argp = *argv++;
        !            82:                argp++;
        !            83:                argc--;
        !            84:                while (*argp++)
        !            85:                switch (argp[-1]) {
        !            86: 
        !            87:                case 'T':
        !            88:                        totflg++;
        !            89:                        break;
        !            90: 
        !            91:                case 'a':
        !            92:                        allflg++;
        !            93:                        break;
        !            94: 
        !            95:                case 'i':
        !            96:                        inof++;
        !            97:                        break;
        !            98: 
        !            99:                case 'k':
        !           100:                        kflg++;
        !           101:                        fcore = "/vmcore";
        !           102:                        break;
        !           103: 
        !           104:                case 'x':
        !           105:                        txtf++;
        !           106:                        break;
        !           107: 
        !           108:                case 'p':
        !           109:                        prcf++;
        !           110:                        break;
        !           111: 
        !           112:                case 't':
        !           113:                        ttyf++;
        !           114:                        break;
        !           115: 
        !           116:                case 'u':
        !           117:                        if (argc == 0)
        !           118:                                break;
        !           119:                        argc--;
        !           120:                        usrf++;
        !           121:                        sscanf( *argv++, "%x", &ubase);
        !           122:                        break;
        !           123: 
        !           124:                case 'f':
        !           125:                        filf++;
        !           126:                        break;
        !           127:                case 's':
        !           128:                        swpf++;
        !           129:                        break;
        !           130:                }
        !           131:        }
        !           132:        if (argc>0)
        !           133:                fcore = argv[0];
        !           134:        if ((fc = open(fcore, 0)) < 0) {
        !           135:                printf("Can't find %s\n", fcore);
        !           136:                exit(1);
        !           137:        }
        !           138:        if (argc>1)
        !           139:                fnlist = argv[1];
        !           140:        nlist(fnlist, nl);
        !           141:        if (kflg) {
        !           142:                register struct nlist *nlp;
        !           143:                for (nlp=nl; nlp < &nl[sizeof (nl)/sizeof(nl[0])]; nlp++)
        !           144:                        nlp->n_value = clear(nlp->n_value);
        !           145:        }
        !           146:        usrpt = (struct pte *)nl[USRPT].n_value;
        !           147:        Usrptma = (struct pte *)nl[USRPTMA].n_value;
        !           148:        if (nl[0].n_type == 0) {
        !           149:                printf("no namelist\n");
        !           150:                exit(1);
        !           151:        }
        !           152:        if (filf||totflg)
        !           153:                dofil();
        !           154:        if (inof||totflg)
        !           155:                doinode();
        !           156:        if (prcf||totflg)
        !           157:                doproc();
        !           158:        if (txtf||totflg)
        !           159:                dotext();
        !           160:        if (ttyf)
        !           161:                dotty();
        !           162:        if (usrf)
        !           163:                dousr();
        !           164:        if (swpf||totflg)
        !           165:                doswap();
        !           166: }
        !           167: 
        !           168: doinode()
        !           169: {
        !           170:        register struct inode *ip;
        !           171:        struct inode xinode[NINODE];
        !           172:        register int nin, loc;
        !           173: 
        !           174:        nin = 0;
        !           175:        lseek(fc, (long)nl[SINODE].n_value, 0);
        !           176:        read(fc, xinode, sizeof(xinode));
        !           177:        for (ip = xinode; ip < &xinode[NINODE]; ip++)
        !           178:                if (ip->i_count)
        !           179:                        nin++;
        !           180:        if (totflg) {
        !           181:                printf("%3d/%3d inodes\n", nin, NINODE);
        !           182:                return;
        !           183:        }
        !           184:        printf("%d/%d active xinodes\n", nin, NINODE);
        !           185:        printf("   LOC    FLAGS  CNT DEVICE   INO  MODE  NLK UID   SIZE/DEV\n");
        !           186:        loc = nl[SINODE].n_value;
        !           187:        for (ip = xinode; ip < &xinode[NINODE]; ip++, loc += sizeof(xinode[0])) {
        !           188:                if (ip->i_count == 0)
        !           189:                        continue;
        !           190:                printf("%8.1x ", loc);
        !           191:                putf(ip->i_flag&ILOCK, 'L');
        !           192:                putf(ip->i_flag&IUPD, 'U');
        !           193:                putf(ip->i_flag&IACC, 'A');
        !           194:                putf(ip->i_flag&IMOUNT, 'M');
        !           195:                putf(ip->i_flag&IWANT, 'W');
        !           196:                putf(ip->i_flag&ITEXT, 'T');
        !           197:                printf("%4d", ip->i_count&0377);
        !           198:                printf("%4d,%3d", major(ip->i_dev), minor(ip->i_dev));
        !           199:                printf("%6d", ip->i_number);
        !           200:                printf("%6x", ip->i_mode & 0xffff);
        !           201:                printf("%4d", ip->i_nlink);
        !           202:                printf("%4d", ip->i_uid);
        !           203:                if ((ip->i_mode&IFMT)==IFBLK || (ip->i_mode&IFMT)==IFCHR)
        !           204:                        printf("%6d,%3d", major(ip->i_un.i_rdev), minor(ip->i_un.i_rdev));
        !           205:                else
        !           206:                        printf("%10ld", ip->i_size);
        !           207:                printf("\n");
        !           208:        }
        !           209: }
        !           210: 
        !           211: putf(v, n)
        !           212: {
        !           213:        if (v)
        !           214:                printf("%c", n);
        !           215:        else
        !           216:                printf(" ");
        !           217: }
        !           218: 
        !           219: dotext()
        !           220: {
        !           221:        register struct text *xp;
        !           222:        struct text xtext[NTEXT];
        !           223:        register loc;
        !           224:        int ntx;
        !           225: 
        !           226:        ntx = 0;
        !           227:        lseek(fc, (long)nl[STEXT].n_value, 0);
        !           228:        read(fc, xtext, sizeof(xtext));
        !           229:        for (xp = xtext; xp < &xtext[NTEXT]; xp++)
        !           230:                if (xp->x_iptr!=NULL)
        !           231:                        ntx++;
        !           232:        if (totflg) {
        !           233:                printf("%3d/%3d texts\n", ntx, NTEXT);
        !           234:                return;
        !           235:        }
        !           236:        printf("   LOC   FLAGS DADDR      CADDR  RSS SIZE      IPTR  CNT CCNT\n");
        !           237:        loc = nl[STEXT].n_value;
        !           238:        for (xp = xtext; xp < &xtext[NTEXT]; xp++, loc+=sizeof(xtext[0])) {
        !           239:                if (xp->x_iptr == NULL)
        !           240:                        continue;
        !           241:                printf("%8.1x", loc);
        !           242:                printf(" ");
        !           243:                putf(xp->x_flag&XPAGI, 'P');
        !           244:                putf(xp->x_flag&XTRC, 'T');
        !           245:                putf(xp->x_flag&XWRIT, 'W');
        !           246:                putf(xp->x_flag&XLOAD, 'L');
        !           247:                putf(xp->x_flag&XLOCK, 'K');
        !           248:                putf(xp->x_flag&XWANT, 'w');
        !           249:                printf("%5x", xp->x_daddr[0]);
        !           250:                printf("%11x", xp->x_caddr);
        !           251:                printf("%5d", xp->x_rssize);
        !           252:                printf("%5d", xp->x_size);
        !           253:                printf("%10.1x", xp->x_iptr);
        !           254:                printf("%5d", xp->x_count&0377);
        !           255:                printf("%5d", xp->x_ccount);
        !           256:                printf("\n");
        !           257:        }
        !           258: }
        !           259: 
        !           260: doproc()
        !           261: {
        !           262:        struct proc xproc[NPROC];
        !           263:        register struct proc *pp;
        !           264:        register loc, np;
        !           265:        struct pte apte;
        !           266: 
        !           267:        lseek(fc, (long)nl[SPROC].n_value, 0);
        !           268:        read(fc, xproc, sizeof(xproc));
        !           269:        np = 0;
        !           270:        for (pp=xproc; pp < &xproc[NPROC]; pp++)
        !           271:                if (pp->p_stat)
        !           272:                        np++;
        !           273:        if (totflg) {
        !           274:                printf("%3d/%3d processes\n", np, NPROC);
        !           275:                return;
        !           276:        }
        !           277:        printf("%d/%d processes\n", np, NPROC);
        !           278:        printf("   LOC    S    F POIP PRI      SIG  UID SLP TIM  CPU  NI   PGRP    PID   PPID    ADDR   RSS SRSS SIZE    WCHAN    LINK   TEXTP CLKT\n");
        !           279:        for (loc=nl[SPROC].n_value,pp=xproc; pp<&xproc[NPROC]; pp++,loc+=sizeof(xproc[0])) {
        !           280:                if (pp->p_stat==0 && allflg==0)
        !           281:                        continue;
        !           282:                printf("%8x", loc);
        !           283:                printf(" %2d", pp->p_stat);
        !           284:                printf(" %4x", pp->p_flag & 0xffff);
        !           285:                printf(" %4d", pp->p_poip);
        !           286:                printf(" %3d", pp->p_pri);
        !           287:                printf(" %8x", pp->p_sig);
        !           288:                printf(" %4d", pp->p_uid);
        !           289:                printf(" %3d", pp->p_slptime);
        !           290:                printf(" %3d", pp->p_time);
        !           291:                printf(" %4d", pp->p_cpu&0377);
        !           292:                printf(" %3d", pp->p_nice);
        !           293:                printf(" %6d", pp->p_pgrp);
        !           294:                printf(" %6d", pp->p_pid);
        !           295:                printf(" %6d", pp->p_ppid);
        !           296:                if (kflg)
        !           297:                        pp->p_addr = (struct pte *)clear((int)pp->p_addr);
        !           298:                lseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
        !           299:                read(fc, &apte, sizeof(apte));
        !           300:                printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
        !           301:                printf(" %4x", pp->p_rssize);
        !           302:                printf(" %4x", pp->p_swrss);
        !           303:                printf(" %5x", pp->p_dsize+pp->p_ssize);
        !           304:                printf(" %7x", clear(pp->p_wchan));
        !           305:                printf(" %7x", clear(pp->p_link));
        !           306:                printf(" %7x", clear(pp->p_textp));
        !           307:                printf("    %u", pp->p_clktim);
        !           308:                printf("\n");
        !           309:        }
        !           310: }
        !           311: 
        !           312: dotty()
        !           313: {
        !           314:        struct tty dz_tty[64];
        !           315:        int ndz;
        !           316:        register struct tty *tp;
        !           317:        register char *mesg;
        !           318: 
        !           319:        printf("1 cons\n");
        !           320:        lseek(fc, (long)nl[SKL].n_value, 0);
        !           321:        read(fc, dz_tty, sizeof(dz_tty[0]));
        !           322:        mesg = " # RAW CAN OUT   MODE    ADDR   DEL COL  STATE   PGRP DISC\n";
        !           323:        printf(mesg);
        !           324:        ttyprt(&dz_tty[0], 0);
        !           325:        if (nl[SNDZ].n_type == 0)
        !           326:                goto dh;
        !           327:        lseek(fc, (long)nl[SNDZ].n_value, 0);
        !           328:        read(fc, &ndz, sizeof(ndz));
        !           329:        printf("%d dz lines\n", ndz);
        !           330:        lseek(fc, (long)nl[SDZ].n_value, 0);
        !           331:        read(fc, dz_tty, sizeof(dz_tty));
        !           332:        for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
        !           333:                ttyprt(tp, tp - dz_tty);
        !           334: dh:
        !           335:        if (nl[SNDH].n_type == 0)
        !           336:                return;
        !           337:        lseek(fc, (long)nl[SNDH].n_value, 0);
        !           338:        read(fc, &ndz, sizeof(ndz));
        !           339:        printf("%d dh lines\n", ndz);
        !           340:        lseek(fc, (long)nl[SDH].n_value, 0);
        !           341:        read(fc, dz_tty, sizeof(dz_tty));
        !           342:        for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
        !           343:                ttyprt(tp, tp - dz_tty);
        !           344: }
        !           345: 
        !           346: ttyprt(atp, line)
        !           347: struct tty *atp;
        !           348: {
        !           349:        register struct tty *tp;
        !           350: 
        !           351:        printf("%2d", line);
        !           352:        tp = atp;
        !           353:        switch (tp->t_line) {
        !           354: 
        !           355:        case NETLDISC:
        !           356:                if (tp->t_rec)
        !           357:                        printf("%4d%4d", 0, tp->t_inbuf);
        !           358:                else
        !           359:                        printf("%4d%4d", tp->t_inbuf, 0);
        !           360:                break;
        !           361: 
        !           362:        default:
        !           363:                printf("%4d", tp->t_rawq.c_cc);
        !           364:                printf("%4d", tp->t_canq.c_cc);
        !           365:        }
        !           366:        printf("%4d", tp->t_outq.c_cc);
        !           367:        printf("%8.1o", tp->t_flags);
        !           368:        printf(" %8.1x", tp->t_addr);
        !           369:        printf("%3d", tp->t_delct);
        !           370:        printf("%4d ", tp->t_col);
        !           371:        putf(tp->t_state&TIMEOUT, 'T');
        !           372:        putf(tp->t_state&WOPEN, 'W');
        !           373:        putf(tp->t_state&ISOPEN, 'O');
        !           374:        putf(tp->t_state&CARR_ON, 'C');
        !           375:        putf(tp->t_state&BUSY, 'B');
        !           376:        putf(tp->t_state&ASLEEP, 'A');
        !           377:        putf(tp->t_state&XCLUDE, 'X');
        !           378: /*
        !           379:        putf(tp->t_state&HUPCLS, 'H');
        !           380:  */
        !           381:        printf("%6d", tp->t_pgrp);
        !           382:        switch (tp->t_line) {
        !           383: 
        !           384:        case NTTYDISC:
        !           385:                printf(" ntty");
        !           386:                break;
        !           387: 
        !           388:        case NETLDISC:
        !           389:                printf(" net");
        !           390:                break;
        !           391:        }
        !           392:        printf("\n");
        !           393: }
        !           394: 
        !           395: dousr()
        !           396: {
        !           397:        struct user U;
        !           398:        register i, j, *ip;
        !           399: 
        !           400:        /* This wins only if PAGSIZ > sizeof (struct user) */
        !           401:        lseek(fc, ubase * NBPG, 0);
        !           402:        read(fc, &U, sizeof(U));
        !           403:        printf("pcb");
        !           404:        ip = (int *)&U.u_pcb;
        !           405:        while (ip < &U.u_arg[0]) {
        !           406:                if ((ip - (int *)&U.u_pcb) % 4 == 0)
        !           407:                        printf("\t");
        !           408:                printf("%x ", *ip++);
        !           409:                if ((ip - (int *)&U.u_pcb) % 4 == 0)
        !           410:                        printf("\n");
        !           411:        }
        !           412:        if ((ip - (int *)&U.u_pcb) % 4 != 0)
        !           413:                printf("\n");
        !           414:        printf("arg\t");
        !           415:        for (i=0; i<5; i++)
        !           416:                printf(" %.1x", U.u_arg[i]);
        !           417:        printf("\n");
        !           418:        for (i=0; i<sizeof(label_t)/sizeof(int); i++) {
        !           419:                if (i%5==0)
        !           420:                        printf("\t");
        !           421:                printf("%9.1x", U.u_ssav[i]);
        !           422:                if (i%5==4)
        !           423:                        printf("\n");
        !           424:        }
        !           425:        if (i%5)
        !           426:                printf("\n");
        !           427:        printf("segflg\t%d\nerror %d\n", U.u_segflg, U.u_error);
        !           428:        printf("uids\t%d,%d,%d,%d\n", U.u_uid,U.u_gid,U.u_ruid,U.u_rgid);
        !           429:        printf("procp\t%.1x\n", U.u_procp);
        !           430:        printf("ap\t%.1x\n", U.u_ap);
        !           431:        printf("r_val?\t%.1x %.1x\n", U.u_r.r_val1, U.u_r.r_val2);
        !           432:        printf("base, count, offset %.1x %.1x %ld\n", U.u_base,
        !           433:                U.u_count, U.u_offset);
        !           434:        printf("cdir rdir %.1x %.1x\n", U.u_cdir, U.u_rdir);
        !           435:        printf("dbuf %.14s\n", U.u_dbuf);
        !           436:        printf("dirp %.1x\n", U.u_dirp);
        !           437:        printf("dent %d %.14s\n", U.u_dent.d_ino, U.u_dent.d_name);
        !           438:        printf("pdir %.1o\n", U.u_pdir);
        !           439:        printf("file\t");
        !           440:        for (i=0; i<10; i++)
        !           441:                printf("%9.1x", U.u_ofile[i]);
        !           442:        printf("\n\t");
        !           443:        for (i=10; i<NOFILE; i++)
        !           444:                printf("%9.1x", U.u_ofile[i]);
        !           445:        printf("\n");
        !           446:        printf("pofile\t");
        !           447:        for (i=0; i<10; i++)
        !           448:                printf("%9.1x", U.u_pofile[i]);
        !           449:        printf("\n\t");
        !           450:        for (i=10; i<NOFILE; i++)
        !           451:                printf("%9.1x", U.u_pofile[i]);
        !           452:        printf("\n");
        !           453:        printf("ssav");
        !           454:        for (i=0; i<sizeof(label_t)/sizeof(int); i++) {
        !           455:                if (i%5==0)
        !           456:                        printf("\t");
        !           457:                printf("%9.1x", U.u_ssav[i]);
        !           458:                if (i%5==4)
        !           459:                        printf("\n");
        !           460:        }
        !           461:        if (i%5)
        !           462:                printf("\n");
        !           463:        printf("sigs\t");
        !           464:        for (i=0; i<NSIG; i++)
        !           465:                printf("%.1x ", U.u_signal[i]);
        !           466:        printf("\n");
        !           467:        printf("cfcode\t%.1x\n", U.u_cfcode);
        !           468:        printf("ar0\t%.1x\n", U.u_ar0);
        !           469:        printf("prof\t%X %X %X %X\n", U.u_prof.pr_base, U.u_prof.pr_size,
        !           470:            U.u_prof.pr_off, U.u_prof.pr_scale);
        !           471:        printf("\neosys\t%d\n", U.u_eosys);
        !           472:        printf("sep\t%d\n", U.u_sep);
        !           473:        printf("ttyp\t%.1x\n", U.u_ttyp);
        !           474:        printf("ttyd\t%d,%d\n", major(U.u_ttyd), minor(U.u_ttyd));
        !           475:        printf("exdata\t");
        !           476:        ip = (int *)&U.u_exdata;
        !           477:        for (i = 0; i < 8; i++)
        !           478:                printf("%.1D ", *ip++);
        !           479:        printf("\n");
        !           480:        printf("comm %.14s\n", U.u_comm);
        !           481:        printf("start\t%D\n", U.u_start);
        !           482:        printf("acflag\t%D\n", U.u_acflag);
        !           483:        printf("fpflag\t%D\n", U.u_fpflag);
        !           484:        printf("cmask\t%D\n", U.u_cmask);
        !           485:        printf("sizes\t%.1x %.1x %.1x\n", U.u_tsize, U.u_dsize, U.u_ssize);
        !           486:        printf("vm\t");
        !           487:        ip = (int *)&U.u_vm;
        !           488:        for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++)
        !           489:                printf("%D ", ip[i]);
        !           490:        printf("\n");
        !           491:        ip = (int *)&U.u_cvm;
        !           492:        printf("cvm\t");
        !           493:        for (i = 0; i < sizeof(U.u_vm)/sizeof(int); i++)
        !           494:                printf("%D ", ip[i]);
        !           495:        printf("\n");
        !           496: /*
        !           497:        i =  U.u_stack - &U;
        !           498:        while (U[++i] == 0);
        !           499:        i &= ~07;
        !           500:        while (i < 512) {
        !           501:                printf("%x ", 0140000+2*i);
        !           502:                for (j=0; j<8; j++)
        !           503:                        printf("%9x", U[i++]);
        !           504:                printf("\n");
        !           505:        }
        !           506: */
        !           507: }
        !           508: 
        !           509: oatoi(s)
        !           510: char *s;
        !           511: {
        !           512:        register v;
        !           513: 
        !           514:        v = 0;
        !           515:        while (*s)
        !           516:                v = (v<<3) + *s++ - '0';
        !           517:        return(v);
        !           518: }
        !           519: 
        !           520: dofil()
        !           521: {
        !           522:        struct file xfile[NFILE];
        !           523:        register struct file *fp;
        !           524:        register nf;
        !           525:        int loc;
        !           526: 
        !           527:        nf = 0;
        !           528:        lseek(fc, (long)nl[SFIL].n_value, 0);
        !           529:        read(fc, xfile, sizeof(xfile));
        !           530:        for (fp=xfile; fp < &xfile[NFILE]; fp++)
        !           531:                if (fp->f_count)
        !           532:                        nf++;
        !           533:        if (totflg) {
        !           534:                printf("%3d/%3d files\n", nf, NFILE);
        !           535:                return;
        !           536:        }
        !           537:        printf("%d/%d open files\n", nf, NFILE);
        !           538:        printf("   LOC   FLG  CNT   INO    OFFS\n");
        !           539:        for (fp=xfile,loc=nl[SFIL].n_value; fp < &xfile[NFILE]; fp++,loc+=sizeof(xfile[0])) {
        !           540:                if (fp->f_count==0)
        !           541:                        continue;
        !           542:                printf("%8x ", loc);
        !           543:                putf(fp->f_flag&FREAD, 'R');
        !           544:                putf(fp->f_flag&FWRITE, 'W');
        !           545:                putf(fp->f_flag&FPIPE, 'P');
        !           546:                printf("%4d", mask(fp->f_count));
        !           547:                printf("%9.1x", fp->f_inode);
        !           548:                printf("  %ld\n", fp->f_un.f_offset);
        !           549:        }
        !           550: }
        !           551: 
        !           552: doswap()
        !           553: {
        !           554:        struct proc proc[NPROC];
        !           555:        struct text xtext[NTEXT];
        !           556:        struct map swapmap[SMAPSIZ];
        !           557:        register struct proc *pp;
        !           558:        int nswap, used, tused, free;
        !           559:        register struct map *mp;
        !           560:        register struct text *xp;
        !           561: 
        !           562:        lseek(fc, (long)nl[SPROC].n_value, 0);
        !           563:        read(fc, proc, sizeof(proc));
        !           564:        lseek(fc, (long)nl[SWAPMAP].n_value, 0);
        !           565:        read(fc, swapmap, sizeof(swapmap));
        !           566:        lseek(fc, (long)nl[SNSWAP].n_value, 0);
        !           567:        read(fc, &nswap, sizeof(nswap));
        !           568:        free = 0;
        !           569:        for (mp = swapmap; mp < &swapmap[SMAPSIZ]; mp++)
        !           570:                free += mp->m_size;
        !           571:        lseek(fc, (long)nl[STEXT].n_value, 0);
        !           572:        read(fc, xtext, sizeof(xtext));
        !           573:        tused = 0;
        !           574:        for (xp = xtext; xp < &xtext[NTEXT]; xp++)
        !           575:                if (xp->x_iptr!=NULL)
        !           576:                        tused += xdsize(xp);
        !           577:        used = tused;
        !           578:        for (pp = proc; pp < &proc[NPROC]; pp++) {
        !           579:                if (pp->p_stat == 0 || pp->p_stat == SZOMB)
        !           580:                        continue;
        !           581:                if (pp->p_flag & SSYS)
        !           582:                        continue;
        !           583:                used += up(pp->p_dsize) + up(pp->p_ssize);
        !           584:                if ((pp->p_flag&SLOAD) == 0)
        !           585:                        used += vusize(pp);
        !           586:        }
        !           587:        /* a DMMAX block goes to argmap */
        !           588:        if (totflg) {
        !           589:                printf("%3d/%3d 00k swap\n", used/2/100, (used+free)/2/100);
        !           590:                return;
        !           591:        }
        !           592:        printf("%d used (%d text), %d free, %d missing\n",
        !           593:            used/2, tused/2, free/2, (nswap - DMMAX - (used + free))/2);
        !           594: }
        !           595: 
        !           596: up(size)
        !           597:        register int size;
        !           598: {
        !           599:        register int i, block;
        !           600: 
        !           601:        i = 0;
        !           602:        block = DMMIN;
        !           603:        while (i < size) {
        !           604:                i += block;
        !           605:                if (block < DMMAX)
        !           606:                        block *= 2;
        !           607:        }
        !           608:        return (i);
        !           609: }
        !           610: 
        !           611: vusize(p)
        !           612: struct proc *p;
        !           613: {
        !           614:        register int tsz = p->p_tsize / NPTEPG;
        !           615: 
        !           616:        return (clrnd(UPAGES + clrnd(ctopt(p->p_tsize+p->p_dsize+p->p_ssize+UPAGES)) - tsz));
        !           617: }
        !           618: 
        !           619: xdsize(xp)
        !           620: struct text *xp;
        !           621: {
        !           622: 
        !           623:        if (xp->x_flag & XPAGI)
        !           624:                return (clrnd(xp->x_size + ctopt(xp->x_size)));
        !           625:        return (xp->x_size);
        !           626: }

unix.superglobalmegacorp.com

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