From 1bd3cde062deb3b61872f89ad02fc5d70cff375d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 24 Dec 2008 22:04:24 +0100 Subject: [PATCH] playlist: fix stored playlist modifications with absolute paths When save_absolute_paths_in_playlists was enabled in mpd.conf, MPD broke all playlists when manipulated using the "playlistdelete" command. The reason was that map_directory_child_fs() was used, which doesn't accept slashes in the file name. Use the new map_uri_fs() function instead. --- src/mapper.c | 12 +++++++++++- src/mapper.h | 8 ++++++++ src/playlist_save.c | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mapper.c b/src/mapper.c index 6317c2f77..b3f86da00 100644 --- a/src/mapper.c +++ b/src/mapper.c @@ -83,6 +83,16 @@ rmp2amp_r(char *dst, const char *rel_path) return dst; } +const char * +map_uri_fs(const char *uri, char *buffer) +{ + assert(uri != NULL); + assert(*uri != '/'); + assert(buffer != NULL); + + return rmp2amp_r(buffer, utf8_to_fs_charset(buffer, uri)); +} + const char * map_directory_fs(const struct directory *directory, char *buffer) { @@ -90,7 +100,7 @@ map_directory_fs(const struct directory *directory, char *buffer) if (isRootDirectory(dirname)) return music_dir; - return rmp2amp_r(buffer, utf8_to_fs_charset(buffer, dirname)); + return map_uri_fs(dirname, buffer); } const char * diff --git a/src/mapper.h b/src/mapper.h index e8249b27d..2aecd9a52 100644 --- a/src/mapper.h +++ b/src/mapper.h @@ -32,6 +32,14 @@ void mapper_init(void); void mapper_finish(void); +/** + * Determines the absolute file system path of a relative URI. This + * is basically done by converting the URI to the file system charset + * and prepending the music directory. + */ +const char * +map_uri_fs(const char *uri, char *buffer); + /** * Determines the file system path of a directory object. * diff --git a/src/playlist_save.c b/src/playlist_save.c index 2568d4293..b07137d9e 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -48,7 +48,7 @@ playlist_print_uri(FILE *file, const char *uri) if (playlist_saveAbsolutePaths && !isRemoteUrl(uri) && uri[0] != '/') - s = map_directory_child_fs(db_get_root(), uri, tmp); + s = map_uri_fs(uri, tmp); else s = utf8_to_fs_charset(tmp, uri);