Annotation of coherent/f/tmp/inst2/kpatch/kpatch.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * File:       kpatch.c
                      3:  *
                      4:  * Purpose:
                      5:  * This program is not expected to work other than on PC Coherent.
                      6:  * Certain hot patches may not be effective, since some values are only
                      7:  * referenced once at system initialization.
                      8:  *
                      9:  */
                     10: 
                     11: /*
                     12:  * ----------------------------------------------------------------------
                     13:  * Includes.
                     14:  */
                     15: #include <stdio.h>
                     16: #include <errno.h>
                     17: #include <sys/patch.h>
                     18: #include "patchl.h"
                     19: 
                     20: /*
                     21:  * ----------------------------------------------------------------------
                     22:  * Definitions.
                     23:  *     Constants.
                     24:  *     Macros with argument lists.
                     25:  *     Typedefs.
                     26:  *     Enums.
                     27:  */
                     28: #define PATCH_DEVICE_NAME      "/dev/patch"
                     29: 
                     30: /*
                     31:  * ----------------------------------------------------------------------
                     32:  * Functions.
                     33:  *     Import Functions.
                     34:  *     Export Functions.
                     35:  *     Local Functions.
                     36:  */
                     37: 
                     38: void main();
                     39: int arg_getc();
                     40: 
                     41: static int kpatch();
                     42: static void usage();
                     43: static int peek_patch();
                     44: 
                     45: /*
                     46:  * ----------------------------------------------------------------------
                     47:  * Global Data.
                     48:  *     Import Variables.
                     49:  *     Export Variables.
                     50:  *     Local Variables.
                     51:  */
                     52: extern struct PatchInfo argInfo;       /* yyparse puts info here. */
                     53: 
                     54: static char * lex_input;
                     55: static int lex_index;
                     56: 
                     57: static int verbose = 0;                        /* Are we printing feedback?  */
                     58: static int kfd;                                /* File descriptor for patch device. */
                     59: 
                     60: static char version[] =        "kpatch version 1.0 for COHERENT v.4.2";
                     61: 
                     62: static char short_helpmessage[] = "\
                     63: kpatch -- alter installation kernel\n\
                     64: Usage: kpatch [-v] \n\
                     65:        { symbol? | symbol=value | symbol:maj:in | symbol:maj:out } ...\n\
                     66: ";
                     67: 
                     68: static char helpmessage[] = "\
                     69:        -v              Verbose mode--print what's being done.\n\
                     70:        symbol?         Display present value of symbol.\n\
                     71:        symbol=value    Store value into symbol.\n\
                     72:        symbol:maj:in   If major number maj is not already in use,\n\
                     73:                        attach CON struct symbol to driver table at major\n\
                     74:                        number maj and call the load routine for the driver.\n\
                     75:        symbol:maj:out  If named CON symbol is installed at major number maj,\n\
                     76:                        call unload routine for the driver and remove the\n\
                     77:                        driver from the driver table.\n\
                     78: 'Value' is a numeric constant (decimal by default, hexadecimal if preceded\n\
                     79: by '0x', octal if preceded by '0' or '0o'.\n\
                     80: 'Value' may also be makedev(major-number, minor-number).\n\
                     81: ";
                     82: 
                     83: /*
                     84:  * ----------------------------------------------------------------------
                     85:  * Code.
                     86:  */
                     87: 
                     88: /*************************************************************************
                     89:  * main
                     90:  ************************************************************************/
                     91: void
                     92: main(argc, argv)
                     93: int argc;
                     94: char *argv[];
                     95: {
                     96:        int c;                  /* For reading options from getopt().  */
                     97:        int i;
                     98:        int patch_err;
                     99:        char errmsg[80];
                    100: 
                    101:        extern int optind;
                    102:        extern char *optarg;
                    103: 
                    104:        if ((kfd = open(PATCH_DEVICE_NAME, 0)) == -1) {
                    105:                sprintf(errmsg, "%s: device %s", argv[0], PATCH_DEVICE_NAME);
                    106:                perror(errmsg);
                    107:                exit(1);
                    108:        }
                    109: 
                    110:        while ((c = getopt(argc, argv, "v?")) != EOF) {
                    111:                switch (c) {
                    112:                case 'v':
                    113:                        verbose++;
                    114:                        break;
                    115:                case '?':
                    116:                        fprintf(stderr, "%s\n", version);
                    117:                        usage(1);       /* Does not return.  */
                    118:                default:
                    119:                        usage(0);       /* Does not return.  */
                    120:                }
                    121:        }
                    122: 
                    123:        /*
                    124:         * There must be at least 2 arguments left.
                    125:         */
                    126:        if (argc - optind < 1) {
                    127:                fprintf(stderr, "Missing arguments.\n");
                    128:                usage(0);       /* Does not return */
                    129:        }
                    130: 
                    131:        /*
                    132:         * Handle patch symbols one at a time.
                    133:         * If an error occurs, display failure and save error status
                    134:         * for exit value.
                    135:         */
                    136:        patch_err = 0;
                    137:        for (i = optind;  i < argc;  i++) {
                    138:                if (kpatch(argv[i])) {
                    139:                        sprintf(errmsg, "%s: %s", argv[0], argv[i]);
                    140:                        if (errno)
                    141:                                perror(errmsg);
                    142:                        patch_err = 1;
                    143:                }
                    144:        }
                    145:        close(kfd);
                    146:        exit(patch_err);
                    147: }
                    148: 
                    149: /*************************************************************************
                    150:  * kpatch
                    151:  *
                    152:  * Given a patch argument, attempt to do the patch.
                    153:  * Return 0 if successful, -1 if failure.
                    154:  ************************************************************************/
                    155: static int
                    156: kpatch(patch_arg)
                    157: char * patch_arg;
                    158: {
                    159:        int result;
                    160: 
                    161:        /*
                    162:         * Parse patch argument.
                    163:         * If its type can be identified, pass the parsed info to
                    164:         * the required action routine.
                    165:         */
                    166:        lex_input = patch_arg;
                    167:        lex_index = 0;
                    168:        argInfo.piType = bad_arg;
                    169:        if(yyparse())
                    170:                result = -1;
                    171:        else {  /* parse succeeded */
                    172:                pDump();
                    173:                switch(argInfo.piType) {
                    174:                case peek_arg:
                    175:                        result = peek_patch(&argInfo);
                    176:                        break;
                    177:                case assign_arg:
                    178:                        result = assign_patch(&argInfo);
                    179:                        break;
                    180:                case con_in_arg:
                    181:                        result = con_in_patch(&argInfo);
                    182:                        break;
                    183:                case con_out_arg:
                    184:                        result = con_out_patch(&argInfo);
                    185:                        break;
                    186:                default:
                    187:                        result = -1;
                    188:                }
                    189:        }
                    190: 
                    191:        return result;
                    192: }
                    193: 
                    194: /*************************************************************************
                    195:  * usage
                    196:  *
                    197:  * Display usage message and terminate abnormally.
                    198:  ************************************************************************/
                    199: /*
                    200:  */
                    201: void
                    202: usage(verbose)
                    203: int verbose;
                    204: {
                    205:        fprintf(stderr, short_helpmessage);
                    206:        if (verbose) {
                    207:                fprintf(stderr, helpmessage);
                    208:        }
                    209:        exit(1);
                    210: }
                    211: 
                    212: /*************************************************************************
                    213:  * arg_getc
                    214:  *
                    215:  * This replaces the default lex input function, taking input from global
                    216:  * character pointer lex_input at position lex_index.
                    217:  ************************************************************************/
                    218: int
                    219: arg_getc()
                    220: {
                    221:        int result;
                    222: 
                    223:        /*
                    224:         * Fetch the next available character.
                    225:         * If at end of string
                    226:         *   Return EOF.
                    227:         * Else
                    228:         *   Advance character pointer.
                    229:         */
                    230:        result = lex_input[lex_index];
                    231:        if (result == 0)
                    232:                result = -1;
                    233:        else
                    234:                lex_index++;
                    235:        return result;
                    236: }
                    237: 
                    238: /*************************************************************************
                    239:  * assign_patch
                    240:  *
                    241:  * Try to modify a kernel variable.
                    242:  * Return 0 if success, -1 if failure.
                    243:  ************************************************************************/
                    244: static int
                    245: assign_patch(pip)
                    246: struct PatchInfo * pip;
                    247: {
                    248:        struct patchVar pvar;
                    249:        int result;
                    250: 
                    251:        strncpy(pvar.patch_vname, pip->piData.assignData.vname,
                    252:          PATCH_VAR_NAME_LENGTH);
                    253:        pvar.patch_data = & pip->piData.assignData.newValue;
                    254:        result = ioctl(kfd, PATCH_WR, &pvar);
                    255: 
                    256:        if (result >= 0 && verbose)
                    257:                printf("Value assigned: %s=0x%08x\n",
                    258:                  pvar.patch_vname, pip->piData.assignData.newValue);
                    259: 
                    260:        return result;
                    261: }
                    262: 
                    263: /*************************************************************************
                    264:  * con_in_patch
                    265:  *
                    266:  * Try to install a device driver.
                    267:  * Return 0 if success, -1 if failure.
                    268:  ************************************************************************/
                    269: static int
                    270: con_in_patch(pip)
                    271: struct PatchInfo * pip;
                    272: {
                    273:        struct patchCon pcon;
                    274:        int result;
                    275: 
                    276:        strncpy(pcon.patch_vname, pip->piData.conData.vname,
                    277:          PATCH_VAR_NAME_LENGTH);
                    278:        pcon.patch_maj = pip->piData.conData.maj;
                    279:        result = ioctl(kfd, PATCH_CON_IN, &pcon);
                    280: 
                    281:        if (result >= 0 && verbose)
                    282:                printf("Device %s attached at major number %d\n",
                    283:                  pcon.patch_vname, pcon.patch_maj);
                    284: 
                    285:        return result;
                    286: }
                    287: 
                    288: /*************************************************************************
                    289:  * con_out_patch
                    290:  *
                    291:  * Try to uninstall a device driver.
                    292:  * Return 0 if success, -1 if failure.
                    293:  ************************************************************************/
                    294: static int
                    295: con_out_patch(pip)
                    296: struct PatchInfo * pip;
                    297: {
                    298:        struct patchCon pcon;
                    299:        int result;
                    300: 
                    301:        strncpy(pcon.patch_vname, pip->piData.conData.vname,
                    302:          PATCH_VAR_NAME_LENGTH);
                    303:        pcon.patch_maj = pip->piData.conData.maj;
                    304:        result = ioctl(kfd, PATCH_CON_OUT, &pcon);
                    305: 
                    306:        if (result >= 0 && verbose)
                    307:                printf("Device %s detached from major number %d\n",
                    308:                  pcon.patch_vname, pcon.patch_maj);
                    309: 
                    310:        return result;
                    311: }
                    312: 
                    313: /*************************************************************************
                    314:  * peek_patch
                    315:  *
                    316:  * Try to examine a kernel variable.
                    317:  * Return 0 if success, -1 if failure.
                    318:  ************************************************************************/
                    319: static int
                    320: peek_patch(pip)
                    321: struct PatchInfo * pip;
                    322: {
                    323:        int vdata = 0;
                    324:        struct patchVar pvar;
                    325:        int result;
                    326: 
                    327:        strncpy(pvar.patch_vname, pip->piData.peekData.vname,
                    328:          PATCH_VAR_NAME_LENGTH);
                    329:        pvar.patch_data = &vdata;
                    330:        result = ioctl(kfd, PATCH_RD, &pvar);
                    331: 
                    332:        if (result >= 0)
                    333:                printf("Value inspected: %s=0x%08x\n", pvar.patch_vname, vdata);
                    334: 
                    335:        return result;
                    336: }
                    337: 
                    338: pDump()
                    339: {
                    340: #if 0
                    341:        switch(argInfo.piType) {
                    342:        case peek_arg:
                    343:                printf("What is the value of %s?\n",
                    344:                  argInfo.piData.peekData.vname);
                    345:                break;
                    346:        case assign_arg:
                    347:                printf("Set %s equal to %d\n",
                    348:                  argInfo.piData.assignData.vname,
                    349:                  argInfo.piData.assignData.newValue);
                    350:                break;
                    351:        case con_in_arg:
                    352:                printf("Attach device %s to major number %d\n",
                    353:                  argInfo.piData.conData.vname,
                    354:                  argInfo.piData.conData.maj);
                    355:                break;
                    356:        case con_out_arg:
                    357:                printf("Detach device %s from major number %d\n",
                    358:                  argInfo.piData.conData.vname,
                    359:                  argInfo.piData.conData.maj);
                    360:                break;
                    361:        default:
                    362:                printf("Bad argument! %s\n", lex_input);
                    363:        }
                    364: #endif
                    365: }

unix.superglobalmegacorp.com

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