diff --git a/libctru/include/3ds/services/fs.h b/libctru/include/3ds/services/fs.h index b062f8d..a20fb9b 100644 --- a/libctru/include/3ds/services/fs.h +++ b/libctru/include/3ds/services/fs.h @@ -138,6 +138,7 @@ Result FSUSER_OpenDirectory(Handle* handle, Handle* out, FS_archive archive, FS_ Result FSUSER_OpenFile(Handle* handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes); Result FSUSER_OpenFileDirectly(Handle* handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes); Result FSUSER_CloseArchive(Handle* handle, FS_archive* archive); +Result FSUSER_CreateFile(Handle* handle, FS_archive archive, FS_path fileLowPath, u32 fileSize); Result FSUSER_CreateDirectory(Handle* handle, FS_archive archive, FS_path dirLowPath); Result FSUSER_DeleteFile(Handle *handle, FS_archive archive, FS_path fileLowPath); Result FSUSER_DeleteDirectory(Handle *handle, FS_archive archive, FS_path dirLowPath); diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index e0c37fc..37d1796 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -449,11 +449,68 @@ FSUSER_DeleteDirectoryRecursively(void) return -1; } -/* stub */ +/*! Create a File + * + * @param[in] handle fs:USER handle + * @param[in] archive Open archive + * @param[in] fileLowPath File path + * @param[in] fileSize Size of new file in bytes + * + * @returns error + * + * @internal + * + * #### Request + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code [0x08060142] + * 1 | 0 + * 2 | archive.handleLow + * 3 | archive.handleHigh + * 4 | fileLowPath.type + * 5 | fileLowPath.size + * 6 | 0 + * 7 | fileSize + * 8 | 0 + * 9 | (fileLowPath.size << 14) \| 0x2 + * 10 | fileLowPath.data + * + * #### Response + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code + * 1 | Result code + */ Result -FSUSER_CreateFile(void) +FSUSER_CreateFile(Handle* handle, + FS_archive archive, + FS_path fileLowPath, + u32 fileSize) { - return -1; + if(!handle) + handle = &fsuHandle; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x08080202; + cmdbuf[1] = 0; + cmdbuf[2] = archive.handleLow; + cmdbuf[3] = archive.handleHigh; + cmdbuf[4] = fileLowPath.type; + cmdbuf[5] = fileLowPath.size; + cmdbuf[6] = 0; + cmdbuf[7] = fileSize; + cmdbuf[8] = 0; + cmdbuf[9] = (fileLowPath.size << 14) | 0x2; + cmdbuf[10] = (u32)fileLowPath.data; + + Result ret = 0; + if((ret = svcSendSyncRequest(*handle))) + return ret; + + return cmdbuf[1]; } /*! Create a directory