Lines Matching refs:bsdar
56 static void add_to_ar_str_table(struct bsdar *bsdar, const char *name);
57 static void add_to_ar_sym_table(struct bsdar *bsdar, const char *name);
58 static struct ar_obj *create_obj_from_file(struct bsdar *bsdar,
60 static void create_symtab_entry(struct bsdar *bsdar, void *maddr,
62 static void free_obj(struct bsdar *bsdar, struct ar_obj *obj);
63 static void insert_obj(struct bsdar *bsdar, struct ar_obj *obj,
66 static void read_objs(struct bsdar *bsdar, const char *archive,
68 static void write_cleanup(struct bsdar *bsdar);
69 static void write_data(struct bsdar *bsdar, struct archive *a,
71 static void write_objs(struct bsdar *bsdar);
79 create_obj_from_file(struct bsdar *bsdar, const char *name, time_t mtime) in create_obj_from_file() argument
91 bsdar_errc(bsdar, errno, "malloc failed"); in create_obj_from_file()
93 bsdar_warnc(bsdar, errno, "can't open file: %s", name); in create_obj_from_file()
100 bsdar_errc(bsdar, errno, "strdup failed"); in create_obj_from_file()
102 bsdar_errc(bsdar, errno, "basename failed"); in create_obj_from_file()
103 if (bsdar->options & AR_TR && strlen(bname) > _TRUNCATE_LEN) { in create_obj_from_file()
105 bsdar_errc(bsdar, errno, "malloc failed"); in create_obj_from_file()
110 bsdar_errc(bsdar, errno, "strdup failed"); in create_obj_from_file()
114 bsdar_warnc(bsdar, errno, "can't fstat file: %s", obj->name); in create_obj_from_file()
118 bsdar_warnc(bsdar, 0, "%s is not an ordinary file", obj->name); in create_obj_from_file()
128 if (mtime != 0 && bsdar->options & AR_U && sb.st_mtime <= mtime) in create_obj_from_file()
137 if (bsdar->options & AR_D) { in create_obj_from_file()
159 bsdar_warnc(bsdar, errno, "can't mmap file: %s", obj->name); in create_obj_from_file()
163 bsdar_errc(bsdar, errno, "close failed: %s", in create_obj_from_file()
170 bsdar_errc(bsdar, errno, "close failed: %s", in create_obj_from_file()
181 free_obj(struct bsdar *bsdar, struct ar_obj *obj) in free_obj() argument
187 bsdar_warnc(bsdar, errno, in free_obj()
197 insert_obj(struct bsdar *bsdar, struct ar_obj *obj, struct ar_obj *pos) in insert_obj() argument
200 bsdar_errc(bsdar, 0, "try to insert a null obj"); in insert_obj()
209 if (bsdar->options & AR_B) { in insert_obj()
213 if (bsdar->options & AR_A) { in insert_obj()
214 TAILQ_INSERT_AFTER(&bsdar->v_obj, pos, obj, objs); in insert_obj()
219 TAILQ_INSERT_TAIL(&bsdar->v_obj, obj, objs); in insert_obj()
230 read_objs(struct bsdar *bsdar, const char *archive, int checkargv) in read_objs() argument
243 bsdar_errc(bsdar, 0, "archive_read_new failed"); in read_objs()
249 bsdar_errc(bsdar, archive_errno(a), "%s", in read_objs()
254 bsdar_warnc(bsdar, archive_errno(a), "%s", in read_objs()
257 bsdar_warnc(bsdar, 0, "Retrying..."); in read_objs()
273 if (checkargv && bsdar->argc > 0) { in read_objs()
275 for(i = 0; i < bsdar->argc; i++) { in read_objs()
276 av = &bsdar->argv[i]; in read_objs()
280 bsdar_errc(bsdar, errno, in read_objs()
297 bsdar_errc(bsdar, errno, "malloc failed"); in read_objs()
299 bsdar_warnc(bsdar, archive_errno(a), "%s", in read_objs()
309 bsdar_errc(bsdar, errno, "malloc failed"); in read_objs()
312 bsdar_errc(bsdar, errno, "strdup failed"); in read_objs()
326 TAILQ_INSERT_TAIL(&bsdar->v_obj, obj, objs); in read_objs()
336 ar_write_archive(struct bsdar *bsdar, int mode) in ar_write_archive() argument
344 TAILQ_INIT(&bsdar->v_obj); in ar_write_archive()
357 if (stat(bsdar->filename, &sb) != 0) { in ar_write_archive()
359 bsdar_warnc(bsdar, 0, "stat %s failed", in ar_write_archive()
360 bsdar->filename); in ar_write_archive()
366 bsdar_warnc(bsdar, 0, "%s: no such file", in ar_write_archive()
367 bsdar->filename); in ar_write_archive()
372 if (!(bsdar->options & AR_C)) in ar_write_archive()
373 bsdar_warnc(bsdar, 0, "creating %s", bsdar->filename); in ar_write_archive()
380 read_objs(bsdar, bsdar->filename, 0); in ar_write_archive()
408 read_objs(bsdar, bsdar->addlib, 1); in ar_write_archive()
415 if (bsdar->options & AR_A || bsdar->options & AR_B) { in ar_write_archive()
416 TAILQ_FOREACH(obj, &bsdar->v_obj, objs) { in ar_write_archive()
417 if (strcmp(obj->name, bsdar->posarg) == 0) { in ar_write_archive()
428 bsdar->options &= ~(AR_A | AR_B); in ar_write_archive()
431 for (i = 0; i < bsdar->argc; i++) { in ar_write_archive()
432 av = &bsdar->argv[i]; in ar_write_archive()
434 TAILQ_FOREACH_SAFE(obj, &bsdar->v_obj, objs, obj_temp) { in ar_write_archive()
436 bsdar_errc(bsdar, errno, "basename failed"); in ar_write_archive()
437 if (bsdar->options & AR_TR) { in ar_write_archive()
449 nobj = create_obj_from_file(bsdar, *av, in ar_write_archive()
457 if (bsdar->options & AR_V) in ar_write_archive()
461 TAILQ_REMOVE(&bsdar->v_obj, obj, objs); in ar_write_archive()
463 free_obj(bsdar, obj); in ar_write_archive()
466 insert_obj(bsdar, obj, pos); in ar_write_archive()
468 insert_obj(bsdar, nobj, pos); in ar_write_archive()
484 for (i = 0; i < bsdar->argc; i++) { in ar_write_archive()
485 av = &bsdar->argv[i]; in ar_write_archive()
487 nobj = create_obj_from_file(bsdar, *av, 0); in ar_write_archive()
493 insert_obj(bsdar, nobj, pos); in ar_write_archive()
494 if (bsdar->options & AR_V && nobj != NULL) in ar_write_archive()
501 write_objs(bsdar); in ar_write_archive()
502 write_cleanup(bsdar); in ar_write_archive()
511 write_cleanup(struct bsdar *bsdar) in write_cleanup() argument
515 TAILQ_FOREACH_SAFE(obj, &bsdar->v_obj, objs, obj_temp) { in write_cleanup()
516 TAILQ_REMOVE(&bsdar->v_obj, obj, objs); in write_cleanup()
517 free_obj(bsdar, obj); in write_cleanup()
520 free(bsdar->as); in write_cleanup()
521 free(bsdar->s_so); in write_cleanup()
522 free(bsdar->s_sn); in write_cleanup()
523 bsdar->as = NULL; in write_cleanup()
524 bsdar->s_so = NULL; in write_cleanup()
525 bsdar->s_so_max = 0; in write_cleanup()
526 bsdar->s_sn = NULL; in write_cleanup()
556 write_data(struct bsdar *bsdar, struct archive *a, const void *buf, size_t s) in write_data() argument
564 bsdar_errc(bsdar, archive_errno(a), "%s", in write_data()
575 write_objs(struct bsdar *bsdar) in write_objs() argument
588 bsdar_errc(bsdar, 0, "ELF library initialization failed: %s", in write_objs()
591 bsdar->rela_off = 0; in write_objs()
594 TAILQ_FOREACH(obj, &bsdar->v_obj, objs) { in write_objs()
595 if (!(bsdar->options & AR_SS) && obj->maddr != NULL) in write_objs()
596 create_symtab_entry(bsdar, obj->maddr, obj->size); in write_objs()
598 add_to_ar_str_table(bsdar, obj->name); in write_objs()
599 bsdar->rela_off += _ARHDR_LEN + obj->size + obj->size % 2; in write_objs()
607 if (bsdar->s_cnt != 0 && bsdar->s_sn_sz % 2 != 0) in write_objs()
608 bsdar->s_sn[bsdar->s_sn_sz++] = '\0'; in write_objs()
615 if (bsdar->as != NULL && bsdar->as_sz % 2 != 0) in write_objs()
616 bsdar->as[bsdar->as_sz++] = '\n'; in write_objs()
626 if (bsdar->s_cnt != 0) { in write_objs()
627 s_sz = (bsdar->s_cnt + 1) * sizeof(uint32_t) + bsdar->s_sn_sz; in write_objs()
629 if (bsdar->as != NULL) in write_objs()
630 pm_sz += _ARHDR_LEN + bsdar->as_sz; in write_objs()
632 if (bsdar->s_so_max > UINT32_MAX - pm_sz) { in write_objs()
635 s_sz = (bsdar->s_cnt + 1) * sizeof(uint64_t) + in write_objs()
636 bsdar->s_sn_sz; in write_objs()
639 for (i = 0; i < bsdar->s_cnt; i++) in write_objs()
640 bsdar->s_so[i] = in write_objs()
641 htobe64(bsdar->s_so[i] + pm_sz); in write_objs()
647 for (i = 0; i < bsdar->s_cnt; i++) in write_objs()
648 ((uint32_t *)(bsdar->s_so))[i] = in write_objs()
649 htobe32(bsdar->s_so[i] + pm_sz); in write_objs()
654 bsdar_errc(bsdar, 0, "archive_write_new failed"); in write_objs()
658 AC(archive_write_open_filename(a, bsdar->filename)); in write_objs()
665 if ((bsdar->s_cnt != 0 && !(bsdar->options & AR_SS)) || in write_objs()
666 bsdar->options & AR_S) { in write_objs()
669 bsdar_errc(bsdar, 0, "archive_entry_new failed"); in write_objs()
674 if ((bsdar->options & AR_D) == 0) in write_objs()
676 archive_entry_set_size(entry, (bsdar->s_cnt + 1) * w_sz + in write_objs()
677 bsdar->s_sn_sz); in write_objs()
680 nr = htobe64(bsdar->s_cnt); in write_objs()
681 write_data(bsdar, a, &nr, sizeof(nr)); in write_objs()
683 nr32 = htobe32((uint32_t)bsdar->s_cnt); in write_objs()
684 write_data(bsdar, a, &nr32, sizeof(nr32)); in write_objs()
686 write_data(bsdar, a, bsdar->s_so, w_sz * bsdar->s_cnt); in write_objs()
687 write_data(bsdar, a, bsdar->s_sn, bsdar->s_sn_sz); in write_objs()
692 if (bsdar->as != NULL) { in write_objs()
695 bsdar_errc(bsdar, 0, "archive_entry_new failed"); in write_objs()
697 archive_entry_set_size(entry, bsdar->as_sz); in write_objs()
699 write_data(bsdar, a, bsdar->as, bsdar->as_sz); in write_objs()
704 TAILQ_FOREACH(obj, &bsdar->v_obj, objs) { in write_objs()
707 bsdar_errc(bsdar, 0, "archive_entry_new failed"); in write_objs()
718 write_data(bsdar, a, obj->maddr, obj->size); in write_objs()
730 create_symtab_entry(struct bsdar *bsdar, void *maddr, size_t size) in create_symtab_entry() argument
742 bsdar_warnc(bsdar, 0, "elf_memory() failed: %s", in create_symtab_entry()
752 bsdar_warnc(bsdar, 0, "elf_getshstrndx failed: %s", in create_symtab_entry()
762 bsdar_warnc(bsdar, 0, in create_symtab_entry()
767 bsdar_warnc(bsdar, 0, in create_symtab_entry()
778 bsdar_warnc(bsdar, 0, "elf_nextscn failed: %s", in create_symtab_entry()
781 bsdar_warnc(bsdar, 0, "can't find .strtab section"); in create_symtab_entry()
789 bsdar_warnc(bsdar, 0, "elf_getshdr failed: %s", in create_symtab_entry()
803 bsdar_warnc(bsdar, 0, in create_symtab_entry()
820 bsdar_warnc(bsdar, 0, in create_symtab_entry()
826 add_to_ar_sym_table(bsdar, name); in create_symtab_entry()
832 bsdar_warnc(bsdar, 0, "elf_nextscn failed: %s", in create_symtab_entry()
842 add_to_ar_str_table(struct bsdar *bsdar, const char *name) in add_to_ar_str_table() argument
845 if (bsdar->as == NULL) { in add_to_ar_str_table()
846 bsdar->as_cap = _INIT_AS_CAP; in add_to_ar_str_table()
847 bsdar->as_sz = 0; in add_to_ar_str_table()
848 if ((bsdar->as = malloc(bsdar->as_cap)) == NULL) in add_to_ar_str_table()
849 bsdar_errc(bsdar, errno, "malloc failed"); in add_to_ar_str_table()
856 while (bsdar->as_sz + strlen(name) + 3 > bsdar->as_cap) { in add_to_ar_str_table()
857 bsdar->as_cap *= 2; in add_to_ar_str_table()
858 bsdar->as = realloc(bsdar->as, bsdar->as_cap); in add_to_ar_str_table()
859 if (bsdar->as == NULL) in add_to_ar_str_table()
860 bsdar_errc(bsdar, errno, "realloc failed"); in add_to_ar_str_table()
862 strncpy(&bsdar->as[bsdar->as_sz], name, strlen(name)); in add_to_ar_str_table()
863 bsdar->as_sz += strlen(name); in add_to_ar_str_table()
864 bsdar->as[bsdar->as_sz++] = '/'; in add_to_ar_str_table()
865 bsdar->as[bsdar->as_sz++] = '\n'; in add_to_ar_str_table()
872 add_to_ar_sym_table(struct bsdar *bsdar, const char *name) in add_to_ar_sym_table() argument
875 if (bsdar->s_so == NULL) { in add_to_ar_sym_table()
876 if ((bsdar->s_so = malloc(_INIT_SYMOFF_CAP)) == in add_to_ar_sym_table()
878 bsdar_errc(bsdar, errno, "malloc failed"); in add_to_ar_sym_table()
879 bsdar->s_so_cap = _INIT_SYMOFF_CAP; in add_to_ar_sym_table()
880 bsdar->s_cnt = 0; in add_to_ar_sym_table()
883 if (bsdar->s_sn == NULL) { in add_to_ar_sym_table()
884 if ((bsdar->s_sn = malloc(_INIT_SYMNAME_CAP)) == NULL) in add_to_ar_sym_table()
885 bsdar_errc(bsdar, errno, "malloc failed"); in add_to_ar_sym_table()
886 bsdar->s_sn_cap = _INIT_SYMNAME_CAP; in add_to_ar_sym_table()
887 bsdar->s_sn_sz = 0; in add_to_ar_sym_table()
890 if (bsdar->s_cnt * sizeof(uint64_t) >= bsdar->s_so_cap) { in add_to_ar_sym_table()
891 bsdar->s_so_cap *= 2; in add_to_ar_sym_table()
892 bsdar->s_so = realloc(bsdar->s_so, bsdar->s_so_cap); in add_to_ar_sym_table()
893 if (bsdar->s_so == NULL) in add_to_ar_sym_table()
894 bsdar_errc(bsdar, errno, "realloc failed"); in add_to_ar_sym_table()
896 bsdar->s_so[bsdar->s_cnt] = bsdar->rela_off; in add_to_ar_sym_table()
897 if ((uint64_t)bsdar->rela_off > bsdar->s_so_max) in add_to_ar_sym_table()
898 bsdar->s_so_max = (uint64_t)bsdar->rela_off; in add_to_ar_sym_table()
899 bsdar->s_cnt++; in add_to_ar_sym_table()
905 while (bsdar->s_sn_sz + strlen(name) + 2 > bsdar->s_sn_cap) { in add_to_ar_sym_table()
906 bsdar->s_sn_cap *= 2; in add_to_ar_sym_table()
907 bsdar->s_sn = realloc(bsdar->s_sn, bsdar->s_sn_cap); in add_to_ar_sym_table()
908 if (bsdar->s_sn == NULL) in add_to_ar_sym_table()
909 bsdar_errc(bsdar, errno, "realloc failed"); in add_to_ar_sym_table()
911 strncpy(&bsdar->s_sn[bsdar->s_sn_sz], name, strlen(name)); in add_to_ar_sym_table()
912 bsdar->s_sn_sz += strlen(name); in add_to_ar_sym_table()
913 bsdar->s_sn[bsdar->s_sn_sz++] = '\0'; in add_to_ar_sym_table()