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)
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;
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;
}
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;
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)
};
// 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;
// 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;
}
}
// 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;
}
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:
/*
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);
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);
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;
}
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;
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) {
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) {
break;
case PAKFIRE_WALK_DONE:
- DEBUG(pakfire, "Callback sent DONE\n");
+ CTX_DEBUG(ctx, "Callback sent DONE\n");
return 0;
// Raise any other errors
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 = {};
}
// 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;
// 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;
}
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;
}
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;
}
// 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);
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;
}
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;
#include <archive.h>
+#include <pakfire/ctx.h>
#include <pakfire/pakfire.h>
// Automatically detect
// 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,
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
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
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;
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;
}