diff options
author | midipix <writeonce@midipix.org> | 2024-02-19 01:54:51 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2024-02-19 02:59:31 +0000 |
commit | 8dc63ddc326ec54709c580a400536fcc4ef62622 (patch) | |
tree | 2a019207f3ea1ae39273fa8246c0cae7e6341ca4 /src/util/slbt_archive_import.c | |
parent | 51c276fbf1686c340588660a754ea04e6099cd37 (diff) | |
download | slibtool-8dc63ddc326ec54709c580a400536fcc4ef62622.tar.bz2 slibtool-8dc63ddc326ec54709c580a400536fcc4ef62622.tar.xz |
library api's: _util_ (utility helper interfaces) namespace overhaul.
Diffstat (limited to 'src/util/slbt_archive_import.c')
-rw-r--r-- | src/util/slbt_archive_import.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/util/slbt_archive_import.c b/src/util/slbt_archive_import.c new file mode 100644 index 0000000..5657fcc --- /dev/null +++ b/src/util/slbt_archive_import.c @@ -0,0 +1,69 @@ +/*******************************************************************/ +/* slibtool: a skinny libtool implementation, written in C */ +/* Copyright (C) 2016--2024 SysDeer Technologies, LLC */ +/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */ +/*******************************************************************/ + +#include <slibtool/slibtool.h> +#include "slibtool_driver_impl.h" +#include "slibtool_symlink_impl.h" +#include "slibtool_errinfo_impl.h" + +/* legacy fallback, no longer in use */ +extern int slbt_util_import_archive_mri( + const struct slbt_driver_ctx * dctx, + struct slbt_exec_ctx * ectx, + char * dstarchive, + char * srcarchive); + +/* use slibtool's in-memory archive merging facility */ +static int slbt_util_import_archive_impl( + const struct slbt_driver_ctx * dctx, + 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_driver_ctx * dctx, + struct slbt_exec_ctx * ectx, + char * dstarchive, + char * srcarchive) +{ + if (slbt_symlink_is_a_placeholder( + slbt_driver_fdcwd(dctx), + srcarchive)) + return 0; + + return slbt_util_import_archive_impl( + dctx,ectx, + dstarchive, + srcarchive); +} |