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