From 00a612eaea10dbeeb28daa223ed59f6216e890d0 Mon Sep 17 00:00:00 2001
From: Liam <byteslice@airmail.cc>
Date: Mon, 25 Sep 2023 16:32:15 -0400
Subject: [PATCH] fsp-srv: add GetFileSystemAttribute

---
 src/core/hle/service/filesystem/fsp_srv.cpp | 41 +++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp
index 2492bbc160..c2054e8a0e 100644
--- a/src/core/hle/service/filesystem/fsp_srv.cpp
+++ b/src/core/hle/service/filesystem/fsp_srv.cpp
@@ -329,6 +329,7 @@ public:
             {13, &IFileSystem::CleanDirectoryRecursively, "CleanDirectoryRecursively"},
             {14, &IFileSystem::GetFileTimeStampRaw, "GetFileTimeStampRaw"},
             {15, nullptr, "QueryEntry"},
+            {16, &IFileSystem::GetFileSystemAttribute, "GetFileSystemAttribute"},
         };
         RegisterHandlers(functions);
     }
@@ -521,6 +522,46 @@ public:
         rb.PushRaw(vfs_timestamp);
     }
 
+    void GetFileSystemAttribute(HLERequestContext& ctx) {
+        LOG_WARNING(Service_FS, "(STUBBED) called");
+
+        struct FileSystemAttribute {
+            u8 dir_entry_name_length_max_defined;
+            u8 file_entry_name_length_max_defined;
+            u8 dir_path_name_length_max_defined;
+            u8 file_path_name_length_max_defined;
+            INSERT_PADDING_BYTES_NOINIT(0x5);
+            u8 utf16_dir_entry_name_length_max_defined;
+            u8 utf16_file_entry_name_length_max_defined;
+            u8 utf16_dir_path_name_length_max_defined;
+            u8 utf16_file_path_name_length_max_defined;
+            INSERT_PADDING_BYTES_NOINIT(0x18);
+            s32 dir_entry_name_length_max;
+            s32 file_entry_name_length_max;
+            s32 dir_path_name_length_max;
+            s32 file_path_name_length_max;
+            INSERT_PADDING_WORDS_NOINIT(0x5);
+            s32 utf16_dir_entry_name_length_max;
+            s32 utf16_file_entry_name_length_max;
+            s32 utf16_dir_path_name_length_max;
+            s32 utf16_file_path_name_length_max;
+            INSERT_PADDING_WORDS_NOINIT(0x18);
+            INSERT_PADDING_WORDS_NOINIT(0x1);
+        };
+        static_assert(sizeof(FileSystemAttribute) == 0xc0,
+                      "FileSystemAttribute has incorrect size");
+
+        FileSystemAttribute savedata_attribute{};
+        savedata_attribute.dir_entry_name_length_max_defined = true;
+        savedata_attribute.file_entry_name_length_max_defined = true;
+        savedata_attribute.dir_entry_name_length_max = 0x40;
+        savedata_attribute.file_entry_name_length_max = 0x40;
+
+        IPC::ResponseBuilder rb{ctx, 50};
+        rb.Push(ResultSuccess);
+        rb.PushRaw(savedata_attribute);
+    }
+
 private:
     VfsDirectoryServiceWrapper backend;
     SizeGetter size;