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