diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.cpp b/deps/ox/src/ox/fs/filesystem/filesystem.cpp index 607e0ceb..a29cbbc5 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.cpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.cpp @@ -10,7 +10,7 @@ namespace ox { -Result FileSystem::read(FileAddress addr) noexcept { +Result FileSystem::read(FileAddress addr) noexcept { switch (addr.type()) { case FileAddressType::Inode: return read(addr.getInode().value); diff --git a/deps/ox/src/ox/fs/filesystem/filesystem.hpp b/deps/ox/src/ox/fs/filesystem/filesystem.hpp index 61ed9732..23272568 100644 --- a/deps/ox/src/ox/fs/filesystem/filesystem.hpp +++ b/deps/ox/src/ox/fs/filesystem/filesystem.hpp @@ -32,19 +32,21 @@ class FileSystem { virtual Error read(const char *path, void *buffer, std::size_t buffSize) noexcept = 0; - virtual Result read(const char *path) noexcept = 0; + virtual Result read(const char *path) noexcept = 0; virtual Error read(uint64_t inode, void *buffer, std::size_t size) noexcept = 0; virtual Error read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept = 0; - virtual Result read(uint64_t inode) noexcept = 0; + virtual Result read(uint64_t inode) noexcept = 0; Error read(FileAddress addr, void *buffer, std::size_t size) noexcept; Error read(FileAddress addr, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept; - Result read(FileAddress addr) noexcept; + Result read(FileAddress addr) noexcept; + + virtual Result> ls(const char *dir) noexcept = 0; virtual Error remove(const char *path, bool recursive = false) noexcept = 0; @@ -118,13 +120,15 @@ class FileSystemTemplate: public FileSystem { Error read(const char *path, void *buffer, std::size_t buffSize) noexcept override; - Result read(const char*) noexcept override; + Result read(const char*) noexcept override; Error read(uint64_t inode, void *buffer, std::size_t size) noexcept override; Error read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override; - Result read(uint64_t) noexcept override; + Result read(uint64_t) noexcept override; + + Result> ls(const char *dir) noexcept override; template Error ls(const char *dir, F cb); @@ -241,7 +245,7 @@ Error FileSystemTemplate::read(const char *path, void *buf } template -Result FileSystemTemplate::read(const char *path) noexcept { +Result FileSystemTemplate::read(const char *path) noexcept { auto fd = fileSystemData(); oxReturnError(fd.error); Directory rootDir(m_fs, fd.value.rootDirInode); @@ -261,7 +265,7 @@ Error FileSystemTemplate::read(uint64_t inode, std::size_t } template -Result FileSystemTemplate::read(uint64_t inode) noexcept { +Result FileSystemTemplate::read(uint64_t inode) noexcept { auto data = m_fs.read(inode); if (!data.valid()) { return OxError(1); @@ -269,6 +273,16 @@ Result FileSystemTemplate::read(uint64_t inode) return data.get(); } +template +Result> FileSystemTemplate::ls(const char *path) noexcept { + Vector out; + oxReturnError(ls(path, [&out](const char *name, typename FileStore::InodeId_t) { + out.emplace_back(name); + return OxError(0); + })); + return ox::move(out); +} + template template Error FileSystemTemplate::ls(const char *path, F cb) { diff --git a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp index 7f0d323e..f2a03758 100644 --- a/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp +++ b/deps/ox/src/ox/fs/filesystem/passthroughfs.cpp @@ -74,7 +74,7 @@ Error PassThroughFS::read(const char *path, void *buffer, std::size_t buffSize) return OxError(0); } -Result PassThroughFS::read(const char*) noexcept { +Result PassThroughFS::read(const char*) noexcept { return OxError(1); } @@ -88,10 +88,22 @@ Error PassThroughFS::read(uint64_t, std::size_t, std::size_t, void*, std::size_t return OxError(1); } -Result PassThroughFS::read(uint64_t) noexcept { +Result PassThroughFS::read(uint64_t) noexcept { return OxError(1); } +Result> PassThroughFS::ls(const char *dir) noexcept { + Vector out; + std::error_code ec; + const auto di = std::filesystem::directory_iterator(m_path / stripSlash(dir), ec); + oxReturnError(OxError(ec.value(), "PassThroughFS: ls failed")); + for (auto &p : di) { + auto u8p = p.path().filename().u8string(); + out.emplace_back(ox::bit_cast(u8p.c_str())); + } + return ox::move(out); +} + Error PassThroughFS::remove(const char *path, bool recursive) noexcept { if (recursive) { return OxError(std::filesystem::remove_all(m_path / stripSlash(path)) != 0); diff --git a/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp b/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp index 48e50382..f62a0d04 100644 --- a/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp +++ b/deps/ox/src/ox/fs/filesystem/passthroughfs.hpp @@ -43,13 +43,15 @@ class PassThroughFS: public FileSystem { Error read(const char *path, void *buffer, std::size_t buffSize) noexcept override; - Result read(const char*) noexcept override; + Result read(const char*) noexcept override; Error read(uint64_t inode, void *buffer, std::size_t size) noexcept override; Error read(uint64_t inode, std::size_t readStart, std::size_t readSize, void *buffer, std::size_t *size) noexcept override; - Result read(uint64_t) noexcept override; + Result read(uint64_t) noexcept override; + + Result> ls(const char *dir) noexcept override; template Error ls(const char *dir, F cb) noexcept;