vfprintf(stdout, format, args_copy);
break;
+ // Highlight any warnings
+ case LOG_WARNING:
+ fputs(color_yellow(), stderr);
+ vfprintf(stderr, format, args_copy);
+ fputs(color_reset(), stderr);
+ break;
+
// Highlight any error messages
case LOG_ERR:
fputs(color_highlight(), stderr);
struct pakfire_jail_pipes {
// Logging
struct pakfire_log_stream* INFO;
+ struct pakfire_log_stream* WARN;
struct pakfire_log_stream* ERROR;
#ifdef ENABLE_DEBUG
struct pakfire_log_stream* DEBUG;
pakfire_log_stream_write(ctx->log.INFO, format, args);
break;
+ case LOG_WARNING:
+ pakfire_log_stream_write(ctx->log.WARN, format, args);
+ break;
+
case LOG_ERR:
pakfire_log_stream_write(ctx->log.ERROR, format, args);
break;
return 0;
}
+static int pakfire_jail_WARN(struct pakfire_log_stream* stream, const char* line, size_t length, void* data) {
+ struct pakfire_jail* jail = data;
+
+ ERROR(jail->ctx, "%.*s", (int)length, line);
+ return 0;
+}
+
static int pakfire_jail_ERROR(struct pakfire_log_stream* stream, const char* line, size_t length, void* data) {
struct pakfire_jail* jail = data;
if (r)
return r;
+ r = pakfire_log_stream_in_child(ctx->log.WARN);
+ if (r)
+ return r;
+
r = pakfire_log_stream_in_child(ctx->log.ERROR);
if (r)
return r;
if (r)
goto ERROR;
+ // WARN
+ r = pakfire_log_stream_create(&ctx.log.WARN, jail->ctx, pakfire_jail_WARN, jail);
+ if (r)
+ goto ERROR;
+
// ERROR
r = pakfire_log_stream_create(&ctx.log.ERROR, jail->ctx, pakfire_jail_ERROR, jail);
if (r)
// Logging
if (ctx.log.INFO)
pakfire_log_stream_unref(ctx.log.INFO);
+ if (ctx.log.WARN)
+ pakfire_log_stream_unref(ctx.log.WARN);
if (ctx.log.ERROR)
pakfire_log_stream_unref(ctx.log.ERROR);
#ifdef ENABLE_DEBUG
struct pakfire_job* job = data;
int r;
- // We only forward INFO & ERROR
+ // We only forward INFO, WARNING & ERROR
switch (priority) {
case LOG_INFO:
r = pakfire_log_stream_write(job->log.stdout, format, args);
return;
break;
+ case LOG_WARNING:
case LOG_ERR:
r = pakfire_log_stream_write(job->log.stderr, format, args);
if (r < 0)