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

unix.superglobalmegacorp.com

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