WFSI: Handle PATCH_TYPE_2 properly in IOCTL_WFSI_FINALIZE_TITLE_INSTALL

This commit is contained in:
Sepalani 2018-12-01 18:22:54 +04:00
parent f351280061
commit 5bb7cd251e
2 changed files with 49 additions and 18 deletions

View File

@ -117,6 +117,15 @@ void WFSI::SetImportTitleIdAndGroupId(u64 tid, u16 gid)
m_import_group_id_str = GroupIdStr(gid); m_import_group_id_str = GroupIdStr(gid);
} }
void WFSI::FinalizePatchInstall()
{
const std::string current_title_dir =
StringFromFormat("/vol/%s/title/%s/%s", m_device_name.c_str(), m_current_group_id_str.c_str(),
m_current_title_id_str.c_str());
const std::string patch_dir = current_title_dir + "/_patch";
File::CopyDir(WFS::NativePath(patch_dir), WFS::NativePath(current_title_dir), true);
}
IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request) IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request)
{ {
s32 return_error_code = IPC_SUCCESS; s32 return_error_code = IPC_SUCCESS;
@ -258,7 +267,43 @@ IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request)
case IOCTL_WFSI_FINALIZE_TITLE_INSTALL: case IOCTL_WFSI_FINALIZE_TITLE_INSTALL:
{ {
std::string tmd_path; std::string tmd_path;
if (m_patch_type == NOT_A_PATCH)
switch (m_patch_type)
{
case PATCH_TYPE_2:
{
// Delete content's default.dol
const std::string title_content_dir =
StringFromFormat("/vol/%s/title/%s/%s/content/", m_device_name.c_str(),
m_current_group_id_str.c_str(), m_current_title_id_str.c_str());
File::Delete(WFS::NativePath(title_content_dir + "default.dol"));
// Copy content's _default.dol to patch's directory
const std::string patch_dir =
StringFromFormat("/vol/%s/title/%s/%s/_patch/", m_device_name.c_str(),
m_current_group_id_str.c_str(), m_current_title_id_str.c_str());
const std::string patch_content_dir = patch_dir + "content/";
File::CreateDir(WFS::NativePath(patch_dir));
File::CreateDir(WFS::NativePath(patch_content_dir));
File::Rename(WFS::NativePath(title_content_dir + "_default.dol"),
WFS::NativePath(patch_content_dir + "default.dol"));
FinalizePatchInstall();
[[fallthrough]];
}
case PATCH_TYPE_1:
{
std::string patch_dir =
StringFromFormat("/vol/%s/title/%s/%s/_patch", m_device_name.c_str(),
m_current_group_id_str.c_str(), m_current_title_id_str.c_str());
File::DeleteDirRecursively(WFS::NativePath(patch_dir));
tmd_path = StringFromFormat("/vol/%s/title/%s/%s/meta/%016" PRIx64 ".tmd",
m_device_name.c_str(), m_current_group_id_str.c_str(),
m_current_title_id_str.c_str(), m_import_title_id);
break;
}
case NOT_A_PATCH:
{ {
std::string title_install_dir = StringFromFormat("/vol/%s/_install/%s", m_device_name.c_str(), std::string title_install_dir = StringFromFormat("/vol/%s/_install/%s", m_device_name.c_str(),
m_import_title_id_str.c_str()); m_import_title_id_str.c_str());
@ -270,17 +315,8 @@ IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request)
tmd_path = StringFromFormat("/vol/%s/title/%s/%s/meta/%016" PRIx64 ".tmd", tmd_path = StringFromFormat("/vol/%s/title/%s/%s/meta/%016" PRIx64 ".tmd",
m_device_name.c_str(), m_import_group_id_str.c_str(), m_device_name.c_str(), m_import_group_id_str.c_str(),
m_import_title_id_str.c_str(), m_import_title_id); m_import_title_id_str.c_str(), m_import_title_id);
break;
} }
else
{
std::string patch_dir =
StringFromFormat("/vol/%s/title/%s/%s/_patch", m_device_name.c_str(),
m_current_group_id_str.c_str(), m_current_title_id_str.c_str());
File::DeleteDirRecursively(WFS::NativePath(patch_dir));
tmd_path = StringFromFormat("/vol/%s/title/%s/%s/meta/%016" PRIx64 ".tmd",
m_device_name.c_str(), m_current_group_id_str.c_str(),
m_current_title_id_str.c_str(), m_import_title_id);
} }
File::IOFile tmd_file(WFS::NativePath(tmd_path), "wb"); File::IOFile tmd_file(WFS::NativePath(tmd_path), "wb");
@ -292,13 +328,7 @@ IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request)
{ {
INFO_LOG(IOS_WFS, "IOCTL_WFSI_FINALIZE_PATCH_INSTALL"); INFO_LOG(IOS_WFS, "IOCTL_WFSI_FINALIZE_PATCH_INSTALL");
if (m_patch_type != NOT_A_PATCH) if (m_patch_type != NOT_A_PATCH)
{ FinalizePatchInstall();
std::string current_title_dir =
StringFromFormat("/vol/%s/title/%s/%s", m_device_name.c_str(),
m_current_group_id_str.c_str(), m_current_title_id_str.c_str());
std::string patch_dir = current_title_dir + "/_patch";
File::CopyDir(WFS::NativePath(patch_dir), WFS::NativePath(current_title_dir), true);
}
break; break;
} }

View File

@ -46,6 +46,7 @@ private:
void SetCurrentTitleIdAndGroupId(u64 tid, u16 gid); void SetCurrentTitleIdAndGroupId(u64 tid, u16 gid);
void SetImportTitleIdAndGroupId(u64 tid, u16 gid); void SetImportTitleIdAndGroupId(u64 tid, u16 gid);
void FinalizePatchInstall();
s32 CancelTitleImport(bool continue_install); s32 CancelTitleImport(bool continue_install);
s32 CancelPatchImport(bool continue_install); s32 CancelPatchImport(bool continue_install);