From 1bd3cde062deb3b61872f89ad02fc5d70cff375d Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
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);