]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Refactor how we read the new archive format
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 16 Sep 2022 12:11:33 +0000 (12:11 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 16 Sep 2022 12:11:33 +0000 (12:11 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index 61c92b3534a6150d83639fd78aa95b2148883237..67380428bf30efe3f46977fc5fc760fe9a761e21 100644 (file)
@@ -103,47 +103,47 @@ static void close_archive(struct pakfire_archive* archive, struct archive* a) {
 /*
        A helper function that opens the archive for reading
 */
-static int open_archive(struct pakfire_archive* archive, struct archive** a) {
-       *a = archive_read_new();
-       if (!*a)
-               return ENOMEM;
+static struct archive* open_archive(struct pakfire_archive* archive) {
+       // Create a new archive object
+       struct archive* a = archive_read_new();
+       if (!a)
+               return NULL;
 
        // Archives must be uncompressed tarballs
-       archive_read_support_format_tar(*a);
+       archive_read_support_format_tar(a);
 
        // Archives are either compressed using XZ or Zstandard
-       archive_read_support_filter_xz(*a);
-       archive_read_support_filter_zstd(*a);
+       archive_read_support_filter_xz(a);
+       archive_read_support_filter_zstd(a);
 
        // Start reading from the beginning
        rewind(archive->f);
 
        // Try opening the archive file
-       int r = archive_read_open_FILE(*a, archive->f);
+       int r = archive_read_open_FILE(a, archive->f);
        if (r) {
                ERROR(archive->pakfire, "Could not open archive %s: %s\n",
-                       archive->path, archive_error_string(*a));
+                       archive->path, archive_error_string(a));
                goto ERROR;
        }
 
        // Success
-       return 0;
+       return a;
 
 ERROR:
-       close_archive(archive, *a);
-       *a = NULL;
+       close_archive(archive, a);
 
-       return r;
+       return NULL;
 }
 
 static int pakfire_archive_walk(struct pakfire_archive* archive,
                pakfire_walk_callback callback, pakfire_walk_filter_callback filter_callback, void* data) {
-       struct archive* a = NULL;
+       int r;
 
        // Open the archive file
-       int r = open_archive(archive, &a);
-       if (r)
-               return r;
+       struct archive* a = open_archive(archive);
+       if (!a)
+               return 1;
 
        // Walk through the archive
        r = pakfire_walk(archive->pakfire, a, callback, filter_callback, data);
@@ -184,24 +184,6 @@ static int find_archive_entry(struct pakfire_archive* archive, struct archive_en
        return 1;
 }
 
-/*
-       A helper function that opens the archive and finds a certain file in it
-*/
-static int open_archive_and_find(struct pakfire_archive* archive, struct archive** a,
-               struct archive_entry** entry, const char* filename) {
-       int r = open_archive(archive, a);
-       if (r)
-               return r;
-
-       r = find_archive_entry(archive, entry, *a, filename);
-
-       // Close archive on error
-       if (r)
-               close_archive(archive, *a);
-
-       return r;
-}
-
 static la_ssize_t pakfire_archive_read_callback(struct archive* a,
                void* client_data, const void** buffer) {
        struct archive* archive = (struct archive*)client_data;
@@ -227,12 +209,12 @@ static la_ssize_t pakfire_archive_read_callback(struct archive* a,
 }
 
 static struct archive* pakfire_archive_open_payload(struct pakfire_archive* archive,
-               struct archive** a, size_t* size) {
+               struct archive* a, size_t* size) {
        struct archive_entry* entry = NULL;
        struct archive* payload = NULL;
 
        // Find the payload
-       int r = open_archive_and_find(archive, a, &entry, "data.img");
+       int r = find_archive_entry(archive, &entry, a, "data.img");
        if (r)
                goto ERROR;
 
@@ -252,7 +234,7 @@ static struct archive* pakfire_archive_open_payload(struct pakfire_archive* arch
        archive_read_support_filter_xz(payload);
 
        // Try opening the payload archive
-       r = archive_read_open2(payload, *a, NULL, pakfire_archive_read_callback, NULL, NULL);
+       r = archive_read_open2(payload, a, NULL, pakfire_archive_read_callback, NULL, NULL);
        if (r) {
                ERROR(archive->pakfire, "Could not open payload archive: %s\n",
                        archive_error_string(payload));
@@ -716,8 +698,16 @@ static int __pakfire_archive_read_legacy(struct pakfire_archive* archive,
 
        struct archive* a = NULL;
        struct archive_entry* entry = NULL;
+       struct archive* payload = NULL;
+
+       // Open the archive
+       a = open_archive(archive);
+       if (!a) {
+               r = 1;
+               goto ERROR;
+       }
 
-       struct archive* payload = pakfire_archive_open_payload(archive, &a, NULL);
+       payload = pakfire_archive_open_payload(archive, a, NULL);
        if (!payload)
                goto ERROR;
 
@@ -880,11 +870,6 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, int flags)
                        goto ERROR;
        }
 
-       // Open payload
-       payload = pakfire_archive_open_payload(archive, &a, &size);
-       if (!payload)
-               goto ERROR;
-
        // Load the filelist (if not done already)
        if (!archive->filelist) {
                r = pakfire_filelist_create(&filelist, archive->pakfire);
@@ -892,8 +877,23 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, int flags)
                        goto ERROR;
        }
 
+       // Open the archive
+       a = open_archive(archive);
+       if (!a) {
+               r = 1;
+               goto ERROR;
+       }
+
+       // Open the internal tarball with the payload for older formats
+       if (archive->format < 6) {
+               payload = pakfire_archive_open_payload(archive, a, &size);
+               if (!payload)
+                       goto ERROR;
+       }
+
        // Extract
-       r = pakfire_extract(archive->pakfire, payload, size, filelist, prefix, nevra, flags);
+       r = pakfire_extract(archive->pakfire, (payload) ? payload : a, size,
+               filelist, prefix, nevra, flags);
        if (r)
                goto ERROR;