Annotation of coherent/b/etc/Build_401/cohpatch.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * cohpatch.c
                      3:  * 8/19/91
                      4:  * Uses common routines in build0.c: cc -o cohpatch cohpatch.c build0.c
                      5:  * Patch new copy of COHERENT for V3.2.0 update installation.
                      6:  * Hack, hack, hack.
                      7:  */
                      8: 
                      9: #include "build0.h"
                     10: #include <l.out.h>
                     11: #include <sys/hdioctl.h>
                     12: 
                     13: extern long    lseek();
                     14: 
                     15: #define        COH     "/coherent"
                     16: #define        COHNEW  "/coherent.new"
                     17: #define        COHOLD  "/coherent.old"
                     18: #define        KMEM    "/dev/kmem"
                     19: #define        NENTRIES        (sizeof(nl)/sizeof(nl[0]))
                     20: 
                     21: char   buf[256];               /* temporary buffer */
                     22: char   cmd[512];               /* command buffer */
                     23: int    kfd;                    /* kernel file desciptor */
                     24: 
                     25: /* Symbols patched from old /coherent to new /coherent. */
                     26: struct nlist   nl[] = {
                     27:        { "rootdev_", 0, 0 },
                     28:        { "pipedev_", 0, 0 },
                     29:        { "ronflag_", 0, 0 },
                     30:        { "___", 0, 0 },
                     31:        { "_entry_", 0, 0 },
                     32:        { "LPTIME_", 0, 0 },
                     33:        { "LPWAIT_", 0, 0 },
                     34:        { "", 0, 0 }
                     35: };
                     36: int    nlsizes[NENTRIES] = {           /* sizes of preceding, yuk */
                     37:                sizeof (unsigned int),
                     38:                sizeof (unsigned int),
                     39:                sizeof (unsigned int),
                     40:                sizeof (unsigned long),
                     41:                sizeof (unsigned long),
                     42:                sizeof (unsigned int),
                     43:                sizeof (unsigned int),
                     44:                0
                     45: };
                     46: 
                     47: /* Symbol from old /coherent handled specially. */
                     48: struct nlist   nlat[] = {
                     49:        { "atparm_", 0, 0 },
                     50:        { "", 0, 0 }
                     51: };
                     52: 
                     53: /* Symbols patched in /drv/al0. */
                     54: struct nlist   nlal0[] = {
                     55:        { "C1BAUD_", 0, 0 },
                     56:        { "C3BAUD_", 0, 0 },
                     57:        { "", 0, 0 }
                     58: };
                     59: 
                     60: /* Symbols patched in /drv/al1. */
                     61: struct nlist   nlal1[] = {
                     62:        { "C2BAUD_", 0, 0 },
                     63:        { "C4BAUD_", 0, 0 },
                     64:        { "", 0, 0 }
                     65: };
                     66: 
                     67: extern void    kread();
                     68: 
                     69: main(argc, argv) int argc; char *argv[];
                     70: {
                     71:        register int i;
                     72:        unsigned char ucval;
                     73:        unsigned int uval;
                     74:        unsigned long ulval;
                     75: 
                     76:        argv0 = argv[0];
                     77:        if (argc > 1 && strcmp(argv[1], "-d") == 0) {
                     78:                ++dflag;
                     79:                --argc;
                     80:                ++argv;
                     81:        }
                     82:                
                     83:        if ((kfd = open(KMEM, 0)) < 0)
                     84:                fatal("cannot open \"%s\"", KMEM);
                     85: 
                     86:        /* Search /coherent for current values. */
                     87:        nlist(COH, nl);
                     88:        nlist(COH, nlat);
                     89:        nlist(COH, nlal0);
                     90:        nlist(COH, nlal1);
                     91: 
                     92:        /*
                     93:         * Patch /coherent.new:
                     94:         *      root device
                     95:         *      pipe device
                     96:         *      read-only flag
                     97:         *      serial number (twice)
                     98:         *      line printer parameters
                     99:         */
                    100:        sprintf(cmd, "/conf/patch %s ", COHNEW);
                    101:        for (i = 0; i < NENTRIES-1; i++) {
                    102:                if (nl[i].n_type == 0)
                    103:                        fatal("cannot find symbol \"%s\"", nl[i].n_name);
                    104:                if (nlsizes[i] == sizeof (unsigned int)) {
                    105:                        kread(nl[i].n_value, &uval, nlsizes[i]);
                    106:                        sprintf(buf, "%s=0x%x ", nl[i].n_name, uval);
                    107:                } else if (nlsizes[i] == sizeof (unsigned long)) {
                    108:                        kread(nl[i].n_value, &ulval, nlsizes[i]);
                    109:                        sprintf(buf, "%s=%lu:l ", nl[i].n_name, ulval);
                    110:                }
                    111:                strcat(cmd, buf);
                    112:        }
                    113:        sys(cmd, S_FATAL);
                    114: 
                    115:        /* Patch AT device parameters. */
                    116:        sprintf(cmd, "/conf/patch %s ", COHNEW);
                    117:        if (nlat[0].n_type != 0) {
                    118:                for (i = 0; i < sizeof(hdparm_t); i++ ) {
                    119:                        kread(nlat[0].n_value+i, &ucval, sizeof(ucval));
                    120:                        sprintf(buf, "atparm_+%d=%u:c ", i, ucval);
                    121:                        strcat(cmd, buf);
                    122:                }
                    123:                sys(cmd, S_FATAL);
                    124:        }
                    125: 
                    126:        /* Patch baud rates. */
                    127:        sprintf(cmd, "/conf/patch /drv/al0 ");
                    128:        for (i = 0; i < 2; i++) {
                    129:                if (nlal0[i].n_type == 0)
                    130:                        fatal("cannot find symbol \"%s\"", nlal0[i].n_name);
                    131:                kread(nlal0[i].n_value, &uval, sizeof(unsigned int));
                    132:                sprintf(buf, "%s=%u ", nlal0[i].n_name, uval);
                    133:                strcat(cmd, buf);
                    134:        }
                    135:        sys(cmd, S_FATAL);
                    136:        sprintf(cmd, "/conf/patch /drv/al1 ");
                    137:        for (i = 0; i < 2; i++) {
                    138:                if (nlal1[i].n_type == 0)
                    139:                        fatal("cannot find symbol \"%s\"", nlal1[i].n_name);
                    140:                kread(nlal1[i].n_value, &uval, sizeof(unsigned int));
                    141:                sprintf(buf, "%s=%u ", nlal1[i].n_name, uval);
                    142:                strcat(cmd, buf);
                    143:        }
                    144:        sys(cmd, S_FATAL);
                    145: 
                    146:        /* Move original and patched versions. */
                    147:        sprintf(cmd, "/bin/mv %s %s", COH, COHOLD);
                    148:        sys(cmd, S_FATAL);
                    149:        sprintf(cmd, "/bin/mv %s %s", COHNEW, COH);
                    150: 
                    151:        /* Done. */
                    152:        sys(cmd, S_FATAL);
                    153:        close(kfd);
                    154:        exit(0);
                    155: }
                    156: 
                    157: void
                    158: kread(useek, bp, n) unsigned int useek; char *bp; int n;
                    159: {
                    160:        if (lseek(kfd, (long)useek, 0) == -1L)
                    161:                fatal("seek error on \"%s\"", KMEM);
                    162:        if (read(kfd, bp, n) != n)
                    163:                fatal("read error on \"%s\"", KMEM);
                    164: }
                    165: 
                    166: /* end of cohpatch.c */

unix.superglobalmegacorp.com

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