1*a79842c9Skettenis /* $OpenBSD: vars.c,v 1.1 2020/07/16 19:48:58 kettenis Exp $ */
2*a79842c9Skettenis
3*a79842c9Skettenis /*
4*a79842c9Skettenis * Copyright (c) 1998-2000 Michael Shalayeff
5*a79842c9Skettenis * All rights reserved.
6*a79842c9Skettenis *
7*a79842c9Skettenis * Redistribution and use in source and binary forms, with or without
8*a79842c9Skettenis * modification, are permitted provided that the following conditions
9*a79842c9Skettenis * are met:
10*a79842c9Skettenis * 1. Redistributions of source code must retain the above copyright
11*a79842c9Skettenis * notice, this list of conditions and the following disclaimer.
12*a79842c9Skettenis * 2. Redistributions in binary form must reproduce the above copyright
13*a79842c9Skettenis * notice, this list of conditions and the following disclaimer in the
14*a79842c9Skettenis * documentation and/or other materials provided with the distribution.
15*a79842c9Skettenis *
16*a79842c9Skettenis * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*a79842c9Skettenis * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*a79842c9Skettenis * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*a79842c9Skettenis * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20*a79842c9Skettenis * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*a79842c9Skettenis * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*a79842c9Skettenis * OR SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*a79842c9Skettenis * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*a79842c9Skettenis * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*a79842c9Skettenis * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*a79842c9Skettenis * SUCH DAMAGE.
27*a79842c9Skettenis *
28*a79842c9Skettenis */
29*a79842c9Skettenis
30*a79842c9Skettenis #include <sys/param.h>
31*a79842c9Skettenis #include <sys/reboot.h>
32*a79842c9Skettenis
33*a79842c9Skettenis #include <limits.h>
34*a79842c9Skettenis #include <stdio.h>
35*a79842c9Skettenis #include <string.h>
36*a79842c9Skettenis #include <stdlib.h>
37*a79842c9Skettenis
38*a79842c9Skettenis #include "cmd.h"
39*a79842c9Skettenis
40*a79842c9Skettenis extern int debug;
41*a79842c9Skettenis int db_console = -1;
42*a79842c9Skettenis
43*a79842c9Skettenis static int Xdevice(void);
44*a79842c9Skettenis #ifdef DEBUG
45*a79842c9Skettenis static int Xdebug(void);
46*a79842c9Skettenis #endif
47*a79842c9Skettenis static int Xdb_console(void);
48*a79842c9Skettenis static int Ximage(void);
49*a79842c9Skettenis static int Xhowto(void);
50*a79842c9Skettenis static int Xtimeout(void);
51*a79842c9Skettenis int Xset(void);
52*a79842c9Skettenis
53*a79842c9Skettenis const struct cmd_table cmd_set[] = {
54*a79842c9Skettenis {"howto", CMDT_VAR, Xhowto},
55*a79842c9Skettenis #ifdef DEBUG
56*a79842c9Skettenis {"debug", CMDT_VAR, Xdebug},
57*a79842c9Skettenis #endif
58*a79842c9Skettenis {"device", CMDT_VAR, Xdevice},
59*a79842c9Skettenis {"image", CMDT_VAR, Ximage},
60*a79842c9Skettenis {"timeout",CMDT_VAR, Xtimeout},
61*a79842c9Skettenis {"db_console", CMDT_VAR, Xdb_console},
62*a79842c9Skettenis {NULL,0}
63*a79842c9Skettenis };
64*a79842c9Skettenis
65*a79842c9Skettenis #ifdef DEBUG
66*a79842c9Skettenis static int
Xdebug(void)67*a79842c9Skettenis Xdebug(void)
68*a79842c9Skettenis {
69*a79842c9Skettenis if (cmd.argc != 2)
70*a79842c9Skettenis printf( "o%s\n", debug? "n": "ff" );
71*a79842c9Skettenis else
72*a79842c9Skettenis debug = (cmd.argv[1][0] == '0' ||
73*a79842c9Skettenis (cmd.argv[1][0] == 'o' && cmd.argv[1][1] == 'f'))?
74*a79842c9Skettenis 0: 1;
75*a79842c9Skettenis return 0;
76*a79842c9Skettenis }
77*a79842c9Skettenis #endif
78*a79842c9Skettenis
79*a79842c9Skettenis int
Xdb_console(void)80*a79842c9Skettenis Xdb_console(void)
81*a79842c9Skettenis {
82*a79842c9Skettenis if (cmd.argc != 2) {
83*a79842c9Skettenis switch (db_console) {
84*a79842c9Skettenis case 0:
85*a79842c9Skettenis printf("off\n");
86*a79842c9Skettenis break;
87*a79842c9Skettenis case 1:
88*a79842c9Skettenis printf("on\n");
89*a79842c9Skettenis break;
90*a79842c9Skettenis default:
91*a79842c9Skettenis printf("unset\n");
92*a79842c9Skettenis break;
93*a79842c9Skettenis }
94*a79842c9Skettenis } else {
95*a79842c9Skettenis if (strcmp(cmd.argv[1], "0") == 0 ||
96*a79842c9Skettenis strcmp(cmd.argv[1], "off") == 0)
97*a79842c9Skettenis db_console = 0;
98*a79842c9Skettenis else if (strcmp(cmd.argv[1], "1") == 0 ||
99*a79842c9Skettenis strcmp(cmd.argv[1], "on") == 0)
100*a79842c9Skettenis db_console = 1;
101*a79842c9Skettenis }
102*a79842c9Skettenis
103*a79842c9Skettenis return (0);
104*a79842c9Skettenis }
105*a79842c9Skettenis
106*a79842c9Skettenis static int
Xtimeout(void)107*a79842c9Skettenis Xtimeout(void)
108*a79842c9Skettenis {
109*a79842c9Skettenis if (cmd.argc != 2)
110*a79842c9Skettenis printf( "%d\n", cmd.timeout );
111*a79842c9Skettenis else
112*a79842c9Skettenis cmd.timeout = (int)strtol( cmd.argv[1], (char **)NULL, 0 );
113*a79842c9Skettenis return 0;
114*a79842c9Skettenis }
115*a79842c9Skettenis
116*a79842c9Skettenis /* called only w/ no arguments */
117*a79842c9Skettenis int
Xset(void)118*a79842c9Skettenis Xset(void)
119*a79842c9Skettenis {
120*a79842c9Skettenis const struct cmd_table *ct;
121*a79842c9Skettenis
122*a79842c9Skettenis printf("boot\n");
123*a79842c9Skettenis for (ct = cmd_set; ct->cmd_name != NULL; ct++) {
124*a79842c9Skettenis printf("%s\t ", ct->cmd_name);
125*a79842c9Skettenis (*ct->cmd_exec)();
126*a79842c9Skettenis }
127*a79842c9Skettenis return 0;
128*a79842c9Skettenis }
129*a79842c9Skettenis
130*a79842c9Skettenis static int
Xdevice(void)131*a79842c9Skettenis Xdevice(void)
132*a79842c9Skettenis {
133*a79842c9Skettenis if (cmd.argc != 2)
134*a79842c9Skettenis printf("%s\n", cmd.bootdev);
135*a79842c9Skettenis else
136*a79842c9Skettenis strlcpy(cmd.bootdev, cmd.argv[1], sizeof(cmd.bootdev));
137*a79842c9Skettenis return 0;
138*a79842c9Skettenis }
139*a79842c9Skettenis
140*a79842c9Skettenis static int
Ximage(void)141*a79842c9Skettenis Ximage(void)
142*a79842c9Skettenis {
143*a79842c9Skettenis if (cmd.argc != 2)
144*a79842c9Skettenis printf("%s\n", cmd.image);
145*a79842c9Skettenis else
146*a79842c9Skettenis strlcpy(cmd.image, cmd.argv[1], sizeof(cmd.image));
147*a79842c9Skettenis return 0;
148*a79842c9Skettenis }
149*a79842c9Skettenis
150*a79842c9Skettenis static int
Xhowto(void)151*a79842c9Skettenis Xhowto(void)
152*a79842c9Skettenis {
153*a79842c9Skettenis if (cmd.argc == 1) {
154*a79842c9Skettenis if (cmd.boothowto) {
155*a79842c9Skettenis putchar('-');
156*a79842c9Skettenis if (cmd.boothowto & RB_ASKNAME)
157*a79842c9Skettenis putchar('a');
158*a79842c9Skettenis if (cmd.boothowto & RB_CONFIG)
159*a79842c9Skettenis putchar('c');
160*a79842c9Skettenis if (cmd.boothowto & RB_SINGLE)
161*a79842c9Skettenis putchar('s');
162*a79842c9Skettenis if (cmd.boothowto & RB_KDB)
163*a79842c9Skettenis putchar('d');
164*a79842c9Skettenis }
165*a79842c9Skettenis putchar('\n');
166*a79842c9Skettenis } else
167*a79842c9Skettenis bootparse(1);
168*a79842c9Skettenis return 0;
169*a79842c9Skettenis }
170*a79842c9Skettenis
171*a79842c9Skettenis int
bootparse(int i)172*a79842c9Skettenis bootparse(int i)
173*a79842c9Skettenis {
174*a79842c9Skettenis char *cp;
175*a79842c9Skettenis int howto = cmd.boothowto;
176*a79842c9Skettenis
177*a79842c9Skettenis for (; i < cmd.argc; i++) {
178*a79842c9Skettenis cp = cmd.argv[i];
179*a79842c9Skettenis if (*cp == '-') {
180*a79842c9Skettenis while (*++cp) {
181*a79842c9Skettenis switch (*cp) {
182*a79842c9Skettenis case 'a':
183*a79842c9Skettenis howto |= RB_ASKNAME;
184*a79842c9Skettenis break;
185*a79842c9Skettenis case 'c':
186*a79842c9Skettenis howto |= RB_CONFIG;
187*a79842c9Skettenis break;
188*a79842c9Skettenis case 's':
189*a79842c9Skettenis howto |= RB_SINGLE;
190*a79842c9Skettenis break;
191*a79842c9Skettenis case 'd':
192*a79842c9Skettenis howto |= RB_KDB;
193*a79842c9Skettenis break;
194*a79842c9Skettenis default:
195*a79842c9Skettenis printf("howto: bad option: %c\n", *cp);
196*a79842c9Skettenis return 1;
197*a79842c9Skettenis }
198*a79842c9Skettenis }
199*a79842c9Skettenis }
200*a79842c9Skettenis }
201*a79842c9Skettenis cmd.boothowto = howto;
202*a79842c9Skettenis return 0;
203*a79842c9Skettenis }
204