]> git.ipfire.org Git - pakfire.git/commitdiff
compress: Anchor walk around context
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 11:45:08 +0000 (11:45 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 11:45:08 +0000 (11:45 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/compress.c
src/libpakfire/include/pakfire/compress.h
src/libpakfire/include/pakfire/util.h
src/libpakfire/util.c

index 99cf544143eed81851e4789f1068687c5ef01e3c..aa3c67acd6537aa19a6ee363f0d304438421be2d 100644 (file)
@@ -175,7 +175,7 @@ static int pakfire_archive_walk(struct pakfire_archive* archive,
                return -errno;
 
        // Walk through the archive
-       r = pakfire_walk(archive->pakfire, a, callback, filter_callback, data);
+       r = pakfire_walk(archive->ctx, a, callback, filter_callback, data);
 
        // Close the archive
        if (a)
@@ -341,7 +341,7 @@ static int pakfire_archive_parse_scriptlet(struct pakfire_archive* archive,
        return 0;
 }
 
-static int __pakfire_archive_read_metadata(struct pakfire* pakfire, struct archive* a,
+static int __pakfire_archive_read_metadata(struct pakfire_ctx* ctx, struct archive* a,
                struct archive_entry* entry, void* p) {
        struct pakfire_archive* archive = (struct pakfire_archive*)p;
 
@@ -351,12 +351,12 @@ static int __pakfire_archive_read_metadata(struct pakfire* pakfire, struct archi
 
        const char* path = archive_entry_pathname(entry);
 
-       DEBUG(pakfire, "Reading metadata file: %s\n", path);
+       CTX_DEBUG(ctx, "Reading metadata file: %s\n", path);
 
        // Load the file into memory
-       r = pakfire_archive_copy_data_to_buffer(archive->pakfire, a, entry, &data, &length);
+       r = pakfire_archive_copy_data_to_buffer(archive->ctx, a, entry, &data, &length);
        if (r) {
-               ERROR(archive->pakfire, "Could not read data from archive: %s\n",
+               CTX_ERROR(archive->ctx, "Could not read data from archive: %s\n",
                        archive_error_string(a));
                goto ERROR;
        }
@@ -390,7 +390,7 @@ ERROR:
        return r;
 }
 
-static int __pakfire_archive_filter_metadata(struct pakfire* pakfire,
+static int __pakfire_archive_filter_metadata(struct pakfire_ctx* ctx,
                struct archive* a, struct archive_entry* entry, void* p) {
        struct pakfire_archive* archive = (struct pakfire_archive*)p;
 
@@ -552,7 +552,7 @@ static int64_t pakfire_archive_metadata_get_int64(
        return json_object_get_int64(object);
 }
 
-static int __pakfire_archive_filter_payload(struct pakfire* pakfire,
+static int __pakfire_archive_filter_payload(struct pakfire_ctx* ctx,
                struct archive* a, struct archive_entry* entry, void* p) {
        const char* path = archive_entry_pathname(entry);
        if (!path)
@@ -630,9 +630,9 @@ static cookie_io_functions_t pakfire_archive_read_functions = {
 };
 
 // Tries to find a matching file in the archive
-static int __pakfire_archive_read_filter(struct pakfire* pakfire, struct archive* a,
+static int __pakfire_archive_read_filter(struct pakfire_ctx* ctx, struct archive* a,
                struct archive_entry* e, void* data) {
-       struct pakfire_archive_read_cookie* cookie = (struct pakfire_archive_read_cookie*)data;
+       struct pakfire_archive_read_cookie* cookie = data;
        const char* symlink = NULL;
        int r;
 
@@ -664,7 +664,7 @@ static int __pakfire_archive_read_filter(struct pakfire* pakfire, struct archive
 
                        // Increment counter
                        if (++cookie->followed_symlinks >= MAX_FOLLOW_SYMLINKS) {
-                               ERROR(pakfire, "Reached maximum number of symlinks to follow\n");
+                               CTX_ERROR(ctx, "Reached maximum number of symlinks to follow\n");
                                return PAKFIRE_WALK_ERROR;
                        }
 
@@ -679,14 +679,14 @@ static int __pakfire_archive_read_filter(struct pakfire* pakfire, struct archive
 }
 
 // Reads a matching file into memory
-static int __pakfire_archive_read(struct pakfire* pakfire, struct archive* a,
+static int __pakfire_archive_read(struct pakfire_ctx* ctx, struct archive* a,
                struct archive_entry* e, void* data) {
-       struct pakfire_archive_read_cookie* cookie = (struct pakfire_archive_read_cookie*)data;
+       struct pakfire_archive_read_cookie* cookie = data;
 
        // Create a file descriptor
        cookie->__f = fopencookie(cookie, "r", pakfire_archive_read_functions);
        if (!cookie->__f) {
-               ERROR(pakfire, "Could not open /%s: %m\n", cookie->path);
+               CTX_ERROR(ctx, "Could not open /%s: %m\n", cookie->path);
                return PAKFIRE_WALK_ERROR;
        }
 
@@ -738,8 +738,8 @@ AGAIN:
                goto ERROR;
 
        // Walk through the archive
-       r = pakfire_walk(archive->pakfire, cookie->a,
-               __pakfire_archive_read, __pakfire_archive_read_filter, cookie);
+       r = pakfire_walk(archive->ctx, cookie->a, __pakfire_archive_read,
+                       __pakfire_archive_read_filter, cookie);
        if (r) {
                switch (-r) {
                        case EAGAIN:
@@ -1351,7 +1351,7 @@ struct pakfire_scriptlet* pakfire_archive_get_scriptlet(
 /*
        systemd sysusers
 */
-static int __pakfire_archive_filter_systemd_sysusers(struct pakfire* pakfire,
+static int __pakfire_archive_filter_systemd_sysusers(struct pakfire_ctx* ctx,
                struct archive* a, struct archive_entry* e, void* data) {
        const char* path = archive_entry_pathname(e);
 
@@ -1387,12 +1387,14 @@ static int pakfire_archive_stream_payload(struct pakfire* pakfire, void* data, i
        return 0;
 }
 
-static int __pakfire_archive_handle_systemd_sysusers(struct pakfire* pakfire,
+static int __pakfire_archive_handle_systemd_sysusers(struct pakfire_ctx* ctx,
                struct archive* a, struct archive_entry* e, void* data) {
        struct pakfire_jail* jail = NULL;
        char replace[PATH_MAX];
        int r;
 
+       struct pakfire* pakfire = data;
+
        // Fetch path
        const char* path = archive_entry_pathname(e);
 
@@ -1420,7 +1422,9 @@ ERROR:
 
 int pakfire_archive_apply_systemd_sysusers(struct pakfire_archive* archive) {
        pakfire_archive_walk(archive,
-                       __pakfire_archive_handle_systemd_sysusers, __pakfire_archive_filter_systemd_sysusers, NULL);
+                       __pakfire_archive_handle_systemd_sysusers,
+                       __pakfire_archive_filter_systemd_sysusers,
+                       archive->pakfire);
 
        return 0;
 }
index d4e0209d521e7a004eeea51d8034c1e116b8f8e2..316a2139de1a8148fb0659315c1bc261eedc6119 100644 (file)
@@ -525,7 +525,7 @@ ERROR:
        Helper function to conditionally walk through an archive
        and perform actions based on the callback.
 */
-int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
+int pakfire_walk(struct pakfire_ctx* ctx, struct archive* archive,
                pakfire_walk_callback callback, pakfire_walk_filter_callback filter_callback,
                void* p) {
        struct archive_entry* entry = NULL;
@@ -553,11 +553,11 @@ int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
 
                path = archive_entry_pathname(entry);
 
-               DEBUG(pakfire, "Walking through %s...\n", path);
+               CTX_DEBUG(ctx, "Walking through %s...\n", path);
 
                // Call the filter callback before we call the actual callback
                if (filter_callback) {
-                       r = filter_callback(pakfire, archive, entry, p);
+                       r = filter_callback(ctx, archive, entry, p);
 
                        // Handle the return code
                        switch (r) {
@@ -565,34 +565,34 @@ int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
                                        break;
 
                                case PAKFIRE_WALK_END:
-                                       DEBUG(pakfire, "Filter callback sent END\n");
+                                       CTX_DEBUG(ctx, "Filter callback sent END\n");
                                        return 0;
 
                                case PAKFIRE_WALK_SKIP:
-                                       DEBUG(pakfire, "Filter callback sent SKIP\n");
+                                       CTX_DEBUG(ctx, "Filter callback sent SKIP\n");
                                        continue;
 
                                case PAKFIRE_WALK_DONE:
-                                       DEBUG(pakfire, "Filter callback sent DONE\n");
+                                       CTX_DEBUG(ctx, "Filter callback sent DONE\n");
 
                                        // Clear the callback function
                                        filter_callback = NULL;
                                        break;
 
                                case PAKFIRE_WALK_AGAIN:
-                                       DEBUG(pakfire, "Filter callback sent AGAIN\n");
+                                       CTX_DEBUG(ctx, "Filter callback sent AGAIN\n");
                                        return -EAGAIN;
 
                                // Raise any other errors
                                default:
-                                       DEBUG(pakfire, "Filter callback returned an error: %d\n", r);
+                                       CTX_DEBUG(ctx, "Filter callback returned an error: %d\n", r);
                                        return r;
                        }
                }
 
                // Run callback
                if (callback) {
-                       r = callback(pakfire, archive, entry, p);
+                       r = callback(ctx, archive, entry, p);
 
                        // Handle the return code
                        switch (r) {
@@ -600,7 +600,7 @@ int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
                                        break;
 
                                case PAKFIRE_WALK_DONE:
-                                       DEBUG(pakfire, "Callback sent DONE\n");
+                                       CTX_DEBUG(ctx, "Callback sent DONE\n");
                                        return 0;
 
                                // Raise any other errors
@@ -648,7 +648,7 @@ static void pakfire_extract_progress(void* p) {
        pakfire_progress_update(data->progress, position);
 }
 
-static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
+static int __pakfire_extract(struct pakfire_ctx* ctx, struct archive* a,
                struct archive_entry* entry, void* p) {
        struct pakfire_file* file = NULL;
        struct vfs_cap_data cap_data = {};
@@ -674,7 +674,7 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
        }
 
        // Generate a file object
-       r = pakfire_file_create_from_archive_entry(&file, pakfire, entry);
+       r = pakfire_file_create_from_archive_entry(&file, data->pakfire, entry);
        if (r)
                goto ERROR;
 
@@ -693,7 +693,7 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
                // Compose file path
                r = pakfire_path_append(buffer, data->prefix, path);
                if (r) {
-                       ERROR(pakfire, "Could not compose file path: %m\n");
+                       CTX_ERROR(ctx, "Could not compose file path: %m\n");
                        goto ERROR;
                }
 
@@ -705,7 +705,7 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
                if (link) {
                        r = pakfire_path_append(buffer, data->prefix, link);
                        if (r) {
-                               ERROR(pakfire, "Could not compose hardlink path: %m\n");
+                               CTX_ERROR(ctx, "Could not compose hardlink path: %m\n");
                                goto ERROR;
                        }
 
@@ -719,12 +719,12 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
                path = archive_entry_pathname(entry);
 
                if (pakfire_path_exists(path)) {
-                       DEBUG(pakfire, "The configuration file %s exists\n",
+                       CTX_DEBUG(ctx, "The configuration file %s exists\n",
                                pakfire_file_get_path(file));
 
                        r = pakfire_string_format(buffer, "%s.paknew", path);
                        if (r) {
-                               ERROR(pakfire, "Could not compose path for configuration file: %m\n");
+                               CTX_ERROR(ctx, "Could not compose path for configuration file: %m\n");
                                goto ERROR;
                        }
 
@@ -738,7 +738,7 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
                // Fetch path again since we changed it
                path = archive_entry_pathname(entry);
 
-               DEBUG(pakfire, "Extracting %s\n", path);
+               CTX_DEBUG(ctx, "Extracting %s\n", path);
 
                // Remove any extended attributes which we never write to disk
                archive_entry_xattr_clear(entry);
@@ -762,14 +762,14 @@ static int __pakfire_extract(struct pakfire* pakfire, struct archive* a,
                                break;
 
                        case ARCHIVE_WARN:
-                               ERROR(pakfire, "%s\n", archive_error_string(data->writer));
+                               CTX_ERROR(ctx, "%s\n", archive_error_string(data->writer));
 
                                // Pretend everything has been okay
                                r = 0;
                                break;
 
                        case ARCHIVE_FATAL:
-                               ERROR(pakfire, "%s\n", archive_error_string(data->writer));
+                               CTX_ERROR(ctx, "%s\n", archive_error_string(data->writer));
                                r = 1;
                                break;
                }
@@ -845,7 +845,7 @@ int pakfire_extract(struct pakfire* pakfire, struct archive* archive,
                goto ERROR;
 
        // Walk through the entire archive
-       r = pakfire_walk(pakfire, archive, __pakfire_extract, filter_callback, &data);
+       r = pakfire_walk(ctx, archive, __pakfire_extract, filter_callback, &data);
        if (r)
                goto ERROR;
 
index 3c509d95d3b0cc3f38f586a2967b8113029c0e0c..cf6a21c49e6e16f15b8ff0a5698a1701f0d00760 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <archive.h>
 
+#include <pakfire/ctx.h>
 #include <pakfire/pakfire.h>
 
 // Automatically detect
@@ -39,9 +40,9 @@ FILE* pakfire_zstdfopen(FILE* f, const char* mode);
 // Walk
 
 typedef int (*pakfire_walk_callback)
-       (struct pakfire* pakfire, struct archive* a, struct archive_entry* e, void* p);
+       (struct pakfire_ctx* ctx, struct archive* a, struct archive_entry* e, void* p);
 typedef int (*pakfire_walk_filter_callback)
-       (struct pakfire* pakfire, struct archive* a, struct archive_entry* e, void* p);
+       (struct pakfire_ctx* ctx, struct archive* a, struct archive_entry* e, void* p);
 
 enum pakfire_walk_codes {
        PAKFIRE_WALK_OK    = 0,
@@ -60,7 +61,7 @@ enum pakfire_walk_codes {
        PAKFIRE_WALK_AGAIN = -40,
 };
 
-int pakfire_walk(struct pakfire* pakfire, struct archive* archive,
+int pakfire_walk(struct pakfire_ctx* ctx, struct archive* archive,
        pakfire_walk_callback callback, pakfire_walk_filter_callback filter_callback, void* p);
 
 // Extract
index 47abc3f5de4a5a3da283f4da384ad09765abba56..9b05700f75887198991b84f7f6b3da3202a4080d 100644 (file)
@@ -90,7 +90,7 @@ int pakfire_tty_is_noninteractive(void);
 
 int pakfire_archive_copy_data_from_file(struct pakfire* pakfire,
        struct archive* archive, FILE* f);
-int pakfire_archive_copy_data_to_buffer(struct pakfire* pakfire, struct archive* a,
+int pakfire_archive_copy_data_to_buffer(struct pakfire_ctx* ctx, struct archive* a,
        struct archive_entry* entry, char** data, size_t* data_size);
 
 // JSON Stuff
index 1368a4743e5899ecd69b86dad08d87368129576d..ff2440c2ec38d8eef25408e144b79d336e0f33f1 100644 (file)
@@ -677,7 +677,7 @@ int pakfire_archive_copy_data_from_file(struct pakfire* pakfire,
        return 0;
 }
 
-int pakfire_archive_copy_data_to_buffer(struct pakfire* pakfire, struct archive* a,
+int pakfire_archive_copy_data_to_buffer(struct pakfire_ctx* ctx, struct archive* a,
                struct archive_entry* entry, char** data, size_t* data_size) {
        *data = NULL;
        *data_size = 0;
@@ -693,7 +693,7 @@ int pakfire_archive_copy_data_to_buffer(struct pakfire* pakfire, struct archive*
 
        ssize_t bytes_read = archive_read_data(a, *data, required_size);
        if (bytes_read < 0) {
-               ERROR(pakfire, "Could not read from archive: %s\n", archive_error_string(a));
+               CTX_ERROR(ctx, "Could not read from archive: %s\n", archive_error_string(a));
                free(*data);
                return 1;
        }