GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/config/cmd.c Lines: 0 129 0.0 %
Date: 2017-11-13 Branches: 0 76 0.0 %

Line Branch Exec Source
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
}