diff --git a/src/main.c b/src/main.c index 8e851b4..62d0bec 100644 --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -2183,6 +2184,38 @@ static gboolean unknown_start(int argc, char **argv) return TRUE; } +static int log_level(GLogLevelFlags level) +{ + if (level & G_LOG_FLAG_FATAL) + return LOG_EMERG; + if (level & G_LOG_FLAG_RECURSION) + return LOG_ALERT; + if (level & G_LOG_LEVEL_CRITICAL) + return LOG_CRIT; + if (level & G_LOG_LEVEL_ERROR) + return LOG_ERR; + if (level & G_LOG_LEVEL_WARNING) + return LOG_WARNING; + if (level & G_LOG_LEVEL_MESSAGE) + return LOG_NOTICE; + if (level & G_LOG_LEVEL_INFO) + return LOG_INFO; + if (level & G_LOG_LEVEL_DEBUG) + return LOG_DEBUG; + + /* Fallback to INFO for unknown levels */ + return LOG_INFO; +} + +static void syslog_handler(const gchar *domain, GLogLevelFlags level, const gchar *message, gpointer arg) +{ + /* unused */ + (void)domain; + (void)arg; + + syslog(log_level(level), "%s", message); +} + typedef enum { UNKNOWN = 0, INSTALL, @@ -2370,7 +2403,7 @@ static void create_option_groups(void) static void cmdline_handler(int argc, char **argv) { - gboolean help = FALSE, debug = FALSE, version = FALSE; + gboolean help = FALSE, debug = FALSE, use_syslog = FALSE, version = FALSE; g_autofree gchar *confpath = NULL, *keyring = NULL, *mount = NULL; char *cmdarg = NULL; g_autoptr(GOptionContext) context = NULL; @@ -2383,6 +2416,7 @@ static void cmdline_handler(int argc, char **argv) {"intermediate", '\0', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME_ARRAY, &intermediate, "intermediate CA file or PKCS#11 URL", "PEMFILE|PKCS11-URL"}, {"mount", '\0', 0, G_OPTION_ARG_FILENAME, &mount, "mount prefix", "PATH"}, {"debug", 'd', 0, G_OPTION_ARG_NONE, &debug, "enable debug output", NULL}, + {"syslog", 's', 0, G_OPTION_ARG_NONE, &use_syslog, "use syslog instead of stdout", NULL}, {"version", '\0', 0, G_OPTION_ARG_NONE, &version, "display version", NULL}, {"help", 'h', 0, G_OPTION_ARG_NONE, &help, "display help and exit", NULL}, {0} @@ -2500,6 +2534,15 @@ static void cmdline_handler(int argc, char **argv) g_message("Debug log domains: '%s'", domains); } + if (use_syslog) { + GLogLevelFlags levels = G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION; + const char *ident = "rauc"; + + /* XXX: facility should be configurable */ + openlog(ident, LOG_PID | LOG_NOWAIT, LOG_LOCAL0); + g_log_set_handler(ident, levels, syslog_handler, NULL); + } + /* get first parameter without dashes */ for (gint i = 1; i <= argc; i++) { if (argv[i] && !g_str_has_prefix(argv[i], "-")) {