|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.