Merge pull request #163 from archshift/create-directory
Added CreateDirectory function to service/fs.cpp, and in Archive.
This commit is contained in:
		| @@ -56,6 +56,13 @@ public: | |||||||
|      */ |      */ | ||||||
|     virtual std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const = 0; |     virtual std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const = 0; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Create a directory specified by its path | ||||||
|  |      * @param path Path relative to the archive | ||||||
|  |      * @return Whether the directory could be created | ||||||
|  |      */ | ||||||
|  |     virtual bool CreateDirectory(const std::string& path) const = 0; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Open a directory specified by its path |      * Open a directory specified by its path | ||||||
|      * @param path Path relative to the archive |      * @param path Path relative to the archive | ||||||
|   | |||||||
| @@ -33,6 +33,16 @@ std::unique_ptr<File> Archive_RomFS::OpenFile(const std::string& path, const Mod | |||||||
|     return std::unique_ptr<File>(new File_RomFS); |     return std::unique_ptr<File>(new File_RomFS); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Create a directory specified by its path | ||||||
|  |  * @param path Path relative to the archive | ||||||
|  |  * @return Whether the directory could be created | ||||||
|  |  */ | ||||||
|  | bool Archive_RomFS::CreateDirectory(const std::string& path) const { | ||||||
|  |     ERROR_LOG(FILESYS, "Attempted to create a directory in ROMFS."); | ||||||
|  |     return false; | ||||||
|  | }; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Open a directory specified by its path |  * Open a directory specified by its path | ||||||
|  * @param path Path relative to the archive |  * @param path Path relative to the archive | ||||||
|   | |||||||
| @@ -36,6 +36,13 @@ public: | |||||||
|      */ |      */ | ||||||
|     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; |     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Create a directory specified by its path | ||||||
|  |      * @param path Path relative to the archive | ||||||
|  |      * @return Whether the directory could be created | ||||||
|  |      */ | ||||||
|  |     bool CreateDirectory(const std::string& path) const override; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Open a directory specified by its path |      * Open a directory specified by its path | ||||||
|      * @param path Path relative to the archive |      * @param path Path relative to the archive | ||||||
|   | |||||||
| @@ -57,6 +57,15 @@ std::unique_ptr<File> Archive_SDMC::OpenFile(const std::string& path, const Mode | |||||||
|     return std::unique_ptr<File>(file); |     return std::unique_ptr<File>(file); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Create a directory specified by its path | ||||||
|  |  * @param path Path relative to the archive | ||||||
|  |  * @return Whether the directory could be created | ||||||
|  |  */ | ||||||
|  | bool Archive_SDMC::CreateDirectory(const std::string& path) const { | ||||||
|  |     return FileUtil::CreateDir(GetMountPoint() + path); | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Open a directory specified by its path |  * Open a directory specified by its path | ||||||
|  * @param path Path relative to the archive |  * @param path Path relative to the archive | ||||||
|   | |||||||
| @@ -40,6 +40,13 @@ public: | |||||||
|      */ |      */ | ||||||
|     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; |     std::unique_ptr<File> OpenFile(const std::string& path, const Mode mode) const override; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Create a directory specified by its path | ||||||
|  |      * @param path Path relative to the archive | ||||||
|  |      * @return Whether the directory could be created | ||||||
|  |      */ | ||||||
|  |     bool CreateDirectory(const std::string& path) const override; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Open a directory specified by its path |      * Open a directory specified by its path | ||||||
|      * @param path Path relative to the archive |      * @param path Path relative to the archive | ||||||
|   | |||||||
| @@ -380,6 +380,21 @@ Handle OpenFileFromArchive(Handle archive_handle, const std::string& path, const | |||||||
|     return handle; |     return handle; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Create a Directory from an Archive | ||||||
|  |  * @param archive_handle Handle to an open Archive object | ||||||
|  |  * @param path Path to the Directory inside of the Archive | ||||||
|  |  * @return Opened Directory object | ||||||
|  |  */ | ||||||
|  | Result CreateDirectoryFromArchive(Handle archive_handle, const std::string& path) { | ||||||
|  |     Archive* archive = Kernel::g_object_pool.GetFast<Archive>(archive_handle); | ||||||
|  |     if (archive == nullptr) | ||||||
|  |         return -1; | ||||||
|  |     if (archive->backend->CreateDirectory(path)) | ||||||
|  |         return 0; | ||||||
|  |     return -1; | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Open a Directory from an Archive |  * Open a Directory from an Archive | ||||||
|  * @param archive_handle Handle to an open Archive object |  * @param archive_handle Handle to an open Archive object | ||||||
|   | |||||||
| @@ -43,7 +43,15 @@ Handle CreateArchive(FileSys::Archive* backend, const std::string& name); | |||||||
|  * @param mode Mode under which to open the File |  * @param mode Mode under which to open the File | ||||||
|  * @return Opened File object |  * @return Opened File object | ||||||
|  */ |  */ | ||||||
| Handle OpenFileFromArchive(Handle handle, const std::string& name, const FileSys::Mode mode); | Handle OpenFileFromArchive(Handle archive_handle, const std::string& name, const FileSys::Mode mode); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Create a Directory from an Archive | ||||||
|  |  * @param archive_handle Handle to an open Archive object | ||||||
|  |  * @param path Path to the Directory inside of the Archive | ||||||
|  |  * @return Whether creation of directory succeeded | ||||||
|  |  */ | ||||||
|  | Result CreateDirectoryFromArchive(Handle archive_handle, const std::string& name); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Open a Directory from an Archive |  * Open a Directory from an Archive | ||||||
| @@ -51,7 +59,7 @@ Handle OpenFileFromArchive(Handle handle, const std::string& name, const FileSys | |||||||
|  * @param path Path to the Directory inside of the Archive |  * @param path Path to the Directory inside of the Archive | ||||||
|  * @return Opened Directory object |  * @return Opened Directory object | ||||||
|  */ |  */ | ||||||
| Handle OpenDirectoryFromArchive(Handle handle, const std::string& name); | Handle OpenDirectoryFromArchive(Handle archive_handle, const std::string& name); | ||||||
|  |  | ||||||
| /// Initialize archives | /// Initialize archives | ||||||
| void ArchiveInit(); | void ArchiveInit(); | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ void OpenFileDirectly(Service::Interface* self) { | |||||||
|     std::string archive_name = GetStringFromCmdBuff(archive_pointer, archive_size); |     std::string archive_name = GetStringFromCmdBuff(archive_pointer, archive_size); | ||||||
|     std::string file_name = GetStringFromCmdBuff(pointer, size); |     std::string file_name = GetStringFromCmdBuff(pointer, size); | ||||||
|  |  | ||||||
|     DEBUG_LOG(KERNEL, "archive_type=%d archive_size=%d archive_data=%s" |     DEBUG_LOG(KERNEL, "archive_type=%d archive_size=%d archive_data=%s " | ||||||
|                       "file_type=%d file_size=%d file_mode=%d file_attrs=%d file_data=%s", |                       "file_type=%d file_size=%d file_mode=%d file_attrs=%d file_data=%s", | ||||||
|               archive_type, archive_size, archive_name.c_str(), |               archive_type, archive_size, archive_name.c_str(), | ||||||
|               file_type, size, mode, attributes, file_name.c_str()); |               file_type, size, mode, attributes, file_name.c_str()); | ||||||
| @@ -136,6 +136,42 @@ void OpenFileDirectly(Service::Interface* self) { | |||||||
|     DEBUG_LOG(KERNEL, "called"); |     DEBUG_LOG(KERNEL, "called"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * FS_User::CreateDirectory service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      2 : Archive handle lower word | ||||||
|  |  *      3 : Archive handle upper word | ||||||
|  |  *      4 : Directory path string type | ||||||
|  |  *      5 : Directory path string size | ||||||
|  |  *      8 : Directory path string data | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void CreateDirectory(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Service::GetCommandBuffer(); | ||||||
|  |  | ||||||
|  |     // TODO: cmd_buff[2], aka archive handle lower word, isn't used according to | ||||||
|  |     // 3dmoo's or ctrulib's implementations.  Triple check if it's really the case. | ||||||
|  |     Handle archive_handle = static_cast<Handle>(cmd_buff[3]); | ||||||
|  |     LowPathType type = static_cast<LowPathType>(cmd_buff[4]); | ||||||
|  |     u32 name_size = cmd_buff[5]; | ||||||
|  |     u32 name_offset = cmd_buff[8]; | ||||||
|  |  | ||||||
|  |     if (type != LowPathType::Char) { | ||||||
|  |         ERROR_LOG(KERNEL, "directory LowPath type other than char is currently unsupported"); | ||||||
|  |         cmd_buff[1] = -1; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     std::string dir_name = GetStringFromCmdBuff(name_offset, name_size); | ||||||
|  |  | ||||||
|  |     DEBUG_LOG(KERNEL, "type=%d size=%d data=%s", type, name_size, dir_name.c_str()); | ||||||
|  |  | ||||||
|  |     cmd_buff[1] = Kernel::CreateDirectoryFromArchive(archive_handle, dir_name); | ||||||
|  |  | ||||||
|  |     DEBUG_LOG(KERNEL, "called"); | ||||||
|  | } | ||||||
|  |  | ||||||
| void OpenDirectory(Service::Interface* self) { | void OpenDirectory(Service::Interface* self) { | ||||||
|     u32* cmd_buff = Service::GetCommandBuffer(); |     u32* cmd_buff = Service::GetCommandBuffer(); | ||||||
|  |  | ||||||
| @@ -227,7 +263,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||||||
|     {0x08060142, nullptr,               "DeleteDirectory"}, |     {0x08060142, nullptr,               "DeleteDirectory"}, | ||||||
|     {0x08070142, nullptr,               "DeleteDirectoryRecursively"}, |     {0x08070142, nullptr,               "DeleteDirectoryRecursively"}, | ||||||
|     {0x08080202, nullptr,               "CreateFile"}, |     {0x08080202, nullptr,               "CreateFile"}, | ||||||
|     {0x08090182, nullptr,               "CreateDirectory"}, |     {0x08090182, CreateDirectory,       "CreateDirectory"}, | ||||||
|     {0x080A0244, nullptr,               "RenameDirectory"}, |     {0x080A0244, nullptr,               "RenameDirectory"}, | ||||||
|     {0x080B0102, OpenDirectory,         "OpenDirectory"}, |     {0x080B0102, OpenDirectory,         "OpenDirectory"}, | ||||||
|     {0x080C00C2, OpenArchive,           "OpenArchive"}, |     {0x080C00C2, OpenArchive,           "OpenArchive"}, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user