| |
| |
| |
| |
| |
| |
| #include <slibtool/slibtool.h> |
| #include "slibtool_driver_impl.h" |
| #include "slibtool_symlink_impl.h" |
| #include "slibtool_errinfo_impl.h" |
| |
| |
| extern int slbt_util_import_archive_mri( |
| struct slbt_exec_ctx * ectx, |
| char * dstarchive, |
| char * srcarchive); |
| |
| |
| static int slbt_util_import_archive_impl( |
| const struct slbt_driver_ctx * dctx, |
| const struct slbt_exec_ctx * ectx, |
| char * dstarchive, |
| char * srcarchive) |
| { |
| int ret; |
| struct slbt_archive_ctx * arctxv[3] = {0,0,0}; |
| struct slbt_archive_ctx * arctx; |
| |
| (void)ectx; |
| |
| if (slbt_ar_get_archive_ctx(dctx,dstarchive,&arctxv[0]) < 0) |
| return SLBT_NESTED_ERROR(dctx); |
| |
| if (slbt_ar_get_archive_ctx(dctx,srcarchive,&arctxv[1]) < 0) { |
| slbt_ar_free_archive_ctx(arctxv[0]); |
| return SLBT_NESTED_ERROR(dctx); |
| } |
| |
| ret = slbt_ar_merge_archives(arctxv,&arctx); |
| |
| slbt_ar_free_archive_ctx(arctxv[0]); |
| slbt_ar_free_archive_ctx(arctxv[1]); |
| |
| if (ret == 0) { |
| ret = slbt_ar_store_archive(arctx,dstarchive,0644); |
| slbt_ar_free_archive_ctx(arctx); |
| } |
| |
| return (ret < 0) ? SLBT_NESTED_ERROR(dctx) : 0; |
| } |
| |
| |
| int slbt_util_import_archive( |
| const struct slbt_exec_ctx * ectx, |
| char * dstarchive, |
| char * srcarchive) |
| { |
| const struct slbt_driver_ctx * dctx; |
| |
| dctx = (slbt_get_exec_ictx(ectx))->dctx; |
| |
| if (slbt_symlink_is_a_placeholder( |
| slbt_driver_fdcwd(dctx), |
| srcarchive)) |
| return 0; |
| |
| return slbt_util_import_archive_impl( |
| dctx,ectx, |
| dstarchive, |
| srcarchive); |
| } |