xref: /original-bsd/usr.bin/systat/disks.c (revision e59fb703)
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.10 (Berkeley) 06/26/91";
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 	kvm_nlist(nlst);
48 	if (nlst[X_DK_NDRIVE].n_value == 0) {
49 		error("dk_ndrive undefined in kernel");
50 		return(0);
51 	}
52 	NREAD(X_DK_NDRIVE, &dk_ndrive, LONG);
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 	{
59 		long *wpms = (long *)calloc(dk_ndrive, sizeof(long));
60 		KREAD(NPTR(X_DK_WPMS), wpms, dk_ndrive * sizeof (long));
61 		for (i = 0; i < dk_ndrive; i++)
62 			*(dk_mspw + i) = (*(wpms + i) == 0)? 0.0:
63 			                 (float) 1.0 / *(wpms + i);
64 		free(wpms);
65 	}
66 	dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
67 	dk_select = (int *)calloc(dk_ndrive, sizeof (int));
68 	for (cp = buf, i = 0; i < dk_ndrive; i++) {
69 		dr_name[i] = cp;
70 		sprintf(dr_name[i], "dk%d", i);
71 		cp += strlen(dr_name[i]) + 1;
72 		if (dk_mspw[i] != 0.0)
73 			dk_select[i] = 1;
74 	}
75 	if (!read_names()) {
76 		free(dr_name);
77 		free(dk_select);
78 		free(dk_mspw);
79 		return(0);
80 	}
81 	once = 1;
82 	return(1);
83 }
84 
85 dkcmd(cmd, args)
86 	char *cmd, *args;
87 {
88 	if (prefix(cmd, "display") || prefix(cmd, "add")) {
89 		dkselect(args, 1, dk_select);
90 		return (1);
91 	}
92 	if (prefix(cmd, "ignore") || prefix(cmd, "delete")) {
93 		dkselect(args, 0, dk_select);
94 		return (1);
95 	}
96 	if (prefix(cmd, "drives")) {
97 		register int i;
98 
99 		move(CMDLINE, 0); clrtoeol();
100 		for (i = 0; i < dk_ndrive; i++)
101 			if (dk_mspw[i] != 0.0)
102 				printw("%s ", dr_name[i]);
103 		return (1);
104 	}
105 	return (0);
106 }
107 
108 #define steal(where, var) \
109 	KREAD(where, &var, sizeof var)
110 
111 #ifdef vax
112 #include <vax/uba/ubavar.h>
113 #include <vax/mba/mbavar.h>
114 
115 read_names()
116 {
117 	struct mba_device mdev;
118 	struct mba_driver mdrv;
119 	short two_char;
120 	char *cp = (char *)&two_char;
121 	struct uba_device udev;
122 	struct uba_driver udrv;
123 	register struct mba_device *mp;
124 	register struct uba_device *up;
125 
126 	mp = (struct mba_device *)nlst[X_MBDINIT].n_value;
127 	up = (struct uba_device *)nlst[X_UBDINIT].n_value;
128 	if (mp == 0 && up == 0) {
129 		error("Disk init info not in namelist\n");
130 		return(0);
131 	}
132 	if (mp) for (;;) {
133 		steal(mp++, mdev);
134 		if (mdev.mi_driver == 0)
135 			break;
136 		if (mdev.mi_dk < 0 || mdev.mi_alive == 0)
137 			continue;
138 		steal(mdev.mi_driver, mdrv);
139 		steal(mdrv.md_dname, two_char);
140 		sprintf(dr_name[mdev.mi_dk], "%c%c%d",
141 		    cp[0], cp[1], mdev.mi_unit);
142 	}
143 	if (up) for (;;) {
144 		steal(up++, udev);
145 		if (udev.ui_driver == 0)
146 			break;
147 		if (udev.ui_dk < 0 || udev.ui_alive == 0)
148 			continue;
149 		steal(udev.ui_driver, udrv);
150 		steal(udrv.ud_dname, two_char);
151 		sprintf(dr_name[udev.ui_dk], "%c%c%d",
152 		    cp[0], cp[1], udev.ui_unit);
153 	}
154 	return(1);
155 }
156 #endif
157 
158 #ifdef sun
159 #include <sundev/mbvar.h>
160 
161 read_names()
162 {
163 	static int once = 0;
164 	struct mb_device mdev;
165 	struct mb_driver mdrv;
166 	short two_char;
167 	char *cp = (char *) &two_char;
168 	register struct mb_device *mp;
169 
170 	mp = (struct mb_device *)nlst[X_MBDINIT].n_value;
171 	if (mp == 0) {
172 		error("Disk init info not in namelist\n");
173 		return(0);
174 	}
175 	for (;;) {
176 		steal(mp++, mdev);
177 		if (mdev.md_driver == 0)
178 			break;
179 		if (mdev.md_dk < 0 || mdev.md_alive == 0)
180 			continue;
181 		steal(mdev.md_driver, mdrv);
182 		steal(mdrv.mdr_dname, two_char);
183 		sprintf(dr_name[mdev.md_dk], "%c%c%d",
184 		    cp[0], cp[1], mdev.md_unit);
185 	}
186 	return(1);
187 }
188 #endif
189 
190 #ifdef tahoe
191 #include <tahoe/vba/vbavar.h>
192 
193 /*
194  * Read the drive names out of kmem.
195  */
196 read_names()
197 {
198 	struct vba_device udev, *up;
199 	struct vba_driver udrv;
200 	short two_char;
201 	char *cp = (char *)&two_char;
202 
203 	up = (struct vba_device *) nlst[X_VBDINIT].n_value;
204 	if (up == 0) {
205 		fprintf(stderr, "vmstat: Disk init info not in namelist\n");
206 		exit(1);
207 	}
208 	for (;;) {
209 		steal(up++, udev);
210 		if (udev.ui_driver == 0)
211 			break;
212 		if (udev.ui_dk < 0 || udev.ui_alive == 0)
213 			continue;
214 		steal(udev.ui_driver, udrv);
215 		steal(udrv.ud_dname, two_char);
216 		sprintf(dr_name[udev.ui_dk], "%c%c%d",
217 		     cp[0], cp[1], udev.ui_unit);
218 	}
219 }
220 #endif
221 
222 #ifdef hp300
223 read_names() {}
224 #endif
225 
226 dkselect(args, truefalse, selections)
227 	char *args;
228 	int truefalse, selections[];
229 {
230 	register char *cp;
231 	register int i;
232 	char *index();
233 
234 	cp = index(args, '\n');
235 	if (cp)
236 		*cp = '\0';
237 	for (;;) {
238 		for (cp = args; *cp && isspace(*cp); cp++)
239 			;
240 		args = cp;
241 		for (; *cp && !isspace(*cp); cp++)
242 			;
243 		if (*cp)
244 			*cp++ = '\0';
245 		if (cp - args == 0)
246 			break;
247 		for (i = 0; i < dk_ndrive; i++)
248 			if (strcmp(args, dr_name[i]) == 0) {
249 				if (dk_mspw[i] != 0.0)
250 					selections[i] = truefalse;
251 				else
252 					error("%s: drive not configured",
253 					    dr_name[i]);
254 				break;
255 			}
256 		if (i >= dk_ndrive)
257 			error("%s: unknown drive", args);
258 		args = cp;
259 	}
260 }
261