From 304d8db634477165f0ac4c092bf0e9252bc974a6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 18 Oct 2024 12:53:12 +0000 Subject: [PATCH] pakfire: Add a function to clone a Pakfire instance This will create a new independant instance based on the previous one. Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/pakfire.h | 2 ++ src/libpakfire/pakfire.c | 29 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index ab64a0cf0..987f48576 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -95,6 +95,8 @@ int pakfire_check(struct pakfire* pakfire, struct pakfire_filelist* errors); #include #include +int pakfire_clone(struct pakfire** clone, struct pakfire* pakfire, const char* path); + struct pakfire_ctx* pakfire_ctx(struct pakfire* pakfire); const char* pakfire_get_effective_arch(struct pakfire* pakfire); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 664cce0a4..da88562f9 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -965,6 +965,35 @@ ERROR: return r; } +int pakfire_clone(struct pakfire** clone, struct pakfire* pakfire, const char* path) { + struct pakfire* p = NULL; + FILE* f = NULL; + int r; + + // Dump the configuration + f = pakfire_config_fdump(pakfire->config); + if (!f) { + r = -errno; + goto ERROR; + } + + // Create a new Pakfire instance + r = pakfire_create(&p, pakfire->ctx, path, pakfire->arches.nominal, f, 0); + if (r < 0) + goto ERROR; + + // Return the pointer + *clone = pakfire_ref(p); + +ERROR: + if (p) + pakfire_unref(p); + if (f) + fclose(f); + + return r; +} + PAKFIRE_EXPORT struct pakfire* pakfire_ref(struct pakfire* pakfire) { ++pakfire->nrefs; -- 2.39.5