aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am2
-rw-r--r--src/conf.c174
-rw-r--r--src/conf.h101
-rw-r--r--src/list.c2
-rw-r--r--src/list.h1
5 files changed, 171 insertions, 109 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 286166237..92966240d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -55,6 +55,7 @@ mpd_headers = \
mpd_SOURCES = \
$(mpd_headers) \
$(mpd_inputPlugins) \
+ conf.c \
audio.c \
audioOutput.c \
audioOutput_ao.c \
@@ -62,7 +63,6 @@ mpd_SOURCES = \
buffer2array.c \
charConv.c \
command.c \
- conf.c \
decode.c \
directory.c \
inputPlugin.c \
diff --git a/src/conf.c b/src/conf.c
index a89a1e334..04ee50942 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -22,8 +22,7 @@
#include "utils.h"
#include "buffer2array.h"
-#include "audio.h"
-#include "volume.h"
+#include "list.h"
#include <sys/param.h>
#include <stdio.h>
@@ -35,67 +34,126 @@
#define MAX_STRING_SIZE MAXPATHLEN+80
-#define CONF_COMMENT '#'
-
-#define CONF_NUMBER_OF_PARAMS 43
-#define CONF_NUMBER_OF_PATHS 6
-#define CONF_NUMBER_OF_REQUIRED 5
-#define CONF_NUMBER_OF_ALLOW_CATS 1
-
-#define CONF_CONNECTION_TIMEOUT_DEFAULT "60"
-#define CONF_MAX_CONNECTIONS_DEFAULT "5"
-#define CONF_MAX_PLAYLIST_LENGTH_DEFAULT "16384"
-#define CONF_BUFFER_BEFORE_PLAY_DEFAULT "25%"
-#define CONF_MAX_COMMAND_LIST_SIZE_DEFAULT "2048"
-#define CONF_MAX_OUTPUT_BUFFER_SIZE_DEFAULT "2048"
-#define CONF_AO_DRIVER_DEFAULT AUDIO_AO_DRIVER_DEFAULT
-#define CONF_AO_DRIVER_OPTIONS_DEFAULT ""
-#define CONF_SAVE_ABSOLUTE_PATHS_IN_PLAYLISTS_DEFAULT "no"
-#define CONF_BIND_TO_ADDRESS_DEFAULT "any"
-#define CONF_USER_DEFAULT ""
-#define CONF_LOG_LEVEL_DEFAULT "default"
-#define CONF_AUDIO_WRITE_SIZE_DEFAULT "1024"
-#define CONF_BUFFER_SIZE_DEFAULT "2048"
-#ifndef NO_OSS_MIXER
-#define CONF_MIXER_TYPE_DEFAULT VOLUME_MIXER_OSS
-#define CONF_MIXER_DEVICE_DEFAULT ""
-#else
-#ifdef HAVE_ALSA
-#define CONF_MIXER_TYPE_DEFAULT VOLUME_MIXER_ALSA
-#define CONF_MIXER_DEVICE_DEFAULT ""
-#else
-#define CONF_MIXER_TYPE_DEFAULT VOLUME_MIXER_SOFTWARE
-#define CONF_MIXER_DEVICE_DEFAULT ""
-#endif
-#endif
-
-static char * conf_params[CONF_NUMBER_OF_PARAMS];
+#define CONF_COMMENT '#'
-void initConf() {
+#define CONF_REPEATABLE_MASK 0x01
+#define CONF_BLOCK_MASK 0x02
+
+typedef struct _configEntry {
+ unsigned char mask;
+ List * configParamList;
+} ConfigEntry;
+
+static List * configEntriesList = NULL;
+
+static BlockParam * newBlockParam(char * name, char * value) {
+ BlockParam * ret = malloc(sizeof(BlockParam));
+
+ ret->name = strdup(name);
+ ret->value = strdup(value);
+
+ return ret;
+}
+
+static void freeBlockParam(BlockParam * param) {
+ free(param->name);
+ free(param->value);
+ free(param);
+}
+
+static ConfigParam * newConfigParam(char * value) {
+ ConfigParam * ret = malloc(sizeof(ConfigParam));
+
+ if(value) ret->value = NULL;
+
+ ret->numberOfBlockParams = 0;
+ ret->blockParams = NULL;
+
+ return ret;
+}
+
+static void freeConfigParam(ConfigParam * param) {
int i;
- for(i=0;i<CONF_NUMBER_OF_PARAMS;i++) conf_params[i] = NULL;
-
- /* we don't specify these on the command line */
- conf_params[CONF_CONNECTION_TIMEOUT] = strdup(CONF_CONNECTION_TIMEOUT_DEFAULT);
- conf_params[CONF_MIXER_DEVICE] = strdup(CONF_MIXER_DEVICE_DEFAULT);
- conf_params[CONF_MAX_CONNECTIONS] = strdup(CONF_MAX_CONNECTIONS_DEFAULT);
- conf_params[CONF_MAX_PLAYLIST_LENGTH] = strdup(CONF_MAX_PLAYLIST_LENGTH_DEFAULT);
- conf_params[CONF_BUFFER_BEFORE_PLAY] = strdup(CONF_BUFFER_BEFORE_PLAY_DEFAULT);
- conf_params[CONF_MAX_COMMAND_LIST_SIZE] = strdup(CONF_MAX_COMMAND_LIST_SIZE_DEFAULT);
- conf_params[CONF_MAX_OUTPUT_BUFFER_SIZE] = strdup(CONF_MAX_OUTPUT_BUFFER_SIZE_DEFAULT);
- conf_params[CONF_AO_DRIVER] = strdup(CONF_AO_DRIVER_DEFAULT);
- conf_params[CONF_AO_DRIVER_OPTIONS] = strdup(CONF_AO_DRIVER_OPTIONS_DEFAULT);
- conf_params[CONF_SAVE_ABSOLUTE_PATHS_IN_PLAYLISTS] = strdup(CONF_SAVE_ABSOLUTE_PATHS_IN_PLAYLISTS_DEFAULT);
- conf_params[CONF_BIND_TO_ADDRESS] = strdup(CONF_BIND_TO_ADDRESS_DEFAULT);
- conf_params[CONF_MIXER_TYPE] = strdup(CONF_MIXER_TYPE_DEFAULT);
- conf_params[CONF_USER] = strdup(CONF_USER_DEFAULT);
- conf_params[CONF_LOG_LEVEL] = strdup(CONF_LOG_LEVEL_DEFAULT);
- conf_params[CONF_AUDIO_WRITE_SIZE] = strdup(CONF_AUDIO_WRITE_SIZE_DEFAULT);
- conf_params[CONF_BUFFER_SIZE] = strdup(CONF_BUFFER_SIZE_DEFAULT);
+ free(param->value);
+
+ for(i=0; i<param->numberOfBlockParams; i++) {
+ freeBlockParam(param->blockParams+i);
+ }
+
+ free(param);
+}
+
+ConfigEntry * newConfigEntry(int repeatable, int block) {
+ ConfigEntry * ret = malloc(sizeof(ConfigEntry));
+
+ ret->mask = 0;
+ ret->configParamList = makeList((ListFreeDataFunc *)freeConfigParam);
+
+ if(repeatable) ret->mask &= CONF_REPEATABLE_MASK;
+ if(block) ret->mask &= CONF_BLOCK_MASK;
+
+ return ret;
+}
+
+void freeConfigEntry(ConfigEntry * entry) {
+ freeList(entry->configParamList);
+ free(entry);
+}
+
+void registerConfigParam(char * name, int repeatable, int block) {
+ ConfigEntry * entry;
+
+ if(findInList(configEntriesList, name, NULL)) {
+ ERROR("config parameter \"%s\" already registered\n", name);
+ exit(EXIT_FAILURE);
+ }
+
+ entry = newConfigEntry(repeatable, block);
+
+ insertInList(configEntriesList, name, entry);
+}
+
+void initConf() {
+ configEntriesList = makeList((ListFreeDataFunc *)freeConfigEntry);
+
+ registerConfigParam(CONF_PORT, 0, 0);
+ registerConfigParam(CONF_MUSIC_DIR, 0, 0);
+ registerConfigParam(CONF_PLAYLIST_DIR, 0, 0);
+ registerConfigParam(CONF_LOG_FILE, 0, 0);
+ registerConfigParam(CONF_ERROR_FILE, 0, 0);
+ registerConfigParam(CONF_CONN_TIMEOUT, 0, 0);
+ registerConfigParam(CONF_MIXER_DEVICE, 0, 0);
+ registerConfigParam(CONF_MAX_CONN, 0, 0);
+ registerConfigParam(CONF_MAX_PLAYLIST_LENGTH, 0, 0);
+ registerConfigParam(CONF_BUFFER_BEFORE_PLAY, 0, 0);
+ registerConfigParam(CONF_MAX_COMMAND_LIST_SIZE, 0, 0);
+ registerConfigParam(CONF_MAX_OUTPUT_BUFFER_SIZE, 0, 0);
+ registerConfigParam(CONF_AUDIO_OUTPUT, 1, 1);
+ registerConfigParam(CONF_SAVE_ABSOLUTE_PATHS, 0, 0);
+ registerConfigParam(CONF_BIND_TO_ADDRESS, 1, 0);
+ registerConfigParam(CONF_MIXER_TYPE, 0, 0);
+ registerConfigParam(CONF_STATE_FILE, 0, 0);
+ registerConfigParam(CONF_USER, 0, 0);
+ registerConfigParam(CONF_DB_FILE, 0, 0);
+ registerConfigParam(CONF_LOG_LEVEL, 0, 0);
+ registerConfigParam(CONF_MIXER_CONTROL, 0, 0);
+ registerConfigParam(CONF_AUDIO_WRITE_SIZE, 0, 0);
+ registerConfigParam(CONF_FS_CHARSET, 0, 0);
+ registerConfigParam(CONF_PASSWORD, 1, 0);
+ registerConfigParam(CONF_DEFAULT_PERMS, 0, 0);
+ registerConfigParam(CONF_AUDIO_BUFFER_SIZE, 0, 0);
+ registerConfigParam(CONF_REPLAYGAIN, 0, 0);
+ registerConfigParam(CONF_AUDIO_OUTPUT_FORMAT, 0, 0);
+ registerConfigParam(CONF_HTTP_PROXY_HOST, 0, 0);
+ registerConfigParam(CONF_HTTP_PROXY_PORT, 0, 0);
+ registerConfigParam(CONF_HTTP_PROXY_USER, 0, 0);
+ registerConfigParam(CONF_HTTP_PROXY_PASSWORD, 0, 0);
+ registerConfigParam(CONF_REPLAYGAIN_PREAMP, 0, 0);
+ registerConfigParam(CONF_ID3V1_ENCODING, 0, 0);
}
-char ** readConf(char * file) {
+int readConf(char * file) {
char * conf_strings[CONF_NUMBER_OF_PARAMS] = {
"port",
"music_directory",
diff --git a/src/conf.h b/src/conf.h
index f6bd5d283..9dbdc86d1 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -21,59 +21,62 @@
#include "../config.h"
-#define CONF_PORT 0
-#define CONF_MUSIC_DIRECTORY 1
-#define CONF_PLAYLIST_DIRECTORY 2
-#define CONF_LOG_FILE 3
-#define CONF_ERROR_FILE 4
-#define CONF_CONNECTION_TIMEOUT 5
-#define CONF_MIXER_DEVICE 6
-#define CONF_MAX_CONNECTIONS 7
-#define CONF_MAX_PLAYLIST_LENGTH 8
-#define CONF_BUFFER_BEFORE_PLAY 9
-#define CONF_MAX_COMMAND_LIST_SIZE 10
-#define CONF_MAX_OUTPUT_BUFFER_SIZE 11
-#define CONF_AO_DRIVER 12
-#define CONF_AO_DRIVER_OPTIONS 13
-#define CONF_SAVE_ABSOLUTE_PATHS_IN_PLAYLISTS 14
-#define CONF_BIND_TO_ADDRESS 15
-#define CONF_MIXER_TYPE 16
-#define CONF_STATE_FILE 17
-#define CONF_USER 18
-#define CONF_DB_FILE 19
-#define CONF_LOG_LEVEL 20
-#define CONF_MIXER_CONTROL 21
-#define CONF_AUDIO_WRITE_SIZE 22
-#define CONF_FS_CHARSET 23
-#define CONF_PASSWORD 24
-#define CONF_DEFAULT_PERMISSIONS 25
-#define CONF_BUFFER_SIZE 26
-#define CONF_REPLAYGAIN 27
-#define CONF_AUDIO_OUTPUT_FORMAT 28
-#define CONF_HTTP_PROXY_HOST 29
-#define CONF_HTTP_PROXY_PORT 30
-#define CONF_HTTP_PROXY_USER 31
-#define CONF_HTTP_PROXY_PASSWORD 32
-#define CONF_REPLAYGAIN_PREAMP 33
-#define CONF_SHOUT_HOST 34
-#define CONF_SHOUT_PORT 35
-#define CONF_SHOUT_PASSWD 36
-#define CONF_SHOUT_MOUNT 37
-#define CONF_SHOUT_NAME 38
-#define CONF_SHOUT_USER 39
-#define CONF_SHOUT_QUALITY 40
-#define CONF_ID3V1_ENCODING 41
-#define CONF_SHOUT_FORMAT 42
+#define CONF_PORT "port"
+#define CONF_MUSIC_DIR "music_directory"
+#define CONF_PLAYLIST_DIR "playlist_directory"
+#define CONF_LOG_FILE "log_file"
+#define CONF_ERROR_FILE "error_file"
+#define CONF_CONN_TIMEOUT "connection_timeout"
+#define CONF_MIXER_DEVICE "mixer_device"
+#define CONF_MAX_CONN "max_connections"
+#define CONF_MAX_PLAYLIST_LENGTH "max_playlist_length"
+#define CONF_BUFFER_BEFORE_PLAY "buffer_before_play"
+#define CONF_MAX_COMMAND_LIST_SIZE "max_command_list_size"
+#define CONF_MAX_OUTPUT_BUFFER_SIZE "max_output_buffer_size"
+#define CONF_AUDIO_OUTPUT "audio_output"
+#define CONF_SAVE_ABSOLUTE_PATHS "save_absolute_paths_in_playlists"
+#define CONF_BIND_TO_ADDRESS "bind_to_address"
+#define CONF_MIXER_TYPE "mixer_type"
+#define CONF_STATE_FILE "state_file"
+#define CONF_USER "user"
+#define CONF_DB_FILE "db_file"
+#define CONF_LOG_LEVEL "log_level"
+#define CONF_MIXER_CONTROL "mixer_control"
+#define CONF_AUDIO_WRITE_SIZE "audio_write_size"
+#define CONF_FS_CHARSET "filesystem_charset"
+#define CONF_PASSWORD "password"
+#define CONF_DEFAULT_PERMS "default_permissions"
+#define CONF_AUDIO_BUFFER_SIZE "audio_buffer_size"
+#define CONF_REPLAYGAIN "replaygain"
+#define CONF_AUDIO_OUTPUT_FORMAT "audio_output_format"
+#define CONF_HTTP_PROXY_HOST "http_proxy_host"
+#define CONF_HTTP_PROXY_PORT "http_proxy_port"
+#define CONF_HTTP_PROXY_USER "http_proxy_user"
+#define CONF_HTTP_PROXY_PASSWORD "http_proxy_password"
+#define CONF_REPLAYGAIN_PREAMP "replaygain_preamp"
+#define CONF_ID3V1_ENCODING "id3v1_encoding"
-#define CONF_CAT_CHAR "\n"
+typedef struct _BlockParam {
+ char * name;
+ char * value;
+ int line;
+} BlockParam;
-/* do not free the return value, it is a static variable */
-char ** readConf(char * file);
-
-char ** getConf();
+typedef struct _ConfigParam {
+ char * value;
+ unsigned int line;
+ BlockParam * blockParams;
+ int numberOfBlockParams;
+} ConfigParam;
void initConf();
-void writeConf(char * file);
+int readConf(char * file);
+
+/* don't free the returned value
+ set _last_ to NULL to get first entry */
+ConfigParam * getNextConfigParam(char * name, ConfigParam * last);
+
+void registerConfigParam(char * name, int repeats, int block);
#endif
diff --git a/src/list.c b/src/list.c
index 68ec8d9c3..8faa271c0 100644
--- a/src/list.c
+++ b/src/list.c
@@ -192,7 +192,7 @@ int findInList(List * list,char * key,void ** data) {
tmpNode = list->nodesArray[cur];
cmp = strcmp(tmpNode->key,key);
if(cmp==0) {
- (*data) = tmpNode->data;
+ if(data) *data = tmpNode->data;
return 1;
}
else if(cmp>0) high = cur;
diff --git a/src/list.h b/src/list.h
index 7b08e7e51..9c879e91a 100644
--- a/src/list.h
+++ b/src/list.h
@@ -88,6 +88,7 @@ void deleteNodeFromList(List * list,ListNode * node);
* _key_ -> which node is being searched for
* _data_ -> a pointer to where data will be placed,
* _data_ memory should not by allocated or freed
+ * _data_ can be NULL
* returns 1 if successful, 0 otherwise
*/
int findInList(List * list, char * key, void ** data);