From: Michael Tremer Date: Mon, 8 Mar 2021 23:12:55 +0000 (+0000) Subject: packager: Use reader and import all attributes except fflags X-Git-Tag: 0.9.28~1285^2~596 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=738b358289bf11ee585ab5fbff19649ef4a769e6;p=pakfire.git packager: Use reader and import all attributes except fflags Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/packager.c b/src/libpakfire/packager.c index bd7ce86e7..36a4a1934 100644 --- a/src/libpakfire/packager.c +++ b/src/libpakfire/packager.c @@ -49,6 +49,10 @@ struct pakfire_packager { PakfirePackage pkg; PakfireFilelist filelist; + // Reader + struct archive* reader; + + // Payload struct archive* payload; FILE* fpayload; }; @@ -122,6 +126,9 @@ static void pakfire_packager_free(struct pakfire_packager* packager) { if (packager->fpayload) fclose(packager->fpayload); + if (packager->reader) + archive_free(packager->reader); + pakfire_filelist_unref(packager->filelist); pakfire_package_unref(packager->pkg); pakfire_unref(packager->pakfire); @@ -152,6 +159,21 @@ PAKFIRE_EXPORT int pakfire_packager_create(struct pakfire_packager** packager, if (r) goto ERROR; + // Open a reader + p->reader = archive_read_disk_new(); + if (!p->reader) { + ERROR(p->pakfire, "archive_read_disk_new() failed\n"); + goto ERROR; + } + + // Do not read fflags + r = archive_read_disk_set_behavior(p->reader, ARCHIVE_READDISK_NO_FFLAGS); + if (r) { + ERROR(p->pakfire, "Could not change behavior of reader: %s\n", + archive_error_string(p->reader)); + goto ERROR; + } + *packager = p; return 0; @@ -356,7 +378,6 @@ ERROR: PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager, const char* path) { FILE* f = NULL; - struct stat st; // Check if path is set if (!path) @@ -366,13 +387,6 @@ PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager, if (!packager->payload) return EINVAL; - // Stat the input file - int r = stat(path, &st); - if (r) { - ERROR(packager->pakfire, "stat() on %s failed: %s\n", path, strerror(errno)); - return r; - } - // Create a new file entry struct archive_entry* entry = archive_entry_new(); if (!entry) @@ -381,8 +395,13 @@ PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager, // Set path in archive archive_entry_set_pathname(entry, path); - // Copy all attributes from stat() - archive_entry_copy_stat(entry, &st); + // Read all attributes from file + int r = archive_read_disk_entry_from_file(packager->reader, entry, -1, NULL); + if (r) { + ERROR(packager->pakfire, "Could not read attributes from %s: %s\n", + path, strerror(errno)); + goto ERROR; + } // Write the header r = archive_write_header(packager->payload, entry);