mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 10:17:22 +01:00
fix: Fix broken case for relative symlinks
Currently, the game will have issues saving files to a relative symlink (for example, when a .DAT file is a symlink pointing to ../CHR_12345/HOTBAR.DAT). This change replaces the symlink resolution system with one that calls `weakly_canonical` to resolve and clean up the path in a single operation.
This commit is contained in:
parent
9b066fde01
commit
e6beb2a19e
1 changed files with 7 additions and 7 deletions
|
|
@ -437,13 +437,13 @@ void xivfixes::backup_userdata_save(bool bApply) {
|
|||
if (ext != ".dat" && ext != ".cfg")
|
||||
return s_hookCreateFileW->call_original(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
|
||||
for (auto i = 0; i < 16; i++) {
|
||||
// Resolve any symbolic links or shenanigans in the chain so that we'll always be working with a canonical
|
||||
// file. If there's an error getting the canonical path, fall back to default behavior and ignore our
|
||||
// fancy logic. We use weakly_canonical here so that we don't run into issues if `path` does not exist.
|
||||
std::error_code ec;
|
||||
auto resolved = read_symlink(path, ec);
|
||||
if (ec || resolved == path)
|
||||
break;
|
||||
path = std::move(resolved);
|
||||
}
|
||||
path = weakly_canonical(path, ec);
|
||||
if (ec)
|
||||
return s_hookCreateFileW->call_original(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
|
||||
std::filesystem::path temporaryPath = path;
|
||||
temporaryPath.replace_extension(std::format(L"{}.new.{:X}.{:X}", path.extension().c_str(), std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count(), GetCurrentProcessId()));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue