Home | History | Annotate | Line # | Download | only in bootpref
bootpref.c revision 1.3.8.1
      1  1.3.8.1  skrll /*	$NetBSD: bootpref.c,v 1.3.8.1 2009/04/28 07:33:53 skrll 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.3.8.1  skrll static void	usage(void);
     42  1.3.8.1  skrll static int	openNVRAM(void);
     43  1.3.8.1  skrll static void	closeNVRAM(int);
     44  1.3.8.1  skrll static u_char	readNVRAM(int, int);
     45  1.3.8.1  skrll static void	writeNVRAM(int, int, u_char);
     46  1.3.8.1  skrll static void	getNVpref(int, u_char[]);
     47  1.3.8.1  skrll static void	setNVpref(int, u_char[], int, int);
     48  1.3.8.1  skrll static void	showOS(u_char);
     49  1.3.8.1  skrll static void	showLang(u_char);
     50  1.3.8.1  skrll static void	showKbdLang(u_char);
     51  1.3.8.1  skrll static void	showDateFmt(u_char);
     52  1.3.8.1  skrll static void	showDateSep(u_char);
     53  1.3.8.1  skrll static void	showVideo2(u_char);
     54  1.3.8.1  skrll static void	showVideo1(u_char, u_char);
     55  1.3.8.1  skrll static int	checkOS(u_char *, char *);
     56  1.3.8.1  skrll static int	checkLang(u_char *, char *);
     57  1.3.8.1  skrll static int	checkKbdLang(u_char *, char *);
     58  1.3.8.1  skrll static int	checkInt(u_char *, char *, int, int);
     59  1.3.8.1  skrll static int 	checkDateFmt(u_char *, char *);
     60  1.3.8.1  skrll static void 	checkDateSep(u_char *, char *);
     61  1.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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.3.8.1  skrll 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