|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.