From b680753db88ea75cab6776aaf99c1635c9e48f68 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 9 Sep 2011 21:40:28 +0200 Subject: [PATCH] log: return GError on initialization failure --- src/log.c | 28 +++++++++++++++++++--------- src/log.h | 10 +++++++++- src/main.c | 7 ++++++- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/log.c b/src/log.c index af76cc1bb..b6c79e985 100644 --- a/src/log.c +++ b/src/log.c @@ -133,16 +133,20 @@ open_log_file(void) return open_cloexec(out_filename, O_CREAT | O_WRONLY | O_APPEND, 0666); } -static void -log_init_file(const char *path, unsigned line) +static bool +log_init_file(const char *path, unsigned line, GError **error_r) { out_filename = path; out_fd = open_log_file(); - if (out_fd < 0) - MPD_ERROR("problem opening log file \"%s\" (config line %u) " - "for writing\n", path, line); + if (out_fd < 0) { + g_set_error(error_r, log_quark(), errno, + "problem opening log file \"%s\" (config line %u) " + "for writing", path, line); + return false; + } g_log_set_default_handler(file_log_func, NULL); + return true; } #ifdef HAVE_SYSLOG @@ -232,7 +236,8 @@ log_early_init(bool verbose) log_init_stdout(); } -void log_init(bool verbose, bool use_stdout) +bool +log_init(bool verbose, bool use_stdout, GError **error_r) { const struct config_param *param; @@ -245,6 +250,7 @@ void log_init(bool verbose, bool use_stdout) if (use_stdout) { log_init_stdout(); + return true; } else { param = config_get_param(CONF_LOG_FILE); if (param == NULL) { @@ -252,19 +258,23 @@ void log_init(bool verbose, bool use_stdout) /* no configuration: default to syslog (if available) */ log_init_syslog(); + return true; #else - MPD_ERROR("config parameter \"%s\" not found\n", - CONF_LOG_FILE); + g_set_error(error_r, log_quark(), 0, + "config parameter \"%s\" not found", + CONF_LOG_FILE); + return false; #endif #ifdef HAVE_SYSLOG } else if (strcmp(param->value, "syslog") == 0) { log_init_syslog(); + return true; #endif } else { const char *path = config_get_path(CONF_LOG_FILE); assert(path != NULL); - log_init_file(path, param->line); + return log_init_file(path, param->line, error_r); } } } diff --git a/src/log.h b/src/log.h index 9a06d46bf..75e386b25 100644 --- a/src/log.h +++ b/src/log.h @@ -23,6 +23,13 @@ #include #include +G_GNUC_CONST +static inline GQuark +log_quark(void) +{ + return g_quark_from_static_string("log"); +} + /** * Configure a logging destination for daemon startup, before the * configuration file is read. This allows the daemon to use the @@ -34,7 +41,8 @@ void log_early_init(bool verbose); -void log_init(bool verbose, bool use_stdout); +bool +log_init(bool verbose, bool use_stdout, GError **error_r); void setup_log_output(bool use_stdout); diff --git a/src/main.c b/src/main.c index 52b1331c4..a80b4e17f 100644 --- a/src/main.c +++ b/src/main.c @@ -332,7 +332,12 @@ int mpd_main(int argc, char *argv[]) stats_global_init(); tag_lib_init(); - log_init(options.verbose, options.log_stderr); + + if (!log_init(options.verbose, options.log_stderr, &error)) { + g_warning("%s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } success = listen_global_init(&error); if (!success) {