diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/file_sys/directory_backend.h | 6 | ||||
| -rw-r--r-- | src/core/file_sys/disk_archive.cpp | 17 | ||||
| -rw-r--r-- | src/core/file_sys/disk_archive.h | 4 | ||||
| -rw-r--r-- | src/core/file_sys/ivfc_archive.h | 3 |
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 | ||
| 113 | ResultVal<std::unique_ptr<DirectoryBackend>> DiskArchive::OpenDirectory(const Path& path) const { | 113 | ResultVal<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 | ||
| 214 | DiskDirectory::DiskDirectory(const DiskArchive& archive, const Path& path) : directory() { | 215 | DiskDirectory::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 | |||
| 221 | bool 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 | ||
| 231 | u32 DiskDirectory::Read(const u32 count, Entry* entries) { | 222 | u32 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 | ||
| 76 | class DiskDirectory : public DirectoryBackend { | 76 | class DiskDirectory : public DirectoryBackend { |
| 77 | public: | 77 | public: |
| 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 | ||
| 91 | protected: | 90 | protected: |
| 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 | ||
| 76 | class IVFCDirectory : public DirectoryBackend { | 76 | class IVFCDirectory : public DirectoryBackend { |
| 77 | public: | 77 | public: |
| 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 | } |