aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-09-28 13:50:15 +0200
committerMax Kellermann <max@duempel.org>2014-09-28 18:26:54 +0200
commitb002ea9a20ea2a9b36c4f577bfeb506ff2cf0696 (patch)
treede0193f520617637da0dae64ebd97563d1d73709
parent540317ea2ba6a36f041364fb68ec6b8b43395d98 (diff)
downloadmpd-b002ea9a20ea2a9b36c4f577bfeb506ff2cf0696.tar.gz
mpd-b002ea9a20ea2a9b36c4f577bfeb506ff2cf0696.tar.xz
mpd-b002ea9a20ea2a9b36c4f577bfeb506ff2cf0696.zip
storage/nfs: convert file name to UTF-8
Assume the configured filesystem character set is also used by the NFS server.
-rw-r--r--src/storage/plugins/NfsStorage.cxx38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/storage/plugins/NfsStorage.cxx b/src/storage/plugins/NfsStorage.cxx
index 2c331dde6..ecf1fb0b6 100644
--- a/src/storage/plugins/NfsStorage.cxx
+++ b/src/storage/plugins/NfsStorage.cxx
@@ -23,6 +23,7 @@
#include "storage/StorageInterface.hxx"
#include "storage/FileInfo.hxx"
#include "lib/nfs/Domain.hxx"
+#include "fs/AllocatedPath.hxx"
#include "util/Error.hxx"
#include "thread/Mutex.hxx"
@@ -42,6 +43,12 @@ class NfsDirectoryReader final : public StorageDirectoryReader {
nfsdirent *ent;
+ /**
+ * Buffer for Read() which holds the current file name
+ * converted to UTF-8.
+ */
+ std::string name_utf8;
+
public:
NfsDirectoryReader(const char *_base, nfs_context *_ctx, nfsdir *_dir)
:base(_base), ctx(_ctx), dir(_dir) {}
@@ -80,13 +87,15 @@ public:
};
static std::string
-UriToNfsPath(const char *uri_utf8)
+UriToNfsPath(const char *_uri_utf8, Error &error)
{
+ assert(_uri_utf8 != nullptr);
+
/* libnfs paths must begin with a slash */
- std::string path("/");
- path.append(uri_utf8);
+ std::string uri_utf8("/");
+ uri_utf8.append(_uri_utf8);
- return path;
+ return AllocatedPath::FromUTF8(uri_utf8.c_str(), error).Steal();
}
std::string
@@ -134,7 +143,9 @@ bool
NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow,
FileInfo &info, Error &error)
{
- const std::string path = UriToNfsPath(uri_utf8);
+ const std::string path = UriToNfsPath(uri_utf8, error);
+ if (path.empty())
+ return false;
return ::GetInfo(ctx, path.c_str(), info, error);
}
@@ -142,7 +153,9 @@ NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow,
StorageDirectoryReader *
NfsStorage::OpenDirectory(const char *uri_utf8, Error &error)
{
- const std::string path = UriToNfsPath(uri_utf8);
+ const std::string path = UriToNfsPath(uri_utf8, error);
+ if (path.empty())
+ return nullptr;
nfsdir *dir;
int result = nfs_opendir(ctx, path.c_str(), &dir);
@@ -172,8 +185,17 @@ const char *
NfsDirectoryReader::Read()
{
while ((ent = nfs_readdir(ctx, dir)) != nullptr) {
- if (!SkipNameFS(ent->name))
- return ent->name;
+ const Path name_fs = Path::FromFS(ent->name);
+ if (SkipNameFS(name_fs.c_str()))
+ continue;
+
+ name_utf8 = name_fs.ToUTF8();
+ if (name_utf8.empty())
+ /* ignore files whose name cannot be converted
+ to UTF-8 */
+ continue;
+
+ return name_utf8.c_str();
}
return nullptr;