]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Fix passing error codes when opening the archive
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 21 Oct 2024 17:56:34 +0000 (17:56 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 21 Oct 2024 17:56:34 +0000 (17:56 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c

index 5539d510928cef64351cc5967c5fa1016624723a..f20f93c8b524e71d5e19c99b8554fd4b8020dbe4 100644 (file)
@@ -203,29 +203,18 @@ ERROR:
        return ARCHIVE_FATAL;
 }
 
-static int pakfire_archive_compute_digests(struct pakfire_archive* archive) {
-       int r;
-
-       // Start reading at the beginning
-       rewind(archive->f);
-
-       // Calculate digest
-       r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests,
-                       PAKFIRE_ARCHIVE_CHECKSUM, archive->f);
-       if (r)
-               CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path);
-
-       return r;
-}
-
 /*
        A helper function that opens the archive for reading
 */
-static struct archive* open_archive(struct pakfire_archive* archive) {
+static int pakfire_archive_open_archive(struct pakfire_archive* archive,
+               struct archive** __archive) {
+       struct archive* a = NULL;
+       int r;
+
        // Create a new archive object
-       struct archive* a = archive_read_new();
+       a = archive_read_new();
        if (!a)
-               return NULL;
+               return -errno;
 
        // Archives must be uncompressed tarballs
        archive_read_support_format_tar(a);
@@ -234,21 +223,39 @@ static struct archive* open_archive(struct pakfire_archive* archive) {
        archive_read_support_filter_zstd(a);
 
        // Try opening the archive file
-       int r = archive_read_file_open(a, archive->f);
-       if (r)
+       r = archive_read_file_open(a, archive->f);
+       if (r) {
+               CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n",
+                       archive->path, archive_error_string(a));
                goto ERROR;
+       }
+
+       // Return pointer
+       *__archive = a;
 
        // Success
-       return a;
+       return 0;
 
 ERROR:
-       CTX_ERROR(archive->ctx, "Could not open archive %s: %s\n",
-               archive->path, archive_error_string(a));
-
        if (a)
                archive_read_free(a);
 
-       return NULL;
+       return r;
+}
+
+static int pakfire_archive_compute_digests(struct pakfire_archive* archive) {
+       int r;
+
+       // Start reading at the beginning
+       rewind(archive->f);
+
+       // Calculate digest
+       r = pakfire_digests_compute_from_file(archive->ctx, &archive->digests,
+                       PAKFIRE_ARCHIVE_CHECKSUM, archive->f);
+       if (r)
+               CTX_ERROR(archive->ctx, "Could not calculate digest of %s: %m\n", archive->path);
+
+       return r;
 }
 
 /*
@@ -344,9 +351,9 @@ static int pakfire_archive_open_and_walk(struct pakfire_archive* archive,
        int r;
 
        // Open the archive
-       a = open_archive(archive);
-       if (!a)
-               return -errno;
+       r = pakfire_archive_open_archive(archive, &a);
+       if (r < 0)
+               goto ERROR;
 
        // Walk...
        r = pakfire_archive_walk(archive, a, walk_callback, filter_callback, data);
@@ -613,11 +620,9 @@ static int pakfire_archive_read_metadata(struct pakfire_archive* archive) {
        CTX_DEBUG(archive->ctx, "Reading archive metadata...\n");
 
        // Open the archive
-       a = open_archive(archive);
-       if (!a) {
-               r = -errno;
+       r = pakfire_archive_open_archive(archive, &a);
+       if (r < 0)
                goto ERROR;
-       }
 
        // Check if the archive file actually has any contect
        if (!archive->stat.st_size) {
@@ -936,8 +941,8 @@ PAKFIRE_EXPORT FILE* pakfire_archive_read(struct pakfire_archive* archive, const
                        archive_read_free(cookie->a);
 
                // Open the archive
-               cookie->a = open_archive(archive);
-               if (!cookie->a)
+               r = pakfire_archive_open_archive(archive, &cookie->a);
+               if (r < 0)
                        goto ERROR;
 
                // Walk through the archive
@@ -1252,11 +1257,9 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, const char
        }
 
        // Open the archive
-       a = open_archive(archive);
-       if (!a) {
-               r = -errno;
+       r = pakfire_archive_open_archive(archive, &a);
+       if (r < 0)
                goto ERROR;
-       }
 
        // Setup the writer if we are not running in dry mode
        if (!(flags & PAKFIRE_EXTRACT_DRY_RUN)) {
@@ -1815,15 +1818,17 @@ ERROR:
 
 int pakfire_archive_apply_systemd_sysusers(struct pakfire_archive* archive) {
        struct archive* a = NULL;
+       int r;
 
        // Open the archive
-       a = open_archive(archive);
-       if (!a)
-               return -errno;
+       r = pakfire_archive_open_archive(archive, &a);
+       if (r < 0)
+               goto ERROR;
 
        pakfire_archive_walk(archive, a, pakfire_archive_handle_systemd_sysusers,
                pakfire_archive_filter_systemd_sysusers, NULL);
 
+ERROR:
        if (a)
                archive_read_free(a);