log: return GError on initialization failure

This commit is contained in:
Max Kellermann 2011-09-09 21:40:28 +02:00
parent 35af940166
commit b680753db8
3 changed files with 34 additions and 11 deletions

View File

@ -133,16 +133,20 @@ open_log_file(void)
return open_cloexec(out_filename, O_CREAT | O_WRONLY | O_APPEND, 0666); return open_cloexec(out_filename, O_CREAT | O_WRONLY | O_APPEND, 0666);
} }
static void static bool
log_init_file(const char *path, unsigned line) log_init_file(const char *path, unsigned line, GError **error_r)
{ {
out_filename = path; out_filename = path;
out_fd = open_log_file(); out_fd = open_log_file();
if (out_fd < 0) if (out_fd < 0) {
MPD_ERROR("problem opening log file \"%s\" (config line %u) " g_set_error(error_r, log_quark(), errno,
"for writing\n", path, line); "problem opening log file \"%s\" (config line %u) "
"for writing", path, line);
return false;
}
g_log_set_default_handler(file_log_func, NULL); g_log_set_default_handler(file_log_func, NULL);
return true;
} }
#ifdef HAVE_SYSLOG #ifdef HAVE_SYSLOG
@ -232,7 +236,8 @@ log_early_init(bool verbose)
log_init_stdout(); 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; const struct config_param *param;
@ -245,6 +250,7 @@ void log_init(bool verbose, bool use_stdout)
if (use_stdout) { if (use_stdout) {
log_init_stdout(); log_init_stdout();
return true;
} else { } else {
param = config_get_param(CONF_LOG_FILE); param = config_get_param(CONF_LOG_FILE);
if (param == NULL) { if (param == NULL) {
@ -252,19 +258,23 @@ void log_init(bool verbose, bool use_stdout)
/* no configuration: default to syslog (if /* no configuration: default to syslog (if
available) */ available) */
log_init_syslog(); log_init_syslog();
return true;
#else #else
MPD_ERROR("config parameter \"%s\" not found\n", g_set_error(error_r, log_quark(), 0,
CONF_LOG_FILE); "config parameter \"%s\" not found",
CONF_LOG_FILE);
return false;
#endif #endif
#ifdef HAVE_SYSLOG #ifdef HAVE_SYSLOG
} else if (strcmp(param->value, "syslog") == 0) { } else if (strcmp(param->value, "syslog") == 0) {
log_init_syslog(); log_init_syslog();
return true;
#endif #endif
} else { } else {
const char *path = config_get_path(CONF_LOG_FILE); const char *path = config_get_path(CONF_LOG_FILE);
assert(path != NULL); assert(path != NULL);
log_init_file(path, param->line); return log_init_file(path, param->line, error_r);
} }
} }
} }

View File

@ -23,6 +23,13 @@
#include <glib.h> #include <glib.h>
#include <stdbool.h> #include <stdbool.h>
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 * Configure a logging destination for daemon startup, before the
* configuration file is read. This allows the daemon to use the * configuration file is read. This allows the daemon to use the
@ -34,7 +41,8 @@
void void
log_early_init(bool verbose); 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); void setup_log_output(bool use_stdout);

View File

@ -332,7 +332,12 @@ int mpd_main(int argc, char *argv[])
stats_global_init(); stats_global_init();
tag_lib_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); success = listen_global_init(&error);
if (!success) { if (!success) {