Annotation of coherent/f/tmp/inst2/kbdinstall.c, revision 1.1

1.1     ! root        1: #define TEST 0
        !             2: 
        !             3: /*
        !             4:  * kbdinstall.c - 386 only!
        !             5:  *
        !             6:  * Revised: Thu Jul 29 05:02:49 1993 CDT
        !             7:  * Keyboard support installation, including virtual console questions.
        !             8:  *
        !             9:  * cc kbdinstall.c -lcurses [-lterm]
        !            10:  * Usage: kbdinstall [ -bu ]
        !            11:  * Options:
        !            12:  *     -b      invoked from build
        !            13:  *     -u      invoked from update install, don't patch running system
        !            14:  */
        !            15: 
        !            16: #include <stdio.h>
        !            17: #include <string.h>
        !            18: #include <ctype.h>
        !            19: #include <curses.h>
        !            20: #include <sys/kb.h>
        !            21: 
        !            22: #include "build0.h"
        !            23: 
        !            24: extern char    *fgets();
        !            25: extern char    *malloc();
        !            26: 
        !            27: #define        VERSION "4.2"                   /* Version number.      */
        !            28: #define        KBDDIR  "/conf/kbd"             /* Keyboard directory.  */
        !            29: 
        !            30: #if TEST
        !            31: #define        KBDLIST "kblist"                /* List of keyboards.   */
        !            32: #define TTYFILE "ttys"
        !            33: #define DRVLDFILE "drvld.all"
        !            34: #else
        !            35: #define        KBDLIST "/conf/kbd/kblist"      /* List of keyboards.   */
        !            36: #define TTYFILE "/tmp/ttys"
        !            37: #define DRVLDFILE "/tmp/drvld.all"
        !            38: #endif
        !            39: 
        !            40: #define KB_LANG_VAR    "kb_lang"
        !            41: #define MONO_SESSION_VAR "MONO_COUNT"  /* Number of monochrome sessions. */
        !            42: #define COLOR_SESSION_VAR "VGA_COUNT"  /* Number of color sessions. */
        !            43: #define        KBDY    4                       /* y-coordinate of keyboard list. */
        !            44: #define        NLINE   512                     /* Line length.         */
        !            45: #define        NKBDS   (24-KBDY)               /* Max number of keyboards */
        !            46: #define        USAGE   "Usage: /etc/kbdinstall [-bu]\n"
        !            47: #define MAX_NUM_SESSIONS       8
        !            48: 
        !            49: /* Language specifiers for nonloadable kb's. */
        !            50: #define DE_LANG_STR    "DE"
        !            51: #define FR_LANG_STR    "FR"
        !            52: #define US_LANG_STR    "-"
        !            53: 
        !            54: /* Keyboard list file entries. */
        !            55: typedef        struct  kline   {
        !            56:        int     k_loadable;             /* True: loadable tables supported */
        !            57:        int     k_lang;                 /* Used only for nonloadable kb. */
        !            58:        char    *k_driver;              /* Name of keyboard driver object */
        !            59:        char    *k_table;               /* Keyboard table name  */
        !            60:        char    *k_desc;                /* Keyboard description */
        !            61: }      KLINE;
        !            62: 
        !            63: /* Forward */
        !            64: char   *copystr();
        !            65: void   display_line();
        !            66: void   display_rev();
        !            67: int    blank_line();
        !            68: void   get_sessions();
        !            69: void   fatal();
        !            70: void   my_fatal();                     /* handles window cleanup */
        !            71: void   format_error();
        !            72: void   nonfatal();
        !            73: void   my_nonfatal();                  /* handles window cleanup */
        !            74: void   read_klist();
        !            75: 
        !            76: /* Globals. */
        !            77: int    bflag;                          /* Invoked from build.  */
        !            78: char   buf[NBUF];                      /* Input buffer.        */
        !            79: KLINE  klist[NKBDS];                   /* Keyboard list.       */
        !            80: int    nkbds;                          /* Number of keyboards. */
        !            81: int    initflag;                       /* Curses initialized.  */
        !            82: int    uflag;                          /* Invoked from update. */
        !            83: int    virtual;                        /* Virtual consoles wanted */
        !            84: int    default_entry = -1;             /* Which entry to default to */
        !            85: 
        !            86: main(argc, argv) int argc; char *argv[];
        !            87: {
        !            88:        register int n, c;
        !            89:        char *s;
        !            90: 
        !            91: #if TEST
        !            92: printf("TEST version - recompile with TEST disabled for production.\n"
        !            93: "Press enter: ");
        !            94: getchar();
        !            95: #endif
        !            96: 
        !            97:        /* Process command line options. */
        !            98:        while (argc > 1 && argv[1][0] == '-') {
        !            99:                for (s = &argv[1][1]; *s != '\0'; s++) {
        !           100:                        switch (*s) {
        !           101:                        case 'b':       ++bflag;                        break;
        !           102:                        case 'u':       ++uflag;                        break;
        !           103:                        case 'V':       nonfatal("V%s", VERSION);       break;
        !           104:                        default:
        !           105:                                fprintf(stderr, USAGE);
        !           106:                                exit(1);
        !           107:                        }
        !           108:                }
        !           109:                --argc;
        !           110:                ++argv;
        !           111:        }
        !           112: 
        !           113:        if (bflag && uflag) {
        !           114:                fprintf(stderr, USAGE);
        !           115:                exit(1);
        !           116:        }
        !           117: 
        !           118:        /* Initialize screen and terminal modes. */
        !           119:        initscr();
        !           120:        initflag = 1;
        !           121:        noecho();
        !           122:        raw();
        !           123:        clear();
        !           124: 
        !           125:        if (bflag || uflag) {
        !           126:                /*
        !           127:                 * If invoked from "build" or "install", output some
        !           128:                 * info about virtual consoles.  Prompt the user if he/she
        !           129:                 * wants V.C. support and set variable "virtual" as needed.
        !           130:                 */
        !           131:                mvaddstr(0, 0,
        !           132: "This release of COHERENT supports multiple simultaneous sessions on the");
        !           133:                mvaddstr(1, 0,
        !           134: "system console.  This feature, known as virtual consoles, supports both");
        !           135:                mvaddstr(2, 0,
        !           136: "monochrome and color video cards (text mode only) with multiple \"login\"");
        !           137:                mvaddstr(3, 0,
        !           138: "sessions on each, depending upon your hardware configuration.  If you have");
        !           139:                mvaddstr(4, 0,
        !           140: "both color and monochrome adapters on your system, you can run multiple");
        !           141:                mvaddstr(5, 0,
        !           142: "sessions on each of them at the same time.");
        !           143:                mvaddstr(7, 0,
        !           144: "Virtual console support only works with systems which have at least one");
        !           145:                mvaddstr(8, 0,
        !           146: "megabyte of usable system memory. You may choose a loadable keyboard table");
        !           147:                mvaddstr(9, 0,
        !           148: "or a non-loadable keyboard table. Loadable keyboard tables will give you the");
        !           149:                mvaddstr(10, 0,
        !           150: "flexibility of remapping your keys and to load new tables at any time while");
        !           151:                mvaddstr(11, 0,
        !           152: "your system is active. This requires keyboards that are 100% IBM AT compliant.");
        !           153:                mvaddstr(12, 0,
        !           154: "If you chose a non-loadable keyboard, you will not have this flexibility.");
        !           155:                mvaddstr(14,0,
        !           156: "Not all keyboards are 100% IBM AT compliant and will not work with loadable");
        !           157:                mvaddstr(15,0,
        !           158: "keyboard tables. If your keyboard is not 100% IBM AT compliant, it may result");
        !           159:                mvaddstr(16,0,
        !           160: "in COHERENT not booting properly after the installation process is completed,");
        !           161:                mvaddstr(17,0,
        !           162: "or you may find that your keyboard keys are not mapped as they are labeled and");
        !           163:                mvaddstr(18,0,
        !           164: "that some keys cease to function at all. For this reason, the default selection");
        !           165:                mvaddstr(19,0,
        !           166: "is the non-loadable keyboard.");
        !           167:                mvaddstr(21, 0,
        !           168: "Do you wish to include support for virtual consoles? [y or n] ");
        !           169:                refresh();
        !           170:                echo();
        !           171:                for (;;) {
        !           172:                        c = getch();
        !           173:                        switch (c) {
        !           174:                        case 'Y':
        !           175:                        case 'y':
        !           176:                                ++virtual;
        !           177:                                break;
        !           178:                        case 'N':
        !           179:                        case 'n':
        !           180:                                break;
        !           181:                        default:
        !           182:                                continue;
        !           183:                        }
        !           184:                        noecho();
        !           185:                        refresh();
        !           186:                        mvaddstr(23, 0, "Please hit <Enter> ...");
        !           187:                        refresh();
        !           188:                        while ((c = getch()) != '\r' && c != '\n')
        !           189:                                ;
        !           190:                        mvaddstr(23, 0, "One moment, please ....");
        !           191:                        refresh();
        !           192:                        break;
        !           193:                }
        !           194:                clear();
        !           195:        }
        !           196: 
        !           197:        /* Read the keyboard list file. */
        !           198:        read_klist();
        !           199: 
        !           200:        /* Display instructions at top of screen. */
        !           201:        mvaddstr(0, 0,
        !           202: "Select the entry below which indentifies your keyboard type.  Hit <Enter> to");
        !           203:        mvaddstr(1, 0,
        !           204: "select the highlighted entry.  Hit <space> to move to the next entry.");
        !           205: 
        !           206:        /* Display choices. */
        !           207:        for (n = 0; n < nkbds; n++)
        !           208:                display_line(n);
        !           209: 
        !           210:        /* Interactive input loop: display choice n highlighted. */
        !           211:        for (n = (default_entry >= 0) ? default_entry : 0; ; ) {
        !           212:                display_rev(n);         /* display default choice in reverse */
        !           213:                refresh();
        !           214:                switch (c = getch()) {
        !           215:                case 'A':               /* n.b.:  ESC [ A is Up Arrow key */
        !           216:                        if (--n < 0)
        !           217:                                n = nkbds - 1;
        !           218:                        continue;
        !           219:                case ' ':               /* space/Down Arrow: try next choice */
        !           220:                case 'B':               /* n.b.:  ESC [ B is Down Arrow key */
        !           221:                        if (++n >= nkbds)
        !           222:                                n = 0;
        !           223:                        continue;
        !           224:                case '\n':
        !           225:                case '\r':              /* enter: take default value */
        !           226:                        break;
        !           227:                default:
        !           228:                        continue;       /* ignore */
        !           229:                }
        !           230:                break;                  /* done, choice is in n */
        !           231:        }
        !           232: 
        !           233:        /*
        !           234:         * Execute the keyboard table file only if invoked by the user
        !           235:         * (i.e., not Build nor Update).
        !           236:         */
        !           237:        if (!uflag && !bflag) {
        !           238: #if! TEST
        !           239: /* Omit this during testing! */
        !           240:                if (klist[n].k_loadable) {
        !           241:                        sprintf(buf, "%s/%s", KBDDIR, klist[n].k_table);
        !           242:                        if (system(buf) != 0)
        !           243:                            fatal("Loadable keyboard tables not supported by this kernel", buf);
        !           244:                } else {
        !           245:                        fatal("Selected entry is not a loadable keyboard table");
        !           246:                }
        !           247: #endif
        !           248:                exit(0);
        !           249:        }
        !           250: 
        !           251:        /*
        !           252:         * Must be in Build or Update mode now.
        !           253:         */
        !           254: 
        !           255:        /* Write idenable line to IDCMDFILE. */
        !           256:        buf[0] = '\0';
        !           257:        if (virtual)
        !           258:                strcpy(buf, "vt");
        !           259:        strcat(buf, klist[n].k_driver);
        !           260:        idenable_dev(buf);
        !           261: 
        !           262:        if (klist[n].k_loadable) {
        !           263: 
        !           264:                /*
        !           265:                 * Loadable keyboard table selected.
        !           266:                 * Store name of keyboard executable into
        !           267:                 * drvld.all.
        !           268:                 */
        !           269:                sprintf(buf,"/bin/echo %s/%s >> %s",
        !           270:                  KBDDIR, klist[n].k_table, DRVLDFILE);
        !           271:                sys(buf,S_FATAL);
        !           272: 
        !           273:        } else {
        !           274: 
        !           275:                char * kb_lang_val;
        !           276:                char line[80];
        !           277: 
        !           278:                /*
        !           279:                 * Non-loadable keyboard table selected.
        !           280:                 * If Language is German (DE) or French (FR),
        !           281:                 * write cohtune line.
        !           282:                 */
        !           283:                switch(klist[n].k_lang) {
        !           284:                case kb_lang_us:
        !           285:                        kb_lang_val = "kb_lang_us";
        !           286:                        break;
        !           287:                case kb_lang_de:
        !           288:                        kb_lang_val = "kb_lang_de";
        !           289:                        break;
        !           290:                case kb_lang_fr:
        !           291:                        kb_lang_val = "kb_lang_fr";
        !           292:                        break;
        !           293:                }
        !           294:                sprintf(line, "int %s = %s;", KB_LANG_VAR, kb_lang_val);
        !           295:                cohtune_ent("console", KB_LANG_VAR, line);
        !           296:        }
        !           297: 
        !           298: 
        !           299:        clear();
        !           300:        mvaddstr(0,0,"Your keyboard selection will not take effect until after");
        !           301:        move(1,0);
        !           302:        printw("your system %s has completed and the system has rebooted!\n",
        !           303:                bflag ? "installation" : "update");
        !           304: 
        !           305: 
        !           306:        mvaddstr(3,0,"Press <Enter> to continue...");
        !           307:        refresh();
        !           308: 
        !           309:        while ((c = getch()) != '\r' && c != '\n')
        !           310:                ;
        !           311: 
        !           312: #if 0
        !           313:        clear();
        !           314:        refresh();
        !           315: #endif
        !           316: 
        !           317:        /* Back to non-curses output. */
        !           318:        endwin();
        !           319: 
        !           320:        /*
        !           321:         * During installation, if V.C.'s are in use,
        !           322:         * don't enable the console device.
        !           323:         */
        !           324:        if (bflag) {
        !           325:                sprintf(cmd, "/bin/echo \"%dlPconsole\" > %s",
        !           326:                  virtual ? 0 : 1, TTYFILE);
        !           327:                sys(cmd, S_FATAL);
        !           328:        }
        !           329: 
        !           330:        /* For virtual consoles, ask how many sessions. */
        !           331:        if (virtual) {
        !           332:                clear();
        !           333:                get_sessions();
        !           334:        }
        !           335: 
        !           336:        /* Done. */
        !           337:        exit(0);
        !           338: }
        !           339: 
        !           340: /*
        !           341:  * Allocate a copy of a string and return a pointer to it.
        !           342:  */
        !           343: char *
        !           344: copystr(s) register char *s;
        !           345: {
        !           346:        register char *cp;
        !           347: 
        !           348:        if ((cp = malloc(strlen(s) + 1)) == NULL)
        !           349:                my_fatal("no space for string \"%s\"");
        !           350:        strcpy(cp, s);
        !           351:        return cp;
        !           352: }
        !           353: 
        !           354: /*
        !           355:  * Display choice n.
        !           356:  */
        !           357: void
        !           358: display_line(n) register int n;
        !           359: {
        !           360:        mvaddstr(KBDY+n, 12, klist[n].k_desc);
        !           361: }
        !           362: 
        !           363: /*
        !           364:  * Display choice n in reverse video.
        !           365:  */
        !           366: void
        !           367: display_rev(n) int n;
        !           368: {
        !           369:        static int last = -1;
        !           370: 
        !           371:        if (last != -1)
        !           372:                display_line(last);     /* redisplay last in normal */
        !           373:        standout();
        !           374:        display_line(n);                /* display n in reverse */
        !           375:        standend();
        !           376:        last = n;
        !           377: }
        !           378: 
        !           379: /*
        !           380:  * Cry and die.
        !           381:  */
        !           382: /* VARARGS */
        !           383: void
        !           384: my_fatal(s) char *s;
        !           385: {
        !           386:        if (initflag)
        !           387:                endwin();
        !           388:        fprintf(stderr, "kbdinstall: %r\n", &s);
        !           389:        exit(1);
        !           390: }
        !           391: 
        !           392: /*
        !           393:  * Issue nonfatal informative message.
        !           394:  */
        !           395: /* VARARGS */
        !           396: void
        !           397: my_nonfatal(s) char *s;
        !           398: {
        !           399:        if (initflag)
        !           400:                endwin();
        !           401:        fprintf(stderr, "kbdinstall: %r\n", &s);
        !           402: }
        !           403: 
        !           404: /*
        !           405:  * Read a file containing keyboard file names and descriptions,
        !           406:  * build a keyboard list.
        !           407:  *
        !           408:  * Format of input is:
        !           409:  *     # Comment line
        !           410:  *      blank line
        !           411:  * or
        !           412:  *     Default <tab> Loadable <tab> Driver <tab> Table <tab> Descr.
        !           413:  */
        !           414: void
        !           415: read_klist()
        !           416: {
        !           417:        register FILE *fp;
        !           418:        register unsigned char *s, *s1;
        !           419: 
        !           420:        if ((fp = fopen(KBDLIST, "r")) == NULL)
        !           421:                my_fatal("cannot open \"%s\"", KBDLIST);
        !           422:        while (fgets(buf, sizeof buf, fp) != NULL) {
        !           423:                if (buf[0] == '#' || blank_line(buf))
        !           424:                        continue;               /* ignore comments */
        !           425:                if (nkbds == NKBDS) {
        !           426:                        my_nonfatal("more than %d keyboard entries", NKBDS-1);
        !           427:                        continue;
        !           428:                }
        !           429: 
        !           430:                /*
        !           431:                 * Parse input lines and emit error messages if input bad.
        !           432:                 */
        !           433:                if (buf[0] == 'Y' || buf[0] == 'y')
        !           434:                        default_entry = nkbds;
        !           435:                if ((s = strchr(buf, '\t')) == NULL) {
        !           436:                        format_error(buf);
        !           437:                        continue;
        !           438:                }
        !           439: 
        !           440:                switch (*++s) {
        !           441:                case 'Y': case 'y':
        !           442:                        klist[nkbds].k_loadable = TRUE;
        !           443:                        break;
        !           444:                case 'N': case 'n':
        !           445:                        klist[nkbds].k_loadable = FALSE;
        !           446:                        break;                  /* ... or if VC's desired */
        !           447:                default:
        !           448:                        format_error(buf);
        !           449:                        continue;
        !           450:                }
        !           451:                if ((s = strchr(++s, '\t')) == NULL) {
        !           452:                        format_error(buf);
        !           453:                        continue;
        !           454:                }
        !           455:                if ((s1 = strchr(++s, '\t')) == NULL) {
        !           456:                        format_error(buf);
        !           457:                        continue;
        !           458:                }
        !           459:                *s1++ = '\0';
        !           460:                klist[nkbds].k_driver = copystr(s);     /* keyboard driver */
        !           461:                if ((s = strchr(s1, '\t')) == NULL) {
        !           462:                        format_error(s1);
        !           463:                        continue;
        !           464:                }
        !           465:                *s++ = '\0';
        !           466:                klist[nkbds].k_table = copystr(s1);     /* keyboard table */
        !           467: 
        !           468:                /* k_table must contain DE/FR/- for non-loadable driver. */
        !           469:                if (!klist[nkbds].k_loadable) {
        !           470:                        if (strcmp(klist[nkbds].k_table, DE_LANG_STR) == 0)
        !           471:                                klist[nkbds].k_lang = kb_lang_de;
        !           472:                        else if (strcmp(klist[nkbds].k_table, FR_LANG_STR) == 0)
        !           473:                                klist[nkbds].k_lang = kb_lang_fr;
        !           474:                        else if (strcmp(klist[nkbds].k_table, US_LANG_STR) == 0)
        !           475:                                klist[nkbds].k_lang = kb_lang_us;
        !           476:                        else {
        !           477:                                format_error(s1);
        !           478:                                continue;
        !           479:                        }
        !           480:                }
        !           481: 
        !           482:                if ((s1 = strchr(s, '\n')) == NULL) {
        !           483:                        my_nonfatal("no newline in \"%s\"", s);
        !           484:                        continue;
        !           485:                }
        !           486: 
        !           487:                *s1 = '\0';
        !           488:                klist[nkbds].k_desc = copystr(s);       /* kbd description */
        !           489: 
        !           490:                nkbds++;
        !           491:        }
        !           492:        fclose(fp);
        !           493: }
        !           494: 
        !           495: /*
        !           496:  * Input error found: display an error message and continue.
        !           497:  */
        !           498: void
        !           499: format_error(line)
        !           500: char *line;
        !           501: {
        !           502:        my_nonfatal("Input format error found in \"%s\" -- ignored.", line);
        !           503: }
        !           504: 
        !           505: /*
        !           506:  * Return TRUE if line consists only of whitespace.
        !           507:  */
        !           508: int
        !           509: blank_line(str)
        !           510: char * str;
        !           511: {
        !           512:        int is_blank = TRUE;
        !           513: 
        !           514:        while(*str) {
        !           515:                if (isspace(*str))
        !           516:                        str++;
        !           517:                else {
        !           518:                        is_blank = FALSE;
        !           519:                        break;
        !           520:                }
        !           521:        }
        !           522: 
        !           523:        return is_blank;
        !           524: }
        !           525: 
        !           526: /*
        !           527:  * For virtual console users only, ask how may mono/color sessions.
        !           528:  */
        !           529: void
        !           530: get_sessions()
        !           531: {
        !           532:        int     color_sessions;         /* number of color sessions */
        !           533:        int     mono_sessions;          /* number of mono sessions */
        !           534:        int     mono_display;           /* 1 if mono display is present */
        !           535:        int     color_display;          /* 1 if color display is present */
        !           536:        int     high_prompt;
        !           537:        int     i;
        !           538: 
        !           539:        for (;;) {
        !           540:                mono_sessions = 0;
        !           541:                color_sessions = 0;
        !           542:                mono_display =
        !           543:                        yes_no("\nDoes this system have a monochrome "
        !           544:                          "(i.e., MDA) video adapter");
        !           545:                color_display =
        !           546:                        yes_no("\nDoes this system have a color "
        !           547:                          "(i.e., CGA/EGA/VGA) video adapter");
        !           548:                printf("\nYou may select a total of up to %d virtual "
        !           549:                  "console sessions.\n", MAX_NUM_SESSIONS);
        !           550: 
        !           551:                high_prompt = MAX_NUM_SESSIONS;
        !           552: 
        !           553:                if (color_display) {
        !           554:                        sprintf(buf, "\nHow many active virtual console sessions "
        !           555:                          "would you like on your\ncolor video display "
        !           556:                          "[1-%d]?", high_prompt);
        !           557:                        color_sessions = get_int(1, high_prompt, buf);
        !           558:                        high_prompt = MAX_NUM_SESSIONS - color_sessions;
        !           559:                }
        !           560: 
        !           561:                if (mono_display) {
        !           562:                        sprintf(buf, "\nHow many active virtual console sessions "
        !           563:                          "would you like on your\nmonchrome video display "
        !           564:                          "[1-%d]?", high_prompt);
        !           565:                        mono_sessions = get_int(1, high_prompt, buf);
        !           566:                }
        !           567: 
        !           568:                if (mono_sessions + color_sessions > 0)
        !           569:                        break;
        !           570: 
        !           571:                /* else - try again - no sessions enabled! */
        !           572:                printf("\nYou must select either a monochrome or a color video "
        !           573:                  "adapter!\n");
        !           574:        }
        !           575: 
        !           576:        /* Write device entries to ttys file. */
        !           577:        for (i = 0; i < color_sessions; ++i) {
        !           578:                sprintf(cmd, "/bin/echo \"1lPcolor%d\" >> %s",
        !           579:                        i, TTYFILE);
        !           580:                sys(cmd, S_FATAL);
        !           581:        }
        !           582: 
        !           583:        for (i = 0; i < mono_sessions; ++i) {
        !           584:                sprintf(cmd, "/bin/echo \"1lPmono%d\" >> %s",
        !           585:                        i, TTYFILE);
        !           586:                sys(cmd, S_FATAL);
        !           587:        }
        !           588: 
        !           589:        /*
        !           590:         * After linking new kernel, will patch it for number of mono
        !           591:         * and color sessions.  Do the patch even if number of sessions
        !           592:         * for the given type is zero.
        !           593:         */
        !           594:        idtune_var(MONO_SESSION_VAR, mono_sessions);
        !           595:        idtune_var(COLOR_SESSION_VAR, color_sessions);
        !           596: }
        !           597: 
        !           598: /* end of kbdinstall.c */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.