int build(void) { CF cf; int afd, tfd; int current_mid; off_t size; current_mid = -1; afd = open_archive(O_RDWR); fp = fdopen(afd, "r+"); tfd = tmp(); SETCF(afd, archive, tfd, tname, RPAD|WPAD); /* Read through the archive, creating list of symbols. */ symcnt = tsymlen = 0; pnext = &rhead; while(get_arobj(afd)) { int new_mid; if (!strcmp(chdr.name, RANLIBMAG)) { skip_arobj(afd); continue; } new_mid = rexec(afd, tfd); if (new_mid != -1) { if (current_mid == -1) current_mid = new_mid; else if (new_mid != current_mid) errx(1, "Mixed object format archive: %d / %d", new_mid, current_mid); } put_arobj(&cf, (struct stat *)NULL); } *pnext = NULL; /* Create the symbol table. Endianess the same as last mid seen */ symobj(current_mid); /* Copy the saved objects into the archive. */ size = lseek(tfd, (off_t)0, SEEK_CUR); (void)lseek(tfd, (off_t)0, SEEK_SET); SETCF(tfd, tname, afd, archive, NOPAD); copy_ar(&cf, size); (void)ftruncate(afd, lseek(afd, (off_t)0, SEEK_CUR)); (void)close(tfd); /* Set the time. */ settime(afd); close_archive(afd); return(0); }
build() { CF cf; int afd, tfd; off_t size; afd = open_archive(O_RDWR); fp = fdopen(afd, "r+"); tfd = tmp(); SETCF(afd, archive, tfd, tname, RPAD|WPAD); /* Read through the archive, creating list of symbols. */ pnext = &rhead; while(get_arobj(afd)) { if (!strcmp(chdr.name, RANLIBMAG)) { skip_arobj(afd); continue; } rexec(afd, tfd); put_arobj(&cf, (struct stat *)NULL); } *pnext = NULL; /* Create the symbol table. */ symobj(); /* Copy the saved objects into the archive. */ size = lseek(tfd, (off_t)0, SEEK_CUR); (void)lseek(tfd, (off_t)0, SEEK_SET); SETCF(tfd, tname, afd, archive, RPAD|WPAD); copy_ar(&cf, size); (void)ftruncate(afd, lseek(afd, (off_t)0, SEEK_CUR)); (void)close(tfd); /* Set the time. */ settime(afd); close_archive(afd); return(0); }
int do_ranlib(void) { CF cf; off_t size; FILE *afp, *tfp; long symcnt; /* symbol count */ long tsymlen; /* total string length */ int i, current_mid; current_mid = -1; afp = open_archive(O_RDWR); tfp = tmp(); SETCF(afp, archive, tfp, tname, 0); /* Read through the archive, creating list of symbols. */ symcnt = tsymlen = 0; ntsize = 0; r_fuzz = SARMAG; pnext = &rhead; while(get_arobj(afp)) { int new_mid; if (!strncmp(chdr.name, AR_NAMTAB, sizeof(AR_NAMTAB) - 1)) { size = ftello(afp); get_namtab(afp); ntsize = chdr.size + sizeof(struct ar_hdr); (void)fseeko(afp, size, SEEK_SET); r_fuzz += skip_arobj(afp); continue; } if (!strncmp(chdr.name, RANLIBMAG, sizeof(RANLIBMAG) - 1) || !strncmp(chdr.name, RANLIBMAG2, sizeof(RANLIBMAG2) - 1)) { r_fuzz += skip_arobj(afp); continue; } new_mid = read_exec(afp, tfp, &symcnt, &tsymlen); if (new_mid != -1) { if (current_mid == -1) current_mid = new_mid; else if (new_mid != current_mid) errx(1, "mixed object format archive: %x / %x", new_mid, current_mid); } put_arobj(&cf, NULL); } *pnext = NULL; SETCF(tfp, tname, afp, archive, NOPAD); /* Create the symbol table. Endianess the same as last mid seen */ symobj(afp, current_mid, symcnt, tsymlen); put_nametab(&cf); /* Copy the saved objects into the archive. */ size = ftello(tfp); rewind(tfp); copy_ar(&cf, size); fflush(afp); (void)ftruncate(fileno(afp), ftello(afp)); (void)fclose(tfp); /* Set the time. */ settime(afp); close_archive(afp); return(0); }