From: Michael Tremer Date: Fri, 20 Oct 2023 11:45:08 +0000 (+0000) Subject: compress: Anchor walk around context X-Git-Tag: 0.9.30~1421 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d956439dd0d4ac0f7d3bb67cd216a5264c80cf8;p=pakfire.git compress: Anchor walk around context Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 99cf54414..aa3c67acd 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -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; } diff --git a/src/libpakfire/compress.c b/src/libpakfire/compress.c index d4e0209d5..316a2139d 100644 --- a/src/libpakfire/compress.c +++ b/src/libpakfire/compress.c @@ -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; diff --git a/src/libpakfire/include/pakfire/compress.h b/src/libpakfire/include/pakfire/compress.h index 3c509d95d..cf6a21c49 100644 --- a/src/libpakfire/include/pakfire/compress.h +++ b/src/libpakfire/include/pakfire/compress.h @@ -25,6 +25,7 @@ #include +#include #include // 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 diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 47abc3f5d..9b05700f7 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -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 diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 1368a4743..ff2440c2e 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -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; }