From ec1101e82ff63cb2ccd4fff161c2efd641f2dae0 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 28 Apr 2024 15:20:42 +0200 Subject: [PATCH] Fix accessing the /vol/save directories --- source/IOAbstraction.cpp | 12 ++++++++++++ source/wiiu/platform.cpp | 20 +++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/source/IOAbstraction.cpp b/source/IOAbstraction.cpp index f8846b3..5fc2e5e 100644 --- a/source/IOAbstraction.cpp +++ b/source/IOAbstraction.cpp @@ -183,6 +183,18 @@ int IOAbstraction::stat (const char *path, struct stat *sbuf) auto r = ::stat (convertedPath.c_str (), sbuf); if (r < 0) { + if (errno == EPERM) + { + auto *dir = ::opendir (convertedPath.c_str ()); + if (dir) + { + *sbuf = {}; + // TODO: init other values? + sbuf->st_mode = _IFDIR; + ::closedir (dir); + return 0; + } + } if (sVirtualDirs.contains (convertedPath)) { *sbuf = {}; diff --git a/source/wiiu/platform.cpp b/source/wiiu/platform.cpp index 392ddc8..597b42e 100644 --- a/source/wiiu/platform.cpp +++ b/source/wiiu/platform.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include @@ -159,6 +160,8 @@ void start_server () virtualDirsInRoot.emplace_back ("storage_usb"); IOAbstraction::addVirtualPath ("storage_usb:/", {}); } + + sMochaPathsWereMounted = true; } virtualDirsInRoot.emplace_back ("fs"); IOAbstraction::addVirtualPath (":/", virtualDirsInRoot); @@ -167,7 +170,22 @@ void start_server () "fs:/vol", std::vector{"external01", "content", "save"}); IOAbstraction::addVirtualPath ("fs:/vol/content", {}); - sMochaPathsWereMounted = true; + + std::vector virtualDirsInSave; + virtualDirsInSave.emplace_back ("common"); + nn::act::Initialize (); + for (int32_t i = 0; i < 13; i++) + { + if (!nn::act::IsSlotOccupied (i)) + { + continue; + } + char buffer[9]; + snprintf (buffer, sizeof (buffer), "%08X", nn::act::GetPersistentIdEx (i)); + virtualDirsInSave.emplace_back (buffer); + } + nn::act::Finalize (); + IOAbstraction::addVirtualPath ("fs:/vol/save", virtualDirsInSave); } else {