WFSI: Implement patch install finalization.

This commit is contained in:
Pierre Bourdon 2017-08-17 16:45:39 +02:00 committed by Léo Lam
parent 76bbfbb511
commit a641609857
3 changed files with 24 additions and 6 deletions

View File

@ -521,7 +521,7 @@ bool DeleteDirRecursively(const std::string& directory)
} }
// Create directory and copy contents (does not overwrite existing files) // Create directory and copy contents (does not overwrite existing files)
void CopyDir(const std::string& source_path, const std::string& dest_path) void CopyDir(const std::string& source_path, const std::string& dest_path, bool destructive)
{ {
if (source_path == dest_path) if (source_path == dest_path)
return; return;
@ -562,10 +562,16 @@ void CopyDir(const std::string& source_path, const std::string& dest_path)
{ {
if (!Exists(dest)) if (!Exists(dest))
File::CreateFullPath(dest + DIR_SEP); File::CreateFullPath(dest + DIR_SEP);
CopyDir(source, dest); CopyDir(source, dest, destructive);
}
else if (!Exists(dest) && !destructive)
{
Copy(source, dest);
}
else
{
Rename(source, dest);
} }
else if (!Exists(dest))
File::Copy(source, dest);
#ifdef _WIN32 #ifdef _WIN32
} while (FindNextFile(hFind, &ffd) != 0); } while (FindNextFile(hFind, &ffd) != 0);
FindClose(hFind); FindClose(hFind);

View File

@ -156,8 +156,9 @@ bool DeleteDirRecursively(const std::string& directory);
// Returns the current directory // Returns the current directory
std::string GetCurrentDir(); std::string GetCurrentDir();
// Create directory and copy contents (does not overwrite existing files) // Create directory and copy contents (optionally overwrites existing files)
void CopyDir(const std::string& source_path, const std::string& dest_path); void CopyDir(const std::string& source_path, const std::string& dest_path,
bool destructive = false);
// Set the current directory to given directory // Set the current directory to given directory
bool SetCurrentDir(const std::string& directory); bool SetCurrentDir(const std::string& directory);

View File

@ -276,7 +276,18 @@ IPCCommandResult WFSI::IOCtl(const IOCtlRequest& request)
} }
case IOCTL_WFSI_FINALIZE_PATCH_INSTALL: case IOCTL_WFSI_FINALIZE_PATCH_INSTALL:
{
INFO_LOG(IOS, "IOCTL_WFSI_FINALIZE_PATCH_INSTALL");
if (m_patch_type != NOT_A_PATCH)
{
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;
}
case IOCTL_WFSI_DELETE_TITLE: case IOCTL_WFSI_DELETE_TITLE:
// Bytes 0-4: ?? // Bytes 0-4: ??