diff --git a/nx/include/switch/runtime/devices/fs_dev.h b/nx/include/switch/runtime/devices/fs_dev.h index 84e0d394..881d1af2 100644 --- a/nx/include/switch/runtime/devices/fs_dev.h +++ b/nx/include/switch/runtime/devices/fs_dev.h @@ -33,6 +33,10 @@ Result fsdevMountSdmc(void); /// Mounts the specified SaveData. Result fsdevMountSaveData(const char *name, u64 application_id, AccountUid uid); +/// Mounts the specified SaveData as ReadOnly. +/// Only available on [2.0.0+]. +Result fsdevMountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid); + /// Mounts the specified BcatSaveData. Result fsdevMountBcatSaveData(const char *name, u64 application_id); diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index 4f750887..dabc8e0a 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -323,16 +323,17 @@ Result fsOpenBisStorage(FsStorage* out, FsBisPartitionId partitionId); Result fsOpenSdCardFileSystem(FsFileSystem* out); Result fsCreateSaveDataFileSystemBySystemSaveDataId(const FsSaveDataAttribute* attr, const FsSaveDataCreationInfo* creation_info); -Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); /// [2.0.0+] +Result fsDeleteSaveDataFileSystemBySaveDataSpaceId(FsSaveDataSpaceId save_data_space_id, u64 saveID); ///< [2.0.0+] Result fsIsExFatSupported(bool* out); Result fsOpenGameCardFileSystem(FsFileSystem* out, const FsGameCardHandle* handle, FsGameCardPartition partition); -Result fsExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); /// [3.0.0+] +Result fsExtendSaveDataFileSystem(FsSaveDataSpaceId save_data_space_id, u64 saveID, s64 dataSize, s64 journalSize); ///< [3.0.0+] Result fsOpenSaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); Result fsOpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); +Result fsOpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr); ///< [2.0.0+]. Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID); Result fsReadSaveDataFileSystemExtraData(void* buf, size_t len, u64 saveID); @@ -342,7 +343,7 @@ Result fsOpenSaveDataInfoReader(FsSaveDataInfoReader* out, FsSaveDataSpaceId sav Result fsOpenImageDirectoryFileSystem(FsFileSystem* out, FsImageDirectoryId image_directory_id); Result fsOpenContentStorageFileSystem(FsFileSystem* out, FsContentStorageId content_storage_id); -Result fsOpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); /// [7.0.0+] +Result fsOpenCustomStorageFileSystem(FsFileSystem* out, FsCustomStorageId custom_storage_id); ///< [7.0.0+] Result fsOpenDataStorageByCurrentProcess(FsStorage* out); Result fsOpenDataStorageByDataId(FsStorage* out, u64 dataId, NcmStorageId storageId); @@ -371,6 +372,11 @@ Result fsCreate_SystemSaveData(FsSaveDataSpaceId save_data_space_id, u64 system_ /// See \ref FsSaveDataAttribute for application_id and uid. Result fsOpen_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid); +/// Wrapper for fsOpenReadOnlySaveDataFileSystem. +/// Only available on [2.0.0+]. +/// See \ref FsSaveDataAttribute for application_id and uid. +Result fsOpen_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid); + /// Wrapper for fsOpenSaveDataFileSystem, for opening BcatSaveData. Result fsOpen_BcatSaveData(FsFileSystem* out, u64 application_id); diff --git a/nx/source/runtime/devices/fs_dev.c b/nx/source/runtime/devices/fs_dev.c index 619ab9ce..97ba9890 100644 --- a/nx/source/runtime/devices/fs_dev.c +++ b/nx/source/runtime/devices/fs_dev.c @@ -465,6 +465,19 @@ Result fsdevMountSaveData(const char *name, u64 application_id, AccountUid uid) return rc; } +Result fsdevMountSaveDataReadOnly(const char *name, u64 application_id, AccountUid uid) +{ + FsFileSystem fs; + Result rc = fsOpen_SaveDataReadOnly(&fs, application_id, uid); + if(R_SUCCEEDED(rc)) + { + int ret = fsdevMountDevice(name, fs); + if(ret==-1) + rc = MAKERESULT(Module_Libnx, LibnxError_OutOfMemory); + } + return rc; +} + Result fsdevMountBcatSaveData(const char *name, u64 application_id) { FsFileSystem fs; diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index 96c28b34..2f9f3aac 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -293,6 +293,22 @@ Result fsOpenSaveDataFileSystemBySystemSaveDataId(FsFileSystem* out, FsSaveDataS ); } +Result fsOpenReadOnlySaveDataFileSystem(FsFileSystem* out, FsSaveDataSpaceId save_data_space_id, const FsSaveDataAttribute *attr) { + if (hosversionBefore(2,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + const struct { + u8 save_data_space_id; + u8 pad[7]; + FsSaveDataAttribute attr; + } in = { (u8)save_data_space_id, {0}, *attr }; + + return _fsObjectDispatchIn(&g_fsSrv, 53, in, + .out_num_objects = 1, + .out_objects = &out->s, + ); +} + Result fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(void* buf, size_t len, FsSaveDataSpaceId save_data_space_id, u64 saveID) { if (hosversionBefore(3,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); @@ -494,6 +510,17 @@ Result fsOpen_SaveData(FsFileSystem* out, u64 application_id, AccountUid uid) { return fsOpenSaveDataFileSystem(out, FsSaveDataSpaceId_User, &attr); } +Result fsOpen_SaveDataReadOnly(FsFileSystem* out, u64 application_id, AccountUid uid) { + FsSaveDataAttribute attr; + + memset(&attr, 0, sizeof(attr)); + attr.application_id = application_id; + attr.uid = uid; + attr.save_data_type = FsSaveDataType_Account; + + return fsOpenReadOnlySaveDataFileSystem(out, FsSaveDataSpaceId_User, &attr); +} + Result fsOpen_BcatSaveData(FsFileSystem* out, u64 application_id) { FsSaveDataAttribute attr;