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