Commit | Line | Data |
---|---|---|
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 | 9 | static 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 | ||
23 | static void dkselect __P((char *, int, int [])); | |
24 | static int read_names __P((void)); | |
833d578b | 25 | |
86923762 | 26 | static 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 | 56 | float *dk_mspw; |
0c28365a | 57 | int dk_ndrive, *dk_select; |
ea485da2 KB |
58 | char **dr_name; |
59 | ||
0c28365a KB |
60 | #include "names.c" /* XXX */ |
61 | ||
ea485da2 | 62 | int |
833d578b SL |
63 | dkinit() |
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 | 114 | int |
833d578b SL |
115 | dkcmd(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 | 138 | static void |
4da6460c KM |
139 | dkselect(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 | } |