Commit b002ea9a authored by Max Kellermann's avatar Max Kellermann

storage/nfs: convert file name to UTF-8

Assume the configured filesystem character set is also used by the NFS server.
parent 540317ea
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "storage/StorageInterface.hxx" #include "storage/StorageInterface.hxx"
#include "storage/FileInfo.hxx" #include "storage/FileInfo.hxx"
#include "lib/nfs/Domain.hxx" #include "lib/nfs/Domain.hxx"
#include "fs/AllocatedPath.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
#include "thread/Mutex.hxx" #include "thread/Mutex.hxx"
...@@ -42,6 +43,12 @@ class NfsDirectoryReader final : public StorageDirectoryReader { ...@@ -42,6 +43,12 @@ class NfsDirectoryReader final : public StorageDirectoryReader {
nfsdirent *ent; nfsdirent *ent;
/**
* Buffer for Read() which holds the current file name
* converted to UTF-8.
*/
std::string name_utf8;
public: public:
NfsDirectoryReader(const char *_base, nfs_context *_ctx, nfsdir *_dir) NfsDirectoryReader(const char *_base, nfs_context *_ctx, nfsdir *_dir)
:base(_base), ctx(_ctx), dir(_dir) {} :base(_base), ctx(_ctx), dir(_dir) {}
...@@ -80,13 +87,15 @@ public: ...@@ -80,13 +87,15 @@ public:
}; };
static std::string 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 */ /* libnfs paths must begin with a slash */
std::string path("/"); std::string uri_utf8("/");
path.append(uri_utf8); uri_utf8.append(_uri_utf8);
return path; return AllocatedPath::FromUTF8(uri_utf8.c_str(), error).Steal();
} }
std::string std::string
...@@ -134,7 +143,9 @@ bool ...@@ -134,7 +143,9 @@ bool
NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow, NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow,
FileInfo &info, Error &error) 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); return ::GetInfo(ctx, path.c_str(), info, error);
} }
...@@ -142,7 +153,9 @@ NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow, ...@@ -142,7 +153,9 @@ NfsStorage::GetInfo(const char *uri_utf8, gcc_unused bool follow,
StorageDirectoryReader * StorageDirectoryReader *
NfsStorage::OpenDirectory(const char *uri_utf8, Error &error) 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; nfsdir *dir;
int result = nfs_opendir(ctx, path.c_str(), &dir); int result = nfs_opendir(ctx, path.c_str(), &dir);
...@@ -172,8 +185,17 @@ const char * ...@@ -172,8 +185,17 @@ const char *
NfsDirectoryReader::Read() NfsDirectoryReader::Read()
{ {
while ((ent = nfs_readdir(ctx, dir)) != nullptr) { while ((ent = nfs_readdir(ctx, dir)) != nullptr) {
if (!SkipNameFS(ent->name)) const Path name_fs = Path::FromFS(ent->name);
return 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; return nullptr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment