summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/file_sys/directory_backend.h6
-rw-r--r--src/core/file_sys/disk_archive.cpp17
-rw-r--r--src/core/file_sys/disk_archive.h4
-rw-r--r--src/core/file_sys/ivfc_archive.h3
4 files changed, 5 insertions, 25 deletions
diff --git a/src/core/file_sys/directory_backend.h b/src/core/file_sys/directory_backend.h
index b55e382ef..0c93f2074 100644
--- a/src/core/file_sys/directory_backend.h
+++ b/src/core/file_sys/directory_backend.h
@@ -41,12 +41,6 @@ public:
41 virtual ~DirectoryBackend() {} 41 virtual ~DirectoryBackend() {}
42 42
43 /** 43 /**
44 * Open the directory
45 * @return true if the directory opened correctly
46 */
47 virtual bool Open() = 0;
48
49 /**
50 * List files contained in the directory 44 * List files contained in the directory
51 * @param count Number of entries to return at once in entries 45 * @param count Number of entries to return at once in entries
52 * @param entries Buffer to read data into 46 * @param entries Buffer to read data into
diff --git a/src/core/file_sys/disk_archive.cpp b/src/core/file_sys/disk_archive.cpp
index ce6b9360b..fef6e68a2 100644
--- a/src/core/file_sys/disk_archive.cpp
+++ b/src/core/file_sys/disk_archive.cpp
@@ -112,10 +112,11 @@ ResultCode DiskArchive::RenameDirectory(const Path& src_path, const Path& dest_p
112 112
113ResultVal<std::unique_ptr<DirectoryBackend>> DiskArchive::OpenDirectory(const Path& path) const { 113ResultVal<std::unique_ptr<DirectoryBackend>> DiskArchive::OpenDirectory(const Path& path) const {
114 LOG_DEBUG(Service_FS, "called path=%s", path.DebugStr().c_str()); 114 LOG_DEBUG(Service_FS, "called path=%s", path.DebugStr().c_str());
115 auto directory = std::make_unique<DiskDirectory>(*this, path); 115 auto full_path = mount_point + path.AsString();
116 if (!directory->Open()) 116 if (!FileUtil::IsDirectory(full_path))
117 return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound, 117 return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
118 ErrorLevel::Permanent); 118 ErrorLevel::Permanent);
119 auto directory = std::make_unique<DiskDirectory>(full_path);
119 return MakeResult<std::unique_ptr<DirectoryBackend>>(std::move(directory)); 120 return MakeResult<std::unique_ptr<DirectoryBackend>>(std::move(directory));
120} 121}
121 122
@@ -211,21 +212,11 @@ bool DiskFile::Close() const {
211 212
212//////////////////////////////////////////////////////////////////////////////////////////////////// 213////////////////////////////////////////////////////////////////////////////////////////////////////
213 214
214DiskDirectory::DiskDirectory(const DiskArchive& archive, const Path& path) : directory() { 215DiskDirectory::DiskDirectory(const std::string& path) : directory() {
215 // TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass
216 // the root directory we set while opening the archive.
217 // For example, opening /../../usr/bin can give the emulated program your installed programs.
218 this->path = archive.mount_point + path.AsString();
219}
220
221bool DiskDirectory::Open() {
222 if (!FileUtil::IsDirectory(path))
223 return false;
224 unsigned size = FileUtil::ScanDirectoryTree(path, directory); 216 unsigned size = FileUtil::ScanDirectoryTree(path, directory);
225 directory.size = size; 217 directory.size = size;
226 directory.isDirectory = true; 218 directory.isDirectory = true;
227 children_iterator = directory.children.begin(); 219 children_iterator = directory.children.begin();
228 return true;
229} 220}
230 221
231u32 DiskDirectory::Read(const u32 count, Entry* entries) { 222u32 DiskDirectory::Read(const u32 count, Entry* entries) {
diff --git a/src/core/file_sys/disk_archive.h b/src/core/file_sys/disk_archive.h
index 0edd87954..c93c32eb2 100644
--- a/src/core/file_sys/disk_archive.h
+++ b/src/core/file_sys/disk_archive.h
@@ -75,13 +75,12 @@ protected:
75 75
76class DiskDirectory : public DirectoryBackend { 76class DiskDirectory : public DirectoryBackend {
77public: 77public:
78 DiskDirectory(const DiskArchive& archive, const Path& path); 78 DiskDirectory(const std::string& path);
79 79
80 ~DiskDirectory() override { 80 ~DiskDirectory() override {
81 Close(); 81 Close();
82 } 82 }
83 83
84 bool Open() override;
85 u32 Read(const u32 count, Entry* entries) override; 84 u32 Read(const u32 count, Entry* entries) override;
86 85
87 bool Close() const override { 86 bool Close() const override {
@@ -89,7 +88,6 @@ public:
89 } 88 }
90 89
91protected: 90protected:
92 std::string path;
93 u32 total_entries_in_directory; 91 u32 total_entries_in_directory;
94 FileUtil::FSTEntry directory; 92 FileUtil::FSTEntry directory;
95 93
diff --git a/src/core/file_sys/ivfc_archive.h b/src/core/file_sys/ivfc_archive.h
index af6297e1f..826261441 100644
--- a/src/core/file_sys/ivfc_archive.h
+++ b/src/core/file_sys/ivfc_archive.h
@@ -75,9 +75,6 @@ private:
75 75
76class IVFCDirectory : public DirectoryBackend { 76class IVFCDirectory : public DirectoryBackend {
77public: 77public:
78 bool Open() override {
79 return false;
80 }
81 u32 Read(const u32 count, Entry* entries) override { 78 u32 Read(const u32 count, Entry* entries) override {
82 return 0; 79 return 0;
83 } 80 }