aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-01-18 16:15:45 +0100
committerMax Kellermann <max@duempel.org>2009-01-18 16:15:45 +0100
commit9933144de7389b12b2a75cfb4320baecefa952af (patch)
tree09d7fc155aa64e596c38a2a7d7908e6c8705bf3b
parentc2cc3b4923684cb00518e7b8db25a9b56c60dc9d (diff)
downloadmpd-9933144de7389b12b2a75cfb4320baecefa952af.tar.gz
mpd-9933144de7389b12b2a75cfb4320baecefa952af.tar.xz
mpd-9933144de7389b12b2a75cfb4320baecefa952af.zip
mapper: make the playlist directory optional
-rw-r--r--NEWS1
-rw-r--r--doc/mpd.conf.57
-rw-r--r--src/command.c5
-rw-r--r--src/mapper.c38
-rw-r--r--src/playlist.c3
-rw-r--r--src/playlist.h3
-rw-r--r--src/stored_playlist.c19
7 files changed, 57 insertions, 19 deletions
diff --git a/NEWS b/NEWS
index 66d14c23e..e4fa1e995 100644
--- a/NEWS
+++ b/NEWS
@@ -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);