From: Michael Tremer Date: Fri, 12 Aug 2022 10:40:51 +0000 (+0000) Subject: copy: Use pre-configured archive readers/writers X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4ca4f32431fd520d6f49b9aee15281dcd27084ec;p=people%2Fstevee%2Fpakfire.git copy: Use pre-configured archive readers/writers Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index ccd81cc6..5e029ca1 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -1012,7 +1012,7 @@ PAKFIRE_EXPORT int pakfire_archive_extract(struct pakfire_archive* archive, cons goto ERROR; // Allocate writer - writer = pakfire_make_archive_disk_writer(archive->pakfire); + writer = pakfire_make_archive_disk_writer(archive->pakfire, 1); if (!writer) goto ERROR; diff --git a/src/libpakfire/include/pakfire/pakfire.h b/src/libpakfire/include/pakfire/pakfire.h index 835bc470..2dcef9ae 100644 --- a/src/libpakfire/include/pakfire/pakfire.h +++ b/src/libpakfire/include/pakfire/pakfire.h @@ -179,7 +179,7 @@ struct pakfire_repo* pakfire_get_installed_repo(struct pakfire* pakfire); // Archive helpers struct archive* pakfire_make_archive_disk_reader(struct pakfire* pakfire, int internal); -struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire); +struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire, int internal); // Build Stuff int pakfire_build_setup(struct pakfire* pakfire); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index b29d6d78..272ca4ac 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1032,7 +1032,13 @@ PAKFIRE_EXPORT int pakfire_refresh(struct pakfire* pakfire, int flags) { return pakfire_foreach_repo(pakfire, pakfire_repo_refresh, flags); } -static int pakfire_copy(struct pakfire* pakfire, const char* src, const char* dst) { +enum pakfire_copy_direction { + PAKFIRE_COPY_IN, + PAKFIRE_COPY_OUT, +}; + +static int pakfire_copy(struct pakfire* pakfire, const char* src, const char* dst, + enum pakfire_copy_direction direction) { struct archive* reader = NULL; struct archive* writer = NULL; struct archive_entry* entry = NULL; @@ -1049,12 +1055,12 @@ static int pakfire_copy(struct pakfire* pakfire, const char* src, const char* ds } // Allocate reader - reader = archive_read_disk_new(); + reader = pakfire_make_archive_disk_reader(pakfire, (direction == PAKFIRE_COPY_OUT)); if (!reader) goto ERROR; // Allocate writer - writer = archive_write_disk_new(); + writer = pakfire_make_archive_disk_writer(pakfire, (direction == PAKFIRE_COPY_IN)); if (!writer) goto ERROR; @@ -1114,7 +1120,7 @@ PAKFIRE_EXPORT int pakfire_copy_in(struct pakfire* pakfire, const char* src, con if (r < 0) return 1; - return pakfire_copy(pakfire, src, path); + return pakfire_copy(pakfire, src, path, PAKFIRE_COPY_IN); } PAKFIRE_EXPORT int pakfire_copy_out(struct pakfire* pakfire, const char* src, const char* dst) { @@ -1128,7 +1134,7 @@ PAKFIRE_EXPORT int pakfire_copy_out(struct pakfire* pakfire, const char* src, co if (r < 0) return 1; - return pakfire_copy(pakfire, path, dst); + return pakfire_copy(pakfire, path, dst, PAKFIRE_COPY_OUT); } PAKFIRE_EXPORT const char* pakfire_get_arch(struct pakfire* pakfire) { @@ -1514,7 +1520,7 @@ static la_int64_t pakfire_gid_lookup(void* data, const char* name, la_int64_t ui return entry->gr_gid; } -struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire) { +struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire, int internal) { struct archive* archive = archive_write_disk_new(); if (!archive) return NULL; @@ -1532,8 +1538,12 @@ struct archive* pakfire_make_archive_disk_writer(struct pakfire* pakfire) { archive_write_disk_set_options(archive, flags); // Install our own routine for user/group lookups - archive_write_disk_set_user_lookup(archive, pakfire, pakfire_uid_lookup, NULL); - archive_write_disk_set_group_lookup(archive, pakfire, pakfire_gid_lookup, NULL); + if (internal) { + archive_write_disk_set_user_lookup(archive, pakfire, pakfire_uid_lookup, NULL); + archive_write_disk_set_group_lookup(archive, pakfire, pakfire_gid_lookup, NULL); + } else { + archive_write_disk_set_standard_lookup(archive); + } return archive; } diff --git a/src/libpakfire/snapshot.c b/src/libpakfire/snapshot.c index 1a21e1ea..968b225b 100644 --- a/src/libpakfire/snapshot.c +++ b/src/libpakfire/snapshot.c @@ -239,7 +239,7 @@ static int pakfire_snapshot_extract(struct pakfire* pakfire, FILE* f) { // And they are compressed using ZSTD archive_read_support_filter_zstd(a); - struct archive* disk = pakfire_make_archive_disk_writer(pakfire); + struct archive* disk = pakfire_make_archive_disk_writer(pakfire, 1); if (!disk) goto ERROR;