Merge pull request #8802 from leoetlino/wiiroot-mii-db

WiiRoot: Fix empty files being created when source is missing
This commit is contained in:
JosJuice 2020-05-17 20:11:11 +02:00 committed by GitHub
commit 2250fbce0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 9 deletions

View File

@ -80,21 +80,21 @@ static void CopySave(FS::FileSystem* source, FS::FileSystem* dest, const u64 tit
static bool CopyNandFile(FS::FileSystem* source_fs, const std::string& source_file, static bool CopyNandFile(FS::FileSystem* source_fs, const std::string& source_file,
FS::FileSystem* dest_fs, const std::string& dest_file) FS::FileSystem* dest_fs, const std::string& dest_file)
{ {
const auto last_slash = dest_file.find_last_of('/');
if (last_slash != std::string::npos && last_slash > 0)
{
const std::string dir = dest_file.substr(0, last_slash);
dest_fs->CreateFullPath(IOS::PID_KERNEL, IOS::PID_KERNEL, dir + '/', 0,
{FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite});
}
auto source_handle = auto source_handle =
source_fs->OpenFile(IOS::PID_KERNEL, IOS::PID_KERNEL, source_file, IOS::HLE::FS::Mode::Read); source_fs->OpenFile(IOS::PID_KERNEL, IOS::PID_KERNEL, source_file, IOS::HLE::FS::Mode::Read);
// If the source file doesn't exist, there is nothing more to do.
// This function must not create an empty file on the destination filesystem.
if (!source_handle)
return true;
dest_fs->CreateFullPath(IOS::PID_KERNEL, IOS::PID_KERNEL, dest_file, 0,
{FS::Mode::ReadWrite, FS::Mode::ReadWrite, FS::Mode::ReadWrite});
auto dest_handle = auto dest_handle =
dest_fs->CreateAndOpenFile(IOS::PID_KERNEL, IOS::PID_KERNEL, source_file, dest_fs->CreateAndOpenFile(IOS::PID_KERNEL, IOS::PID_KERNEL, source_file,
{IOS::HLE::FS::Mode::ReadWrite, IOS::HLE::FS::Mode::ReadWrite, {IOS::HLE::FS::Mode::ReadWrite, IOS::HLE::FS::Mode::ReadWrite,
IOS::HLE::FS::Mode::ReadWrite}); IOS::HLE::FS::Mode::ReadWrite});
if (!source_handle || !dest_handle) if (!dest_handle)
return false; return false;
std::vector<u8> buffer(source_handle->GetStatus()->size); std::vector<u8> buffer(source_handle->GetStatus()->size);