|
|
1.1 ! root 1: /* ! 2: * kbdinstall.c ! 3: * 07/26/92 ! 4: * Keyboard support installation, including virtual console questions. ! 5: * ! 6: * cc kbdinstall.c -lcurses [-lterm] ! 7: * Usage: kbdinstall [ -bu ] ! 8: * Options: ! 9: * -b invoked from build ! 10: * -u invoked from update install, don't patch running system ! 11: */ ! 12: ! 13: #include <stdio.h> ! 14: #include <string.h> ! 15: #include <curses.h> ! 16: #include "build0.h" ! 17: ! 18: extern char *fgets(); ! 19: extern char *malloc(); ! 20: ! 21: #define VERSION "3.4" /* Version number. */ ! 22: #define KBDDIR "/conf/kbd" /* Keyboard directory. */ ! 23: #define KBDLIST "/conf/kbd/.list" /* List of keyboards. */ ! 24: #define KBDFILE "/tmp/kbd" /* File of driver object name(s) */ ! 25: #define KBDY 4 /* y-coordinate of keyboard list. */ ! 26: #define NLINE 512 /* Line length. */ ! 27: #define NKBDS (24-KBDY) /* Max number of keyboards */ ! 28: #define USAGE "Usage: /etc/kbdinstall [-bu]\n" ! 29: ! 30: /* Keyboard list file entries. */ ! 31: typedef struct kline { ! 32: int k_loadable; /* True: loadable tables supported */ ! 33: char *k_driver; /* Name of keyboard driver object */ ! 34: char *k_table; /* Keyboard table name */ ! 35: char *k_desc; /* Keyboard description */ ! 36: } KLINE; ! 37: ! 38: /* Forward */ ! 39: char *copystr(); ! 40: void display_line(); ! 41: void display_rev(); ! 42: void fatal(); ! 43: void my_fatal(); /* handles window cleanup */ ! 44: void format_error(); ! 45: void nonfatal(); ! 46: void my_nonfatal(); /* handles window cleanup */ ! 47: void read_klist(); ! 48: ! 49: /* Globals. */ ! 50: int bflag; /* Invoked from build. */ ! 51: char buf[NBUF]; /* Input buffer. */ ! 52: KLINE klist[NKBDS]; /* Keyboard list. */ ! 53: int nkbds; /* Number of keyboards. */ ! 54: int initflag; /* Curses initialized. */ ! 55: int uflag; /* Invoked from update. */ ! 56: int virtual; /* Virtual consoles wanted */ ! 57: int default_entry = -1; /* Which entry to default to */ ! 58: int color_sessions; /* number of color sessions */ ! 59: int mono_sessions; /* number of mono sessions */ ! 60: ! 61: main(argc, argv) int argc; char *argv[]; ! 62: { ! 63: register int n, c, i; ! 64: char *s; ! 65: ! 66: /* Process command line options. */ ! 67: while (argc > 1 && argv[1][0] == '-') { ! 68: for (s = &argv[1][1]; *s != '\0'; s++) { ! 69: switch (*s) { ! 70: case 'b': ++bflag; break; ! 71: case 'u': ++uflag; break; ! 72: case 'V': nonfatal("V%s", VERSION); break; ! 73: default: ! 74: fprintf(stderr, USAGE); ! 75: exit(1); ! 76: } ! 77: } ! 78: --argc; ! 79: ++argv; ! 80: } ! 81: ! 82: if (bflag && uflag) { ! 83: fprintf(stderr, USAGE); ! 84: exit(1); ! 85: } ! 86: ! 87: /* Initialize screen and terminal modes. */ ! 88: initscr(); ! 89: initflag = 1; ! 90: noecho(); ! 91: raw(); ! 92: clear(); ! 93: ! 94: #if _I386 ! 95: if (bflag || uflag) { ! 96: /* ! 97: * If 386 and invoked from "build" or "install", output some ! 98: * info about virtual consoles. Prompt the user if he/she ! 99: * wants V.C. support and set variable "virtual" as needed. ! 100: */ ! 101: mvaddstr(0, 0, ! 102: "This release of COHERENT supports multiple simultaneous sessions on the"); ! 103: mvaddstr(1, 0, ! 104: "system console. This feature, known as virtual consoles, supports both"); ! 105: mvaddstr(2, 0, ! 106: "monochrome and color video cards (text mode only) with multiple \"login\""); ! 107: mvaddstr(3, 0, ! 108: "sessions on each, depending upon your hardware configuration. If you have"); ! 109: mvaddstr(4, 0, ! 110: "both color and monochrome adapters on your system, you can run multiple"); ! 111: mvaddstr(5, 0, ! 112: "sessions on each of them at the same time."); ! 113: mvaddstr(6, 0, ! 114: "Virtual console support only works with systems which have at least one"); ! 115: mvaddstr(7, 0, ! 116: "megabyte of usable system memory, and with keyboards which are 100% IBM AT"); ! 117: mvaddstr(8, 0, ! 118: "hardware compatible. If you are using a low cost clone keyboard which is not"); ! 119: mvaddstr(9, 0, ! 120: "100% hardware compatible (i.e., does not correctly support scan code set 3"); ! 121: mvaddstr(10, 0, ! 122: "operation), you will not be able to use COHERENT's virtual console features,"); ! 123: mvaddstr(11, 0, ! 124: "nor will you be able to use COHERENT's \"loadable\" keyboard driver."); ! 125: mvaddstr(13, 0, ! 126: "Do you wish to include support for virtual consoles? [y or n] "); ! 127: refresh(); ! 128: echo(); ! 129: for (;;) { ! 130: c = getch(); ! 131: switch (c) { ! 132: case 'Y': ! 133: case 'y': ! 134: ++virtual; ! 135: break; ! 136: case 'N': ! 137: case 'n': ! 138: break; ! 139: default: ! 140: continue; ! 141: } ! 142: noecho(); ! 143: refresh(); ! 144: mvaddstr(14, 0, "Please hit <Enter> ..."); ! 145: refresh(); ! 146: while ((c = getch()) != '\r' && c != '\n') ! 147: ; ! 148: mvaddstr(14, 0, "One moment, please ...."); ! 149: refresh(); ! 150: break; ! 151: } ! 152: clear(); ! 153: } ! 154: #endif ! 155: ! 156: /* Read the keyboard list file. */ ! 157: read_klist(); ! 158: ! 159: /* Display instructions at top of screen. */ ! 160: mvaddstr(0, 0, ! 161: "Select the entry below which indentifies your keyboard type. Hit <Enter> to"); ! 162: mvaddstr(1, 0, ! 163: "select the highlighted entry. Hit <space> to move to the next entry."); ! 164: ! 165: /* Display choices. */ ! 166: for (n = 0; n < nkbds; n++) ! 167: display_line(n); ! 168: ! 169: /* Interactive input loop: display choice n highlighted. */ ! 170: for (n = (default_entry >= 0) ? default_entry : 0; ; ) { ! 171: display_rev(n); /* display default choice in reverse */ ! 172: refresh(); ! 173: switch (c = getch()) { ! 174: case 'A': /* n.b.: ESC [ A is Up Arrow key */ ! 175: if (--n < 0) ! 176: n = nkbds - 1; ! 177: continue; ! 178: case ' ': /* space/Down Arrow: try next choice */ ! 179: case 'B': /* n.b.: ESC [ B is Down Arrow key */ ! 180: if (++n >= nkbds) ! 181: n = 0; ! 182: continue; ! 183: case '\n': ! 184: case '\r': /* enter: take default value */ ! 185: break; ! 186: default: ! 187: continue; /* ignore */ ! 188: } ! 189: break; /* done, choice is in n */ ! 190: } ! 191: endwin(); ! 192: ! 193: /* ! 194: * Execute the keyboard table file only if invoked by the user ! 195: * (i.e., not Build nor Update). ! 196: */ ! 197: if (!uflag && !bflag) { ! 198: if (klist[n].k_loadable) { ! 199: sprintf(buf, "%s/%s", KBDDIR, klist[n].k_table); ! 200: if (system(buf) != 0) ! 201: fatal("Loadable keyboard tables not supported by this kernel", buf); ! 202: } else { ! 203: fatal("Selected entry is not a loadable keyboard table"); ! 204: } ! 205: exit(0); ! 206: } ! 207: ! 208: /* ! 209: * Build or Update: ! 210: * Store keyboard driver name in file specified by KBDFILE. ! 211: * If loadable keyboard table selected, store name of keyboard ! 212: * table into /tmp/drvld.all (386), ! 213: * or to /etc/drvld.all (286 update). ! 214: */ ! 215: ! 216: /* ! 217: * COH 4.2 adds vt support with non-loadable tables. If such a keyboard is ! 218: * selected by the user, then the table field will be "nl". In this instance, ! 219: * we don't want to build a drvld entry. bob h 7/14/93 ! 220: */ ! 221: if (klist[n].k_loadable) { ! 222: sprintf(buf,"/bin/echo %s >%s",(virtual)?klist[n].k_driver : "nkb.a mm.a", KBDFILE); ! 223: if(strcmp(klist[n].k_table,"nl")){ ! 224: sprintf(buf,"/bin/echo %s/%s >>%s/drvld.all", ! 225: KBDDIR, klist[n].k_table, ! 226: #if _I386 ! 227: "/tmp"); ! 228: ! 229: #else ! 230: (bflag) ? "/tmp" : "/etc"); ! 231: #endif ! 232: ! 233: } ! 234: } else { ! 235: sprintf(buf, "/bin/echo %s mm.a >%s", ! 236: klist[n].k_driver, KBDFILE); ! 237: } ! 238: sys(buf, S_FATAL); ! 239: ! 240: printf( "Your keyboard selection will not take effect until after\n" ! 241: "your system %s has completed and the system has rebooted!\n\n", ! 242: bflag ? "installation" : "update"); ! 243: ! 244: /* ! 245: * During installation, if V.C.'s are in use, ! 246: * don't provide the console device. ! 247: */ ! 248: if (bflag && !virtual) { ! 249: sprintf(cmd, "/bin/echo \"1lPconsole\" >/tmp/ttys"); ! 250: sys(cmd, S_FATAL); ! 251: } ! 252: ! 253: again: ! 254: mono_sessions = 0; ! 255: if (virtual && yes_no("\nDoes this system have a monochrome (i.e., MDA) video adapter")) { ! 256: mono_sessions = get_int(1, 4, ! 257: "How many active virtual console sessions would you like on your\n" ! 258: "monochrome video adapter card [1-4]?"); ! 259: for (i = 0; i < mono_sessions; ++i) { ! 260: sprintf(cmd, "/bin/echo \"1lPmono%d\" >>%s/ttys", ! 261: #if _I386 ! 262: i, "/tmp"); ! 263: #else ! 264: i, (bflag) ? "/tmp" : "/etc"); ! 265: #endif ! 266: sys(cmd, S_FATAL); ! 267: } ! 268: } ! 269: ! 270: color_sessions = 0; ! 271: if (virtual && yes_no("\nDoes this system have a color (i.e., CGA/EGA/VGA) video adapter")) { ! 272: color_sessions = get_int(1, 4, ! 273: "How many active virtual console sessions would you like on your\n" ! 274: "color video adapter card [1-4]?"); ! 275: for (i = 0; i < color_sessions; ++i) { ! 276: sprintf(cmd, "/bin/echo \"1lPcolor%d\" >>%s/ttys", ! 277: #if _I386 ! 278: i, "/tmp"); ! 279: #else ! 280: i, (bflag) ? "/tmp" : "/etc"); ! 281: #endif ! 282: sys(cmd, S_FATAL); ! 283: } ! 284: } ! 285: ! 286: if (virtual && (mono_sessions + color_sessions) == 0) { ! 287: printf("\nYou must select either a monochrome or a color video adapter!\n"); ! 288: goto again; ! 289: } ! 290: ! 291: /* ! 292: * After linking new kernel, will patch it for number of mono ! 293: * and color sessions. Do the patch even if number of sessions ! 294: * for the given type is zero. ! 295: */ ! 296: if (virtual) { ! 297: sprintf(cmd, ! 298: "echo /conf/patch /mnt/coherent VTMONO=%d:c VTVGA=%d:c >> %s\n", ! 299: mono_sessions, color_sessions, PATCHFILE); ! 300: sys(cmd, S_FATAL); ! 301: } ! 302: ! 303: /* Done. */ ! 304: exit(0); ! 305: } ! 306: ! 307: /* ! 308: * Allocate a copy of a string and return a pointer to it. ! 309: */ ! 310: char * ! 311: copystr(s) register char *s; ! 312: { ! 313: register char *cp; ! 314: ! 315: if ((cp = malloc(strlen(s) + 1)) == NULL) ! 316: my_fatal("no space for string \"%s\""); ! 317: strcpy(cp, s); ! 318: return cp; ! 319: } ! 320: ! 321: /* ! 322: * Display choice n. ! 323: */ ! 324: void ! 325: display_line(n) register int n; ! 326: { ! 327: mvaddstr(KBDY+n, 12, klist[n].k_desc); ! 328: } ! 329: ! 330: /* ! 331: * Display choice n in reverse video. ! 332: */ ! 333: void ! 334: display_rev(n) int n; ! 335: { ! 336: static int last = -1; ! 337: ! 338: if (last != -1) ! 339: display_line(last); /* redisplay last in normal */ ! 340: standout(); ! 341: display_line(n); /* display n in reverse */ ! 342: standend(); ! 343: last = n; ! 344: } ! 345: ! 346: /* ! 347: * Cry and die. ! 348: */ ! 349: /* VARARGS */ ! 350: void ! 351: my_fatal(s) char *s; ! 352: { ! 353: if (initflag) ! 354: endwin(); ! 355: fprintf(stderr, "kbdinstall: %r\n", &s); ! 356: exit(1); ! 357: } ! 358: ! 359: /* ! 360: * Issue nonfatal informative message. ! 361: */ ! 362: /* VARARGS */ ! 363: void ! 364: my_nonfatal(s) char *s; ! 365: { ! 366: if (initflag) ! 367: endwin(); ! 368: fprintf(stderr, "kbdinstall: %r\n", &s); ! 369: } ! 370: ! 371: /* ! 372: * Read a file containing keyboard file names and descriptions, ! 373: * build a keyboard list. ! 374: * ! 375: * Format of input is: ! 376: * # Comment line ! 377: * or ! 378: * Default <tab> Loadable <tab> Driver <tab> Table <tab> Descr. ! 379: */ ! 380: void ! 381: read_klist() ! 382: { ! 383: register FILE *fp; ! 384: register unsigned char *s, *s1; ! 385: ! 386: if ((fp = fopen(KBDLIST, "r")) == NULL) ! 387: my_fatal("cannot open \"%s\"", KBDLIST); ! 388: while (fgets(buf, sizeof buf, fp) != NULL) { ! 389: if (buf[0] == '#') ! 390: continue; /* ignore comments */ ! 391: if (nkbds == NKBDS) { ! 392: my_nonfatal("more than %d keyboard entries", NKBDS-1); ! 393: continue; ! 394: } ! 395: ! 396: /* ! 397: * Parse input lines and emit error messages if input bad. ! 398: */ ! 399: if (buf[0] == 'Y' || buf[0] == 'y') ! 400: default_entry = nkbds; ! 401: if ((s = strchr(buf, '\t')) == NULL) { ! 402: format_error(buf); ! 403: continue; ! 404: } ! 405: ! 406: switch (*++s) { ! 407: case 'Y': case 'y': ! 408: klist[nkbds].k_loadable = TRUE; ! 409: break; ! 410: case 'N': case 'n': ! 411: if ((!bflag && !uflag) || virtual) ! 412: continue; /* ignore if interactive ... */ ! 413: break; /* ... or if VC's desired */ ! 414: default: ! 415: format_error(buf); ! 416: continue; ! 417: } ! 418: if ((s = strchr(++s, '\t')) == NULL) { ! 419: format_error(buf); ! 420: continue; ! 421: } ! 422: if ((s1 = strchr(++s, '\t')) == NULL) { ! 423: format_error(buf); ! 424: continue; ! 425: } ! 426: *s1++ = '\0'; ! 427: klist[nkbds].k_driver = copystr(s); /* keyboard driver */ ! 428: if ((s = strchr(s1, '\t')) == NULL) { ! 429: format_error(s1); ! 430: continue; ! 431: } ! 432: *s++ = '\0'; ! 433: klist[nkbds].k_table = copystr(s1); /* keyboard table */ ! 434: if ((s1 = strchr(s, '\n')) == NULL) { ! 435: my_nonfatal("no newline in \"%s\"", s); ! 436: continue; ! 437: } ! 438: *s1 = '\0'; ! 439: klist[nkbds].k_desc = copystr(s); /* kbd description */ ! 440: ! 441: nkbds++; ! 442: } ! 443: fclose(fp); ! 444: } ! 445: ! 446: /* ! 447: * Input error found: display an error message and continue. ! 448: */ ! 449: void ! 450: format_error(line) ! 451: char *line; ! 452: { ! 453: my_nonfatal("Input format error found in \"%s\" -- ignored.", line); ! 454: } ! 455: ! 456: /* end of kbdinstall.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.