1 |
|
|
/* $OpenBSD: cmd.c,v 1.20 2013/11/23 17:38:15 deraadt Exp $ */ |
2 |
|
|
|
3 |
|
|
/* |
4 |
|
|
* Copyright (c) 1999-2001 Mats O Jansson. All rights reserved. |
5 |
|
|
* |
6 |
|
|
* Redistribution and use in source and binary forms, with or without |
7 |
|
|
* modification, are permitted provided that the following conditions |
8 |
|
|
* are met: |
9 |
|
|
* 1. Redistributions of source code must retain the above copyright |
10 |
|
|
* notice, this list of conditions and the following disclaimer. |
11 |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
12 |
|
|
* notice, this list of conditions and the following disclaimer in the |
13 |
|
|
* documentation and/or other materials provided with the distribution. |
14 |
|
|
* |
15 |
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
16 |
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
17 |
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
18 |
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
19 |
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
20 |
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
21 |
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
22 |
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
23 |
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
24 |
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
25 |
|
|
*/ |
26 |
|
|
|
27 |
|
|
#include <sys/types.h> |
28 |
|
|
#include <sys/device.h> |
29 |
|
|
#include <sys/time.h> |
30 |
|
|
|
31 |
|
|
#include <ctype.h> |
32 |
|
|
#include <limits.h> |
33 |
|
|
#include <nlist.h> |
34 |
|
|
#include <stdio.h> |
35 |
|
|
#include <string.h> |
36 |
|
|
|
37 |
|
|
#include "misc.h" |
38 |
|
|
#define CMD_NOEXTERN |
39 |
|
|
#include "cmd.h" |
40 |
|
|
#include "ukc.h" |
41 |
|
|
#include "exec.h" |
42 |
|
|
|
43 |
|
|
extern int ukc_mod_kernel; |
44 |
|
|
static void int_variable_adjust(const cmd_t *, int, const char *); |
45 |
|
|
|
46 |
|
|
/* Our command table */ |
47 |
|
|
cmd_table_t cmd_table[] = { |
48 |
|
|
{"help", Xhelp, "", "Command help list"}, |
49 |
|
|
{"add", Xadd, "dev", "Add a device"}, |
50 |
|
|
{"base", Xbase, "8|10|16", "Base on large numbers"}, |
51 |
|
|
{"change", Xchange, "devno|dev", "Change device"}, |
52 |
|
|
{"disable",Xdisable, "attr val|devno|dev", "Disable device"}, |
53 |
|
|
{"enable", Xenable, "attr val|devno|dev", "Enable device"}, |
54 |
|
|
{"find", Xfind, "devno|dev", "Find device"}, |
55 |
|
|
{"list", Xlist, "", "List configuration"}, |
56 |
|
|
{"lines", Xlines, "count", "# of lines per page"}, |
57 |
|
|
{"show", Xshow, "[attr [val]]", "Show attribute"}, |
58 |
|
|
{"exit", Xexit, "", "Exit, without saving changes"}, |
59 |
|
|
{"quit", Xquit, "", "Quit, saving current changes"}, |
60 |
|
|
{"timezone", Xtimezone, "[mins [dst]]", "Show/change timezone"}, |
61 |
|
|
{"bufcachepercent", Xbufcachepct, "[number]", |
62 |
|
|
"Show/change BUFCACHEPERCENT"}, |
63 |
|
|
{"nkmempg", Xnkmempg, "[number]", "Show/change NKMEMPAGES"}, |
64 |
|
|
{NULL, NULL, NULL, NULL} |
65 |
|
|
}; |
66 |
|
|
|
67 |
|
|
int |
68 |
|
|
Xhelp(cmd_t *cmd) |
69 |
|
|
{ |
70 |
|
|
cmd_table_t *cmd_table = cmd->table; |
71 |
|
|
int i; |
72 |
|
|
|
73 |
|
|
/* Hmm, print out cmd_table here... */ |
74 |
|
|
for (i = 0; cmd_table[i].cmd != NULL; i++) |
75 |
|
|
printf("\t%-16s%-20s%s\n", cmd_table[i].cmd, |
76 |
|
|
cmd_table[i].opt, cmd_table[i].help); |
77 |
|
|
return (CMD_CONT); |
78 |
|
|
} |
79 |
|
|
|
80 |
|
|
int |
81 |
|
|
Xadd(cmd_t *cmd) |
82 |
|
|
{ |
83 |
|
|
short unit, state; |
84 |
|
|
int a; |
85 |
|
|
|
86 |
|
|
if (strlen(cmd->args) == 0) |
87 |
|
|
printf("Dev expected\n"); |
88 |
|
|
else if (device(cmd->args, &a, &unit, &state) == 0) |
89 |
|
|
add(cmd->args, a, unit, state); |
90 |
|
|
else |
91 |
|
|
printf("Unknown argument\n"); |
92 |
|
|
return (CMD_CONT); |
93 |
|
|
} |
94 |
|
|
|
95 |
|
|
int |
96 |
|
|
Xbase(cmd_t *cmd) |
97 |
|
|
{ |
98 |
|
|
int a; |
99 |
|
|
|
100 |
|
|
if (strlen(cmd->args) == 0) |
101 |
|
|
printf("8|10|16 expected\n"); |
102 |
|
|
else if (number(&cmd->args[0], &a) == 0) { |
103 |
|
|
if (a == 8 || a == 10 || a == 16) { |
104 |
|
|
base = a; |
105 |
|
|
} else { |
106 |
|
|
printf("8|10|16 expected\n"); |
107 |
|
|
} |
108 |
|
|
} else |
109 |
|
|
printf("Unknown argument\n"); |
110 |
|
|
return (CMD_CONT); |
111 |
|
|
} |
112 |
|
|
|
113 |
|
|
int |
114 |
|
|
Xchange(cmd_t *cmd) |
115 |
|
|
{ |
116 |
|
|
short unit, state; |
117 |
|
|
int a; |
118 |
|
|
|
119 |
|
|
if (strlen(cmd->args) == 0) |
120 |
|
|
printf("DevNo or Dev expected\n"); |
121 |
|
|
else if (number(cmd->args, &a) == 0) |
122 |
|
|
change(a); |
123 |
|
|
else if (device(cmd->args, &a, &unit, &state) == 0) |
124 |
|
|
common_dev(cmd->args, a, unit, state, UC_CHANGE); |
125 |
|
|
else |
126 |
|
|
printf("Unknown argument\n"); |
127 |
|
|
return (CMD_CONT); |
128 |
|
|
} |
129 |
|
|
|
130 |
|
|
int |
131 |
|
|
Xdisable(cmd_t *cmd) |
132 |
|
|
{ |
133 |
|
|
short unit, state; |
134 |
|
|
int a; |
135 |
|
|
|
136 |
|
|
if (strlen(cmd->args) == 0) |
137 |
|
|
printf("Attr, DevNo or Dev expected\n"); |
138 |
|
|
else if (attr(cmd->args, &a) == 0) |
139 |
|
|
common_attr(cmd->args, a, UC_DISABLE); |
140 |
|
|
else if (number(cmd->args, &a) == 0) |
141 |
|
|
disable(a); |
142 |
|
|
else if (device(cmd->args, &a, &unit, &state) == 0) |
143 |
|
|
common_dev(cmd->args, a, unit, state, UC_DISABLE); |
144 |
|
|
else |
145 |
|
|
printf("Unknown argument\n"); |
146 |
|
|
return (CMD_CONT); |
147 |
|
|
} |
148 |
|
|
|
149 |
|
|
int |
150 |
|
|
Xenable(cmd_t *cmd) |
151 |
|
|
{ |
152 |
|
|
short unit, state; |
153 |
|
|
int a; |
154 |
|
|
|
155 |
|
|
if (strlen(cmd->args) == 0) |
156 |
|
|
printf("Attr, DevNo or Dev expected\n"); |
157 |
|
|
else if (attr(cmd->args, &a) == 0) |
158 |
|
|
common_attr(cmd->args, a, UC_ENABLE); |
159 |
|
|
else if (number(cmd->args, &a) == 0) |
160 |
|
|
enable(a); |
161 |
|
|
else if (device(cmd->args, &a, &unit, &state) == 0) |
162 |
|
|
common_dev(cmd->args, a, unit, state, UC_ENABLE); |
163 |
|
|
else |
164 |
|
|
printf("Unknown argument\n"); |
165 |
|
|
return (CMD_CONT); |
166 |
|
|
} |
167 |
|
|
|
168 |
|
|
int |
169 |
|
|
Xfind(cmd_t *cmd) |
170 |
|
|
{ |
171 |
|
|
short unit, state; |
172 |
|
|
int a; |
173 |
|
|
|
174 |
|
|
if (strlen(cmd->args) == 0) |
175 |
|
|
printf("DevNo or Dev expected\n"); |
176 |
|
|
else if (number(cmd->args, &a) == 0) |
177 |
|
|
pdev(a); |
178 |
|
|
else if (device(cmd->args, &a, &unit, &state) == 0) |
179 |
|
|
common_dev(cmd->args, a, unit, state, UC_FIND); |
180 |
|
|
else |
181 |
|
|
printf("Unknown argument\n"); |
182 |
|
|
return (CMD_CONT); |
183 |
|
|
} |
184 |
|
|
|
185 |
|
|
int |
186 |
|
|
Xlines(cmd_t *cmd) |
187 |
|
|
{ |
188 |
|
|
int a; |
189 |
|
|
|
190 |
|
|
if (strlen(cmd->args) == 0) |
191 |
|
|
printf("Argument expected\n"); |
192 |
|
|
else if (number(cmd->args, &a) == 0) |
193 |
|
|
lines = a; |
194 |
|
|
else |
195 |
|
|
printf("Unknown argument\n"); |
196 |
|
|
return (CMD_CONT); |
197 |
|
|
} |
198 |
|
|
|
199 |
|
|
int |
200 |
|
|
Xlist(cmd_t *cmd) |
201 |
|
|
{ |
202 |
|
|
struct cfdata *cd; |
203 |
|
|
int i = 0; |
204 |
|
|
|
205 |
|
|
cnt = 0; |
206 |
|
|
cd = get_cfdata(0); |
207 |
|
|
|
208 |
|
|
while (cd->cf_attach != 0) { |
209 |
|
|
if (more()) |
210 |
|
|
break; |
211 |
|
|
pdev(i++); |
212 |
|
|
cd++; |
213 |
|
|
} |
214 |
|
|
|
215 |
|
|
if (nopdev == 0) { |
216 |
|
|
while (i <= (totdev+maxpseudo)) { |
217 |
|
|
if (more()) |
218 |
|
|
break; |
219 |
|
|
pdev(i++); |
220 |
|
|
} |
221 |
|
|
} |
222 |
|
|
cnt = -1; |
223 |
|
|
return (CMD_CONT); |
224 |
|
|
} |
225 |
|
|
|
226 |
|
|
int |
227 |
|
|
Xshow(cmd_t *cmd) |
228 |
|
|
{ |
229 |
|
|
if (strlen(cmd->args) == 0) |
230 |
|
|
show(); |
231 |
|
|
else |
232 |
|
|
show_attr(&cmd->args[0]); |
233 |
|
|
return (CMD_CONT); |
234 |
|
|
} |
235 |
|
|
|
236 |
|
|
int |
237 |
|
|
Xquit(cmd_t *cmd) |
238 |
|
|
{ |
239 |
|
|
/* Nothing to do here */ |
240 |
|
|
return (CMD_SAVE); |
241 |
|
|
} |
242 |
|
|
|
243 |
|
|
int |
244 |
|
|
Xexit(cmd_t *cmd) |
245 |
|
|
{ |
246 |
|
|
/* Nothing to do here */ |
247 |
|
|
return (CMD_EXIT); |
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
int |
251 |
|
|
Xtimezone(cmd_t *cmd) |
252 |
|
|
{ |
253 |
|
|
struct timezone *tz; |
254 |
|
|
int num; |
255 |
|
|
char *c; |
256 |
|
|
|
257 |
|
|
ukc_mod_kernel = 1; |
258 |
|
|
tz = (struct timezone *)adjust((caddr_t)(nl[TZ_TZ].n_value)); |
259 |
|
|
|
260 |
|
|
if (strlen(cmd->args) == 0) { |
261 |
|
|
printf("timezone = %d, dst = %d\n", |
262 |
|
|
tz->tz_minuteswest, tz->tz_dsttime); |
263 |
|
|
} else { |
264 |
|
|
if (number(cmd->args, &num) == 0) { |
265 |
|
|
tz->tz_minuteswest = num; |
266 |
|
|
c = cmd->args; |
267 |
|
|
while ((*c != '\0') && !isspace((unsigned char)*c)) |
268 |
|
|
c++; |
269 |
|
|
while (isspace((unsigned char)*c)) |
270 |
|
|
c++; |
271 |
|
|
if (strlen(c) != 0 && number(c, &num) == 0) |
272 |
|
|
tz->tz_dsttime = num; |
273 |
|
|
printf("timezone = %d, dst = %d\n", |
274 |
|
|
tz->tz_minuteswest, tz->tz_dsttime); |
275 |
|
|
} else |
276 |
|
|
printf("Unknown argument\n"); |
277 |
|
|
} |
278 |
|
|
return (CMD_CONT); |
279 |
|
|
} |
280 |
|
|
|
281 |
|
|
void |
282 |
|
|
int_variable_adjust(const cmd_t *cmd, int idx, const char *name) |
283 |
|
|
{ |
284 |
|
|
int *v, num; |
285 |
|
|
|
286 |
|
|
if (nl[idx].n_type != 0) { |
287 |
|
|
ukc_mod_kernel = 1; |
288 |
|
|
|
289 |
|
|
v = (int *)adjust((caddr_t)(nl[idx].n_value)); |
290 |
|
|
|
291 |
|
|
if (strlen(cmd->args) == 0) { |
292 |
|
|
printf("%s = %d\n", name, *v); |
293 |
|
|
} else { |
294 |
|
|
if (number(cmd->args, &num) == 0) { |
295 |
|
|
*v = num; |
296 |
|
|
printf("%s = %d\n", name, *v); |
297 |
|
|
} else |
298 |
|
|
printf("Unknown argument\n"); |
299 |
|
|
} |
300 |
|
|
} else |
301 |
|
|
printf("This kernel does not support modification of %s.\n", |
302 |
|
|
name); |
303 |
|
|
} |
304 |
|
|
|
305 |
|
|
int |
306 |
|
|
Xbufcachepct(cmd_t *cmd) |
307 |
|
|
{ |
308 |
|
|
int_variable_adjust(cmd, I_BUFCACHEPCT, "bufcachepercent"); |
309 |
|
|
return (CMD_CONT); |
310 |
|
|
} |
311 |
|
|
|
312 |
|
|
int |
313 |
|
|
Xnkmempg(cmd_t *cmd) |
314 |
|
|
{ |
315 |
|
|
int_variable_adjust(cmd, I_NKMEMPG, "nkmempages"); |
316 |
|
|
return (CMD_CONT); |
317 |
|
|
} |