diff options
Diffstat (limited to '')
-rw-r--r-- | src/cmdline.c | 141 |
1 files changed, 103 insertions, 38 deletions
diff --git a/src/cmdline.c b/src/cmdline.c index e0274ef36..2c1db890b 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2009 The Music Player Daemon Project + * Copyright (C) 2003-2010 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,14 +17,20 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "config.h" #include "cmdline.h" #include "path.h" #include "log.h" #include "conf.h" #include "decoder_list.h" -#include "config.h" +#include "decoder_plugin.h" #include "output_list.h" #include "ls.h" +#include "mpd_error.h" + +#ifdef ENABLE_ENCODER +#include "encoder_list.h" +#endif #ifdef ENABLE_ARCHIVE #include "archive_list.h" @@ -35,9 +41,37 @@ #include <stdio.h> #include <stdlib.h> -#define SYSTEM_CONFIG_FILE_LOCATION "/etc/mpd.conf" +#ifdef G_OS_WIN32 +#define CONFIG_FILE_LOCATION "\\mpd\\mpd.conf" +#else /* G_OS_WIN32 */ #define USER_CONFIG_FILE_LOCATION1 ".mpdconf" #define USER_CONFIG_FILE_LOCATION2 ".mpd/mpd.conf" +#endif + +static GQuark +cmdline_quark(void) +{ + return g_quark_from_static_string("cmdline"); +} + +static void +print_all_decoders(FILE *fp) +{ + for (unsigned i = 0; decoder_plugins[i] != NULL; ++i) { + const struct decoder_plugin *plugin = decoder_plugins[i]; + const char *const*suffixes; + + fprintf(fp, "[%s]", plugin->name); + + for (suffixes = plugin->suffixes; + suffixes != NULL && *suffixes != NULL; + ++suffixes) { + fprintf(fp, " %s", *suffixes); + } + + fprintf(fp, "\n"); + } +} G_GNUC_NORETURN static void version(void) @@ -45,19 +79,25 @@ static void version(void) puts(PACKAGE " (MPD: Music Player Daemon) " VERSION " \n" "\n" "Copyright (C) 2003-2007 Warren Dukes <warren.dukes@gmail.com>\n" - "Copyright (C) 2008 Max Kellermann <max@duempel.org>\n" + "Copyright (C) 2008-2010 Max Kellermann <max@duempel.org>\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" "\n" "Supported decoders:\n"); - decoder_plugin_init_all(); - decoder_plugin_print_all_decoders(stdout); + print_all_decoders(stdout); puts("\n" "Supported outputs:\n"); audio_output_plugin_print_all_types(stdout); +#ifdef ENABLE_ENCODER + puts("\n" + "Supported encoders:\n"); + encoder_plugin_print_all_types(stdout); +#endif + + #ifdef ENABLE_ARCHIVE puts("\n" "Supported archives:\n"); @@ -72,31 +112,29 @@ static void version(void) exit(EXIT_SUCCESS); } -#if GLIB_CHECK_VERSION(2,12,0) static const char *summary = "Music Player Daemon - a daemon for playing music."; -#endif -void parseOptions(int argc, char **argv, Options *options) +bool +parse_cmdline(int argc, char **argv, struct options *options, + GError **error_r) { GError *error = NULL; GOptionContext *context; bool ret; static gboolean option_version, - option_create_db, option_no_create_db, option_no_daemon, + option_no_daemon, option_no_config; const GOptionEntry entries[] = { - { "create-db", 0, 0, G_OPTION_ARG_NONE, &option_create_db, - "force (re)creation of database", NULL }, { "kill", 0, 0, G_OPTION_ARG_NONE, &options->kill, "kill the currently running mpd session", NULL }, { "no-config", 0, 0, G_OPTION_ARG_NONE, &option_no_config, "don't read from config", NULL }, - { "no-create-db", 0, 0, G_OPTION_ARG_NONE, &option_no_create_db, - "don't create database, even if it doesn't exist", NULL }, { "no-daemon", 0, 0, G_OPTION_ARG_NONE, &option_no_daemon, "don't detach from console", NULL }, - { "stdout", 0, 0, G_OPTION_ARG_NONE, &options->stdOutput, + { "stdout", 0, 0, G_OPTION_ARG_NONE, &options->log_stderr, + NULL, NULL }, + { "stderr", 0, 0, G_OPTION_ARG_NONE, &options->log_stderr, "print messages to stderr", NULL }, { "verbose", 'v', 0, G_OPTION_ARG_NONE, &options->verbose, "verbose logging", NULL }, @@ -107,24 +145,19 @@ void parseOptions(int argc, char **argv, Options *options) options->kill = false; options->daemon = true; - options->stdOutput = false; + options->log_stderr = false; options->verbose = false; - options->createDB = 0; context = g_option_context_new("[path/to/mpd.conf]"); g_option_context_add_main_entries(context, entries, NULL); -#if GLIB_CHECK_VERSION(2,12,0) g_option_context_set_summary(context, summary); -#endif ret = g_option_context_parse(context, &argc, &argv, &error); g_option_context_free(context); - if (!ret) { - g_error("option parsing failed: %s\n", error->message); - exit(1); - } + if (!ret) + MPD_ERROR("option parsing failed: %s\n", error->message); if (option_version) version(); @@ -133,39 +166,71 @@ void parseOptions(int argc, char **argv, Options *options) parser can use it already */ log_early_init(options->verbose); - if (option_create_db && option_no_create_db) - g_error("Cannot use both --create-db and --no-create-db\n"); - - if (option_no_create_db) - options->createDB = -1; - else if (option_create_db) - options->createDB = 1; - options->daemon = !option_no_daemon; if (option_no_config) { g_debug("Ignoring config, using daemon defaults\n"); + return true; } else if (argc <= 1) { /* default configuration file path */ char *path1; - char *path2; +#ifdef G_OS_WIN32 + path1 = g_build_filename(g_get_user_config_dir(), + CONFIG_FILE_LOCATION, NULL); + if (g_file_test(path1, G_FILE_TEST_IS_REGULAR)) + ret = config_read_file(path1, error_r); + else { + int i = 0; + char *system_path = NULL; + const char * const *system_config_dirs; + + system_config_dirs = g_get_system_config_dirs(); + + while(system_config_dirs[i] != NULL) { + system_path = g_build_filename(system_config_dirs[i], + CONFIG_FILE_LOCATION, + NULL); + if(g_file_test(system_path, + G_FILE_TEST_IS_REGULAR)) { + ret = config_read_file(system_path,error_r); + g_free(system_path); + g_free(&system_config_dirs); + break; + } + ++i;; + } + g_free(system_path); + g_free(&system_config_dirs); + } +#else /* G_OS_WIN32 */ + char *path2; path1 = g_build_filename(g_get_home_dir(), USER_CONFIG_FILE_LOCATION1, NULL); path2 = g_build_filename(g_get_home_dir(), USER_CONFIG_FILE_LOCATION2, NULL); if (g_file_test(path1, G_FILE_TEST_IS_REGULAR)) - config_read_file(path1); + ret = config_read_file(path1, error_r); else if (g_file_test(path2, G_FILE_TEST_IS_REGULAR)) - config_read_file(path2); + ret = config_read_file(path2, error_r); else if (g_file_test(SYSTEM_CONFIG_FILE_LOCATION, G_FILE_TEST_IS_REGULAR)) - config_read_file(SYSTEM_CONFIG_FILE_LOCATION); + ret = config_read_file(SYSTEM_CONFIG_FILE_LOCATION, + error_r); +#endif + g_free(path1); +#ifndef G_OS_WIN32 g_free(path2); +#endif + + return ret; } else if (argc == 2) { /* specified configuration file */ - config_read_file(argv[1]); - } else - g_error("too many arguments"); + return config_read_file(argv[1], error_r); + } else { + g_set_error(error_r, cmdline_quark(), 0, + "too many arguments"); + return false; + } } |