From a621fdf857460d0cb4cb493fd5dc4f3b69d37295 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Thu, 16 Jun 2022 03:59:14 +0200 Subject: Core: In deterministic mode, build SD cards with a consistent filename order and dummy timestamps. --- Source/Core/Common/FatFsUtil.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'Source/Core/Common/FatFsUtil.cpp') diff --git a/Source/Core/Common/FatFsUtil.cpp b/Source/Core/Common/FatFsUtil.cpp index ffd42e68ab..7e0c2e2a21 100644 --- a/Source/Core/Common/FatFsUtil.cpp +++ b/Source/Core/Common/FatFsUtil.cpp @@ -30,6 +30,7 @@ enum : u32 static std::mutex s_fatfs_mutex; static File::IOFile s_image; +static bool s_deterministic; extern "C" DSTATUS disk_status(BYTE pdrv) { @@ -96,6 +97,9 @@ extern "C" DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff) extern "C" DWORD get_fattime(void) { + if (s_deterministic) + return 0; + const std::time_t time = std::time(nullptr); std::tm tm; #ifdef _WIN32 @@ -286,13 +290,26 @@ static bool Pack(const File::FSTEntry& entry, bool is_root, std::vector& tmp return true; } -bool SyncSDFolderToSDImage() +static void SortFST(File::FSTEntry* root) +{ + std::sort(root->children.begin(), root->children.end(), + [](const File::FSTEntry& lhs, const File::FSTEntry& rhs) { + return lhs.virtualName < rhs.virtualName; + }); + for (auto& child : root->children) + SortFST(&child); +} + +bool SyncSDFolderToSDImage(bool deterministic) { + deterministic = true; const std::string root_path = File::GetUserPath(D_WIISDCARDSYNCFOLDER_IDX); if (!File::IsDirectory(root_path)) return false; - const File::FSTEntry root = File::ScanDirectoryTree(root_path, true); + File::FSTEntry root = File::ScanDirectoryTree(root_path, true); + if (deterministic) + SortFST(&root); if (!CheckIfFATCompatible(root)) return false; @@ -302,6 +319,7 @@ bool SyncSDFolderToSDImage() size = AlignUp(size, MAX_CLUSTER_SIZE); std::lock_guard lk(s_fatfs_mutex); + s_deterministic = deterministic; const std::string image_path = File::GetUserPath(F_WIISDCARDIMAGE_IDX); const std::string temp_image_path = File::GetTempFilenameForAtomicWrite(image_path); -- cgit v1.2.3