diff options
| author | Admiral H. Curtiss <pikachu025@gmail.com> | 2022-06-16 03:59:14 +0200 |
|---|---|---|
| committer | Admiral H. Curtiss <pikachu025@gmail.com> | 2022-07-11 23:11:41 +0200 |
| commit | a621fdf857460d0cb4cb493fd5dc4f3b69d37295 (patch) | |
| tree | f4b21ab4dd4ebc5eccd7ef7fad99bb1b7e7224f8 /Source/Core/Common/FatFsUtil.cpp | |
| parent | 1d12e95404049b8113d8d5a43d424b252dd9b1a4 (diff) | |
Core: In deterministic mode, build SD cards with a consistent filename order and dummy timestamps.
Diffstat (limited to 'Source/Core/Common/FatFsUtil.cpp')
| -rw-r--r-- | Source/Core/Common/FatFsUtil.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
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<u8>& 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); |
