From: Michael Tremer Date: Wed, 29 Jan 2025 15:06:15 +0000 (+0000) Subject: log stream: Make this more versatile X-Git-Tag: 0.9.30~300 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7e4ca07cef0b5676781b0037a54cabbae733dff8;p=pakfire.git log stream: Make this more versatile 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 --- diff --git a/src/pakfire/jail.c b/src/pakfire/jail.c index 48940fe0..113b9a06 100644 --- a/src/pakfire/jail.c +++ b/src/pakfire/jail.c @@ -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 */ diff --git a/src/pakfire/job.c b/src/pakfire/job.c index 07fad1e9..4d0151fa 100644 --- a/src/pakfire/job.c +++ b/src/pakfire/job.c @@ -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: diff --git a/src/pakfire/log_stream.c b/src/pakfire/log_stream.c index 5ca90e0c..485cd5dd 100644 --- a/src/pakfire/log_stream.c +++ b/src/pakfire/log_stream.c @@ -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) { diff --git a/src/pakfire/log_stream.h b/src/pakfire/log_stream.h index 7c6aa2e5..a8bf1521 100644 --- a/src/pakfire/log_stream.h +++ b/src/pakfire/log_stream.h @@ -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);