Annotation of 43BSDReno/usr.bin/systat/disks.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)disks.c    5.5 (Berkeley) 5/29/89";
        !             9: #endif not lint
        !            10: 
        !            11: #include "systat.h"
        !            12: #include <sys/buf.h>
        !            13: #include <ctype.h>
        !            14: #include <paths.h>
        !            15: 
        !            16: static struct nlist nlst[] = {
        !            17: #define        X_DK_NDRIVE     0
        !            18:        { "_dk_ndrive" },
        !            19: #define        X_DK_WPMS       1
        !            20:        { "_dk_wpms" },
        !            21: #ifdef vax
        !            22: #define        X_MBDINIT       (X_DK_WPMS+1)
        !            23:        { "_mbdinit" },
        !            24: #define        X_UBDINIT       (X_DK_WPMS+2)
        !            25:        { "_ubdinit" },
        !            26: #endif
        !            27: #ifdef sun
        !            28: #define        X_MBDINIT       (X_DK_WPMS+1)
        !            29:        { "_mbdinit" },
        !            30: #endif
        !            31: #ifdef tahoe
        !            32: #define        X_VBDINIT       (X_DK_WPMS+1)
        !            33:        { "_vbdinit" },
        !            34: #endif
        !            35:        { "" },
        !            36: };
        !            37: 
        !            38: dkinit()
        !            39: {
        !            40:        register int i;
        !            41:        register char *cp;
        !            42:        static int once = 0;
        !            43:        static char buf[1024];
        !            44: 
        !            45:        if (once)
        !            46:                return(1);
        !            47:        nlist(_PATH_UNIX, nlst);
        !            48:        if (nlst[X_DK_NDRIVE].n_value == 0) {
        !            49:                error("dk_ndrive undefined in kernel");
        !            50:                return(0);
        !            51:        }
        !            52:        dk_ndrive = getw(nlst[X_DK_NDRIVE].n_value);
        !            53:        if (dk_ndrive <= 0) {
        !            54:                error("dk_ndrive=%d according to %s", dk_ndrive, _PATH_UNIX);
        !            55:                return(0);
        !            56:        }
        !            57:        dk_mspw = (float *)calloc(dk_ndrive, sizeof (float));
        !            58:        lseek(kmem, nlst[X_DK_WPMS].n_value, L_SET);
        !            59:        {
        !            60:                long *wpms = (long *)calloc(dk_ndrive, sizeof(long));
        !            61:                read(kmem, wpms, dk_ndrive * sizeof (long));
        !            62:                for (i = 0; i < dk_ndrive; i++)
        !            63:                        *(dk_mspw + i) = (*(wpms + i) == 0)? 0.0:
        !            64:                                         (float) 1.0 / *(wpms + i);
        !            65:                free(wpms);
        !            66:        }
        !            67:        dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
        !            68:        dk_select = (int *)calloc(dk_ndrive, sizeof (int));
        !            69:        for (cp = buf, i = 0; i < dk_ndrive; i++) {
        !            70:                dr_name[i] = cp;
        !            71:                sprintf(dr_name[i], "dk%d", i);
        !            72:                cp += strlen(dr_name[i]) + 1;
        !            73:                if (dk_mspw[i] != 0.0)
        !            74:                        dk_select[i] = 1;
        !            75:        }
        !            76:        if (!read_names()) {
        !            77:                free(dr_name);
        !            78:                free(dk_select);
        !            79:                free(dk_mspw);
        !            80:                return(0);
        !            81:        }
        !            82:        once = 1;
        !            83:        return(1);
        !            84: }
        !            85: 
        !            86: dkcmd(cmd, args)
        !            87:        char *cmd, *args;
        !            88: {
        !            89:        if (prefix(cmd, "display") || prefix(cmd, "add")) {
        !            90:                dkselect(args, 1, dk_select);
        !            91:                return (1);
        !            92:        }
        !            93:        if (prefix(cmd, "ignore") || prefix(cmd, "delete")) {
        !            94:                dkselect(args, 0, dk_select);
        !            95:                return (1);
        !            96:        }
        !            97:        if (prefix(cmd, "drives")) {
        !            98:                register int i;
        !            99: 
        !           100:                move(CMDLINE, 0); clrtoeol();
        !           101:                for (i = 0; i < dk_ndrive; i++)
        !           102:                        if (dk_mspw[i] != 0.0)
        !           103:                                printw("%s ", dr_name[i]);
        !           104:                return (1);
        !           105:        }
        !           106:        return (0);
        !           107: }
        !           108: 
        !           109: #define steal(where, var) \
        !           110:        lseek(kmem, where, L_SET); read(kmem, &var, sizeof var);
        !           111: 
        !           112: #ifdef vax
        !           113: #include <vaxuba/ubavar.h>
        !           114: #include <vaxmba/mbavar.h>
        !           115: 
        !           116: read_names()
        !           117: {
        !           118:        struct mba_device mdev;
        !           119:        struct mba_driver mdrv;
        !           120:        short two_char;
        !           121:        char *cp = (char *)&two_char;
        !           122:        struct uba_device udev;
        !           123:        struct uba_driver udrv;
        !           124:        register struct mba_device *mp;
        !           125:        register struct uba_device *up;
        !           126: 
        !           127:        mp = (struct mba_device *)nlst[X_MBDINIT].n_value;
        !           128:        up = (struct uba_device *)nlst[X_UBDINIT].n_value;
        !           129:        if (mp == 0 && up == 0) {
        !           130:                error("Disk init info not in namelist\n");
        !           131:                return(0);
        !           132:        }
        !           133:        if (mp) for (;;) {
        !           134:                steal(mp++, mdev);
        !           135:                if (mdev.mi_driver == 0)
        !           136:                        break;
        !           137:                if (mdev.mi_dk < 0 || mdev.mi_alive == 0)
        !           138:                        continue;
        !           139:                steal(mdev.mi_driver, mdrv);
        !           140:                steal(mdrv.md_dname, two_char);
        !           141:                sprintf(dr_name[mdev.mi_dk], "%c%c%d",
        !           142:                    cp[0], cp[1], mdev.mi_unit);
        !           143:        }
        !           144:        if (up) for (;;) {
        !           145:                steal(up++, udev);
        !           146:                if (udev.ui_driver == 0)
        !           147:                        break;
        !           148:                if (udev.ui_dk < 0 || udev.ui_alive == 0)
        !           149:                        continue;
        !           150:                steal(udev.ui_driver, udrv);
        !           151:                steal(udrv.ud_dname, two_char);
        !           152:                sprintf(dr_name[udev.ui_dk], "%c%c%d",
        !           153:                    cp[0], cp[1], udev.ui_unit);
        !           154:        }
        !           155:        return(1);
        !           156: }
        !           157: #endif
        !           158: 
        !           159: #ifdef sun
        !           160: #include <sundev/mbvar.h>
        !           161: 
        !           162: read_names()
        !           163: {
        !           164:        static int once = 0;
        !           165:        struct mb_device mdev;
        !           166:        struct mb_driver mdrv;
        !           167:        short two_char;
        !           168:        char *cp = (char *) &two_char;
        !           169:        register struct mb_device *mp;
        !           170: 
        !           171:        mp = (struct mb_device *)nlst[X_MBDINIT].n_value;
        !           172:        if (mp == 0) {
        !           173:                error("Disk init info not in namelist\n");
        !           174:                return(0);
        !           175:        }
        !           176:        for (;;) {
        !           177:                steal(mp++, mdev);
        !           178:                if (mdev.md_driver == 0)
        !           179:                        break;
        !           180:                if (mdev.md_dk < 0 || mdev.md_alive == 0)
        !           181:                        continue;
        !           182:                steal(mdev.md_driver, mdrv);
        !           183:                steal(mdrv.mdr_dname, two_char);
        !           184:                sprintf(dr_name[mdev.md_dk], "%c%c%d",
        !           185:                    cp[0], cp[1], mdev.md_unit);
        !           186:        }
        !           187:        return(1);
        !           188: }
        !           189: #endif
        !           190: 
        !           191: #ifdef tahoe
        !           192: #include <tahoevba/vbavar.h>
        !           193: 
        !           194: /*
        !           195:  * Read the drive names out of kmem.
        !           196:  */
        !           197: read_names()
        !           198: {
        !           199:        struct vba_device udev, *up;
        !           200:        struct vba_driver udrv;
        !           201:        short two_char;
        !           202:        char *cp = (char *)&two_char;
        !           203: 
        !           204:        up = (struct vba_device *) nlst[X_VBDINIT].n_value;
        !           205:        if (up == 0) {
        !           206:                fprintf(stderr, "vmstat: Disk init info not in namelist\n");
        !           207:                exit(1);
        !           208:        }
        !           209:        for (;;) {
        !           210:                steal(up++, udev);
        !           211:                if (udev.ui_driver == 0)
        !           212:                        break;
        !           213:                if (udev.ui_dk < 0 || udev.ui_alive == 0)
        !           214:                        continue;
        !           215:                steal(udev.ui_driver, udrv);
        !           216:                steal(udrv.ud_dname, two_char);
        !           217:                sprintf(dr_name[udev.ui_dk], "%c%c%d",
        !           218:                     cp[0], cp[1], udev.ui_unit);
        !           219:        }
        !           220: }
        !           221: #endif
        !           222: 
        !           223: dkselect(args, truefalse, selections)
        !           224:        char *args;
        !           225:        int truefalse, selections[];
        !           226: {
        !           227:        register char *cp;
        !           228:        register int i;
        !           229:        char *index();
        !           230: 
        !           231:        cp = index(args, '\n');
        !           232:        if (cp)
        !           233:                *cp = '\0';
        !           234:        for (;;) {
        !           235:                for (cp = args; *cp && isspace(*cp); cp++)
        !           236:                        ;
        !           237:                args = cp;
        !           238:                for (; *cp && !isspace(*cp); cp++)
        !           239:                        ;
        !           240:                if (*cp)
        !           241:                        *cp++ = '\0';
        !           242:                if (cp - args == 0)
        !           243:                        break;
        !           244:                for (i = 0; i < dk_ndrive; i++)
        !           245:                        if (strcmp(args, dr_name[i]) == 0) {
        !           246:                                if (dk_mspw[i] != 0.0)
        !           247:                                        selections[i] = truefalse;
        !           248:                                else
        !           249:                                        error("%s: drive not configured",
        !           250:                                            dr_name[i]);
        !           251:                                break;
        !           252:                        }
        !           253:                if (i >= dk_ndrive)
        !           254:                        error("%s: unknown drive", args);
        !           255:                args = cp;
        !           256:        }
        !           257: }

unix.superglobalmegacorp.com

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