diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | doc/mpd.conf.5 | 7 | ||||
-rw-r--r-- | src/command.c | 5 | ||||
-rw-r--r-- | src/mapper.c | 38 | ||||
-rw-r--r-- | src/playlist.c | 3 | ||||
-rw-r--r-- | src/playlist.h | 3 | ||||
-rw-r--r-- | src/stored_playlist.c | 19 |
7 files changed, 57 insertions, 19 deletions
@@ -12,6 +12,7 @@ ver 0.15 - (200?/??/??) * failure to read the state file is non-fatal * added Icy-Metadata support * --create-db starts the MPD daemon instead of exiting +* playlist_directory is optional ver 0.14.1 (2009/01/17) diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5 index 0440dda06..9ee10b2b7 100644 --- a/doc/mpd.conf.5 +++ b/doc/mpd.conf.5 @@ -32,9 +32,6 @@ configuration file. .B music_directory <directory> This specifies the directory where music is located. .TP -.B playlist_directory <directory> -This specifies the directory where saved playlists are stored. -.TP .B follow_outside_symlinks <yes or no> Control if MPD will follow symbolic links pointing outside the music dir. You must recreate the database after changing this option. @@ -57,6 +54,10 @@ The special value "syslog" makes MPD use the local syslog daemon. .B pid_file <file> This specifies the file to save mpd's process ID in. .TP +.B playlist_directory <directory> +This specifies the directory where saved playlists are stored. +If you do not configure this, you cannot save playlists. +.TP .B state_file <file> This specifies if a state file is used and where it is located. The state of mpd will be saved to this file when mpd is terminated by a TERM signal or by diff --git a/src/command.c b/src/command.c index 9eac2438b..dbc7bdb99 100644 --- a/src/command.c +++ b/src/command.c @@ -320,6 +320,11 @@ print_playlist_result(struct client *client, command_error(client, ACK_ERROR_PLAYLIST_MAX, "playlist is at the max size"); return COMMAND_RETURN_ERROR; + + case PLAYLIST_RESULT_DISABLED: + command_error(client, ACK_ERROR_UNKNOWN, + "stored playlist support is disabled"); + return COMMAND_RETURN_ERROR; } assert(0); diff --git a/src/mapper.c b/src/mapper.c index 028d35b22..2c3e50ab0 100644 --- a/src/mapper.c +++ b/src/mapper.c @@ -39,14 +39,29 @@ static char *music_dir; static size_t music_dir_length; static char *playlist_dir; -static size_t playlist_dir_length; + +static void +mapper_set_playlist_dir(const char *path, int line) +{ + int ret; + struct stat st; + + playlist_dir = g_strdup(path); + + ret = stat(playlist_dir, &st); + if (ret < 0) + g_warning("failed to stat playlist directory \"%s\" (config line %i): %s\n", + playlist_dir, line, g_strerror(errno)); + else if (!S_ISDIR(st.st_mode)) + g_warning("playlist directory is not a directory: \"%s\" (config line %i)\n", + playlist_dir, line); +} void mapper_init(void) { struct config_param *music_dir_param = parseConfigFilePath(CONF_MUSIC_DIR, false); - struct config_param *playlist_dir_param = - parseConfigFilePath(CONF_PLAYLIST_DIR, 1); + struct config_param *param; int ret; struct stat st; @@ -73,17 +88,9 @@ void mapper_init(void) g_warning("music directory is not a directory: \"%s\" (config line %i)\n", music_dir_param->value, music_dir_param->line); - playlist_dir = g_strdup(playlist_dir_param->value); - playlist_dir_length = strlen(playlist_dir); - - ret = stat(playlist_dir, &st); - if (ret < 0) - g_warning("failed to stat playlist directory \"%s\" (config line %i): %s\n", - playlist_dir_param->value, playlist_dir_param->line, - strerror(errno)); - else if (!S_ISDIR(st.st_mode)) - g_warning("playlist directory is not a directory: \"%s\" (config line %i)\n", - playlist_dir_param->value, playlist_dir_param->line); + param = parseConfigFilePath(CONF_PLAYLIST_DIR, false); + if (param != NULL) + mapper_set_playlist_dir(param->value, param->line); } void mapper_finish(void) @@ -183,6 +190,9 @@ map_spl_utf8_to_fs(const char *name) char *filename = g_strconcat(name, "." PLAYLIST_FILE_SUFFIX, NULL); char *path; + if (playlist_dir == NULL) + return NULL; + path = g_build_filename(playlist_dir, filename, NULL); g_free(filename); diff --git a/src/playlist.c b/src/playlist.c index 20ea05907..e4f9e3538 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -1216,6 +1216,9 @@ enum playlist_result savePlaylist(const char *utf8file) return PLAYLIST_RESULT_BAD_NAME; path = map_spl_utf8_to_fs(utf8file); + if (path == NULL) + return PLAYLIST_RESULT_DISABLED; + if (g_file_test(path, G_FILE_TEST_EXISTS)) { g_free(path); return PLAYLIST_RESULT_LIST_EXISTS; diff --git a/src/playlist.h b/src/playlist.h index 4af4aa82c..19dc747e9 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -38,7 +38,8 @@ enum playlist_result { PLAYLIST_RESULT_BAD_NAME, PLAYLIST_RESULT_BAD_RANGE, PLAYLIST_RESULT_NOT_PLAYING, - PLAYLIST_RESULT_TOO_LARGE + PLAYLIST_RESULT_TOO_LARGE, + PLAYLIST_RESULT_DISABLED, }; typedef struct _Playlist { diff --git a/src/stored_playlist.c b/src/stored_playlist.c index e6fdf944a..941702835 100644 --- a/src/stored_playlist.c +++ b/src/stored_playlist.c @@ -80,6 +80,9 @@ spl_list(void) GPtrArray *list; struct stored_playlist_info *playlist; + if (parent_path_fs == NULL) + return NULL; + dir = opendir(parent_path_fs); if (dir == NULL) return NULL; @@ -118,6 +121,8 @@ spl_save(GPtrArray *list, const char *utf8path) assert(utf8path != NULL); path_fs = map_spl_utf8_to_fs(utf8path); + if (path_fs == NULL) + return PLAYLIST_RESULT_DISABLED; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -145,6 +150,8 @@ spl_load(const char *utf8path) return NULL; path_fs = map_spl_utf8_to_fs(utf8path); + if (path_fs == NULL) + return NULL; while (!(file = fopen(path_fs, "r")) && errno == EINTR); g_free(path_fs); @@ -264,6 +271,8 @@ spl_clear(const char *utf8path) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); + if (path_fs == NULL) + return PLAYLIST_RESULT_DISABLED; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -283,6 +292,9 @@ spl_delete(const char *name_utf8) int ret; path_fs = map_spl_utf8_to_fs(name_utf8); + if (path_fs == NULL) + return PLAYLIST_RESULT_DISABLED; + ret = unlink(path_fs); g_free(path_fs); if (ret < 0) @@ -330,6 +342,8 @@ spl_append_song(const char *utf8path, struct song *song) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); + if (path_fs == NULL) + return PLAYLIST_RESULT_DISABLED; while (!(file = fopen(path_fs, "a")) && errno == EINTR); g_free(path_fs); @@ -410,7 +424,10 @@ spl_rename(const char *utf8from, const char *utf8to) from_path_fs = map_spl_utf8_to_fs(utf8from); to_path_fs = map_spl_utf8_to_fs(utf8to); - ret = spl_rename_internal(from_path_fs, to_path_fs); + if (from_path_fs != NULL && to_path_fs != NULL) + ret = spl_rename_internal(from_path_fs, to_path_fs); + else + ret = PLAYLIST_RESULT_DISABLED; g_free(from_path_fs); g_free(to_path_fs); |