Annotation of 40BSD/cmd/adb/setup.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "%Z%%M% %I% %G%";
        !             2: /*
        !             3:  * adb - routines to read a.out+core at startup
        !             4:  */
        !             5: #include "defs.h"
        !             6: #include <stat.h>
        !             7: 
        !             8: off_t  datbas;                 /* offset of the base of the data segment */
        !             9: off_t  stksiz;                 /* stack size in the core image */
        !            10: 
        !            11: char   *symfil = "a.out";
        !            12: char   *corfil = "core";
        !            13: 
        !            14: setsym()
        !            15: {
        !            16:        off_t loc;
        !            17:        struct exec hdr;
        !            18:        register struct nlist *sp;
        !            19:        int ssiz;
        !            20:        char *strtab;
        !            21: 
        !            22:        fsym = getfile(symfil, 1);
        !            23:        txtmap.ufd = fsym;
        !            24:        if (read(fsym, (char *)&hdr, sizeof hdr) != sizeof hdr ||
        !            25:            N_BADMAG(hdr)) {
        !            26:                txtmap.e1 = MAXFILE;
        !            27:                return;
        !            28:        }
        !            29:        filhdr = hdr;
        !            30:        loc = filhdr.a_text+filhdr.a_data;
        !            31:        txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr);
        !            32:        txtmap.b1 = 0;
        !            33:        switch (filhdr.a_magic) {
        !            34: 
        !            35:        case OMAGIC:
        !            36:                txtmap.e1 = loc;
        !            37:                txtmap.b2 = datbas = 0;
        !            38:                txtmap.e2 = loc;
        !            39:                break;
        !            40: 
        !            41:        case ZMAGIC:
        !            42:        case NMAGIC:
        !            43:                txtmap.e1 = filhdr.a_text;
        !            44:                txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ);
        !            45:                txtmap.e2 = datbas + filhdr.a_data;
        !            46:                txtmap.f2 += txtmap.e1;
        !            47:        }
        !            48:        loc = N_SYMOFF(filhdr);
        !            49:        symtab = (struct nlist *) malloc(filhdr.a_syms);
        !            50:        esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)];
        !            51:        if (symtab == NULL)
        !            52:                goto nospac;
        !            53:        lseek(fsym, loc, 0);
        !            54:        if (filhdr.a_syms == 0)
        !            55:                goto nosymt;
        !            56:        /* SHOULD SQUISH OUT STABS HERE!!! */
        !            57:        if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms)
        !            58:                goto readerr;
        !            59:        if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz))
        !            60:                goto oldfmt;
        !            61:        strtab = (char *) malloc(ssiz);
        !            62:        if (strtab == 0)
        !            63:                goto nospac;
        !            64:        *(int *)strtab = ssiz;
        !            65:        ssiz -= sizeof (ssiz);
        !            66:        if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz)
        !            67:                goto readerr;
        !            68:        for (sp = symtab; sp < esymtab; sp++)
        !            69:                if (sp->n_strx)
        !            70:                        /* SHOULD PERFORM RANGE CHECK HERE */
        !            71:                        sp->n_un.n_name = strtab + sp->n_un.n_strx;
        !            72: nosymt:
        !            73:        if (INKERNEL(filhdr.a_entry)) {
        !            74:                txtmap.b1 += KERNOFF;
        !            75:                txtmap.e1 += KERNOFF;
        !            76:                txtmap.b2 += KERNOFF;
        !            77:                txtmap.e2 += KERNOFF;
        !            78:        }
        !            79:        return;
        !            80: readerr:
        !            81:        printf("Error reading symbol|string table\n");
        !            82:        exit(1);
        !            83: nospac:
        !            84:        printf("Not enough space for symbol|string table\n");
        !            85:        exit(1);
        !            86: oldfmt:
        !            87:        printf("Old format a.out - no string table\n");
        !            88:        exit(1);
        !            89: }
        !            90: 
        !            91: setcor()
        !            92: {
        !            93: 
        !            94:        if (fcor != -1 && INKERNEL(filhdr.a_magic)) {
        !            95:                struct stat stb;
        !            96: 
        !            97:                fstat(fcor, &stb);
        !            98:                if ((stb.st_mode&S_IFMT) == S_IFREG) {
        !            99:                        datmap.b1 += KERNOFF;
        !           100:                        datmap.e1 += KERNOFF;
        !           101:                }
        !           102:                return;
        !           103:        }
        !           104:        fcor = datmap.ufd = getfile(corfil,2);
        !           105:        if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) ||
        !           106:           !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) {
        !           107:                datmap.e1 = MAXFILE;
        !           108:                return;
        !           109:        }
        !           110:        signo = u.u_arg[0];
        !           111:        filhdr.a_text = ctob(u.u_tsize);
        !           112:        filhdr.a_data = ctob(u.u_dsize);
        !           113:        stksiz = ctob(u.u_ssize);
        !           114:        switch (filhdr.a_magic) {
        !           115: 
        !           116:        case OMAGIC:
        !           117:                datmap.b1 = 0;
        !           118:                datmap.e1 = filhdr.a_text+filhdr.a_data;
        !           119:                datmap.f2 = ctob(UPAGES) + datmap.e1;
        !           120:                break;
        !           121: 
        !           122:        case NMAGIC:
        !           123:        case ZMAGIC:
        !           124:                datmap.b1 = round(filhdr.a_text, PAGSIZ);
        !           125:                datmap.e1 = datmap.b1 + filhdr.a_data;
        !           126:                datmap.f2 = ctob(UPAGES) + filhdr.a_data;
        !           127:                break;
        !           128:        }
        !           129:        datbas = datmap.b1;
        !           130:        datmap.f1 = ctob(UPAGES);
        !           131:        datmap.b2 = MAXSTOR - stksiz;
        !           132:        datmap.e2 = MAXSTOR;
        !           133:        if (filhdr.a_magic && u.u_exdata.ux_mag &&
        !           134:            filhdr.a_magic != u.u_exdata.ux_mag)
        !           135:                printf("corefile not from this program");
        !           136: }
        !           137: 
        !           138: create(f)
        !           139:        char *f;
        !           140: {
        !           141:        register int fd;
        !           142: 
        !           143:        fd = creat(f, 0644);
        !           144:        if (fd < 0)
        !           145:                return (-1);
        !           146:        close(fd);
        !           147:        return (open(f, wtflag));
        !           148: }
        !           149: 
        !           150: getfile(filnam, cnt)
        !           151:        char *filnam;
        !           152: {
        !           153:        register int fsym;
        !           154: 
        !           155:        if (eqstr(filnam, "-"))
        !           156:                return (-1);
        !           157:        fsym = open(filnam, wtflag);
        !           158:        if (fsym < 0 && xargc > cnt) {
        !           159:                if (wtflag)
        !           160:                        fsym = create(filnam);
        !           161:                if (fsym < 0)
        !           162:                        printf("cannot open `%s'\n", filnam);
        !           163:        }
        !           164:        return (fsym);
        !           165: }
        !           166: 
        !           167: setvar()
        !           168: {
        !           169: 
        !           170:        var[varchk('b')] = datbas;
        !           171:        var[varchk('d')] = filhdr.a_data;
        !           172:        var[varchk('e')] = filhdr.a_entry;
        !           173:        var[varchk('m')] = filhdr.a_magic;
        !           174:        var[varchk('s')] = stksiz;
        !           175:        var[varchk('t')] = filhdr.a_text;
        !           176: }

unix.superglobalmegacorp.com

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