1 1.6 he /* $NetBSD: bootpref.c,v 1.6 2009/03/17 00:18:40 he Exp $ */ 2 1.1 leo /*- 3 1.1 leo * Copyright (c) 1998 The NetBSD Foundation, Inc. 4 1.1 leo * All rights reserved. 5 1.1 leo * 6 1.1 leo * This code is derived from software contributed to The NetBSD Foundation 7 1.1 leo * by Julian Coleman. 8 1.1 leo * 9 1.1 leo * Redistribution and use in source and binary forms, with or without 10 1.1 leo * modification, are permitted provided that the following conditions 11 1.1 leo * are met: 12 1.1 leo * 1. Redistributions of source code must retain the above copyright 13 1.1 leo * notice, this list of conditions and the following disclaimer. 14 1.1 leo * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 leo * notice, this list of conditions and the following disclaimer in the 16 1.1 leo * documentation and/or other materials provided with the distribution. 17 1.1 leo * 18 1.1 leo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19 1.1 leo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 1.1 leo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 1.1 leo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 1.1 leo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 1.1 leo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 1.1 leo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 1.1 leo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 1.1 leo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 1.1 leo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 1.1 leo * POSSIBILITY OF SUCH DAMAGE. 29 1.1 leo */ 30 1.1 leo #include <sys/types.h> 31 1.1 leo #include <unistd.h> 32 1.1 leo #include <string.h> 33 1.1 leo #include <stdlib.h> 34 1.1 leo #include <stdio.h> 35 1.1 leo #include <fcntl.h> 36 1.1 leo #include <errno.h> 37 1.1 leo #include <err.h> 38 1.1 leo #include <sys/mman.h> 39 1.1 leo #include "bootpref.h" 40 1.1 leo 41 1.4 dsl static void usage(void); 42 1.4 dsl static int openNVRAM(void); 43 1.4 dsl static void closeNVRAM(int); 44 1.4 dsl static u_char readNVRAM(int, int); 45 1.4 dsl static void writeNVRAM(int, int, u_char); 46 1.4 dsl static void getNVpref(int, u_char[]); 47 1.4 dsl static void setNVpref(int, u_char[], int, int); 48 1.4 dsl static void showOS(u_char); 49 1.4 dsl static void showLang(u_char); 50 1.4 dsl static void showKbdLang(u_char); 51 1.4 dsl static void showDateFmt(u_char); 52 1.4 dsl static void showDateSep(u_char); 53 1.4 dsl static void showVideo2(u_char); 54 1.4 dsl static void showVideo1(u_char, u_char); 55 1.4 dsl static int checkOS(u_char *, char *); 56 1.4 dsl static int checkLang(u_char *, char *); 57 1.4 dsl static int checkKbdLang(u_char *, char *); 58 1.4 dsl static int checkInt(u_char *, char *, int, int); 59 1.4 dsl static int checkDateFmt(u_char *, char *); 60 1.4 dsl static void checkDateSep(u_char *, char *); 61 1.4 dsl static int checkColours(u_char *, char *); 62 1.1 leo 63 1.1 leo #define SET_OS 0x001 64 1.1 leo #define SET_LANG 0x002 65 1.1 leo #define SET_KBDLANG 0x004 66 1.1 leo #define SET_HOSTID 0x008 67 1.1 leo #define SET_DATIME 0x010 68 1.1 leo #define SET_DATESEP 0x020 69 1.1 leo #define SET_BOOTDLY 0x040 70 1.1 leo #define SET_VID1 0x080 71 1.1 leo #define SET_VID2 0x100 72 1.1 leo 73 1.1 leo #define ARRAY_OS 0 74 1.1 leo #define ARRAY_LANG 1 75 1.1 leo #define ARRAY_KBDLANG 2 76 1.1 leo #define ARRAY_HOSTID 3 77 1.1 leo #define ARRAY_DATIME 4 78 1.1 leo #define ARRAY_DATESEP 5 79 1.1 leo #define ARRAY_BOOTDLY 6 80 1.1 leo #define ARRAY_VID1 7 81 1.1 leo #define ARRAY_VID2 8 82 1.1 leo 83 1.1 leo static const char nvrdev[] = PATH_NVRAM; 84 1.1 leo 85 1.1 leo int 86 1.5 dsl main (int argc, char *argv[]) 87 1.1 leo { 88 1.1 leo int c, set = 0, verbose = 0; 89 1.1 leo int fd; 90 1.1 leo u_char bootpref[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; 91 1.1 leo u_char check_hour = 0, check_video1 = 0, check_video2 = 0; 92 1.1 leo 93 1.1 leo fd = openNVRAM (); 94 1.1 leo bootpref[ARRAY_VID2] = readNVRAM (fd, NVRAM_VID2); 95 1.1 leo bootpref[ARRAY_VID1] = readNVRAM (fd, NVRAM_VID1); 96 1.1 leo /* parse options */ 97 1.1 leo while ((c = getopt (argc, argv, "Vb:d:k:l:s:f:12e:c:nptv48oOxXiI")) != -1) { 98 1.1 leo switch (c) { 99 1.1 leo case 'V': 100 1.1 leo verbose = 1; 101 1.1 leo break; 102 1.1 leo case 'b': 103 1.1 leo if (checkOS (&bootpref[ARRAY_OS], optarg)) 104 1.1 leo set |= SET_OS; 105 1.1 leo else 106 1.1 leo usage (); 107 1.1 leo break; 108 1.1 leo case 'd': 109 1.1 leo if (checkInt (&bootpref[ARRAY_BOOTDLY], optarg, 110 1.1 leo 0, 255)) 111 1.1 leo set |= SET_BOOTDLY; 112 1.1 leo else 113 1.1 leo usage (); 114 1.1 leo break; 115 1.1 leo case 'k': 116 1.1 leo if (checkKbdLang (&bootpref[ARRAY_KBDLANG], optarg)) 117 1.1 leo set |= SET_KBDLANG; 118 1.1 leo else 119 1.1 leo usage (); 120 1.1 leo break; 121 1.1 leo case 'l': 122 1.1 leo if (checkLang (&bootpref[ARRAY_LANG], optarg)) 123 1.1 leo set |= SET_LANG; 124 1.1 leo else 125 1.1 leo usage (); 126 1.1 leo break; 127 1.1 leo case 's': 128 1.1 leo if (checkInt (&bootpref[ARRAY_HOSTID], optarg, 129 1.1 leo 0, 7)) 130 1.1 leo set |= SET_HOSTID; 131 1.1 leo else 132 1.1 leo usage (); 133 1.1 leo break; 134 1.1 leo case 'f': 135 1.1 leo if (checkDateFmt (&bootpref[ARRAY_DATIME], optarg)) 136 1.1 leo set |= SET_DATIME; 137 1.1 leo else 138 1.1 leo usage (); 139 1.1 leo break; 140 1.1 leo case '1': 141 1.1 leo if (check_hour & DATIME_24H) { 142 1.1 leo usage(); 143 1.1 leo } else { 144 1.1 leo bootpref[ARRAY_DATIME] &= ~DATIME_24H; 145 1.1 leo set |= SET_DATIME; 146 1.1 leo check_hour |= DATIME_24H; 147 1.1 leo } 148 1.1 leo break; 149 1.1 leo case '2': 150 1.1 leo if (check_hour & DATIME_24H) { 151 1.1 leo usage(); 152 1.1 leo } else { 153 1.1 leo bootpref[ARRAY_DATIME] |= DATIME_24H; 154 1.1 leo set |= SET_DATIME; 155 1.1 leo check_hour |= DATIME_24H; 156 1.1 leo } 157 1.1 leo break; 158 1.1 leo case 'e': 159 1.1 leo checkDateSep (&bootpref[ARRAY_DATESEP], optarg); 160 1.1 leo set |= SET_DATESEP; 161 1.1 leo break; 162 1.1 leo case 'c': 163 1.1 leo if (checkColours (&bootpref[ARRAY_VID2], optarg)) 164 1.1 leo set |= SET_VID2; 165 1.1 leo else 166 1.1 leo usage (); 167 1.1 leo break; 168 1.1 leo case 'n': 169 1.1 leo if (check_video2 & VID2_PAL) { 170 1.1 leo usage(); 171 1.1 leo } else { 172 1.1 leo bootpref[ARRAY_VID2] &= ~VID2_PAL; 173 1.1 leo set |= SET_VID2; 174 1.1 leo check_video2 |= VID2_PAL; 175 1.1 leo } 176 1.1 leo break; 177 1.1 leo case 'p': 178 1.1 leo if (check_video2 & VID2_PAL) { 179 1.1 leo usage(); 180 1.1 leo } else { 181 1.1 leo bootpref[ARRAY_VID2] |= VID2_PAL; 182 1.1 leo set |= SET_VID2; 183 1.1 leo check_video2 |= VID2_PAL; 184 1.1 leo } 185 1.1 leo break; 186 1.1 leo case 't': 187 1.1 leo if (check_video2 & VID2_VGA) { 188 1.1 leo usage(); 189 1.1 leo } else { 190 1.1 leo bootpref[ARRAY_VID2] &= ~VID2_VGA; 191 1.1 leo set |= SET_VID2; 192 1.1 leo check_video2 |= VID2_VGA; 193 1.1 leo } 194 1.1 leo break; 195 1.1 leo case 'v': 196 1.1 leo if (check_video2 & VID2_VGA) { 197 1.1 leo usage(); 198 1.1 leo } else { 199 1.1 leo bootpref[ARRAY_VID2] |= VID2_VGA; 200 1.1 leo set |= SET_VID2; 201 1.1 leo check_video2 |= VID2_VGA; 202 1.1 leo } 203 1.1 leo break; 204 1.1 leo case '4': 205 1.1 leo if (check_video2 & VID2_80CLM) { 206 1.1 leo usage(); 207 1.1 leo } else { 208 1.1 leo bootpref[ARRAY_VID2] &= ~VID2_80CLM; 209 1.1 leo set |= SET_VID2; 210 1.1 leo check_video2 |= VID2_80CLM; 211 1.1 leo } 212 1.1 leo break; 213 1.1 leo case '8': 214 1.1 leo if (check_video2 & VID2_80CLM) { 215 1.1 leo usage(); 216 1.1 leo } else { 217 1.1 leo bootpref[ARRAY_VID2] |= VID2_80CLM; 218 1.1 leo set |= SET_VID2; 219 1.1 leo check_video2 |= VID2_80CLM; 220 1.1 leo } 221 1.1 leo break; 222 1.1 leo case 'o': 223 1.1 leo if (check_video2 & VID2_OVERSCAN) { 224 1.1 leo usage(); 225 1.1 leo } else { 226 1.1 leo bootpref[ARRAY_VID2] |= VID2_OVERSCAN; 227 1.1 leo set |= SET_VID2; 228 1.1 leo check_video2 |= VID2_OVERSCAN; 229 1.1 leo } 230 1.1 leo break; 231 1.1 leo case 'O': 232 1.1 leo if (check_video2 & VID2_OVERSCAN) { 233 1.1 leo usage(); 234 1.1 leo } else { 235 1.1 leo bootpref[ARRAY_VID2] &= ~VID2_OVERSCAN; 236 1.1 leo set |= SET_VID2; 237 1.1 leo check_video2 |= VID2_OVERSCAN; 238 1.1 leo } 239 1.1 leo break; 240 1.1 leo case 'x': 241 1.1 leo if (check_video2 & VID2_COMPAT) { 242 1.1 leo usage(); 243 1.1 leo } else { 244 1.1 leo bootpref[ARRAY_VID2] |= VID2_COMPAT; 245 1.1 leo set |= SET_VID2; 246 1.1 leo check_video2 |= VID2_COMPAT; 247 1.1 leo } 248 1.1 leo break; 249 1.1 leo case 'X': 250 1.1 leo if (check_video2 & VID2_COMPAT) { 251 1.1 leo usage(); 252 1.1 leo } else { 253 1.1 leo bootpref[ARRAY_VID2] &= ~VID2_COMPAT; 254 1.1 leo set |= SET_VID2; 255 1.1 leo check_video2 |= VID2_COMPAT; 256 1.1 leo } 257 1.1 leo break; 258 1.1 leo case 'i': 259 1.1 leo if (check_video1 & VID1_INTERLACE) { 260 1.1 leo usage(); 261 1.1 leo } else { 262 1.1 leo bootpref[ARRAY_VID1] |= VID1_INTERLACE; 263 1.1 leo set |= SET_VID1; 264 1.1 leo check_video1 |= VID1_INTERLACE; 265 1.1 leo } 266 1.1 leo break; 267 1.1 leo case 'I': 268 1.1 leo if (check_video1 & VID1_INTERLACE) { 269 1.1 leo usage(); 270 1.1 leo } else { 271 1.1 leo bootpref[ARRAY_VID1] &= ~VID1_INTERLACE; 272 1.1 leo set |= SET_VID1; 273 1.1 leo check_video1 |= VID1_INTERLACE; 274 1.1 leo } 275 1.1 leo break; 276 1.1 leo default: 277 1.1 leo usage (); 278 1.1 leo } 279 1.1 leo } 280 1.1 leo if (optind != argc) { 281 1.1 leo usage (); 282 1.1 leo } 283 1.1 leo if (set) { 284 1.1 leo setNVpref (fd, bootpref, set, verbose); 285 1.1 leo } else { 286 1.1 leo getNVpref (fd, bootpref); 287 1.1 leo } 288 1.1 leo closeNVRAM (fd); 289 1.1 leo return (EXIT_SUCCESS); 290 1.1 leo } 291 1.1 leo 292 1.1 leo static void 293 1.1 leo usage (void) 294 1.1 leo { 295 1.1 leo fprintf (stderr, 296 1.1 leo "usage: bootpref [-V] [-b os] [-d delay] [-k kbd] [-l lang] " 297 1.1 leo "[-s id]\n" 298 1.1 leo "\t[-f fmt] [-1] [-2] [-e sep]\n" 299 1.1 leo "\t[-c colours] [-n] [-p] [-t] [-v] [-4] [-8]\n" 300 1.1 leo "\t[-o] [-O] [-x] [-X] [-i] [-I]\n"); 301 1.1 leo exit (EXIT_FAILURE); 302 1.1 leo } 303 1.1 leo 304 1.1 leo static int 305 1.1 leo openNVRAM () 306 1.1 leo { 307 1.1 leo int fd; 308 1.1 leo 309 1.1 leo if ((fd = open (nvrdev, O_RDWR)) < 0) { 310 1.1 leo err (EXIT_FAILURE, "%s", nvrdev); 311 1.1 leo } 312 1.1 leo return (fd); 313 1.1 leo } 314 1.1 leo 315 1.1 leo static void 316 1.5 dsl closeNVRAM (int fd) 317 1.1 leo { 318 1.1 leo if (close (fd) < 0) { 319 1.1 leo err (EXIT_FAILURE, "%s", nvrdev); 320 1.1 leo } 321 1.1 leo } 322 1.1 leo 323 1.1 leo static u_char 324 1.5 dsl readNVRAM (int fd, int pos) 325 1.1 leo { 326 1.1 leo u_char val; 327 1.1 leo 328 1.1 leo if (lseek(fd, (off_t)pos, SEEK_SET) != pos) { 329 1.1 leo err(EXIT_FAILURE, "%s", nvrdev); 330 1.1 leo } 331 1.1 leo if (read (fd, &val, (size_t)1) != 1) { 332 1.1 leo err(EXIT_FAILURE, "%s", nvrdev); 333 1.1 leo } 334 1.1 leo return (val); 335 1.1 leo } 336 1.1 leo 337 1.1 leo static void 338 1.5 dsl writeNVRAM (int fd, int pos, u_char val) 339 1.1 leo { 340 1.1 leo if (lseek(fd, (off_t)pos, SEEK_SET) != pos) { 341 1.1 leo err(EXIT_FAILURE, "%s", nvrdev); 342 1.1 leo } 343 1.1 leo if (write (fd, &val, (size_t)1) != 1) { 344 1.1 leo err(EXIT_FAILURE, "%s", nvrdev); 345 1.1 leo } 346 1.1 leo } 347 1.1 leo 348 1.1 leo static void 349 1.5 dsl getNVpref (int fd, u_char bootpref[]) 350 1.1 leo { 351 1.1 leo /* Boot OS */ 352 1.1 leo printf ("Boot OS is "); 353 1.1 leo showOS (readNVRAM (fd, NVRAM_BOOTPREF)); 354 1.1 leo /* Boot Delay */ 355 1.1 leo printf ("Boot delay is %d seconds\n", readNVRAM (fd, NVRAM_BOOTDLY)); 356 1.1 leo /* TOS Language */ 357 1.1 leo printf ("Language is "); 358 1.1 leo showLang (readNVRAM (fd, NVRAM_LANG)); 359 1.1 leo /* Keyboard Language */ 360 1.1 leo printf ("Keyboard is "); 361 1.1 leo showKbdLang (readNVRAM (fd, NVRAM_KBDLANG)); 362 1.1 leo /* SCSI Host ID */ 363 1.1 leo printf ("SCSI host ID is "); 364 1.1 leo if (readNVRAM (fd, NVRAM_HOSTID) & HOSTID_VALID) { 365 1.1 leo printf ("%d\n", readNVRAM (fd, NVRAM_HOSTID) ^ HOSTID_VALID); 366 1.1 leo } else { 367 1.1 leo printf ("invalid"); 368 1.1 leo } 369 1.1 leo /* Date format/separator */ 370 1.1 leo printf ("Date format is "); 371 1.1 leo showDateFmt (readNVRAM (fd, NVRAM_DATIME)); 372 1.1 leo printf ("Date separator is "); 373 1.1 leo showDateSep (readNVRAM (fd, NVRAM_DATESEP)); 374 1.1 leo /* Video */ 375 1.1 leo printf ("Video is (0x%02x, 0x%02x) :\n", readNVRAM (fd, NVRAM_VID2), 376 1.1 leo readNVRAM (fd, NVRAM_VID1)); 377 1.1 leo showVideo2 (readNVRAM (fd, NVRAM_VID2)); 378 1.1 leo showVideo1 (readNVRAM (fd, NVRAM_VID1), readNVRAM (fd, NVRAM_VID2)); 379 1.1 leo } 380 1.1 leo 381 1.1 leo static void 382 1.6 he setNVpref (int fd, u_char bootpref[], int set, int verbose) 383 1.1 leo { 384 1.1 leo /* Boot OS */ 385 1.1 leo if (set & SET_OS) { 386 1.1 leo writeNVRAM (fd, NVRAM_BOOTPREF, bootpref[ARRAY_OS]); 387 1.1 leo if (verbose) { 388 1.1 leo printf ("Boot OS set to "); 389 1.1 leo showOS (readNVRAM (fd, NVRAM_BOOTPREF)); 390 1.1 leo } 391 1.1 leo } 392 1.1 leo /* Boot Delay */ 393 1.1 leo if (set & SET_BOOTDLY) { 394 1.1 leo writeNVRAM (fd, NVRAM_BOOTDLY, bootpref[ARRAY_BOOTDLY]); 395 1.1 leo if (verbose) { 396 1.1 leo printf ("Boot delay set to %d seconds\n", readNVRAM (fd, 397 1.1 leo NVRAM_BOOTDLY)); 398 1.1 leo } 399 1.1 leo } 400 1.1 leo /* TOS Language */ 401 1.1 leo if (set & SET_LANG) { 402 1.1 leo writeNVRAM (fd, NVRAM_LANG, bootpref[ARRAY_LANG]); 403 1.1 leo if (verbose) { 404 1.1 leo printf ("Language set to "); 405 1.1 leo showLang (readNVRAM (fd, NVRAM_LANG)); 406 1.1 leo } 407 1.1 leo } 408 1.1 leo /* Keyboard Language */ 409 1.1 leo if (set & SET_KBDLANG) { 410 1.1 leo writeNVRAM (fd, NVRAM_KBDLANG, bootpref[ARRAY_KBDLANG]); 411 1.1 leo if (verbose) { 412 1.1 leo printf ("Keyboard set to "); 413 1.1 leo showKbdLang (readNVRAM (fd, NVRAM_KBDLANG)); 414 1.1 leo } 415 1.1 leo } 416 1.1 leo /* SCSI Host ID */ 417 1.1 leo if (set & SET_HOSTID) { 418 1.1 leo writeNVRAM (fd, NVRAM_HOSTID, bootpref[ARRAY_HOSTID] | 419 1.1 leo HOSTID_VALID); 420 1.1 leo if (verbose) { 421 1.1 leo printf ("SCSI host ID set to "); 422 1.1 leo printf ("%d\n", readNVRAM (fd, NVRAM_HOSTID) ^ 423 1.1 leo HOSTID_VALID); 424 1.1 leo } 425 1.1 leo } 426 1.1 leo /* Date format/separator */ 427 1.1 leo if (set & SET_DATIME) { 428 1.1 leo writeNVRAM (fd, NVRAM_DATIME, bootpref[ARRAY_DATIME]); 429 1.1 leo if (verbose) { 430 1.1 leo printf ("Date format set to "); 431 1.1 leo showDateFmt (readNVRAM (fd, NVRAM_DATIME)); 432 1.1 leo printf ("\n"); 433 1.1 leo } 434 1.1 leo } 435 1.1 leo if (set & SET_DATESEP) { 436 1.1 leo writeNVRAM (fd, NVRAM_DATESEP, bootpref[ARRAY_DATESEP]); 437 1.1 leo if (verbose) { 438 1.1 leo printf ("Date separator set to "); 439 1.1 leo showDateSep (readNVRAM (fd, NVRAM_DATESEP)); 440 1.1 leo } 441 1.1 leo } 442 1.1 leo /* Video */ 443 1.1 leo if ((set & SET_VID2) || (set & SET_VID1)) { 444 1.1 leo if (set & SET_VID2) { 445 1.1 leo writeNVRAM (fd, NVRAM_VID2, bootpref[ARRAY_VID2]); 446 1.1 leo } 447 1.1 leo if (set & SET_VID1) { 448 1.1 leo writeNVRAM (fd, NVRAM_VID1, bootpref[ARRAY_VID1]); 449 1.1 leo } 450 1.1 leo if (verbose) { 451 1.1 leo printf ("Video set to (0x%02x, 0x%02x) :\n", 452 1.1 leo readNVRAM (fd, NVRAM_VID2), 453 1.1 leo readNVRAM (fd, NVRAM_VID1)); 454 1.1 leo showVideo2 (readNVRAM (fd, NVRAM_VID2)); 455 1.1 leo showVideo1 (readNVRAM (fd, NVRAM_VID1), 456 1.1 leo readNVRAM (fd, NVRAM_VID2)); 457 1.1 leo } 458 1.1 leo } 459 1.1 leo } 460 1.1 leo 461 1.1 leo static void 462 1.5 dsl showOS (u_char bootos) 463 1.1 leo { 464 1.1 leo switch (bootos) { 465 1.1 leo case BOOTPREF_NETBSD: 466 1.1 leo printf ("NetBSD"); 467 1.1 leo break; 468 1.1 leo case BOOTPREF_TOS: 469 1.1 leo printf ("TOS"); 470 1.1 leo break; 471 1.1 leo case BOOTPREF_MAGIC: 472 1.1 leo printf ("MAGIC"); 473 1.1 leo break; 474 1.1 leo case BOOTPREF_LINUX: 475 1.1 leo printf ("Linux"); 476 1.1 leo break; 477 1.1 leo case BOOTPREF_SYSV: 478 1.1 leo printf ("System V"); 479 1.1 leo break; 480 1.1 leo case BOOTPREF_NONE: 481 1.1 leo printf ("none"); 482 1.1 leo break; 483 1.1 leo default: 484 1.1 leo printf ("unknown"); 485 1.1 leo break; 486 1.1 leo } 487 1.1 leo printf (" (0x%x).\n", bootos); 488 1.1 leo } 489 1.1 leo 490 1.1 leo static void 491 1.5 dsl showLang (u_char lang) 492 1.1 leo { 493 1.1 leo switch (lang) { 494 1.2 leo case LANG_USA: 495 1.1 leo case LANG_GB: 496 1.1 leo printf ("English"); 497 1.1 leo break; 498 1.1 leo case LANG_D: 499 1.1 leo printf ("German"); 500 1.1 leo break; 501 1.1 leo case LANG_FR: 502 1.1 leo printf ("French"); 503 1.1 leo break; 504 1.1 leo case LANG_ESP: 505 1.1 leo printf ("Spanish"); 506 1.1 leo break; 507 1.1 leo case LANG_I: 508 1.1 leo printf ("Italian"); 509 1.1 leo break; 510 1.1 leo default: 511 1.1 leo printf ("unknown"); 512 1.1 leo break; 513 1.1 leo } 514 1.1 leo printf (" (0x%x).\n", lang); 515 1.1 leo } 516 1.1 leo 517 1.1 leo static void 518 1.5 dsl showKbdLang (u_char lang) 519 1.1 leo { 520 1.1 leo switch (lang) { 521 1.1 leo case KBDLANG_USA: 522 1.1 leo printf ("American"); 523 1.1 leo break; 524 1.1 leo case KBDLANG_D: 525 1.1 leo printf ("German"); 526 1.1 leo break; 527 1.1 leo case KBDLANG_FR: 528 1.1 leo printf ("French"); 529 1.1 leo break; 530 1.1 leo case KBDLANG_GB: 531 1.1 leo printf ("British"); 532 1.1 leo break; 533 1.1 leo case KBDLANG_ESP: 534 1.1 leo printf ("Spanish"); 535 1.1 leo break; 536 1.1 leo case KBDLANG_I: 537 1.1 leo printf ("Italian"); 538 1.1 leo break; 539 1.1 leo case KBDLANG_CHF: 540 1.1 leo printf ("Swiss (French)"); 541 1.1 leo break; 542 1.1 leo case KBDLANG_CHD: 543 1.1 leo printf ("Swiss (German)"); 544 1.1 leo break; 545 1.1 leo default: 546 1.1 leo printf ("unknown"); 547 1.1 leo break; 548 1.1 leo } 549 1.1 leo printf (" (0x%x).\n", lang); 550 1.1 leo } 551 1.1 leo 552 1.1 leo static void 553 1.5 dsl showDateFmt (u_char fmt) 554 1.1 leo { 555 1.1 leo if (fmt & DATIME_24H) { 556 1.1 leo printf ("24 hour clock, "); 557 1.1 leo } else { 558 1.1 leo printf ("12 hour clock, "); 559 1.1 leo } 560 1.1 leo switch (fmt & ~DATIME_24H) { 561 1.1 leo case DATIME_MMDDYY: 562 1.1 leo printf ("MMDDYY"); 563 1.1 leo break; 564 1.1 leo case DATIME_DDMMYY: 565 1.1 leo printf ("DDMMYY"); 566 1.1 leo break; 567 1.1 leo case DATIME_YYMMDD: 568 1.1 leo printf ("YYMMDD"); 569 1.1 leo break; 570 1.1 leo case DATIME_YYDDMM: 571 1.1 leo printf ("YYDDMM"); 572 1.1 leo break; 573 1.1 leo default: 574 1.1 leo printf ("unknown"); 575 1.1 leo break; 576 1.1 leo } 577 1.1 leo printf (" (0x%02x)\n", fmt); 578 1.1 leo } 579 1.1 leo 580 1.1 leo static void 581 1.5 dsl showDateSep (u_char sep) 582 1.1 leo { 583 1.1 leo if (sep) { 584 1.1 leo if (sep >= 0x20) { 585 1.1 leo printf ("\"%c\" ", sep); 586 1.1 leo } 587 1.1 leo } else { 588 1.1 leo printf ("\"/\" "); 589 1.1 leo } 590 1.1 leo printf ("(0x%02x)\n", sep); 591 1.1 leo } 592 1.1 leo 593 1.1 leo static void 594 1.5 dsl showVideo2 (u_char vid2) 595 1.1 leo { 596 1.1 leo u_char colours; 597 1.1 leo 598 1.1 leo colours = vid2 & 0x07; 599 1.1 leo printf ("\t"); 600 1.1 leo switch (colours) { 601 1.1 leo case VID2_2COL: 602 1.1 leo printf ("2"); 603 1.1 leo break; 604 1.1 leo case VID2_4COL: 605 1.1 leo printf ("4"); 606 1.1 leo break; 607 1.1 leo case VID2_16COL: 608 1.1 leo printf ("16"); 609 1.1 leo break; 610 1.1 leo case VID2_256COL: 611 1.1 leo printf ("256"); 612 1.1 leo break; 613 1.1 leo case VID2_65535COL: 614 1.1 leo printf ("65535"); 615 1.1 leo break; 616 1.1 leo } 617 1.1 leo printf (" colours, "); 618 1.1 leo if (vid2 & VID2_80CLM) { 619 1.1 leo printf ("80"); 620 1.1 leo } else { 621 1.1 leo printf ("40"); 622 1.1 leo } 623 1.1 leo printf (" column, "); 624 1.1 leo if (vid2 & VID2_VGA) { 625 1.1 leo printf ("VGA"); 626 1.1 leo } else { 627 1.1 leo printf ("TV"); 628 1.1 leo } 629 1.1 leo printf (", "); 630 1.1 leo if (vid2 & VID2_PAL) { 631 1.1 leo printf ("PAL\n"); 632 1.1 leo } else { 633 1.1 leo printf ("NTSC\n"); 634 1.1 leo } 635 1.1 leo printf ("\tOverscan "); 636 1.1 leo if (vid2 & VID2_OVERSCAN) { 637 1.1 leo printf ("on\n"); 638 1.1 leo } else { 639 1.1 leo printf ("off\n"); 640 1.1 leo } 641 1.1 leo printf ("\tST compatibility "); 642 1.1 leo if (vid2 & VID2_COMPAT) { 643 1.1 leo printf ("on\n"); 644 1.1 leo } else { 645 1.1 leo printf ("off\n"); 646 1.1 leo } 647 1.1 leo } 648 1.1 leo 649 1.1 leo static void 650 1.5 dsl showVideo1 (u_char vid1, u_char vid2) 651 1.1 leo { 652 1.1 leo if (vid2 & VID2_VGA) { 653 1.1 leo printf ("\tDouble line "); 654 1.1 leo if (vid1 & VID1_INTERLACE) { 655 1.1 leo printf ("on"); 656 1.1 leo } else { 657 1.1 leo printf ("off"); 658 1.1 leo } 659 1.1 leo } else { 660 1.1 leo printf ("\tInterlace "); 661 1.1 leo if (vid1 & VID1_INTERLACE) { 662 1.1 leo printf ("on"); 663 1.1 leo } else { 664 1.1 leo printf ("off"); 665 1.1 leo } 666 1.1 leo } 667 1.1 leo printf ("\n"); 668 1.1 leo } 669 1.1 leo 670 1.1 leo static int 671 1.5 dsl checkOS (u_char *val, char *str) 672 1.1 leo { 673 1.1 leo if (!strncasecmp (str, "ne", 2)) { 674 1.1 leo *val = BOOTPREF_NETBSD; 675 1.1 leo return (1); 676 1.1 leo } 677 1.1 leo if (!strncasecmp (str, "t", 1)) { 678 1.1 leo *val = BOOTPREF_TOS; 679 1.1 leo return (1); 680 1.1 leo } 681 1.1 leo if (!strncasecmp (str, "m", 1)) { 682 1.1 leo *val = BOOTPREF_MAGIC; 683 1.1 leo return (1); 684 1.1 leo } 685 1.1 leo if (!strncasecmp (str, "l", 1)) { 686 1.1 leo *val = BOOTPREF_LINUX; 687 1.1 leo return (1); 688 1.1 leo } 689 1.1 leo if (!strncasecmp (str, "s", 1)) { 690 1.1 leo *val = BOOTPREF_SYSV; 691 1.1 leo return (1); 692 1.1 leo } 693 1.1 leo if (!strncasecmp (str, "no", 2)) { 694 1.1 leo *val = BOOTPREF_NONE; 695 1.1 leo return (1); 696 1.1 leo } 697 1.1 leo return (0); 698 1.1 leo } 699 1.1 leo 700 1.1 leo static int 701 1.5 dsl checkLang (u_char *val, char *str) 702 1.1 leo { 703 1.1 leo if (!strncasecmp (str, "e", 1)) { 704 1.1 leo *val = LANG_GB; 705 1.1 leo return (1); 706 1.1 leo } 707 1.1 leo if (!strncasecmp (str, "g", 1)) { 708 1.1 leo *val = LANG_D; 709 1.1 leo return (1); 710 1.1 leo } 711 1.1 leo if (!strncasecmp (str, "f", 1)) { 712 1.1 leo *val = LANG_FR; 713 1.1 leo return (1); 714 1.1 leo } 715 1.1 leo if (!strncasecmp (str, "s", 1)) { 716 1.1 leo *val = LANG_ESP; 717 1.1 leo return (1); 718 1.1 leo } 719 1.1 leo if (!strncasecmp (str, "i", 1)) { 720 1.1 leo *val = LANG_I; 721 1.1 leo return (1); 722 1.1 leo } 723 1.1 leo return (0); 724 1.1 leo } 725 1.1 leo 726 1.1 leo static int 727 1.5 dsl checkKbdLang (u_char *val, char *str) 728 1.1 leo { 729 1.1 leo if (!strncasecmp (str, "a", 1)) { 730 1.1 leo *val = KBDLANG_USA; 731 1.1 leo return (1); 732 1.1 leo } 733 1.1 leo if (!strncasecmp (str, "g", 1)) { 734 1.1 leo *val = KBDLANG_D; 735 1.1 leo return (1); 736 1.1 leo } 737 1.1 leo if (!strncasecmp (str, "f", 1)) { 738 1.1 leo *val = KBDLANG_FR; 739 1.1 leo return (1); 740 1.1 leo } 741 1.1 leo if (!strncasecmp (str, "b", 1)) { 742 1.1 leo *val = KBDLANG_GB; 743 1.1 leo return (1); 744 1.1 leo } 745 1.1 leo if (!strncasecmp (str, "sp", 2)) { 746 1.1 leo *val = KBDLANG_ESP; 747 1.1 leo return (1); 748 1.1 leo } 749 1.1 leo if (!strncasecmp (str, "i", 1)) { 750 1.1 leo *val = KBDLANG_I; 751 1.1 leo return (1); 752 1.1 leo } 753 1.1 leo if (!strncasecmp (str, "swiss f", 7) || !strncasecmp (str, "sw f", 4)) { 754 1.1 leo *val = KBDLANG_CHF; 755 1.1 leo return (1); 756 1.1 leo } 757 1.1 leo if (!strncasecmp (str, "swiss g", 7) || !strncasecmp (str, "sw g", 4)) { 758 1.1 leo *val = KBDLANG_CHD; 759 1.1 leo return (1); 760 1.1 leo } 761 1.1 leo return (0); 762 1.1 leo } 763 1.1 leo 764 1.1 leo static int 765 1.5 dsl checkInt (u_char *val, char *str, int min, int max) 766 1.1 leo { 767 1.1 leo int num; 768 1.1 leo if (1 == sscanf (str, "%d", &num) && num >= min && num <= max) { 769 1.1 leo *val = num; 770 1.1 leo return (1); 771 1.1 leo } 772 1.1 leo return (0); 773 1.1 leo } 774 1.1 leo 775 1.1 leo static int 776 1.5 dsl checkDateFmt (u_char *val, char *str) 777 1.1 leo { 778 1.1 leo if (!strncasecmp (str, "m", 1)) { 779 1.1 leo *val |= DATIME_MMDDYY; 780 1.1 leo return (1); 781 1.1 leo } 782 1.1 leo if (!strncasecmp (str, "d", 1)) { 783 1.1 leo *val |= DATIME_DDMMYY; 784 1.1 leo return (1); 785 1.1 leo } 786 1.1 leo if (!strncasecmp (str, "yym", 3)) { 787 1.1 leo *val |= DATIME_YYMMDD; 788 1.1 leo return (1); 789 1.1 leo } 790 1.1 leo if (!strncasecmp (str, "yyd", 3)) { 791 1.1 leo *val |= DATIME_YYDDMM; 792 1.1 leo return (1); 793 1.1 leo } 794 1.1 leo return (0); 795 1.1 leo } 796 1.1 leo 797 1.1 leo static void 798 1.5 dsl checkDateSep (u_char *val, char *str) 799 1.1 leo { 800 1.1 leo if (str[0] == '/') { 801 1.1 leo *val = 0; 802 1.1 leo } else { 803 1.1 leo *val = str[0]; 804 1.1 leo } 805 1.1 leo } 806 1.1 leo 807 1.1 leo static int 808 1.5 dsl checkColours (u_char *val, char *str) 809 1.1 leo { 810 1.1 leo *val &= ~0x07; 811 1.1 leo if (!strncasecmp (str, "6", 1)) { 812 1.1 leo *val |= VID2_65535COL; 813 1.1 leo return (1); 814 1.1 leo } 815 1.1 leo if (!strncasecmp (str, "25", 2)) { 816 1.1 leo *val |= VID2_256COL; 817 1.1 leo return (1); 818 1.1 leo } 819 1.1 leo if (!strncasecmp (str, "1", 1)) { 820 1.1 leo *val |= VID2_16COL; 821 1.1 leo return (1); 822 1.1 leo } 823 1.1 leo if (!strncasecmp (str, "4", 1)) { 824 1.1 leo *val |= VID2_4COL; 825 1.1 leo return (1); 826 1.1 leo } 827 1.1 leo if (!strncasecmp (str, "2", 1)) { 828 1.1 leo *val |= VID2_2COL; 829 1.1 leo return (1); 830 1.1 leo } 831 1.1 leo return (0); 832 1.1 leo } 833