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