]> git.ipfire.org Git - pakfire.git/commitdiff
log stream: Make this more versatile
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 29 Jan 2025 15:06:15 +0000 (15:06 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 29 Jan 2025 15:06:15 +0000 (15:06 +0000)
This is needed because we have differnt types of input and therefore
need to be able to handle them all.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/jail.c
src/pakfire/job.c
src/pakfire/log_stream.c
src/pakfire/log_stream.h

index 48940fe048f99296729c054ac57c735d96497aad..113b9a062602f5af854100cb69c31e964eef53dc 100644 (file)
@@ -327,20 +327,20 @@ static void pakfire_jail_log_redirect(void* data, int priority, const char* file
 
        switch (priority) {
                case LOG_INFO:
-                       pakfire_log_stream_write(ctx->log.INFO, format, args);
+                       pakfire_log_stream_vprintf(ctx->log.INFO, format, args);
                        break;
 
                case LOG_WARNING:
-                       pakfire_log_stream_write(ctx->log.WARN, format, args);
+                       pakfire_log_stream_vprintf(ctx->log.WARN, format, args);
                        break;
 
                case LOG_ERR:
-                       pakfire_log_stream_write(ctx->log.ERROR, format, args);
+                       pakfire_log_stream_vprintf(ctx->log.ERROR, format, args);
                        break;
 
 #ifdef ENABLE_DEBUG
                case LOG_DEBUG:
-                       pakfire_log_stream_write(ctx->log.DEBUG, format, args);
+                       pakfire_log_stream_vprintf(ctx->log.DEBUG, format, args);
                        break;
 #endif /* ENABLE_DEBUG */
 
index 07fad1e9d41c25c5fa0517e1f161d4e8176ec5ee..4d0151fa893253a5d72426f97fd76491f103e8cf 100644 (file)
@@ -565,21 +565,25 @@ static void pakfire_job_log(void* data, int priority, const char* file,
 static void pakfire_job_log(void* data, int priority, const char* file,
                int line, const char* fn, const char* format, va_list args) {
        struct pakfire_job* job = data;
+       char* buffer = NULL;
        int r;
 
+       // Format the line
+       const ssize_t length = vasprintf(&buffer, format, args);
+
+       // Fail if we could not format the log line
+       if (unlikely(length < 0))
+               return;
+
        // We only forward INFO, WARNING & ERROR
        switch (priority) {
                case LOG_INFO:
-                       r = pakfire_log_stream_write(job->log.stdout, format, args);
-                       if (r < 0)
-                               return;
+                       pakfire_log_stream_write(job->log.stdout, buffer, length);
                        break;
 
                case LOG_WARNING:
                case LOG_ERR:
-                       r = pakfire_log_stream_write(job->log.stderr, format, args);
-                       if (r < 0)
-                               return;
+                       pakfire_log_stream_write(job->log.stderr, buffer, length);
                        break;
 
                default:
index 5ca90e0c77e4bac8586ffaf26cad86a9467818af..485cd5dd34c9096d36e8c3118e36a63e58de6d4d 100644 (file)
@@ -233,19 +233,36 @@ int pakfire_log_stream_printf(struct pakfire_log_stream* stream, const char* for
        int r;
 
        va_start(args, format);
-       r = pakfire_log_stream_write(stream, format, args);
+       r = pakfire_log_stream_vprintf(stream, format, args);
        va_end(args);
 
        return r;
 }
 
-int pakfire_log_stream_write(struct pakfire_log_stream* stream, const char* format, va_list args) {
+int pakfire_log_stream_vprintf(struct pakfire_log_stream* stream, const char* format, va_list args) {
+       char* buffer = NULL;
+       ssize_t length;
+       int r;
+
+       // Format the buffer
+       length = vasprintf(&buffer, format, args);
+       if (length < 0)
+               return -errno;
+
+       // Write the buffer to the stream
+       r = pakfire_log_stream_write(stream, buffer, length);
+       free(buffer);
+
+       return r;
+}
+
+int pakfire_log_stream_write(struct pakfire_log_stream* stream, const char* buffer, size_t length) {
        // Fail if the pipe isn't open
        if (stream->pipe[1] < 0)
                return -EPIPE;
 
        // Send the message into the pipe
-       return vdprintf(stream->pipe[1], format, args);
+       return write(stream->pipe[1], buffer, length);
 }
 
 int pakfire_log_stream_close(struct pakfire_log_stream* stream) {
index 7c6aa2e5e9ced2c907e20567d1cb6103d3e5a535..a8bf152102dfd28c8e9afb8bb91a6bdaa59e21fb 100644 (file)
@@ -42,8 +42,10 @@ int pakfire_log_stream_in_child(struct pakfire_log_stream* stream);
 
 int pakfire_log_stream_printf(struct pakfire_log_stream* stream,
        const char* format, ...) __attribute__((format(printf, 2, 3)));
-int pakfire_log_stream_write(struct pakfire_log_stream* stream,
+int pakfire_log_stream_vprintf(struct pakfire_log_stream* stream,
        const char* format, va_list args) __attribute__((format(printf, 2, 0)));
+int pakfire_log_stream_write(struct pakfire_log_stream* stream,
+       const char* buffer, size_t length);
 
 int pakfire_log_stream_close(struct pakfire_log_stream* stream);