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