From c8a4c7d7fa394b12d228d8cfa91ba53a8ed8dfc3 Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Mon, 23 Jan 2023 13:34:31 +0200 Subject: [PATCH] [FS] Implement ReadFile for files with host OS file descriptors. --- src/core/kernel/file_operations.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/kernel/file_operations.cpp b/src/core/kernel/file_operations.cpp index f1cd6629..17bcea07 100644 --- a/src/core/kernel/file_operations.cpp +++ b/src/core/kernel/file_operations.cpp @@ -56,9 +56,31 @@ void Kernel::readFile(u32 messagePointer, Handle fileHandle) { if (!file->isOpen) { Helpers::panic("Tried to read closed file"); } + + // Handle files with their own file descriptors by just fread'ing the data + if (file->fd) { + std::unique_ptr data(new u8[size]); + IOFile f(file->fd); + auto [success, bytesRead] = f.readBytes(data.get(), size); + + if (!success) { + Helpers::panic("Kernel::ReadFile with file descriptor failed"); + } + else { + for (size_t i = 0; i < bytesRead; i++) { + mem.write8(dataPointer + i, data[i]); + } + + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, bytesRead); + } + + return; + } + + // Handle files without their own FD, such as SelfNCCH files auto archive = file->archive; - std::optional bytesRead = archive->readFile(file, offset, size, dataPointer); if (!bytesRead.has_value()) { Helpers::panic("Kernel::ReadFile failed");