summaryrefslogtreecommitdiff
path: root/src/helper/slbt_archive_import.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/helper/slbt_archive_import.c')
-rw-r--r--src/helper/slbt_archive_import.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/helper/slbt_archive_import.c b/src/helper/slbt_archive_import.c
index 620ac3b..924a54f 100644
--- a/src/helper/slbt_archive_import.c
+++ b/src/helper/slbt_archive_import.c
@@ -8,19 +8,55 @@
#include "slibtool_driver_impl.h"
#include "slibtool_errinfo_impl.h"
+/* legacy fallback, no longer in use */
extern int slbt_archive_import_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_archive_import_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_get_archive_ctx(dctx,dstarchive,&arctxv[0]) < 0)
+ return SLBT_NESTED_ERROR(dctx);
+
+ if (slbt_get_archive_ctx(dctx,srcarchive,&arctxv[1]) < 0) {
+ slbt_free_archive_ctx(arctxv[0]);
+ return SLBT_NESTED_ERROR(dctx);
+ }
+
+ ret = slbt_merge_archives(arctxv,&arctx);
+
+ slbt_free_archive_ctx(arctxv[0]);
+ slbt_free_archive_ctx(arctxv[1]);
+
+ if (ret == 0) {
+ ret = slbt_store_archive(arctx,dstarchive,0644);
+ slbt_free_archive_ctx(arctx);
+ }
+
+ return (ret < 0) ? SLBT_NESTED_ERROR(dctx) : 0;
+}
+
+
int slbt_archive_import(
const struct slbt_driver_ctx * dctx,
struct slbt_exec_ctx * ectx,
char * dstarchive,
char * srcarchive)
{
- return slbt_archive_import_mri(
+ return slbt_archive_import_impl(
dctx,ectx,
dstarchive,
srcarchive);