Annotation of coherent/b/etc/Build_401/cohpatch.c, revision 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.