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