Improve Trophy Installer robustness

Relax paranoidal mount point locking and temp dir creation mechanism.
It was incompatible with a setup where user directory is symlinked.
Instead, create temp dir as close to target as possible (see savedata).
This commit is contained in:
Nekotekina 2020-10-01 22:00:57 +03:00
parent 56cebd99c2
commit 0ac3dbfec9
2 changed files with 5 additions and 6 deletions

View file

@ -23,6 +23,7 @@ namespace vfs
// Functions in this namespace operate on host filepaths, similar to fs::
namespace host
{
// For internal use (don't use)
std::string hash_path(const std::string& path, const std::string& dev_root);
// Call fs::rename with retry on access error

View file

@ -1,7 +1,5 @@
#include "stdafx.h"
#include "Emu/VFS.h"
#include "Emu/System.h"
#include "Emu/Cell/lv2/sys_fs.h"
#include "TRP.h"
#include "Crypto/sha1.h"
#include "Utilities/StrUtil.h"
@ -25,7 +23,7 @@ bool TRPLoader::Install(const std::string& dest, bool show)
const std::string& local_path = vfs::get(dest);
const auto temp = vfs::host::hash_path(local_path, Emu.GetHddDir()) + '/';
const auto temp = fmt::format(u8"%s.temp%u", local_path, __rdtsc());
if (!fs::create_dir(temp))
{
@ -49,7 +47,7 @@ bool TRPLoader::Install(const std::string& dest, bool show)
}
// Create the file in the temporary directory
success = fs::write_file(temp + vfs::escape(entry.name), fs::create + fs::excl, buffer);
success = fs::write_file(temp + '/' + vfs::escape(entry.name), fs::create + fs::excl, buffer);
if (!success)
{
break;
@ -58,7 +56,7 @@ bool TRPLoader::Install(const std::string& dest, bool show)
if (success)
{
success = vfs::host::remove_all(local_path, Emu.GetHddDir(), &g_mp_sys_dev_hdd0, true) || !fs::is_dir(local_path);
success = fs::remove_all(local_path) || !fs::is_dir(local_path);
if (success)
{
@ -70,7 +68,7 @@ bool TRPLoader::Install(const std::string& dest, bool show)
if (!success)
{
// Remove temporary directory manually on failure (removed automatically on success)
auto old_error = fs::g_tls_error;
auto old_error = fs::g_tls_error;
fs::remove_all(temp);
fs::g_tls_error = old_error;
}