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