[FS] Implement File::Flush and fix file function headers

This commit is contained in:
wheremyfoodat 2023-06-03 22:25:30 +03:00
parent e9a8c2cb2e
commit 7cc7dc09f4
2 changed files with 28 additions and 0 deletions

View file

@ -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);

View file

@ -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<FileSession>();
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<FileSession>();
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);
}