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