diff --git a/Dockerfile b/Dockerfile index ef10fff..b417396 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM ghcr.io/wiiu-env/devkitppc:20231112 COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20230621 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20230719 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/libcontentredirection:20230621 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:0.3.2-dev-20231203-2e5832b /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libcontentredirection:1.1-dev-20240421-50d6722 /artifacts $DEVKITPRO WORKDIR project diff --git a/src/FSWrapper.cpp b/src/FSWrapper.cpp index 2982deb..db80561 100644 --- a/src/FSWrapper.cpp +++ b/src/FSWrapper.cpp @@ -670,7 +670,15 @@ bool FSWrapper::IsFileModeAllowed(const char *mode) { } bool FSWrapper::IsPathToReplace(const std::string_view &path) { - return path.starts_with(pPathToReplace); + if (!path.starts_with(pPathToReplace)) { + return false; + } + + if (std::ranges::any_of(pIgnorePaths.cbegin(), pIgnorePaths.cend(), [&path](auto &ignorePath) { return path.starts_with(ignorePath); })) { + return false; + } + + return true; } std::string FSWrapper::GetNewPath(const std::string_view &path) { diff --git a/src/FSWrapper.h b/src/FSWrapper.h index b9a2eb6..9da9ed0 100644 --- a/src/FSWrapper.h +++ b/src/FSWrapper.h @@ -10,16 +10,20 @@ class FSWrapper : public IFSWrapper { public: - FSWrapper(const std::string &name, const std::string &pathToReplace, const std::string &replacePathWith, bool fallbackOnError, bool isWriteable) { + FSWrapper(const std::string &name, const std::string &pathToReplace, const std::string &replacePathWith, bool fallbackOnError, bool isWriteable, std::vector ignorePaths = {}) { this->pName = name; this->pPathToReplace = pathToReplace; this->pReplacePathWith = replacePathWith; this->pFallbackOnError = fallbackOnError; this->pIsWriteable = isWriteable; this->pCheckIfDeleted = fallbackOnError; + this->pIgnorePaths = std::move(ignorePaths); std::replace(pPathToReplace.begin(), pPathToReplace.end(), '\\', '/'); std::replace(pReplacePathWith.begin(), pReplacePathWith.end(), '\\', '/'); + for (auto &ignorePath : pIgnorePaths) { + std::replace(ignorePath.begin(), ignorePath.end(), '\\', '/'); + } } ~FSWrapper() override { { @@ -129,6 +133,7 @@ protected: private: std::string pPathToReplace; std::string pReplacePathWith; + std::vector pIgnorePaths; bool pIsWriteable = false; std::mutex openFilesMutex; std::mutex openDirsMutex; diff --git a/src/export.cpp b/src/export.cpp index 5e60770..78c28a4 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -115,6 +115,10 @@ ContentRedirectionApiErrorType CRAddFSLayer(CRLayerHandle *handle, const char *l } else if (layerType == FS_LAYER_TYPE_SAVE_REPLACE) { DEBUG_FUNCTION_LINE_INFO("Redirecting \"/vol/save\" to \"%s\", mode: \"replace\"", replacementDir); ptr = make_unique_nothrow(layerName, "/vol/save", replacementDir, false, true); + } else if (layerType == FS_LAYER_TYPE_SAVE_REPLACE_IGNORE_VOL_SAVE_COMMON) { + DEBUG_FUNCTION_LINE_INFO("Redirecting \"/vol/save\" to \"%s\", mode: \"replace\", ignore: (\"/vol/save/common\")", replacementDir); + std::vector ignorePaths({"/vol/save/common"}); + ptr = make_unique_nothrow(layerName, "/vol/save", replacementDir, false, true, ignorePaths); } else { DEBUG_FUNCTION_LINE_ERR("CONTENT_REDIRECTION_API_ERROR_UNKNOWN_LAYER_DIR_TYPE: %s %s %d", layerName, replacementDir, layerType); return CONTENT_REDIRECTION_API_ERROR_UNKNOWN_FS_LAYER_TYPE;