4.4BSD snapshot (revision 8.1); add 1993 to copyright
[unix-history] / usr / src / usr.bin / systat / disks.c
CommitLineData
e485a75a 1/*-
ee9c1c1e
KB
2 * Copyright (c) 1980, 1992, 1993
3 * The Regents of the University of California. All rights reserved.
e485a75a 4 *
1e3c68be 5 * %sccs.include.redist.c%
07ed1e09
KM
6 */
7
4da6460c 8#ifndef lint
ee9c1c1e 9static char sccsid[] = "@(#)disks.c 8.1 (Berkeley) %G%";
e485a75a 10#endif /* not lint */
4da6460c 11
ea485da2 12#include <sys/types.h>
4da6460c 13#include <sys/buf.h>
0c28365a 14
ea485da2 15#include <nlist.h>
833d578b 16#include <ctype.h>
eef33ea7 17#include <paths.h>
ea485da2
KB
18#include <string.h>
19#include <stdlib.h>
20#include "systat.h"
21#include "extern.h"
22
23static void dkselect __P((char *, int, int []));
24static int read_names __P((void));
833d578b 25
86923762 26static struct nlist namelist[] = {
833d578b
SL
27#define X_DK_NDRIVE 0
28 { "_dk_ndrive" },
bcc006b0
KM
29#define X_DK_WPMS 1
30 { "_dk_wpms" },
4da6460c 31#ifdef vax
bcc006b0 32#define X_MBDINIT (X_DK_WPMS+1)
833d578b 33 { "_mbdinit" },
bcc006b0 34#define X_UBDINIT (X_DK_WPMS+2)
833d578b 35 { "_ubdinit" },
4da6460c
KM
36#endif
37#ifdef sun
bcc006b0 38#define X_MBDINIT (X_DK_WPMS+1)
833d578b 39 { "_mbdinit" },
8d7d38c3
SL
40#endif
41#ifdef tahoe
bcc006b0 42#define X_VBDINIT (X_DK_WPMS+1)
8d7d38c3 43 { "_vbdinit" },
0c28365a 44#endif
e2d6f19e 45#if defined(hp300) || defined(luna68k)
0c28365a
KB
46#define X_HPDINIT (X_DK_WPMS+1)
47 { "_hp_dinit" },
6cb096c5
RC
48#endif
49#ifdef mips
50#define X_SCSI_DINIT (X_DK_WPMS+1)
51 { "_scsi_dinit" },
4da6460c 52#endif
833d578b
SL
53 { "" },
54};
55
ea485da2 56float *dk_mspw;
0c28365a 57int dk_ndrive, *dk_select;
ea485da2
KB
58char **dr_name;
59
0c28365a
KB
60#include "names.c" /* XXX */
61
ea485da2 62int
833d578b
SL
63dkinit()
64{
65 register int i;
66 register char *cp;
67 static int once = 0;
68 static char buf[1024];
4da6460c 69
833d578b 70 if (once)
c0b7e584 71 return(1);
ea485da2 72
86923762
KB
73 if (kvm_nlist(kd, namelist)) {
74 nlisterr(namelist);
ea485da2
KB
75 return(0);
76 }
86923762 77 if (namelist[X_DK_NDRIVE].n_value == 0) {
833d578b 78 error("dk_ndrive undefined in kernel");
c0b7e584 79 return(0);
833d578b 80 }
142cb8a1 81 NREAD(X_DK_NDRIVE, &dk_ndrive, LONG);
833d578b 82 if (dk_ndrive <= 0) {
eef33ea7 83 error("dk_ndrive=%d according to %s", dk_ndrive, _PATH_UNIX);
c0b7e584 84 return(0);
833d578b
SL
85 }
86 dk_mspw = (float *)calloc(dk_ndrive, sizeof (float));
bcc006b0
KM
87 {
88 long *wpms = (long *)calloc(dk_ndrive, sizeof(long));
142cb8a1 89 KREAD(NPTR(X_DK_WPMS), wpms, dk_ndrive * sizeof (long));
bcc006b0
KM
90 for (i = 0; i < dk_ndrive; i++)
91 *(dk_mspw + i) = (*(wpms + i) == 0)? 0.0:
92 (float) 1.0 / *(wpms + i);
93 free(wpms);
94 }
833d578b
SL
95 dr_name = (char **)calloc(dk_ndrive, sizeof (char *));
96 dk_select = (int *)calloc(dk_ndrive, sizeof (int));
97 for (cp = buf, i = 0; i < dk_ndrive; i++) {
98 dr_name[i] = cp;
99 sprintf(dr_name[i], "dk%d", i);
100 cp += strlen(dr_name[i]) + 1;
101 if (dk_mspw[i] != 0.0)
102 dk_select[i] = 1;
103 }
8d7d38c3 104 if (!read_names()) {
c0b7e584
JB
105 free(dr_name);
106 free(dk_select);
107 free(dk_mspw);
108 return(0);
109 }
110 once = 1;
111 return(1);
833d578b
SL
112}
113
ea485da2 114int
833d578b
SL
115dkcmd(cmd, args)
116 char *cmd, *args;
117{
eef33ea7
KB
118 if (prefix(cmd, "display") || prefix(cmd, "add")) {
119 dkselect(args, 1, dk_select);
833d578b 120 return (1);
eef33ea7
KB
121 }
122 if (prefix(cmd, "ignore") || prefix(cmd, "delete")) {
123 dkselect(args, 0, dk_select);
833d578b 124 return (1);
eef33ea7
KB
125 }
126 if (prefix(cmd, "drives")) {
833d578b
SL
127 register int i;
128
eef33ea7
KB
129 move(CMDLINE, 0); clrtoeol();
130 for (i = 0; i < dk_ndrive; i++)
131 if (dk_mspw[i] != 0.0)
132 printw("%s ", dr_name[i]);
133 return (1);
134 }
833d578b
SL
135 return (0);
136}
4da6460c 137
ea485da2 138static void
4da6460c
KM
139dkselect(args, truefalse, selections)
140 char *args;
141 int truefalse, selections[];
142{
143 register char *cp;
144 register int i;
145 char *index();
146
147 cp = index(args, '\n');
148 if (cp)
149 *cp = '\0';
150 for (;;) {
151 for (cp = args; *cp && isspace(*cp); cp++)
152 ;
153 args = cp;
154 for (; *cp && !isspace(*cp); cp++)
155 ;
156 if (*cp)
157 *cp++ = '\0';
158 if (cp - args == 0)
159 break;
833d578b 160 for (i = 0; i < dk_ndrive; i++)
4da6460c 161 if (strcmp(args, dr_name[i]) == 0) {
4da6460c 162 if (dk_mspw[i] != 0.0)
833d578b
SL
163 selections[i] = truefalse;
164 else
165 error("%s: drive not configured",
166 dr_name[i]);
4da6460c
KM
167 break;
168 }
833d578b 169 if (i >= dk_ndrive)
4da6460c
KM
170 error("%s: unknown drive", args);
171 args = cp;
172 }
173}