diff --git a/nx/include/switch/services/fs.h b/nx/include/switch/services/fs.h index 0c6ecd63..859dfdc9 100644 --- a/nx/include/switch/services/fs.h +++ b/nx/include/switch/services/fs.h @@ -181,6 +181,7 @@ Result fsFsOpenDirectory(FsFileSystem* fs, const char* path, int flags, FsDir* o Result fsFsCommit(FsFileSystem* fs); Result fsFsGetFreeSpace(FsFileSystem* fs, const char* path, u64* out); Result fsFsGetTotalSpace(FsFileSystem* fs, const char* path, u64* out); +Result fsFsCleanDirectoryRecursively(FsFileSystem* fs, const char* path); void fsFsClose(FsFileSystem* fs); // IFile diff --git a/nx/source/services/fs.c b/nx/source/services/fs.c index 90bc6574..8acb4ae1 100644 --- a/nx/source/services/fs.c +++ b/nx/source/services/fs.c @@ -842,6 +842,38 @@ Result fsFsGetTotalSpace(FsFileSystem* fs, const char* path, u64* out) { return rc; } +Result fsFsCleanDirectoryRecursively(FsFileSystem* fs, const char* path) { + IpcCommand c; + ipcInitialize(&c); + ipcAddSendStatic(&c, path, FS_MAX_PATH, 0); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 13; + + Result rc = serviceIpcDispatch(&fs->s); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + } *resp = r.Raw; + + rc = resp->result; + } + + return rc; +} + void fsFsClose(FsFileSystem* fs) { serviceClose(&fs->s); }