Annotation of 43BSDReno/usr.bin/systat/disks.c, revision 1.1.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.