diff options
author | Max Kellermann <max@duempel.org> | 2009-09-24 21:40:05 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-09-24 21:40:05 +0200 |
commit | 1b227e01458e5db2b1ae80ae8501837f3206c1ac (patch) | |
tree | c2d550ad02d7721f2ee7bfd63fbad2bbd81170ca | |
parent | 308b3f2337f100b5d27fa2af50bf929caff4a7d4 (diff) | |
download | mpd-1b227e01458e5db2b1ae80ae8501837f3206c1ac.tar.gz mpd-1b227e01458e5db2b1ae80ae8501837f3206c1ac.tar.xz mpd-1b227e01458e5db2b1ae80ae8501837f3206c1ac.zip |
cmdline: handle fatal errors with GError
Don't call g_error(), which will abort the process and dump core.
-rw-r--r-- | src/cmdline.c | 22 | ||||
-rw-r--r-- | src/cmdline.h | 6 | ||||
-rw-r--r-- | src/main.c | 7 |
3 files changed, 30 insertions, 5 deletions
diff --git a/src/cmdline.c b/src/cmdline.c index d0e8e75da..44b3ff507 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -38,6 +38,12 @@ #define USER_CONFIG_FILE_LOCATION1 ".mpdconf" #define USER_CONFIG_FILE_LOCATION2 ".mpd/mpd.conf" +static GQuark +cmdline_quark(void) +{ + return g_quark_from_static_string("cmdline"); +} + G_GNUC_NORETURN static void version(void) { @@ -76,7 +82,9 @@ static const char *summary = "Music Player Daemon - a daemon for playing music."; #endif -void parse_cmdline(int argc, char **argv, struct options *options) +bool +parse_cmdline(int argc, char **argv, struct options *options, + GError **error_r) { GError *error = NULL; GOptionContext *context; @@ -133,6 +141,7 @@ void parse_cmdline(int argc, char **argv, struct options *options) if (option_no_config) { g_debug("Ignoring config, using daemon defaults\n"); + return true; } else if (argc <= 1) { /* default configuration file path */ char *path1; @@ -151,9 +160,16 @@ void parse_cmdline(int argc, char **argv, struct options *options) config_read_file(SYSTEM_CONFIG_FILE_LOCATION); g_free(path1); g_free(path2); + + return true; } else if (argc == 2) { /* specified configuration file */ config_read_file(argv[1]); - } else - g_error("too many arguments"); + + return true; + } else { + g_set_error(error_r, cmdline_quark(), 0, + "too many arguments"); + return false; + } } diff --git a/src/cmdline.h b/src/cmdline.h index eb626dbc2..945868b8c 100644 --- a/src/cmdline.h +++ b/src/cmdline.h @@ -22,6 +22,8 @@ #include <glib.h> +#include <stdbool.h> + struct options { gboolean kill; gboolean daemon; @@ -29,6 +31,8 @@ struct options { gboolean verbose; }; -void parse_cmdline(int argc, char **argv, struct options *options); +bool +parse_cmdline(int argc, char **argv, struct options *options, + GError **error_r); #endif diff --git a/src/main.c b/src/main.c index 0d7cbf1ed..952e6d1fe 100644 --- a/src/main.c +++ b/src/main.c @@ -295,7 +295,12 @@ int main(int argc, char *argv[]) tag_pool_init(); config_global_init(); - parse_cmdline(argc, argv, &options); + success = parse_cmdline(argc, argv, &options, &error); + if (!success) { + g_warning("%s", error->message); + g_error_free(error); + return EXIT_FAILURE; + } glue_daemonize_init(&options); |