aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2021-08-20 13:36:14 -0700
committerGitHub <noreply@github.com>2021-08-20 13:36:14 -0700
commite0af248e6f96efe7009915935407fc809eb774a9 (patch)
treec2423a9b16ee246d18a0e2b75b03e802fa6e7776 /Ryujinx.HLE/HOS
parent97aedc030d24bc5e32fa95a297155f2df2ecfcc2 (diff)
Clean the SD card save directory when opening the emulator (#2564)
Cleans "sdcard:/Nintendo/save" and deletes "sdcard:/save" when opening the emulator. Works around invalid encryption when keys or the SD card encryption seed are changed.
Diffstat (limited to 'Ryujinx.HLE/HOS')
-rw-r--r--Ryujinx.HLE/HOS/LibHacHorizonManager.cs26
1 files changed, 26 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/LibHacHorizonManager.cs b/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
index 48077aa8..61e0227f 100644
--- a/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
+++ b/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
@@ -1,5 +1,8 @@
using LibHac;
using LibHac.Bcat;
+using LibHac.Common;
+using LibHac.Fs.Fsa;
+using LibHac.Fs.Shim;
using LibHac.FsSrv.Impl;
using LibHac.Loader;
using LibHac.Ncm;
@@ -57,6 +60,8 @@ namespace Ryujinx.HLE.HOS
virtualFileSystem.InitializeFsServer(Server, out var fsClient);
FsClient = fsClient;
+
+ CleanSdCardDirectory();
}
public void InitializeSystemClients()
@@ -80,6 +85,27 @@ namespace Ryujinx.HLE.HOS
npdm.FsAccessControlData, npdm.FsAccessControlDescriptor);
}
+ // This function was added to avoid errors that come from a user's keys or SD encryption seed changing.
+ // Catching these errors and recreating the file ended up not working because of the different ways
+ // applications respond to a file suddenly containing all zeros or having a length of zero.
+ // Clearing the SD card save directory was determined to be the best option for the moment since
+ // the saves on the SD card are meant as caches that can be deleted at any time.
+ private void CleanSdCardDirectory()
+ {
+ Result rc = RyujinxClient.Fs.MountSdCard("sdcard".ToU8Span());
+ if (rc.IsFailure()) return;
+
+ try
+ {
+ RyujinxClient.Fs.CleanDirectoryRecursively("sdcard:/Nintendo/save".ToU8Span()).IgnoreResult();
+ RyujinxClient.Fs.DeleteDirectoryRecursively("sdcard:/save".ToU8Span()).IgnoreResult();
+ }
+ finally
+ {
+ RyujinxClient.Fs.Unmount("sdcard".ToU8Span());
+ }
+ }
+
private static AccessControlBits.Bits AccountFsPermissions => AccessControlBits.Bits.SystemSaveData |
AccessControlBits.Bits.GameCard |
AccessControlBits.Bits.SaveDataMeta |