]> git.ipfire.org Git - pakfire.git/commitdiff
packager: Use reader and import all attributes except fflags
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Mar 2021 23:12:55 +0000 (23:12 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 8 Mar 2021 23:12:55 +0000 (23:12 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/packager.c

index bd7ce86e736bd635c74425fc67ed12aa1adf20bf..36a4a19347fce8a355fbada5fd43734465ac024a 100644 (file)
@@ -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);