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