diff options
Diffstat (limited to 'src/conf.c')
-rw-r--r-- | src/conf.c | 155 |
1 files changed, 91 insertions, 64 deletions
diff --git a/src/conf.c b/src/conf.c index 14dac93a6..549ff51ef 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2010 The Music Player Daemon Project + * Copyright (C) 2003-2011 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -20,6 +20,7 @@ #include "config.h" #include "conf.h" #include "utils.h" +#include "string_util.h" #include "tokenizer.h" #include "path.h" #include "glib_compat.h" @@ -58,6 +59,7 @@ static struct config_entry config_entries[] = { { .name = CONF_LOG_FILE, false, false }, { .name = CONF_PID_FILE, false, false }, { .name = CONF_STATE_FILE, false, false }, + { .name = "restore_paused", false, false }, { .name = CONF_USER, false, false }, { .name = CONF_GROUP, false, false }, { .name = CONF_BIND_TO_ADDRESS, true, false }, @@ -97,6 +99,9 @@ static struct config_entry config_entries[] = { { .name = CONF_PLAYLIST_PLUGIN, true, true }, { .name = CONF_AUTO_UPDATE, false, false }, { .name = CONF_AUTO_UPDATE_DEPTH, false, false }, + { .name = CONF_DESPOTIFY_USER, false, false }, + { .name = CONF_DESPOTIFY_PASSWORD, false, false}, + { .name = CONF_DESPOTIFY_HIGH_BITRATE, false, false }, { .name = "filter", true, true }, }; @@ -138,7 +143,7 @@ config_new_param(const char *value, int line) return ret; } -static void +void config_param_free(struct config_param *param) { g_free(param->value); @@ -218,20 +223,13 @@ void config_global_check(void) } } -bool +void config_add_block_param(struct config_param * param, const char *name, - const char *value, int line, GError **error_r) + const char *value, int line) { struct block_param *bp; - bp = config_get_block_param(param, name); - if (bp != NULL) { - g_set_error(error_r, config_quark(), 0, - "\"%s\" first defined on line %i, and " - "redefined on line %i\n", name, - bp->line, line); - return false; - } + assert(config_get_block_param(param, name) == NULL); param->num_block_params++; @@ -245,7 +243,46 @@ config_add_block_param(struct config_param * param, const char *name, bp->value = g_strdup(value); bp->line = line; bp->used = false; +} +static bool +config_read_name_value(struct config_param *param, char *input, unsigned line, + GError **error_r) +{ + const char *name = tokenizer_next_word(&input, error_r); + if (name == NULL) { + assert(*input != 0); + return false; + } + + const char *value = tokenizer_next_string(&input, error_r); + if (value == NULL) { + if (*input == 0) { + assert(error_r == NULL || *error_r == NULL); + g_set_error(error_r, config_quark(), 0, + "Value missing"); + } else { + assert(error_r == NULL || *error_r != NULL); + } + + return false; + } + + if (*input != 0 && *input != CONF_COMMENT) { + g_set_error(error_r, config_quark(), 0, + "Unknown tokens after value"); + return false; + } + + const struct block_param *bp = config_get_block_param(param, name); + if (bp != NULL) { + g_set_error(error_r, config_quark(), 0, + "\"%s\" is duplicate, first defined on line %i", + name, bp->line); + return false; + } + + config_add_block_param(param, name, value, line); return true; } @@ -254,11 +291,9 @@ config_read_block(FILE *fp, int *count, char *string, GError **error_r) { struct config_param *ret = config_new_param(NULL, *count); GError *error = NULL; - bool success; while (true) { char *line; - const char *name, *value; line = fgets(string, MAX_STRING_SIZE, fp); if (line == NULL) { @@ -269,7 +304,7 @@ config_read_block(FILE *fp, int *count, char *string, GError **error_r) } (*count)++; - line = g_strchug(line); + line = strchug_fast(line); if (*line == 0 || *line == CONF_COMMENT) continue; @@ -277,7 +312,7 @@ config_read_block(FILE *fp, int *count, char *string, GError **error_r) /* end of this block; return from the function (and from this "while" loop) */ - line = g_strchug(line + 1); + line = strchug_fast(line + 1); if (*line != 0 && *line != CONF_COMMENT) { config_param_free(ret); g_set_error(error_r, config_quark(), 0, @@ -291,42 +326,13 @@ config_read_block(FILE *fp, int *count, char *string, GError **error_r) /* parse name and value */ - name = tokenizer_next_word(&line, &error); - if (name == NULL) { + if (!config_read_name_value(ret, line, *count, &error)) { assert(*line != 0); config_param_free(ret); g_propagate_prefixed_error(error_r, error, "line %i: ", *count); return NULL; } - - value = tokenizer_next_string(&line, &error); - if (value == NULL) { - config_param_free(ret); - if (*line == 0) - g_set_error(error_r, config_quark(), 0, - "line %i: Value missing", *count); - else - g_propagate_prefixed_error(error_r, error, - "line %i: ", - *count); - return NULL; - } - - if (*line != 0 && *line != CONF_COMMENT) { - config_param_free(ret); - g_set_error(error_r, config_quark(), 0, - "line %i: Unknown tokens after value", - *count); - return NULL; - } - - success = config_add_block_param(ret, name, value, *count, - error_r); - if (!success) { - config_param_free(ret); - return false; - } } } @@ -344,7 +350,7 @@ config_read_file(const char *file, GError **error_r) if (!(fp = fopen(file, "r"))) { g_set_error(error_r, config_quark(), errno, "Failed to open %s: %s", - file, strerror(errno)); + file, g_strerror(errno)); return false; } @@ -355,7 +361,7 @@ config_read_file(const char *file, GError **error_r) count++; - line = g_strchug(string); + line = strchug_fast(string); if (*line == 0 || *line == CONF_COMMENT) continue; @@ -405,7 +411,7 @@ config_read_file(const char *file, GError **error_r) return false; } - line = g_strchug(line + 1); + line = strchug_fast(line + 1); if (*line != 0 && *line != CONF_COMMENT) { g_set_error(error_r, config_quark(), 0, "line %i: Unknown tokens after '{'", @@ -457,7 +463,7 @@ config_read_file(const char *file, GError **error_r) return true; } -struct config_param * +const struct config_param * config_get_next_param(const char *name, const struct config_param * last) { struct config_entry *entry; @@ -497,22 +503,23 @@ config_get_string(const char *name, const char *default_value) return param->value; } -const char * -config_get_path(const char *name) +char * +config_dup_path(const char *name, GError **error_r) { - struct config_param *param = config_get_param(name); - char *path; + assert(error_r != NULL); + assert(*error_r == NULL); + const struct config_param *param = config_get_param(name); if (param == NULL) return NULL; - path = parsePath(param->value); - if (path == NULL) - MPD_ERROR("error parsing \"%s\" at line %i\n", - name, param->line); + char *path = parsePath(param->value, error_r); + if (G_UNLIKELY(path == NULL)) + g_prefix_error(error_r, + "Invalid path in \"%s\" at line %i: ", + name, param->line); - g_free(param->value); - return param->value = path; + return path; } unsigned @@ -553,7 +560,7 @@ config_get_positive(const char *name, unsigned default_value) return (unsigned)value; } -struct block_param * +const struct block_param * config_get_block_param(const struct config_param * param, const char *name) { if (param == NULL) @@ -591,7 +598,7 @@ const char * config_get_block_string(const struct config_param *param, const char *name, const char *default_value) { - struct block_param *bp = config_get_block_param(param, name); + const struct block_param *bp = config_get_block_param(param, name); if (bp == NULL) return default_value; @@ -599,11 +606,31 @@ config_get_block_string(const struct config_param *param, const char *name, return bp->value; } +char * +config_dup_block_path(const struct config_param *param, const char *name, + GError **error_r) +{ + assert(error_r != NULL); + assert(*error_r == NULL); + + const struct block_param *bp = config_get_block_param(param, name); + if (bp == NULL) + return NULL; + + char *path = parsePath(bp->value, error_r); + if (G_UNLIKELY(path == NULL)) + g_prefix_error(error_r, + "Invalid path in \"%s\" at line %i: ", + name, bp->line); + + return path; +} + unsigned config_get_block_unsigned(const struct config_param *param, const char *name, unsigned default_value) { - struct block_param *bp = config_get_block_param(param, name); + const struct block_param *bp = config_get_block_param(param, name); long value; char *endptr; @@ -624,7 +651,7 @@ bool config_get_block_bool(const struct config_param *param, const char *name, bool default_value) { - struct block_param *bp = config_get_block_param(param, name); + const struct block_param *bp = config_get_block_param(param, name); bool success, value; if (bp == NULL) |