Always use configured root when installing WAD

This prevents Dolphin from writing to /sys/uid.sys (on the host; root
partition) when installing a WAD before starting emulation, because
the session root is not initialized at that moment.

Incidentally, this also gets rid of a singleton.
This commit is contained in:
Léo Lam 2017-02-08 21:37:12 +01:00
parent 96e83b5d54
commit 7a1f676ef4
4 changed files with 10 additions and 28 deletions

View File

@ -52,7 +52,6 @@ void Init()
if (SConfig::GetInstance().bWii) if (SConfig::GetInstance().bWii)
{ {
Core::InitializeWiiRoot(Core::g_want_determinism); Core::InitializeWiiRoot(Core::g_want_determinism);
DiscIO::cUIDsys::AccessInstance().UpdateLocation();
DiscIO::CSharedContent::AccessInstance().UpdateLocation(); DiscIO::CSharedContent::AccessInstance().UpdateLocation();
IOS::Init(); IOS::Init();
IOS::HLE::Init(); // Depends on Memory IOS::HLE::Init(); // Depends on Memory

View File

@ -121,7 +121,8 @@ void ES::OpenInternal()
m_TitleID = contentLoader.GetTitleID(); m_TitleID = contentLoader.GetTitleID();
m_TitleIDs.clear(); m_TitleIDs.clear();
DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDs); DiscIO::cUIDsys uid_sys{Common::FromWhichRoot::FROM_SESSION_ROOT};
uid_sys.GetTitleIDs(m_TitleIDs);
// uncomment if ES_GetOwnedTitlesCount / ES_GetOwnedTitles is implemented // uncomment if ES_GetOwnedTitlesCount / ES_GetOwnedTitles is implemented
// m_TitleIDsOwned.clear(); // m_TitleIDsOwned.clear();
// DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDsOwned, true); // DiscIO::cUIDsys::AccessInstance().GetTitleIDs(m_TitleIDsOwned, true);
@ -1324,7 +1325,8 @@ u32 ES::ES_DIVerify(const std::vector<u8>& tmd)
if (!tmd_file.WriteBytes(tmd.data(), tmd.size())) if (!tmd_file.WriteBytes(tmd.data(), tmd.size()))
ERROR_LOG(IOS_ES, "DIVerify failed to write disc TMD to NAND."); ERROR_LOG(IOS_ES, "DIVerify failed to write disc TMD to NAND.");
} }
DiscIO::cUIDsys::AccessInstance().AddTitle(tmd_title_id); DiscIO::cUIDsys uid_sys{Common::FromWhichRoot::FROM_SESSION_ROOT};
uid_sys.AddTitle(tmd_title_id);
// DI_VERIFY writes to title.tmd, which is read and cached inside the NAND Content Manager. // DI_VERIFY writes to title.tmd, which is read and cached inside the NAND Content Manager.
// clear the cache to avoid content access mismatches. // clear the cache to avoid content access mismatches.
DiscIO::CNANDContentManager::Access().ClearCache(); DiscIO::CNANDContentManager::Access().ClearCache();

View File

@ -398,16 +398,11 @@ void CNANDContentLoader::RemoveTitle() const
} }
} }
cUIDsys::cUIDsys() cUIDsys::cUIDsys(Common::FromWhichRoot root)
{
UpdateLocation();
}
void cUIDsys::UpdateLocation()
{ {
m_Elements.clear(); m_Elements.clear();
m_LastUID = 0x00001000; m_LastUID = 0x00001000;
m_UidSys = File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/sys/uid.sys"; m_UidSys = Common::RootUserPath(root) + "/sys/uid.sys";
File::IOFile pFile(m_UidSys, "rb"); File::IOFile pFile(m_UidSys, "rb");
SElement Element; SElement Element;
@ -430,10 +425,6 @@ void cUIDsys::UpdateLocation()
} }
} }
cUIDsys::~cUIDsys()
{
}
u32 cUIDsys::GetUIDFromTitle(u64 title_id) u32 cUIDsys::GetUIDFromTitle(u64 title_id)
{ {
for (auto& Element : m_Elements) for (auto& Element : m_Elements)
@ -541,7 +532,8 @@ u64 CNANDContentManager::Install_WiiWAD(const std::string& filename)
return 0; return 0;
} }
cUIDsys::AccessInstance().AddTitle(title_id); cUIDsys uid_sys{Common::FromWhichRoot::FROM_CONFIGURED_ROOT};
uid_sys.AddTitle(title_id);
ClearCache(); ClearCache();

View File

@ -188,27 +188,16 @@ private:
std::vector<SElement> m_Elements; std::vector<SElement> m_Elements;
}; };
class cUIDsys class cUIDsys final
{ {
public: public:
static cUIDsys& AccessInstance() explicit cUIDsys(Common::FromWhichRoot root);
{
static cUIDsys instance;
return instance;
}
u32 GetUIDFromTitle(u64 title_id); u32 GetUIDFromTitle(u64 title_id);
void AddTitle(u64 title_id); void AddTitle(u64 title_id);
void GetTitleIDs(std::vector<u64>& title_ids, bool owned = false); void GetTitleIDs(std::vector<u64>& title_ids, bool owned = false);
void UpdateLocation();
private: private:
cUIDsys();
virtual ~cUIDsys();
cUIDsys(cUIDsys const&) = delete;
void operator=(cUIDsys const&) = delete;
#pragma pack(push, 1) #pragma pack(push, 1)
struct SElement struct SElement
{ {