1 /* $OpenBSD: cmd.c,v 1.22 2019/09/06 21:30:31 cheloha 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
30 #include <ctype.h>
31 #include <limits.h>
32 #include <nlist.h>
33 #include <stdio.h>
34 #include <string.h>
35
36 #include "misc.h"
37 #define CMD_NOEXTERN
38 #include "cmd.h"
39 #include "ukc.h"
40 #include "exec.h"
41
42 extern int ukc_mod_kernel;
43 static void int_variable_adjust(const cmd_t *, int, const char *);
44
45 /* Our command table */
46 cmd_table_t cmd_table[] = {
47 {"help", Xhelp, "", "Command help list"},
48 {"add", Xadd, "dev", "Add a device"},
49 {"base", Xbase, "8|10|16", "Base on large numbers"},
50 {"change", Xchange, "devno|dev", "Change device"},
51 {"disable",Xdisable, "attr val|devno|dev", "Disable device"},
52 {"enable", Xenable, "attr val|devno|dev", "Enable device"},
53 {"find", Xfind, "devno|dev", "Find device"},
54 {"list", Xlist, "", "List configuration"},
55 {"lines", Xlines, "count", "# of lines per page"},
56 {"show", Xshow, "[attr [val]]", "Show attribute"},
57 {"exit", Xexit, "", "Exit, without saving changes"},
58 {"quit", Xquit, "", "Quit, saving current changes"},
59 {"nkmempg", Xnkmempg, "[number]", "Show/change NKMEMPAGES"},
60 {NULL, NULL, NULL, NULL}
61 };
62
63 int
Xhelp(cmd_t * cmd)64 Xhelp(cmd_t *cmd)
65 {
66 cmd_table_t *cmd_table = cmd->table;
67 int i;
68
69 /* Hmm, print out cmd_table here... */
70 for (i = 0; cmd_table[i].cmd != NULL; i++)
71 printf("\t%-16s%-20s%s\n", cmd_table[i].cmd,
72 cmd_table[i].opt, cmd_table[i].help);
73 return (CMD_CONT);
74 }
75
76 int
Xadd(cmd_t * cmd)77 Xadd(cmd_t *cmd)
78 {
79 short unit, state;
80 int a;
81
82 if (strlen(cmd->args) == 0)
83 printf("Dev expected\n");
84 else if (device(cmd->args, &a, &unit, &state) == 0)
85 add(cmd->args, a, unit, state);
86 else
87 printf("Unknown argument\n");
88 return (CMD_CONT);
89 }
90
91 int
Xbase(cmd_t * cmd)92 Xbase(cmd_t *cmd)
93 {
94 int a;
95
96 if (strlen(cmd->args) == 0)
97 printf("8|10|16 expected\n");
98 else if (number(&cmd->args[0], &a) == 0) {
99 if (a == 8 || a == 10 || a == 16) {
100 base = a;
101 } else {
102 printf("8|10|16 expected\n");
103 }
104 } else
105 printf("Unknown argument\n");
106 return (CMD_CONT);
107 }
108
109 int
Xchange(cmd_t * cmd)110 Xchange(cmd_t *cmd)
111 {
112 short unit, state;
113 int a;
114
115 if (strlen(cmd->args) == 0)
116 printf("DevNo or Dev expected\n");
117 else if (number(cmd->args, &a) == 0)
118 change(a);
119 else if (device(cmd->args, &a, &unit, &state) == 0)
120 common_dev(cmd->args, a, unit, state, UC_CHANGE);
121 else
122 printf("Unknown argument\n");
123 return (CMD_CONT);
124 }
125
126 int
Xdisable(cmd_t * cmd)127 Xdisable(cmd_t *cmd)
128 {
129 short unit, state;
130 int a;
131
132 if (strlen(cmd->args) == 0)
133 printf("Attr, DevNo or Dev expected\n");
134 else if (attr(cmd->args, &a) == 0)
135 common_attr(cmd->args, a, UC_DISABLE);
136 else if (number(cmd->args, &a) == 0)
137 disable(a);
138 else if (device(cmd->args, &a, &unit, &state) == 0)
139 common_dev(cmd->args, a, unit, state, UC_DISABLE);
140 else
141 printf("Unknown argument\n");
142 return (CMD_CONT);
143 }
144
145 int
Xenable(cmd_t * cmd)146 Xenable(cmd_t *cmd)
147 {
148 short unit, state;
149 int a;
150
151 if (strlen(cmd->args) == 0)
152 printf("Attr, DevNo or Dev expected\n");
153 else if (attr(cmd->args, &a) == 0)
154 common_attr(cmd->args, a, UC_ENABLE);
155 else if (number(cmd->args, &a) == 0)
156 enable(a);
157 else if (device(cmd->args, &a, &unit, &state) == 0)
158 common_dev(cmd->args, a, unit, state, UC_ENABLE);
159 else
160 printf("Unknown argument\n");
161 return (CMD_CONT);
162 }
163
164 int
Xfind(cmd_t * cmd)165 Xfind(cmd_t *cmd)
166 {
167 short unit, state;
168 int a;
169
170 if (strlen(cmd->args) == 0)
171 printf("DevNo or Dev expected\n");
172 else if (number(cmd->args, &a) == 0)
173 pdev(a);
174 else if (device(cmd->args, &a, &unit, &state) == 0)
175 common_dev(cmd->args, a, unit, state, UC_FIND);
176 else
177 printf("Unknown argument\n");
178 return (CMD_CONT);
179 }
180
181 int
Xlines(cmd_t * cmd)182 Xlines(cmd_t *cmd)
183 {
184 int a;
185
186 if (strlen(cmd->args) == 0)
187 printf("Argument expected\n");
188 else if (number(cmd->args, &a) == 0)
189 lines = a;
190 else
191 printf("Unknown argument\n");
192 return (CMD_CONT);
193 }
194
195 int
Xlist(cmd_t * cmd)196 Xlist(cmd_t *cmd)
197 {
198 struct cfdata *cd;
199 int i = 0;
200
201 cnt = 0;
202 cd = get_cfdata(0);
203
204 while (cd->cf_attach != 0) {
205 if (more())
206 break;
207 pdev(i++);
208 cd++;
209 }
210
211 if (nopdev == 0) {
212 while (i <= (totdev+maxpseudo)) {
213 if (more())
214 break;
215 pdev(i++);
216 }
217 }
218 cnt = -1;
219 return (CMD_CONT);
220 }
221
222 int
Xshow(cmd_t * cmd)223 Xshow(cmd_t *cmd)
224 {
225 if (strlen(cmd->args) == 0)
226 show();
227 else
228 show_attr(&cmd->args[0]);
229 return (CMD_CONT);
230 }
231
232 int
Xquit(cmd_t * cmd)233 Xquit(cmd_t *cmd)
234 {
235 /* Nothing to do here */
236 return (CMD_SAVE);
237 }
238
239 int
Xexit(cmd_t * cmd)240 Xexit(cmd_t *cmd)
241 {
242 /* Nothing to do here */
243 return (CMD_EXIT);
244 }
245
246 void
int_variable_adjust(const cmd_t * cmd,int idx,const char * name)247 int_variable_adjust(const cmd_t *cmd, int idx, const char *name)
248 {
249 int *v, num;
250
251 if (nl[idx].n_type != 0) {
252 ukc_mod_kernel = 1;
253
254 v = (int *)adjust((caddr_t)(nl[idx].n_value));
255
256 if (strlen(cmd->args) == 0) {
257 printf("%s = %d\n", name, *v);
258 } else {
259 if (number(cmd->args, &num) == 0) {
260 *v = num;
261 printf("%s = %d\n", name, *v);
262 } else
263 printf("Unknown argument\n");
264 }
265 } else
266 printf("This kernel does not support modification of %s.\n",
267 name);
268 }
269
270 int
Xnkmempg(cmd_t * cmd)271 Xnkmempg(cmd_t *cmd)
272 {
273 int_variable_adjust(cmd, I_NKMEMPG, "nkmempages");
274 return (CMD_CONT);
275 }
276