diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/conf.c | 174 | ||||
-rw-r--r-- | src/conf.h | 101 | ||||
-rw-r--r-- | src/list.c | 2 | ||||
-rw-r--r-- | src/list.h | 1 |
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); |