|
|
1.1 ! root 1: /* ! 2: * Insert a directory into a character archive file ! 3: */ ! 4: #include "ar.h" /*god: char fmt archives */ ! 5: #include "a.out.h" /*god: pdp11 fmt a.out.h */ ! 6: #include <stdio.h> ! 7: #ifndef AR /*god: name of archiver */ ! 8: #define AR "ar" ! 9: #endif ! 10: #define MAGIC exp.a_magic ! 11: #define BADMAG MAGIC!=A_MAGIC1 && MAGIC!=A_MAGIC2 \ ! 12: && MAGIC!=A_MAGIC3 && MAGIC!=A_MAGIC4 ! 13: struct ar_hdr arp; ! 14: long arsize; ! 15: struct exec exp; ! 16: FILE *fi, *fo; ! 17: long off, oldoff; ! 18: long atol(); ! 19: long ftell(); ! 20: #define TABSZ 2000 ! 21: struct tab ! 22: { char cname[8]; ! 23: long cloc; ! 24: } tab[TABSZ]; ! 25: int tnum; ! 26: int new; ! 27: char tempnm[] = "__.SYMDEF"; ! 28: char firstname[17]; ! 29: long offdelta; ! 30: ! 31: char *progname; /*god: holds argv[0] */ ! 32: ! 33: main(argc, argv) ! 34: char **argv; ! 35: { ! 36: char buf[256]; ! 37: char magbuf[SARMAG+1]; ! 38: ! 39: progname = argv[0]; /*god: for error messages */ ! 40: --argc; ! 41: while(argc--) { ! 42: fi = fopen(*++argv,"r"); ! 43: if (fi == NULL) { ! 44: fprintf(stderr, "%s: cannot open %s\n", ! 45: progname, *argv); ! 46: continue; ! 47: } ! 48: off = SARMAG; ! 49: fread(magbuf, 1, SARMAG, fi); /* get magic no. */ ! 50: if (strncmp(magbuf, ARMAG, SARMAG)) { ! 51: fprintf(stderr, "not archive: %s\n", *argv); ! 52: continue; ! 53: } ! 54: fseek(fi, 0L, 0); ! 55: new = tnum = 0; ! 56: if(nextel(fi) == 0) ! 57: { fclose(fi); ! 58: continue; ! 59: } ! 60: do { ! 61: long o; ! 62: register n; ! 63: struct nlist sym; ! 64: ! 65: fread((char *)&exp, 1, sizeof(struct exec), fi); ! 66: if (BADMAG) /* archive element not in */ ! 67: continue; /* proper format - skip it */ ! 68: o = (long)exp.a_text + exp.a_data; ! 69: if ((exp.a_flag & 01) == 0) ! 70: o *= 2; ! 71: fseek(fi, o, 1); ! 72: n = exp.a_syms / sizeof(struct nlist); ! 73: if (n == 0) { ! 74: fprintf(stderr, "%s: %s-- no name list\n", ! 75: progname, arp.ar_name); ! 76: continue; ! 77: } ! 78: while (--n >= 0) { ! 79: fread((char *)&sym, 1, sizeof(sym), fi); ! 80: if ((sym.n_type&N_EXT)==0) ! 81: continue; ! 82: switch (sym.n_type&N_TYPE) { ! 83: ! 84: case N_UNDF: ! 85: if (sym.n_value!=0) ! 86: stash(&sym); ! 87: continue; ! 88: ! 89: default: ! 90: stash(&sym); ! 91: continue; ! 92: } ! 93: } ! 94: } while(nextel(fi)); ! 95: new = fixsize(); ! 96: fclose(fi); ! 97: fo = fopen(tempnm, "w"); ! 98: if(fo == NULL) ! 99: { fprintf(stderr, "can't create temporary\n"); ! 100: exit(1); ! 101: } ! 102: fwrite((char *)tab, tnum, sizeof(struct tab), fo); ! 103: fclose(fo); ! 104: if(new) ! 105: sprintf(buf, "%s rlb %s %s %s\n", ! 106: AR, firstname, *argv, tempnm);/*god*/ ! 107: else sprintf(buf, "%s rl %s %s\n", ! 108: AR, *argv, tempnm);/*god*/ ! 109: if(system(buf)) ! 110: fprintf(stderr, "can't execute %s\n", buf); ! 111: else fixdate(*argv); ! 112: unlink(tempnm); ! 113: } ! 114: exit(0); ! 115: } ! 116: ! 117: nextel(af) ! 118: FILE *af; ! 119: { ! 120: register r; ! 121: register char *cp; ! 122: ! 123: oldoff = off; ! 124: fseek(af, off, 0); ! 125: r = fread((char *)&arp, 1, sizeof(struct ar_hdr), af); /* read archive header */ ! 126: if (r != sizeof(struct ar_hdr)) ! 127: return(0); ! 128: for (cp=arp.ar_name; cp < & arp.ar_name[sizeof(arp.ar_name)]; cp++) ! 129: if (*cp == ' ') ! 130: *cp = '\0'; ! 131: arsize = atol(arp.ar_size); ! 132: if (arsize & 1) ! 133: arsize++; ! 134: off = ftell(af) + arsize; /* offset to next element */ ! 135: return(1); ! 136: } ! 137: ! 138: stash(s) struct nlist *s; ! 139: { int i; ! 140: if(tnum >= TABSZ) ! 141: { fprintf(stderr, "symbol table overflow\n"); ! 142: exit(1); ! 143: } ! 144: for(i=0; i<8; i++) ! 145: tab[tnum].cname[i] = s->n_name[i]; ! 146: tab[tnum].cloc = oldoff; ! 147: tnum++; ! 148: } ! 149: ! 150: fixsize() ! 151: { int i; ! 152: offdelta = tnum * sizeof(struct tab) + sizeof(arp); ! 153: off = SARMAG; ! 154: nextel(fi); ! 155: if(strncmp(arp.ar_name, tempnm, 14) == 0) ! 156: { new = 0; ! 157: offdelta -= sizeof(arp) + arsize; ! 158: } ! 159: else ! 160: { new = 1; ! 161: strncpy(firstname, arp.ar_name, 14); ! 162: } ! 163: for(i=0; i<tnum; i++) ! 164: tab[i].cloc += offdelta; ! 165: return(new); ! 166: } ! 167: ! 168: /* patch time */ ! 169: fixdate(s) char *s; ! 170: { long time(); ! 171: char buf[24]; ! 172: int fd; ! 173: fd = open(s, 1); ! 174: if(fd < 0) ! 175: { fprintf(stderr, "can't reopen %s\n", s); ! 176: return; ! 177: } ! 178: sprintf(buf, "%-*ld", sizeof(arp.ar_date), time((long *)NULL)+5); ! 179: lseek(fd, (long)SARMAG + ((char *)arp.ar_date-(char *)&arp), 0); ! 180: write(fd, buf, sizeof(arp.ar_date)); ! 181: close(fd); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.