]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Allow customising the log callback
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 31 Aug 2023 04:17:50 +0000 (04:17 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 31 Aug 2023 04:17:50 +0000 (04:17 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/jail.h
src/libpakfire/jail.c
src/libpakfire/libpakfire.sym

index 0fe26a98be5234250f80904024dedacbaa8a9835..380cc150411dd5a93546b5b606bd5938dcc22dd8 100644 (file)
@@ -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);
 
index c08624251af8519fbf6d8fa805c96e28554c54c8..40ea2348acd3f307d95fa89ab8642bd558628bb4 100644 (file)
@@ -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,
index c2d1967fe8e564d56230fd8cdd96a094483c9c8c..7c0f96fc6c72ba454fdb14945df0098eec64574a 100644 (file)
@@ -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;