xref: /openbsd-src/sys/arch/powerpc64/stand/rdboot/vars.c (revision a79842c90b600f90baeff83b9d7a012a21c20237)
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