integrate Steve Hayman's version; now POSIX 1003.2 D11.2 compliant
[unix-history] / usr / src / usr.bin / systat / disks.c
CommitLineData
07ed1e09
KM
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
4da6460c 7#ifndef lint
142cb8a1 8static char sccsid[] = "@(#)disks.c 5.10 (Berkeley) %G%";
07ed1e09 9#endif not lint
4da6460c
KM
10
11#include "systat.h"
4da6460c 12#include <sys/buf.h>
833d578b 13#include <ctype.h>
eef33ea7 14#include <paths.h>
833d578b
SL
15
16static struct nlist nlst[] = {
17#define X_DK_NDRIVE 0
18 { "_dk_ndrive" },
bcc006b0
KM
19#define X_DK_WPMS 1
20 { "_dk_wpms" },
4da6460c 21#ifdef vax
bcc006b0 22#define X_MBDINIT (X_DK_WPMS+1)
833d578b 23 { "_mbdinit" },
bcc006b0 24#define X_UBDINIT (X_DK_WPMS+2)
833d578b 25 { "_ubdinit" },
4da6460c
KM
26#endif
27#ifdef sun
bcc006b0 28#define X_MBDINIT (X_DK_WPMS+1)
833d578b 29 { "_mbdinit" },
8d7d38c3
SL
30#endif
31#ifdef tahoe
bcc006b0 32#define X_VBDINIT (X_DK_WPMS+1)
8d7d38c3 33 { "_vbdinit" },
4da6460c 34#endif
833d578b
SL
35 { "" },
36};
37
38dkinit()
39{
40 register int i;
41 register char *cp;
42 static int once = 0;
43 static char buf[1024];
4da6460c 44
833d578b 45 if (once)
c0b7e584 46 return(1);
142cb8a1 47 kvm_nlist(nlst);
833d578b
SL
48 if (nlst[X_DK_NDRIVE].n_value == 0) {
49 error("dk_ndrive undefined in kernel");
c0b7e584 50 return(0);
833d578b 51 }
142cb8a1 52 NREAD(X_DK_NDRIVE, &dk_ndrive, LONG);
833d578b 53 if (dk_ndrive <= 0) {
eef33ea7 54 error("dk_ndrive=%d according to %s", dk_ndrive, _PATH_UNIX);
c0b7e584 55 return(0);
833d578b
SL
56 }
57 dk_mspw = (float *)calloc(dk_ndrive, sizeof (float));
bcc006b0
KM
58 {
59 long *wpms = (long *)calloc(dk_ndrive, sizeof(long));
142cb8a1 60 KREAD(NPTR(X_DK_WPMS), wpms, dk_ndrive * sizeof (long));
bcc006b0
KM
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 }
833d578b
SL
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 }
8d7d38c3 75 if (!read_names()) {
c0b7e584
JB
76 free(dr_name);
77 free(dk_select);
78 free(dk_mspw);
79 return(0);
80 }
81 once = 1;
82 return(1);
833d578b
SL
83}
84
85dkcmd(cmd, args)
86 char *cmd, *args;
87{
eef33ea7
KB
88 if (prefix(cmd, "display") || prefix(cmd, "add")) {
89 dkselect(args, 1, dk_select);
833d578b 90 return (1);
eef33ea7
KB
91 }
92 if (prefix(cmd, "ignore") || prefix(cmd, "delete")) {
93 dkselect(args, 0, dk_select);
833d578b 94 return (1);
eef33ea7
KB
95 }
96 if (prefix(cmd, "drives")) {
833d578b
SL
97 register int i;
98
eef33ea7
KB
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 }
833d578b
SL
105 return (0);
106}
4da6460c
KM
107
108#define steal(where, var) \
142cb8a1 109 KREAD(where, &var, sizeof var)
4da6460c
KM
110
111#ifdef vax
f389ef71
KS
112#include <vax/uba/ubavar.h>
113#include <vax/mba/mbavar.h>
833d578b
SL
114
115read_names()
4da6460c 116{
4da6460c
KM
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;
833d578b
SL
123 register struct mba_device *mp;
124 register struct uba_device *up;
4da6460c 125
833d578b
SL
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) {
4da6460c 129 error("Disk init info not in namelist\n");
c0b7e584 130 return(0);
4da6460c
KM
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 }
c0b7e584 154 return(1);
4da6460c
KM
155}
156#endif
157
158#ifdef sun
833d578b
SL
159#include <sundev/mbvar.h>
160
161read_names()
4da6460c
KM
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;
833d578b 168 register struct mb_device *mp;
4da6460c 169
833d578b 170 mp = (struct mb_device *)nlst[X_MBDINIT].n_value;
4da6460c
KM
171 if (mp == 0) {
172 error("Disk init info not in namelist\n");
c0b7e584 173 return(0);
4da6460c
KM
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 }
c0b7e584 186 return(1);
4da6460c
KM
187}
188#endif
189
8d7d38c3 190#ifdef tahoe
35ecfc80 191#include <tahoe/vba/vbavar.h>
8d7d38c3
SL
192
193/*
194 * Read the drive names out of kmem.
195 */
196read_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
1a7e8c28
MT
222#ifdef hp300
223read_names() {}
224#endif
225
4da6460c
KM
226dkselect(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;
833d578b 247 for (i = 0; i < dk_ndrive; i++)
4da6460c 248 if (strcmp(args, dr_name[i]) == 0) {
4da6460c 249 if (dk_mspw[i] != 0.0)
833d578b
SL
250 selections[i] = truefalse;
251 else
252 error("%s: drive not configured",
253 dr_name[i]);
4da6460c
KM
254 break;
255 }
833d578b 256 if (i >= dk_ndrive)
4da6460c
KM
257 error("%s: unknown drive", args);
258 args = cp;
259 }
260}