]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Keep filelist when extracting files
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 20 Apr 2021 11:31:58 +0000 (11:31 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 20 Apr 2021 11:31:58 +0000 (11:31 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index f93963471df320407f6f8ad330fec342948ecbbc..8a1aa8fe1b2778d366e079cf3b0ab6a34858ec66 100644 (file)
@@ -854,6 +854,7 @@ PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* p
        struct archive* a = NULL;
        struct archive* payload = NULL;
        struct archive* writer = NULL;
+       int r;
 
        // Use default path if nothing is set
        if (!prefix)
@@ -861,10 +862,17 @@ PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* p
 
        DEBUG(archive->pakfire, "Extracting %s to %s\n", archive->path, prefix);
 
+       // Create a filelist
+       if (!archive->filelist) {
+               r = pakfire_filelist_create(&archive->filelist, archive->pakfire);
+               if (r)
+                       goto ERROR;
+       }
+
        // Open the archive
-       int r = archive_open(archive, &a);
+       r = archive_open(archive, &a);
        if (r)
-               return r;
+               goto ERROR;
 
        // Open payload
        payload = pakfire_archive_open_payload(archive, a);
@@ -877,8 +885,9 @@ PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* p
                goto ERROR;
 
        struct pakfire_archive_extractor extractor = {
-               .writer = writer,
-               .prefix = prefix,
+               .writer   = writer,
+               .prefix   = prefix,
+               .filelist = archive->filelist,
        };
 
        // Extract everything
@@ -886,6 +895,12 @@ PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* p
                pakfire_archive_extract_entry, &extractor);
 
 ERROR:
+       // Destroy the filelist on error
+       if (r) {
+               pakfire_filelist_unref(archive->filelist);
+               archive->filelist = NULL;
+       }
+
        if (writer)
                archive_write_free(writer);
        if (payload)