Annotation of 40BSD/cmd/adb/setup.c, revision 1.1.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.