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 */
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:
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) {
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);