Annotation of cci/usr/src/bin/adb/setup.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * adb - routines to read a.out+core at startup
                      3:  */
                      4: #include "defs.h"
                      5: #include <sys/stat.h>
                      6: 
                      7: off_t  datbas;                 /* offset of the base of the data segment */
                      8: off_t  stksiz;                 /* stack size in the core image */
                      9: INT    sigcode;        /* belongs in head.h */
                     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:        register char *strtab;
                     21: 
                     22:        fsym = getfile(symfil, 1);
                     23:        txtmap.ufd = fsym;
                     24:        if (fsym < 0)
                     25:                return;
                     26:        ssiz = read(fsym, (char *)&hdr, sizeof hdr);
                     27: #ifdef vax
                     28:        swap4((long *)&hdr, 8);
                     29: #endif
                     30:        if (ssiz != sizeof hdr || N_BADMAG(hdr)) {
                     31:                txtmap.e1 = MAXFILE;
                     32:                printf("%s not executable", symfil);
                     33:                return;
                     34:        }
                     35:        filhdr = hdr;
                     36:        loc = filhdr.a_text+filhdr.a_data;
                     37:        txtmap.f1 = txtmap.f2 = N_TXTOFF(filhdr);
                     38:        txtmap.b1 = 0;
                     39:        switch (filhdr.a_magic) {
                     40: 
                     41:        case OMAGIC:
                     42:                txtmap.b1 = txtmap.e1 = 0;
                     43:                txtmap.b2 = datbas = 0;
                     44:                txtmap.e2 = loc;
                     45:                break;
                     46: 
                     47:        case ZMAGIC:
                     48:        case NMAGIC:
                     49:                txtmap.e1 = filhdr.a_text;
                     50:                txtmap.b2 = datbas = round(filhdr.a_text, PAGSIZ);
                     51:                txtmap.e2 = datbas + filhdr.a_data;
                     52:                txtmap.f2 += txtmap.e1;
                     53:        }
                     54:        loc = N_SYMOFF(filhdr);
                     55:        symtab = (struct nlist *) malloc(filhdr.a_syms);
                     56:        esymtab = &symtab[filhdr.a_syms / sizeof (struct nlist)];
                     57:        if (symtab == NULL)
                     58:                goto nospac;
                     59:        lseek(fsym, loc, 0);
                     60:        if (filhdr.a_syms == 0)
                     61:                goto nosymt;
                     62:        /* SHOULD SQUISH OUT STABS HERE!!! */
                     63:        if (read(fsym, symtab, filhdr.a_syms) != filhdr.a_syms)
                     64:                goto readerr;
                     65:        if (read(fsym, &ssiz, sizeof (ssiz)) != sizeof (ssiz))
                     66:                goto oldfmt;
                     67: #ifdef vax
                     68:        for (sp = symtab; sp < esymtab; sp++) {
                     69:                /* should also swap n_desc, but it isn't used */
                     70:                swap4((long *)&sp->n_un, 1);
                     71:                swap4((long *)&sp->n_value, 1);
                     72:        }
                     73:        swap4((long *)&ssiz, 1);
                     74: #endif
                     75:        strtab = (char *) malloc(ssiz);
                     76:        if (strtab == 0)
                     77:                goto nospac;
                     78:        *(int *)strtab = ssiz;
                     79:        ssiz -= sizeof (ssiz);
                     80:        if (read(fsym, strtab + sizeof (ssiz), ssiz) != ssiz)
                     81:                goto readerr;
                     82:        for (sp = symtab; sp < esymtab; sp++)
                     83:                if (sp->n_un.n_strx)
                     84:                        /* SHOULD PERFORM RANGE CHECK HERE */
                     85:                        sp->n_un.n_name = strtab + sp->n_un.n_strx;
                     86: nosymt:
                     87:        if (INKERNEL(filhdr.a_entry)) {
                     88:                txtmap.b1 += KERNOFF;
                     89:                txtmap.e1 += KERNOFF+KERNSTART;
                     90:                txtmap.f1 -= KERNSTART;
                     91:                txtmap.b2 += KERNOFF+KERNSTART;
                     92:                txtmap.e2 += KERNOFF+KERNSTART;
                     93:        }
                     94:        return;
                     95: readerr:
                     96:        printf("Error reading symbol|string table\n");
                     97:        exit(1);
                     98: nospac:
                     99:        printf("Not enough space for symbol|string table\n");
                    100:        exit(1);
                    101: oldfmt:
                    102:        printf("Old format a.out - no string table\n");
                    103:        exit(1);
                    104: }
                    105: 
                    106: #ifdef vax
                    107: swap4(adr, n)
                    108:        register long *adr;
                    109:        register n;
                    110: {
                    111:        union lb {
                    112:                long l;
                    113:                char b[4];
                    114:        } lb;
                    115:        register i;
                    116: 
                    117:        do {
                    118:                for(i=4; --i>=0; )
                    119:                        lb.b[i] = ((union lb *)adr)->b[3-i];
                    120:                *adr++ = lb.l;
                    121:        } while(--n > 0);
                    122: }
                    123: #endif
                    124: 
                    125: setcor()
                    126: {
                    127:        struct nlist *symp;
                    128: 
                    129:        fcor = datmap.ufd = getfile(corfil,2);
                    130:        if (fcor != -1 && INKERNEL(filhdr.a_entry)) {
                    131:                struct stat stb;
                    132: 
                    133:                fstat(fcor, &stb);
                    134:                datmap.b1 = 0;
                    135:                datmap.e1 = MAXFILE;
                    136:                datmap.e2 = MAXFILE;
                    137:                if (kernel == 0 && (stb.st_mode&S_IFMT) == S_IFREG)
                    138:                        datmap.b1 = KERNOFF;
                    139:                symp = lookup("_Sysmap");
                    140:                sbr = (struct pte *)symp->n_value;
                    141:                symp = lookup("_Syssize");
                    142:                slr = symp->n_value;
                    143:                return;
                    144:        }
                    145:        if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) ||
                    146:           !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) {
                    147:                datmap.e1 = MAXFILE;
                    148:                return;
                    149:        }
                    150:        signo = u.u_arg[0];
                    151:        sigcode = u.u_code;
                    152:        filhdr.a_text = ctob(u.u_tsize);
                    153:        filhdr.a_data = ctob(u.u_dsize);
                    154:        stksiz = ctob(u.u_ssize);
                    155:        switch (filhdr.a_magic) {
                    156: 
                    157:        case OMAGIC:
                    158:                datmap.b1 = 0;
                    159:                datmap.e1 = filhdr.a_text+filhdr.a_data;
                    160:                datmap.f2 = ctob(UPAGES) + datmap.e1;
                    161:                break;
                    162: 
                    163:        case NMAGIC:
                    164:        case ZMAGIC:
                    165:                datmap.b1 = round(filhdr.a_text, PAGSIZ);
                    166:                datmap.e1 = datmap.b1 + filhdr.a_data;
                    167:                datmap.f2 = ctob(UPAGES) + filhdr.a_data;
                    168:                break;
                    169:        }
                    170:        datbas = datmap.b1;
                    171:        datmap.f1 = ctob(UPAGES);
                    172:        datmap.b2 = MAXSTOR - stksiz;
                    173:        datmap.e2 = MAXSTOR;
                    174:        if (filhdr.a_magic && u.u_exdata.ux_mag &&
                    175:            filhdr.a_magic != u.u_exdata.ux_mag)
                    176:                printf("corefile not from this program");
                    177: }
                    178: 
                    179: create(f)
                    180:        char *f;
                    181: {
                    182:        register int fd;
                    183: 
                    184:        fd = creat(f, 0644);
                    185:        if (fd < 0)
                    186:                return (-1);
                    187:        close(fd);
                    188:        return (open(f, wtflag));
                    189: }
                    190: 
                    191: getfile(filnam, cnt)
                    192:        char *filnam;
                    193: {
                    194:        register int fsym;
                    195: 
                    196:        if (!strcmp(filnam, "-"))
                    197:                return (-1);
                    198:        fsym = open(filnam, wtflag);
                    199:        if (fsym < 0 && xargc > cnt) {
                    200:                if (wtflag)
                    201:                        fsym = create(filnam);
                    202:                if (fsym < 0)
                    203:                        printf("cannot open `%s'\n", filnam);
                    204:        }
                    205:        return (fsym);
                    206: }
                    207: 
                    208: setvar()
                    209: {
                    210: 
                    211:        var[varchk('b')] = datbas;
                    212:        var[varchk('d')] = filhdr.a_data;
                    213:        var[varchk('e')] = filhdr.a_entry;
                    214:        var[varchk('m')] = filhdr.a_magic;
                    215:        var[varchk('s')] = stksiz;
                    216:        var[varchk('t')] = filhdr.a_text;
                    217: }

unix.superglobalmegacorp.com

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