Annotation of 42BSD/usr.bin/ranlib.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)ranlib.c 4.6 5/22/83";
        !             3: #endif
        !             4: /*
        !             5:  * ranlib - create table of contents for archive; string table version
        !             6:  */
        !             7: #include <sys/types.h>
        !             8: #include <ar.h>
        !             9: #include <ranlib.h>
        !            10: #include <a.out.h>
        !            11: #include <stdio.h>
        !            12: 
        !            13: struct ar_hdr  archdr;
        !            14: #define        OARMAG 0177545
        !            15: long   arsize;
        !            16: struct exec    exp;
        !            17: FILE   *fi, *fo;
        !            18: long   off, oldoff;
        !            19: long   atol(), ftell();
        !            20: #define TABSZ  6000
        !            21: struct ranlib tab[TABSZ];
        !            22: int    tnum;
        !            23: #define        STRTABSZ        75000
        !            24: char   tstrtab[STRTABSZ];
        !            25: int    tssiz;
        !            26: char   *strtab;
        !            27: int    ssiz;
        !            28: int    new;
        !            29: char   tempnm[] = "__.SYMDEF";
        !            30: char   firstname[17];
        !            31: 
        !            32: main(argc, argv)
        !            33: char **argv;
        !            34: {
        !            35:        char cmdbuf[BUFSIZ];
        !            36:        /* magbuf must be an int array so it is aligned on an int-ish
        !            37:           boundary, so that we may access its first word as an int! */
        !            38:        int magbuf[(SARMAG+sizeof(int))/sizeof(int)];
        !            39: 
        !            40:        --argc;
        !            41:        while(argc--) {
        !            42:                fi = fopen(*++argv,"r");
        !            43:                if (fi == NULL) {
        !            44:                        fprintf(stderr, "ranlib: cannot open %s\n", *argv);
        !            45:                        continue;
        !            46:                }
        !            47:                off = SARMAG;
        !            48:                fread((char *)magbuf, 1, SARMAG, fi);
        !            49:                if (strncmp((char *)magbuf, ARMAG, SARMAG)) {
        !            50:                        if (magbuf[0] == OARMAG)
        !            51:                                fprintf(stderr, "old format ");
        !            52:                        else
        !            53:                                fprintf(stderr, "not an ");
        !            54:                        fprintf(stderr, "archive: %s\n", *argv);
        !            55:                        continue;
        !            56:                }
        !            57:                fseek(fi, 0L, 0);
        !            58:                new = tnum = 0;
        !            59:                if (nextel(fi) == 0) {
        !            60:                        fclose(fi);
        !            61:                        continue;
        !            62:                }
        !            63:                do {
        !            64:                        long o;
        !            65:                        register n;
        !            66:                        struct nlist sym;
        !            67: 
        !            68:                        fread((char *)&exp, 1, sizeof(struct exec), fi);
        !            69:                        if (N_BADMAG(exp))
        !            70:                                continue;
        !            71:                        if (exp.a_syms == 0) {
        !            72:                                fprintf(stderr, "ranlib: warning: %s(%s): no symbol table\n", *argv, archdr.ar_name);
        !            73:                                continue;
        !            74:                        }
        !            75:                        o = N_STROFF(exp) - sizeof (struct exec);
        !            76:                        if (ftell(fi)+o+sizeof(ssiz) >= off) {
        !            77:                                fprintf(stderr, "ranlib: %s(%s): old format .o file\n", *argv, archdr.ar_name);
        !            78:                                exit(1);
        !            79:                        }
        !            80:                        fseek(fi, o, 1);
        !            81:                        fread((char *)&ssiz, 1, sizeof (ssiz), fi);
        !            82:                        if (ssiz < sizeof ssiz){
        !            83:                                /* sanity check */
        !            84:                                fprintf(stderr, "ranlib: %s(%s): mangled string table\n", *argv, archdr.ar_name);
        !            85:                                exit(1);
        !            86:                        }
        !            87:                        strtab = (char *)calloc(1, ssiz);
        !            88:                        if (strtab == 0) {
        !            89:                                fprintf(stderr, "ranlib: ran out of memory\n");
        !            90:                                exit(1);
        !            91:                        }
        !            92:                        fread(strtab+sizeof(ssiz), ssiz - sizeof(ssiz), 1, fi);
        !            93:                        fseek(fi, -(exp.a_syms+ssiz), 1);
        !            94:                        n = exp.a_syms / sizeof(struct nlist);
        !            95:                        while (--n >= 0) {
        !            96:                                fread((char *)&sym, 1, sizeof(sym), fi);
        !            97:                                if (sym.n_un.n_strx == 0)
        !            98:                                        continue;
        !            99:                                sym.n_un.n_name = strtab + sym.n_un.n_strx;
        !           100:                                if ((sym.n_type&N_EXT)==0)
        !           101:                                        continue;
        !           102:                                switch (sym.n_type&N_TYPE) {
        !           103: 
        !           104:                                case N_UNDF:
        !           105:                                        if (sym.n_value!=0)
        !           106:                                                stash(&sym);
        !           107:                                        continue;
        !           108: 
        !           109:                                default:
        !           110:                                        stash(&sym);
        !           111:                                        continue;
        !           112:                                }
        !           113:                        }
        !           114:                } while(nextel(fi));
        !           115:                new = fixsize();
        !           116:                fclose(fi);
        !           117:                fo = fopen(tempnm, "w");
        !           118:                if(fo == NULL) {
        !           119:                        fprintf(stderr, "can't create temporary\n");
        !           120:                        exit(1);
        !           121:                }
        !           122:                tnum *= sizeof (struct ranlib);
        !           123:                fwrite(&tnum, 1, sizeof (tnum), fo);
        !           124:                tnum /= sizeof (struct ranlib);
        !           125:                fwrite((char *)tab, tnum, sizeof(struct ranlib), fo);
        !           126:                fwrite(&tssiz, 1, sizeof (tssiz), fo);
        !           127:                fwrite(tstrtab, tssiz, 1, fo);
        !           128:                fclose(fo);
        !           129:                if(new)
        !           130:                        sprintf(cmdbuf, "ar rlb %s %s %s\n", firstname, *argv, tempnm);
        !           131:                else
        !           132:                        sprintf(cmdbuf, "ar rl %s %s\n", *argv, tempnm);
        !           133:                if(system(cmdbuf))
        !           134:                        fprintf(stderr, "ranlib: ``%s'' failed\n", cmdbuf);
        !           135:                else
        !           136:                        fixdate(*argv);
        !           137:                unlink(tempnm);
        !           138:        }
        !           139:        exit(0);
        !           140: }
        !           141: 
        !           142: nextel(af)
        !           143: FILE *af;
        !           144: {
        !           145:        register r;
        !           146:        register char *cp;
        !           147: 
        !           148:        oldoff = off;
        !           149:        fseek(af, off, 0);
        !           150:        r = fread((char *)&archdr, 1, sizeof(struct ar_hdr), af);
        !           151:        if (r != sizeof(struct ar_hdr))
        !           152:                return(0);
        !           153:        for (cp=archdr.ar_name; cp < & archdr.ar_name[sizeof(archdr.ar_name)]; cp++)
        !           154:                if (*cp == ' ')
        !           155:                        *cp = '\0';
        !           156:        arsize = atol(archdr.ar_size);
        !           157:        if (arsize & 1)
        !           158:                arsize++;
        !           159:        off = ftell(af) + arsize;
        !           160:        return(1);
        !           161: }
        !           162: 
        !           163: stash(s)
        !           164:        struct nlist *s;
        !           165: {
        !           166:        int i;
        !           167:        register char *cp;
        !           168: 
        !           169:        if(tnum >= TABSZ) {
        !           170:                fprintf(stderr, "ranlib: symbol table overflow\n");
        !           171:                exit(1);
        !           172:        }
        !           173:        tab[tnum].ran_un.ran_strx = tssiz;
        !           174:        tab[tnum].ran_off = oldoff;
        !           175:        for (cp = s->n_un.n_name; tstrtab[tssiz++] = *cp++;)
        !           176:                if (tssiz > STRTABSZ) {
        !           177:                        fprintf(stderr, "ranlib: string table overflow\n");
        !           178:                        exit(1);
        !           179:                }
        !           180:        tnum++;
        !           181: }
        !           182: 
        !           183: fixsize()
        !           184: {
        !           185:        int i;
        !           186:        off_t offdelta;
        !           187: 
        !           188:        if (tssiz&1)
        !           189:                tssiz++;
        !           190:        offdelta = sizeof(archdr) + sizeof (tnum) + tnum * sizeof(struct ranlib) +
        !           191:            sizeof (tssiz) + tssiz;
        !           192:        off = SARMAG;
        !           193:        nextel(fi);
        !           194:        if(strncmp(archdr.ar_name, tempnm, sizeof (archdr.ar_name)) == 0) {
        !           195:                new = 0;
        !           196:                offdelta -= sizeof(archdr) + arsize;
        !           197:        } else {
        !           198:                new = 1;
        !           199:                strncpy(firstname, archdr.ar_name, sizeof(archdr.ar_name));
        !           200:        }
        !           201:        for(i=0; i<tnum; i++)
        !           202:                tab[i].ran_off += offdelta;
        !           203:        return(new);
        !           204: }
        !           205: 
        !           206: /* patch time */
        !           207: fixdate(s)
        !           208:        char *s;
        !           209: {
        !           210:        long time();
        !           211:        char buf[24];
        !           212:        int fd;
        !           213: 
        !           214:        fd = open(s, 1);
        !           215:        if(fd < 0) {
        !           216:                fprintf(stderr, "ranlib: can't reopen %s\n", s);
        !           217:                return;
        !           218:        }
        !           219:        sprintf(buf, "%-*ld", sizeof(archdr.ar_date), time((long *)NULL)+5);
        !           220:        lseek(fd, (long)SARMAG + ((char *)archdr.ar_date-(char *)&archdr), 0);
        !           221:        write(fd, buf, sizeof(archdr.ar_date));
        !           222:        close(fd);
        !           223: }

unix.superglobalmegacorp.com

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