From eea2c204206b7b972f30bb9a06684c5eb726b730 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 11 Mar 2018 13:05:47 +0300 Subject: [PATCH] Improve vfs::mount Mount /dev_bdvd/PS3_GAME if necessary --- rpcs3/Emu/System.cpp | 9 +++++++-- rpcs3/Emu/VFS.cpp | 27 +++++++++++++++++++++------ rpcs3/Emu/VFS.h | 2 +- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 825a3765cd..e4d37ee3ed 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -513,12 +513,17 @@ void Emulator::Load(bool add_only) { // Don't need /dev_bdvd } - else if (disc.empty() && !from_hdd0_game) + else if (m_cat == "DG" && from_hdd0_game) + { + vfs::mount("dev_bdvd/PS3_GAME", hdd0_game + m_path.substr(hdd0_game.size(), 10)); + LOG_NOTICE(LOADER, "Game: %s", vfs::get("/dev_bdvd/PS3_GAME")); + } + else if (disc.empty()) { LOG_ERROR(LOADER, "Failed to mount disc directory for the disc game %s", m_title_id); return; } - else if (!disc.empty()) + else { bdvd_dir = disc; vfs::mount("dev_bdvd", bdvd_dir); diff --git a/rpcs3/Emu/VFS.cpp b/rpcs3/Emu/VFS.cpp index af3a4d909b..0368613838 100644 --- a/rpcs3/Emu/VFS.cpp +++ b/rpcs3/Emu/VFS.cpp @@ -18,20 +18,20 @@ bool vfs::mount(const std::string& dev_name, const std::string& path) { const auto table = fxm::get_always(); - writer_lock lock(table->mutex); + safe_writer_lock lock(table->mutex); return table->mounted.emplace(dev_name, path).second; } -std::string vfs::get(const std::string& vpath) +std::string vfs::get(const std::string& vpath, const std::string* prev, std::size_t pos) { const auto table = fxm::get_always(); - reader_lock lock(table->mutex); + safe_reader_lock lock(table->mutex); std::smatch match; - if (!std::regex_match(vpath, match, s_regex_ps3)) + if (!std::regex_match(vpath.begin() + pos, vpath.end(), match, s_regex_ps3)) { const auto found = table->mounted.find(""); @@ -44,15 +44,30 @@ std::string vfs::get(const std::string& vpath) return found->second + vfs::escape(vpath); } - if (match.length(1) == 0) + if (match.length(1) + pos == 0) { return "/"; } - const auto found = table->mounted.find(match.str(1)); + std::string dev; + + if (prev) + { + dev += *prev; + dev += '/'; + } + + dev += match.str(1); + + const auto found = table->mounted.find(dev); if (found == table->mounted.end()) { + if (match.length(2)) + { + return vfs::get(vpath, &dev, pos + match.position(1) + match.length(1)); + } + LOG_WARNING(GENERAL, "vfs::get(): device not found: %s", vpath); return {}; } diff --git a/rpcs3/Emu/VFS.h b/rpcs3/Emu/VFS.h index f8ec7e4873..ca6fe7e64f 100644 --- a/rpcs3/Emu/VFS.h +++ b/rpcs3/Emu/VFS.h @@ -8,7 +8,7 @@ namespace vfs bool mount(const std::string& dev_name, const std::string& path); // Convert VFS path to fs path - std::string get(const std::string& vpath); + std::string get(const std::string& vpath, const std::string* = nullptr, std::size_t = 0); // Escape VFS path by replacing non-portable characters with surrogates std::string escape(const std::string& path);