From 7cc7dc09f496bc990f7b81e73d9f03c7ac6978e8 Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Sat, 3 Jun 2023 22:25:30 +0300 Subject: [PATCH] [FS] Implement File::Flush and fix file function headers --- include/kernel/kernel.hpp | 1 + src/core/kernel/file_operations.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index d43b88c0..9d46d1b9 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -146,6 +146,7 @@ private: // File operations void handleFileOperation(u32 messagePointer, Handle file); void closeFile(u32 messagePointer, Handle file); + void flushFile(u32 messagePointer, Handle file); void readFile(u32 messagePointer, Handle file); void writeFile(u32 messagePointer, Handle file); void getFileSize(u32 messagePointer, Handle file); diff --git a/src/core/kernel/file_operations.cpp b/src/core/kernel/file_operations.cpp index 331a3bd5..c6307e06 100644 --- a/src/core/kernel/file_operations.cpp +++ b/src/core/kernel/file_operations.cpp @@ -1,3 +1,4 @@ +#include "ipc.hpp" #include "kernel.hpp" namespace FileOps { @@ -7,6 +8,7 @@ namespace FileOps { GetSize = 0x08040000, SetSize = 0x08050080, Close = 0x08080000, + Flush = 0x08090000, SetPriority = 0x080A0040, OpenLinkFile = 0x080C0000 }; @@ -47,6 +49,24 @@ void Kernel::closeFile(u32 messagePointer, Handle fileHandle) { fclose(session->fd); } + mem.write32(messagePointer, IPC::responseHeader(0x0808, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + +void Kernel::flushFile(u32 messagePointer, Handle fileHandle) { + logFileIO("Flushed file %X\n", fileHandle); + + const auto p = getObject(fileHandle, KernelObjectType::File); + if (p == nullptr) [[unlikely]] { + Helpers::panic("Called FlushFile on non-existent file"); + } + + FileSession* session = p->getData(); + if (session->fd != nullptr) { + fflush(session->fd); + } + + mem.write32(messagePointer, IPC::responseHeader(0x0809, 1, 0)); mem.write32(messagePointer + 4, Result::Success); } @@ -63,6 +83,8 @@ void Kernel::readFile(u32 messagePointer, Handle fileHandle) { Helpers::panic("Called ReadFile on non-existent file"); } + mem.write32(messagePointer, IPC::responseHeader(0x0802, 2, 2)); + FileSession* file = p->getData(); if (!file->isOpen) { Helpers::panic("Tried to read closed file"); @@ -131,6 +153,7 @@ void Kernel::writeFile(u32 messagePointer, Handle fileHandle) { IOFile f(file->fd); auto [success, bytesWritten] = f.writeBytes(data.get(), size); + mem.write32(messagePointer, IPC::responseHeader(0x0803, 2, 2)); if (!success) { Helpers::panic("Kernel::WriteFile failed"); } else { @@ -151,6 +174,7 @@ void Kernel::setFileSize(u32 messagePointer, Handle fileHandle) { if (!file->isOpen) { Helpers::panic("Tried to get size of closed file"); } + mem.write32(messagePointer, IPC::responseHeader(0x0805, 1, 0)); if (file->fd) { const u64 newSize = mem.read64(messagePointer + 4); @@ -179,6 +203,7 @@ void Kernel::getFileSize(u32 messagePointer, Handle fileHandle) { if (!file->isOpen) { Helpers::panic("Tried to get size of closed file"); } + mem.write32(messagePointer, IPC::responseHeader(0x0804, 3, 0)); if (file->fd) { IOFile f(file->fd); @@ -217,6 +242,7 @@ void Kernel::openLinkFile(u32 messagePointer, Handle fileHandle) { // However we do seek properly on every file access so this shouldn't matter cloneFile.data = new FileSession(*file); + mem.write32(messagePointer, IPC::responseHeader(0x080C, 1, 2)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 12, handle); } @@ -236,5 +262,6 @@ void Kernel::setFilePriority(u32 messagePointer, Handle fileHandle) { } file->priority = priority; + mem.write32(messagePointer, IPC::responseHeader(0x080A, 1, 0)); mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file