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