From f4b707b4ca6451fcb1a6af6d3f2e58579b3c01a5 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 8 Dec 2009 08:17:35 +0100 Subject: [PATCH] mapper: apply filesystem_charset to playlists This fixes an inconsistency in the stored playlist subsystem: when obtaining the list of playlists (listplaylist, listplaylistinfo), the file names in the playlist directory are converted to UTF-8 (according to filesystem_charset), but when saving or loading playlists, the filesystem_charset setting was ignored. --- NEWS | 1 + src/mapper.c | 13 +++++++++---- src/mapper.h | 2 ++ src/playlist_save.c | 5 ++++- src/stored_playlist.c | 27 +++++++++++++++++++++------ 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index a48bac467..3ce6b8403 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ ver 0.15.7 (2009/??/??) * decoders: - ffmpeg: don't try to force stereo * mapper: fix memory leak when playlist_directory is not set +* mapper: apply filesystem_charset to playlists * command: verify playlist name in the "rm" command diff --git a/src/mapper.c b/src/mapper.c index 5c19021f9..5518cb79e 100644 --- a/src/mapper.c +++ b/src/mapper.c @@ -221,14 +221,19 @@ map_spl_path(void) char * map_spl_utf8_to_fs(const char *name) { - char *filename, *path; + char *filename_utf8, *filename_fs, *path; if (playlist_dir == NULL) return NULL; - filename = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL); - path = g_build_filename(playlist_dir, filename, NULL); - g_free(filename); + filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL); + filename_fs = utf8_to_fs_charset(filename_utf8); + g_free(filename_utf8); + if (filename_fs == NULL) + return NULL; + + path = g_build_filename(playlist_dir, filename_fs, NULL); + g_free(filename_fs); return path; } diff --git a/src/mapper.h b/src/mapper.h index 2667f1eee..f109de0bd 100644 --- a/src/mapper.h +++ b/src/mapper.h @@ -99,6 +99,8 @@ map_spl_path(void); * Maps a playlist name (without the ".m3u" suffix) to a file system * path. The return value is allocated on the heap and must be freed * with g_free(). + * + * @return the path in file system encoding, or NULL if mapping failed */ char * map_spl_utf8_to_fs(const char *name); diff --git a/src/playlist_save.c b/src/playlist_save.c index 776d3c385..13dbc721d 100644 --- a/src/playlist_save.c +++ b/src/playlist_save.c @@ -71,12 +71,15 @@ spl_save_queue(const char *name_utf8, const struct queue *queue) char *path_fs; FILE *file; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(name_utf8)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(name_utf8); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) { g_free(path_fs); diff --git a/src/stored_playlist.c b/src/stored_playlist.c index 131c2098a..5ed7182f6 100644 --- a/src/stored_playlist.c +++ b/src/stored_playlist.c @@ -152,9 +152,12 @@ spl_save(GPtrArray *list, const char *utf8path) assert(utf8path != NULL); + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -178,7 +181,7 @@ spl_load(const char *utf8path) char buffer[MPD_PATH_MAX]; char *path_fs; - if (!spl_valid_name(utf8path)) + if (!spl_valid_name(utf8path) || map_spl_path() == NULL) return NULL; path_fs = map_spl_utf8_to_fs(utf8path); @@ -299,12 +302,15 @@ spl_clear(const char *utf8path) char *path_fs; FILE *file; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8path)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "w")) && errno == EINTR); g_free(path_fs); @@ -323,12 +329,15 @@ spl_delete(const char *name_utf8) char *path_fs; int ret; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(name_utf8)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(name_utf8); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; ret = unlink(path_fs); g_free(path_fs); @@ -373,12 +382,15 @@ spl_append_song(const char *utf8path, struct song *song) struct stat st; char *path_fs; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8path)) return PLAYLIST_RESULT_BAD_NAME; path_fs = map_spl_utf8_to_fs(utf8path); if (path_fs == NULL) - return PLAYLIST_RESULT_DISABLED; + return PLAYLIST_RESULT_BAD_NAME; while (!(file = fopen(path_fs, "a")) && errno == EINTR); g_free(path_fs); @@ -448,6 +460,9 @@ spl_rename(const char *utf8from, const char *utf8to) char *from_path_fs, *to_path_fs; static enum playlist_result ret; + if (map_spl_path() == NULL) + return PLAYLIST_RESULT_DISABLED; + if (!spl_valid_name(utf8from) || !spl_valid_name(utf8to)) return PLAYLIST_RESULT_BAD_NAME; @@ -457,7 +472,7 @@ spl_rename(const char *utf8from, const char *utf8to) if (from_path_fs != NULL && to_path_fs != NULL) ret = spl_rename_internal(from_path_fs, to_path_fs); else - ret = PLAYLIST_RESULT_DISABLED; + ret = PLAYLIST_RESULT_BAD_NAME; g_free(from_path_fs); g_free(to_path_fs);