From 2dc104da8a5ed5e821964e8a0ff8aa76d272da83 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 31 Aug 2023 04:17:50 +0000 Subject: [PATCH] jail: Allow customising the log callback Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/jail.h | 7 ++++ src/libpakfire/jail.c | 51 +++++++++++++++++++++------ src/libpakfire/libpakfire.sym | 1 + 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/libpakfire/include/pakfire/jail.h b/src/libpakfire/include/pakfire/jail.h index 0fe26a98b..380cc1504 100644 --- a/src/libpakfire/include/pakfire/jail.h +++ b/src/libpakfire/include/pakfire/jail.h @@ -25,6 +25,9 @@ struct pakfire_jail; +typedef int (*pakfire_jail_log_callback) + (struct pakfire* pakfire, void* data, int priority, const char* line, size_t length); + int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire); struct pakfire_jail* pakfire_jail_ref(struct pakfire_jail* jail); @@ -34,6 +37,10 @@ struct pakfire_jail* pakfire_jail_unref(struct pakfire_jail* jail); int pakfire_jail_bind(struct pakfire_jail* jail, const char* source, const char* target, int flags); +// Callbacks +void pakfire_jail_set_log_callback(struct pakfire_jail* jail, + pakfire_jail_log_callback callback, void* data); + // Resource Limits int pakfire_jail_nice(struct pakfire_jail* jail, int nice); diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index c08624251..40ea2348a 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -110,6 +110,13 @@ struct pakfire_jail { // Mountpoints struct pakfire_jail_mountpoint mountpoints[MAX_MOUNTPOINTS]; unsigned int num_mountpoints; + + // Callbacks + struct pakfire_jail_callbacks { + // Log + pakfire_jail_log_callback log; + void* log_data; + } callbacks; }; struct pakfire_log_buffer { @@ -272,6 +279,9 @@ PAKFIRE_EXPORT int pakfire_jail_create(struct pakfire_jail** jail, struct pakfir DEBUG(j->pakfire, "Allocated new jail at %p\n", j); + // Set the default logging callback + pakfire_jail_set_log_callback(j, pakfire_jail_default_log_callback, NULL); + // Set default environment for (const struct environ* e = ENV; e->key; e++) { r = pakfire_jail_set_env(j, e->key, e->val); @@ -322,6 +332,14 @@ PAKFIRE_EXPORT struct pakfire_jail* pakfire_jail_unref(struct pakfire_jail* jail return NULL; } +// Logging Callback + +PAKFIRE_EXPORT void pakfire_jail_set_log_callback(struct pakfire_jail* jail, + pakfire_jail_log_callback callback, void* data) { + jail->callbacks.log = callback; + jail->callbacks.log_data = data; +} + // Resource Limits PAKFIRE_EXPORT int pakfire_jail_nice(struct pakfire_jail* jail, int nice) { @@ -900,34 +918,49 @@ static int pakfire_jail_wait(struct pakfire_jail* jail, struct pakfire_jail_exec buffer = &ctx->buffers.log_INFO; priority = LOG_INFO; - callback = pakfire_jail_default_log_callback; + callback = jail->callbacks.log; + data = jail->callbacks.log_data; } else if (fd == log_ERROR) { buffer = &ctx->buffers.log_ERROR; priority = LOG_ERR; - callback = pakfire_jail_default_log_callback; + callback = jail->callbacks.log; + data = jail->callbacks.log_data; } else if (fd == log_DEBUG) { buffer = &ctx->buffers.log_DEBUG; priority = LOG_DEBUG; - callback = pakfire_jail_default_log_callback; + callback = jail->callbacks.log; + data = jail->callbacks.log_data; // Handle anything from the log pipes } else if (fd == stdout) { buffer = &ctx->buffers.stdout; priority = LOG_INFO; - callback = ctx->communicate.out; - data = ctx->communicate.data; + // Send any output to the default logger if no callback is set + if (ctx->communicate.out) { + callback = ctx->communicate.out; + data = ctx->communicate.data; + } else { + callback = jail->callbacks.log; + data = jail->callbacks.log_data; + } } else if (fd == stderr) { buffer = &ctx->buffers.stderr; priority = LOG_ERR; - callback = ctx->communicate.out; - data = ctx->communicate.data; + // Send any output to the default logger if no callback is set + if (ctx->communicate.out) { + callback = ctx->communicate.out; + data = ctx->communicate.data; + } else { + callback = jail->callbacks.log; + data = jail->callbacks.log_data; + } } else { DEBUG(jail->pakfire, "Received invalid file descriptor %d\n", fd); @@ -1809,10 +1842,6 @@ static int __pakfire_jail_exec(struct pakfire_jail* jail, const char* argv[], return -1; } - // Send any output to the default logger if no callback is set - if (!communicate_out) - communicate_out = pakfire_jail_default_log_callback; - // Initialize context for this call struct pakfire_jail_exec ctx = { .flags = flags, diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index c2d1967fe..7c0f96fc6 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -153,6 +153,7 @@ global: pakfire_jail_nice; pakfire_jail_ref; pakfire_jail_set_env; + pakfire_jail_set_log_callback; pakfire_jail_set_timeout; pakfire_jail_unref; -- 2.39.5