|
|
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.