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