From 7004ad3d7fd54b0d61d9f947a3d4ceb0afe1b42f Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 6 Mar 2020 09:50:59 -0800 Subject: [PATCH] fs: improve UnsupportedOperation results --- .../include/stratosphere/fs/fs_istorage.hpp | 28 +++++++++++-------- .../stratosphere/fs/fs_memory_storage.hpp | 6 +++- .../include/stratosphere/fs/fs_substorage.hpp | 4 +-- .../source/fs/fs_file_storage.cpp | 2 +- .../source/fs/fs_romfs_filesystem.cpp | 28 +++++++++---------- .../include/vapours/results/fs_results.hpp | 10 +++++++ .../fs_mitm/fsmitm_layered_romfs_storage.hpp | 10 +++++++ 7 files changed, 58 insertions(+), 30 deletions(-) diff --git a/libraries/libstratosphere/include/stratosphere/fs/fs_istorage.hpp b/libraries/libstratosphere/include/stratosphere/fs/fs_istorage.hpp index b3d06e8b8..d6749c5c3 100644 --- a/libraries/libstratosphere/include/stratosphere/fs/fs_istorage.hpp +++ b/libraries/libstratosphere/include/stratosphere/fs/fs_istorage.hpp @@ -26,21 +26,15 @@ namespace ams::fs { virtual Result Read(s64 offset, void *buffer, size_t size) = 0; - virtual Result Write(s64 offset, const void *buffer, size_t size) { - return fs::ResultUnsupportedOperation(); - } + virtual Result Write(s64 offset, const void *buffer, size_t size) = 0; virtual Result Flush() = 0; - virtual Result SetSize(s64 size) { - return fs::ResultUnsupportedOperation(); - } + virtual Result SetSize(s64 size) = 0; virtual Result GetSize(s64 *out) = 0; - virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) { - return fs::ResultUnsupportedOperation(); - } + virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) = 0; virtual Result OperateRange(OperationId op_id, s64 offset, s64 size) { return this->OperateRange(nullptr, 0, op_id, offset, size, nullptr, 0); @@ -86,21 +80,31 @@ namespace ams::fs { virtual ~ReadOnlyStorageAdapter() { /* ... */ } public: - virtual Result Read(s64 offset, void *buffer, size_t size) { + virtual Result Read(s64 offset, void *buffer, size_t size) override { return this->storage->Read(offset, buffer, size); } - virtual Result Flush() { + virtual Result Flush() override { return this->storage->Flush(); } - virtual Result GetSize(s64 *out) { + virtual Result GetSize(s64 *out) override { return this->storage->GetSize(out); } virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override { return this->storage->OperateRange(dst, dst_size, op_id, offset, size, src, src_size); } + + virtual Result Write(s64 offset, const void *buffer, size_t size) override { + /* TODO: Better result? Is it possible to get a more specific one? */ + return fs::ResultUnsupportedOperation(); + } + + virtual Result SetSize(s64 size) override { + /* TODO: Better result? Is it possible to get a more specific one? */ + return fs::ResultUnsupportedOperation(); + } }; } diff --git a/libraries/libstratosphere/include/stratosphere/fs/fs_memory_storage.hpp b/libraries/libstratosphere/include/stratosphere/fs/fs_memory_storage.hpp index c2424cf3c..bc86f0838 100644 --- a/libraries/libstratosphere/include/stratosphere/fs/fs_memory_storage.hpp +++ b/libraries/libstratosphere/include/stratosphere/fs/fs_memory_storage.hpp @@ -62,6 +62,10 @@ namespace ams::fs { return ResultSuccess(); } + virtual Result SetSize(s64 size) override { + return fs::ResultUnsupportedMemoryStorageSetSize(); + } + virtual Result OperateRange(void *dst, size_t dst_size, OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override { switch (op_id) { case OperationId::InvalidateCache: @@ -72,7 +76,7 @@ namespace ams::fs { reinterpret_cast(dst)->Clear(); return ResultSuccess(); default: - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedMemoryStorageOperateRange(); } } }; diff --git a/libraries/libstratosphere/include/stratosphere/fs/fs_substorage.hpp b/libraries/libstratosphere/include/stratosphere/fs/fs_substorage.hpp index be0e15778..b6a4f0011 100644 --- a/libraries/libstratosphere/include/stratosphere/fs/fs_substorage.hpp +++ b/libraries/libstratosphere/include/stratosphere/fs/fs_substorage.hpp @@ -103,13 +103,13 @@ namespace ams::fs { virtual Result SetSize(s64 size) override { /* Ensure we're initialized and validate arguments. */ R_UNLESS(this->IsValid(), fs::ResultNotInitialized()); - R_UNLESS(this->resizable, fs::ResultUnsupportedOperation()); + R_UNLESS(this->resizable, fs::ResultUnsupportedSubStorageSetSizeA()); R_UNLESS(IStorage::IsOffsetAndSizeValid(this->offset, size), fs::ResultInvalidSize()); /* Ensure that we're allowed to set size. */ s64 cur_size; R_TRY(this->base_storage->GetSize(std::addressof(cur_size))); - R_UNLESS(cur_size == this->offset + this->size, fs::ResultUnsupportedOperation()); + R_UNLESS(cur_size == this->offset + this->size, fs::ResultUnsupportedSubStorageSetSizeB()); /* Set the size. */ R_TRY(this->base_storage->SetSize(this->offset + size)); diff --git a/libraries/libstratosphere/source/fs/fs_file_storage.cpp b/libraries/libstratosphere/source/fs/fs_file_storage.cpp index d96f723c1..0ed8f1338 100644 --- a/libraries/libstratosphere/source/fs/fs_file_storage.cpp +++ b/libraries/libstratosphere/source/fs/fs_file_storage.cpp @@ -86,7 +86,7 @@ namespace ams::fs { R_UNLESS(IStorage::IsOffsetAndSizeValid(offset, size), fs::ResultOutOfRange()); return this->base_file->OperateRange(dst, dst_size, op_id, offset, size, src, src_size); default: - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedFileStorageOperateRange(); } } diff --git a/libraries/libstratosphere/source/fs/fs_romfs_filesystem.cpp b/libraries/libstratosphere/source/fs/fs_romfs_filesystem.cpp index 42a4165ea..cbbee7514 100644 --- a/libraries/libstratosphere/source/fs/fs_romfs_filesystem.cpp +++ b/libraries/libstratosphere/source/fs/fs_romfs_filesystem.cpp @@ -223,11 +223,11 @@ namespace ams::fs { } virtual Result WriteImpl(s64 offset, const void *buffer, size_t size, const fs::WriteOption &option) override { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileWrite(); } virtual Result SetSizeImpl(s64 size) override { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileWrite(); } virtual Result OperateRangeImpl(void *dst, size_t dst_size, fs::OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override { @@ -239,7 +239,7 @@ namespace ams::fs { R_UNLESS(this->GetSize() >= 0, fs::ResultOutOfRange()); } default: - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileOperateRange(); } } public: @@ -438,31 +438,31 @@ namespace ams::fs { } Result RomFsFileSystem::CreateFileImpl(const char *path, s64 size, int flags) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::DeleteFileImpl(const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::CreateDirectoryImpl(const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::DeleteDirectoryImpl(const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::DeleteDirectoryRecursivelyImpl(const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::RenameFileImpl(const char *old_path, const char *new_path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::RenameDirectoryImpl(const char *old_path, const char *new_path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::GetEntryTypeImpl(fs::DirectoryEntryType *out, const char *path) { @@ -519,19 +519,19 @@ namespace ams::fs { } Result RomFsFileSystem::GetFreeSpaceSizeImpl(s64 *out, const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemGetSize(); } Result RomFsFileSystem::GetTotalSpaceSizeImpl(s64 *out, const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemGetSize(); } Result RomFsFileSystem::CleanDirectoryRecursivelyImpl(const char *path) { - return fs::ResultUnsupportedOperation(); + return fs::ResultUnsupportedRomFsFileSystemWrite(); } Result RomFsFileSystem::CommitProvisionallyImpl(s64 counter) { - return ResultSuccess(); + return fs::ResultUnsupportedRomFsFileSystemCommitProvisionally(); } Result RomFsFileSystem::RollbackImpl() { diff --git a/libraries/libvapours/include/vapours/results/fs_results.hpp b/libraries/libvapours/include/vapours/results/fs_results.hpp index db9a5f86d..eaa659a44 100644 --- a/libraries/libvapours/include/vapours/results/fs_results.hpp +++ b/libraries/libvapours/include/vapours/results/fs_results.hpp @@ -231,6 +231,16 @@ namespace ams::fs { R_DEFINE_ERROR_RESULT(FileExtensionWithoutOpenModeAllowAppend, 6201); R_DEFINE_ERROR_RANGE(UnsupportedOperation, 6300, 6399); + R_DEFINE_ERROR_RESULT(UnsupportedSubStorageSetSizeA, 6302); + R_DEFINE_ERROR_RESULT(UnsupportedSubStorageSetSizeB, 6303); + R_DEFINE_ERROR_RESULT(UnsupportedMemoryStorageSetSize, 6304); + R_DEFINE_ERROR_RESULT(UnsupportedMemoryStorageOperateRange, 6305); + R_DEFINE_ERROR_RESULT(UnsupportedFileStorageOperateRange, 6306); + R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemWrite, 6364); + R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemCommitProvisionally, 6365); + R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileSystemGetSize, 6366); + R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileWrite, 6367); + R_DEFINE_ERROR_RESULT(UnsupportedRomFsFileOperateRange, 6368); R_DEFINE_ERROR_RANGE(PermissionDenied, 6400, 6449); diff --git a/stratosphere/ams_mitm/source/fs_mitm/fsmitm_layered_romfs_storage.hpp b/stratosphere/ams_mitm/source/fs_mitm/fsmitm_layered_romfs_storage.hpp index e928d8bcf..6782fa961 100644 --- a/stratosphere/ams_mitm/source/fs_mitm/fsmitm_layered_romfs_storage.hpp +++ b/stratosphere/ams_mitm/source/fs_mitm/fsmitm_layered_romfs_storage.hpp @@ -49,6 +49,16 @@ namespace ams::mitm::fs { virtual Result GetSize(s64 *out_size) override; virtual Result Flush() override; virtual Result OperateRange(void *dst, size_t dst_size, ams::fs::OperationId op_id, s64 offset, s64 size, const void *src, size_t src_size) override; + + virtual Result Write(s64 offset, const void *buffer, size_t size) override { + /* TODO: Better result code? */ + return ams::fs::ResultUnsupportedOperation(); + } + + virtual Result SetSize(s64 size) override { + /* TODO: Better result code? */ + return ams::fs::ResultUnsupportedOperation(); + } }; }