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: }