summaryrefslogtreecommitdiff
path: root/Source/Core/Common/FatFsUtil.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2022-06-16 03:59:14 +0200
committerAdmiral H. Curtiss <pikachu025@gmail.com>2022-07-11 23:11:41 +0200
commita621fdf857460d0cb4cb493fd5dc4f3b69d37295 (patch)
treef4b21ab4dd4ebc5eccd7ef7fad99bb1b7e7224f8 /Source/Core/Common/FatFsUtil.cpp
parent1d12e95404049b8113d8d5a43d424b252dd9b1a4 (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.cpp22
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);