diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index c0d549f6..25c00423 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -179,8 +179,8 @@ typedef enum } FsFileSystemType; /// Mount requested filesystem type from content file -Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); /// only on 1.0.0 -Result fsOpenFileSystemWithId(FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath); /// 2.0.0+ +Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath); +Result fsOpenFileSystemWithId(FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath); // IFileSystem Result fsFsCreateFile(FsFileSystem* fs, const char* path, size_t size, int flags); diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index d1479185..f954ea94 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -4,6 +4,7 @@ #include "result.h" #include "arm/atomics.h" #include "kernel/ipc.h" +#include "kernel/detect.h" #include "services/fs.h" #include "services/sm.h" @@ -433,44 +434,7 @@ Result fsMount_SystemSaveData(FsFileSystem* out, u64 saveID) { } Result fsOpenFileSystem(FsFileSystem* out, FsFileSystemType fsType, const char* contentPath) { - char sendStr[FS_MAX_PATH] = {0}; - strncpy(sendStr, contentPath, sizeof(sendStr)-1); - - IpcCommand c; - ipcInitialize(&c); - ipcAddSendStatic(&c, sendStr, sizeof(sendStr), 0); - - struct { - u64 magic; - u64 cmd_id; - u32 fsType; - } *raw; - - raw = ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 0; - raw->fsType = fsType; - - Result rc = serviceIpcDispatch(&g_fsSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - } *resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - serviceCreate(&out->s, r.Handles[0]); - } - } - - return rc; + return fsOpenFileSystemWithId(out, 0, fsType, contentPath); } Result fsOpenFileSystemWithId(FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath) { @@ -481,19 +445,34 @@ Result fsOpenFileSystemWithId(FsFileSystem* out, u64 titleId, FsFileSystemType f ipcInitialize(&c); ipcAddSendStatic(&c, sendStr, sizeof(sendStr), 0); - struct { - u64 magic; - u64 cmd_id; - u32 fsType; - u64 titleId; - } *raw; - - raw = ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 8; - raw->fsType = fsType; - raw->titleId = titleId; + if (kernelAbove200()) { + struct { + u64 magic; + u64 cmd_id; + u32 fsType; + u64 titleId; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 8; + raw->fsType = fsType; + raw->titleId = titleId; + } + else { + struct { + u64 magic; + u64 cmd_id; + u32 fsType; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 0; + raw->fsType = fsType; + } Result rc = serviceIpcDispatch(&g_fsSrv);