/* * append -- * Append files to the archive - modifies original archive or creates * a new archive if named archive does not exist. */ int append(char **argv) { struct stat sb; CF cf; FILE *afp; char *file; int eval, ntsz; afp = open_archive(O_CREAT|O_RDWR); if (fseeko(afp, 0, SEEK_END) == (off_t)-1) err(1, "lseek: %s", archive); /* Read from disk, write to an archive; pad on write. */ SETCF(0, 0, afp, archive, 0); if (options & AR_C) { /* ain't no need for a.out but a small price to pay */ if ((ntsz = mknametab(argv)) == 0) ; /* build and write the symdef, also need a mid! */ /* mkranlib(argv); if (mid & ELF) */ { options |= AR_S5; /* write out the nametab */ if (ntsz) put_nametab(&cf); } } for (eval = 0; (file = *argv++);) { if (!(cf.rfp = fopen(file, "r"))) { warn("fopen: %s", file); eval = 1; continue; } if (options & AR_V) (void)printf("q - %s\n", file); cf.rname = file; put_arobj(&cf, &sb); (void)fclose(cf.rfp); } close_archive(afp); return (eval); }
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); }