diff options
Diffstat (limited to 'liblog_use_syslog.c')
| -rw-r--r-- | liblog_use_syslog.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/liblog_use_syslog.c b/liblog_use_syslog.c new file mode 100644 index 0000000..09b6ca9 --- /dev/null +++ b/liblog_use_syslog.c @@ -0,0 +1,99 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#ifndef TEST + +#if defined(__clang__) +# pragma clang diagnostic ignored "-Wassign-enum" +#endif + +int +liblog_use_syslog(struct liblog_context *ctx, const char *prefixfmt, int use_backtrace) +{ + void *new; + size_t old_noutputs = ctx->noutputs; + struct liblog_output output = { + .userdata = NULL, + .prefixfmt = prefixfmt, + .lowest_verbosity_unlimited = 1U, + .highest_verbosity_unlimited = 0U, + .use_backtrace = (use_backtrace ? 1U : 0U), + .lowest_verbosity = 0, + .highest_verbosity = LIBLOG_ALERT - 1, + .sink_type = LIBLOG_SYSLOG, + .sink.syslog.level = LOG_EMERG + }; + + if (!ctx) { + errno = EINVAL; + return -1; + } + + if (ctx->noutputs > SIZE_MAX / sizeof(*ctx->outputs) - 8) + goto enomem; + new = realloc(ctx->outputs, (ctx->noutputs + 8) * sizeof(*ctx->outputs)); + if (!new) { + enomem: + errno = ENOMEM; + return -1; + } + ctx->outputs = new; + + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity_unlimited = 0; + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_CRITICAL - 1; + output.sink.syslog.level = LOG_ALERT; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_ERROR - 1; + output.sink.syslog.level = LOG_CRIT; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_WARNING - 1; + output.sink.syslog.level = LOG_ERR; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_NOTICE - 1; + output.sink.syslog.level = LOG_WARNING; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_INFO - 1; + output.sink.syslog.level = LOG_NOTICE; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity = LIBLOG_TRACE - 1; + output.sink.syslog.level = LOG_INFO; + if (liblog_use_output(ctx, &output)) + goto fail; + + output.lowest_verbosity = output.highest_verbosity + 1; + output.highest_verbosity_unlimited = 1; + output.sink.syslog.level = LOG_DEBUG; + if (liblog_use_output(ctx, &output)) + goto fail; + + return 0; + +fail: + while (ctx->noutputs > old_noutputs) + liblog_destroy_output(&ctx->outputs[--ctx->noutputs]); + return -1; +} + +#else + +int main(void) {return 0;} /* TODO test */ + +#endif |
