Annotation of coherent/a/usr/src/kbmain.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * driver routine for loadable keyboard tables.
                      3:  *
                      4:  * prior to firing off the ioctl() which loads the new keyboard tables,
                      5:  * permform some simple validity checks on the table.
                      6:  * if errors are found, bail out without setting the new table.
                      7:  *
                      8:  * Version 1.0, 6/8/91
                      9:  */
                     10: #include <stdio.h>
                     11: #include <sgtty.h>
                     12: #include <sys/kb.h>
                     13: #include <sys/kbscan.h>
                     14: #include <errno.h>
                     15: 
                     16: #define        VERSION "1.0"
                     17: #define        FALSE   (0 != 0)
                     18: #define        TRUE    (0 == 0)
                     19: 
                     20: /*
                     21:  * globals
                     22:  */
                     23: char   *argv0;                         /* name of this executable */
                     24: int    errors;                         /* for exit status */
                     25: char   verbose;                        /* step-by-step details */
                     26: char   debug;                          /* print out cooked table & exit */
                     27: KBTBL  table[MAX_KEYS];                /* cooked table for ioctl() */
                     28: FNKEY  *arena;                         /* function key arena */
                     29: 
                     30: unsigned char  keyval[] = {            /* code set 3 mapped value */
                     31: none, K_1, K_2, K_3, K_4, K_5, K_6, K_7,
                     32: K_8, K_9, K_10, K_11, K_12, K_13, none, K_15,
                     33: K_16, K_17, K_18, K_19, K_20, K_21, K_22, K_23,
                     34: K_24, K_25, K_26, K_27, K_28, K_29, K_30, K_31,
                     35: K_32, K_33, K_34, K_35, K_36, K_37, K_38, K_39,
                     36: K_40, K_41, K_42, K_43, K_44, K_45, K_46, K_47,
                     37: K_48, K_49, K_50, K_51, K_52, K_53, K_54, K_55,
                     38: none, K_57, K_58, none, K_60, K_61, K_62, none,
                     39: K_64, none, none, none, none, none, none, none,
                     40: none, none, none, K_75, K_76, none, none, K_79,
                     41: K_80, K_81, none, K_83, K_84, K_85, K_86, none,
                     42: none, K_89, K_90, K_91, K_92, K_93, none, K_95,
                     43: K_96, K_97, K_98, K_99, K_100, K_101, K_102, K_103,
                     44: K_104, K_105, K_106, none, K_108, none, K_110, none,
                     45: K_112, K_113, K_114, K_115, K_116, K_117, K_118, K_119,
                     46: K_120, K_121, K_122, K_123, K_124, K_125, K_126
                     47: };
                     48: 
                     49: /*
                     50:  * externs from user-defined keyboard table
                     51:  */
                     52: extern KBTBL   kbtbl[];                        /* actual table */
                     53: extern char    tbl_name[];                     /* name of table as text */
                     54: extern unsigned char *funkey[];                /* function key definitions */
                     55: extern int     numfun;                         /* # of function keys in tbl */
                     56: extern int     numkey;                         /* number of keys in kbtbl[] */
                     57: 
                     58: main(argc, argv)
                     59: char *argv[];
                     60: {
                     61:        unsigned char *cp, *ncp;
                     62:        int i, j;
                     63:        int fd;                                 /* console file descriptor */
                     64: 
                     65:        argv0 = argv[0];
                     66:        if ((arena = (FNKEY *)malloc(sizeof(FNKEY) + MAX_FCHAR)) == NULL) {
                     67:                err("out of memory");
                     68:                exit(errors);
                     69:        }
                     70:        if (argc > 1) {
                     71:                if (strcmp(argv[1], "-V") == 0)
                     72:                        printf("Version %s\n", VERSION);
                     73:                else if (strcmp(argv[1], "-D") == 0)
                     74:                        ++debug;
                     75:                else
                     76:                        usage();
                     77:        }
                     78: 
                     79:        if ((fd = open("/dev/console", 2)) < 0) {
                     80:                err("unable to access console");
                     81:                exit(errors);
                     82:        }
                     83: 
                     84:        /*
                     85:         * loop through the user's keyboard table validating each entry.
                     86:         * if the entry is good, copy it to the destination table.
                     87:         */
                     88:        for (i = 0; i < numkey; ++i) {          /* loop thru user's keys */
                     89:                if (ok_entry(i)) {
                     90:                        j = kbtbl[i].k_key;             /* map key */
                     91:                        table[j] = kbtbl[i];            /* copy entry */
                     92:                } else
                     93:                        ++errors;
                     94:        }
                     95: 
                     96:        if (errors)
                     97:                exit(errors);
                     98:        /*
                     99:         * build a function key arena consisting of the user defined
                    100:         * special and function keys.
                    101:         */
                    102:        ncp = arena->k_fnval;
                    103:        for (i = 0; i < numfun; ++i) {
                    104:                cp = funkey[i];
                    105:                do {
                    106:                        if (ncp >= &arena->k_fnval[MAX_FCHAR]) {
                    107:                                err("function key table overflow");
                    108:                                exit(errors);
                    109:                        }
                    110:                        *ncp++ = *cp;
                    111:                } while (*cp++ != DELIM);
                    112:        }
                    113:        arena->k_nfkeys = numfun;
                    114: 
                    115:        if (debug) {
                    116:                dump();                         /* print out cooked table */
                    117:                exit(0);
                    118:        }
                    119: 
                    120:        /*
                    121:         * load the cooked keyboard table into the driver via a
                    122:         * special ioctl() call.
                    123:         */
                    124:        ioctl(fd, TIOCSETKBT, table);
                    125:        if (errno) {
                    126:                perror("keyboard table ioctl() failed");
                    127:                exit(++errors);
                    128:        }
                    129: 
                    130:        /*
                    131:         * load the cooked function key table into the driver via a
                    132:         * special ioctl() call.
                    133:         */
                    134:        ioctl(fd, TIOCSETF, arena);
                    135:        if (errno) {
                    136:                perror("function key ioctl() failed");
                    137:                exit(++errors);
                    138:        }
                    139: 
                    140:        printf("Loaded %s\n", tbl_name);
                    141:        close(fd);
                    142:        exit(errors);
                    143: }
                    144: 
                    145: /*
                    146:  * validate a table entry
                    147:  */
                    148: ok_entry(n)
                    149: register int n;
                    150: {
                    151:        int i;
                    152:        int key = lookup(kbtbl[n].k_key);
                    153: 
                    154:        if (!key) {
                    155:                err("invalid key #0x%x in kbtbl[%d]", kbtbl[n].k_key, n);
                    156:                return FALSE;
                    157:        }
                    158:        if ((kbtbl[n].k_flags & (S|F)) == (S|F)) {
                    159:                err("invalid flag field for key K_%d", key);
                    160:                return FALSE;
                    161:        }
                    162:        if (kbtbl[n].k_flags & S) {
                    163:                for (i = BASE; i <= ALT_GR; ++i) {
                    164:                        if (kbtbl[n].k_val[i] != kbtbl[n].k_val[BASE]) {
                    165:                                err("inconsistent shift key entry for K_%d",
                    166:                                    key);
                    167:                                return FALSE;
                    168:                        }
                    169:                        if (kbtbl[n].k_val[i] < scroll
                    170:                           || kbtbl[n].k_val[i] > altgr) {
                    171:                                err("bad shift key entry for K_%d",
                    172:                                    key);
                    173:                                return FALSE;
                    174:                        }
                    175:                } /* for */
                    176:        } else if (kbtbl[n].k_flags & F) {
                    177:                for (i = BASE; i <= ALT_GR; ++i) {
                    178:                        if (kbtbl[n].k_val[i] != none)
                    179:                                if (kbtbl[n].k_val[i] >= numfun) {
                    180:                                        err("bad function key entry for K_%d",
                    181:                                            key);
                    182:                                        return FALSE;
                    183:                                }
                    184:                } /* for */
                    185:        } /* flag key */
                    186: 
                    187:        key = kbtbl[n].k_key;
                    188:        if (table[key].k_key != 0) {
                    189:                err("multiple entries for K_%d", key);
                    190:                return FALSE;
                    191:        }
                    192:        return TRUE;
                    193: }
                    194: 
                    195: /*
                    196:  * lookup the physical key number associated with a given
                    197:  * code set 3 scan code.
                    198:  *
                    199:  * return 0 if not found.
                    200:  */
                    201: lookup(sc)
                    202: unsigned sc;
                    203: {
                    204:        register int i;
                    205: 
                    206:        if (sc == none)
                    207:                return 0;
                    208:        for (i = 0; i < sizeof(keyval)/sizeof(keyval[0]); ++i)
                    209:                if (keyval[i] == (unsigned char)sc)
                    210:                        return (i);
                    211:        return 0;
                    212: }
                    213: 
                    214: usage()
                    215: {
                    216:        fprintf(stderr, "usage:\t%s [-V]\n", argv0);
                    217:        exit(1);
                    218: }
                    219: 
                    220: err(msg)
                    221: char *msg;
                    222: {
                    223:        fprintf(stderr, "%s: ERROR: %r\n", argv0, &msg);
                    224:        ++errors;
                    225: }
                    226: 
                    227: /*
                    228:  * dump the cooked keyboard table to stdout
                    229:  */
                    230: dump()
                    231: {
                    232:        int i, j;
                    233: 
                    234:        for (i = 0; i < MAX_KEYS; ++i) {
                    235:                printf("%02x: %02x ", i, table[i].k_key);
                    236:                for (j = 0; j < 9; ++j)
                    237:                        printf("%02x ", table[i].k_val[j]);
                    238:                printf("(%02x)\n", table[i].k_flags);
                    239:        }
                    240: }

unix.superglobalmegacorp.com

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