[FS] Implement File::Flush and fix file function headers
This commit is contained in:
@@ -146,6 +146,7 @@ private:
|
|||||||
// File operations
|
// File operations
|
||||||
void handleFileOperation(u32 messagePointer, Handle file);
|
void handleFileOperation(u32 messagePointer, Handle file);
|
||||||
void closeFile(u32 messagePointer, Handle file);
|
void closeFile(u32 messagePointer, Handle file);
|
||||||
|
void flushFile(u32 messagePointer, Handle file);
|
||||||
void readFile(u32 messagePointer, Handle file);
|
void readFile(u32 messagePointer, Handle file);
|
||||||
void writeFile(u32 messagePointer, Handle file);
|
void writeFile(u32 messagePointer, Handle file);
|
||||||
void getFileSize(u32 messagePointer, Handle file);
|
void getFileSize(u32 messagePointer, Handle file);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include "ipc.hpp"
|
||||||
#include "kernel.hpp"
|
#include "kernel.hpp"
|
||||||
|
|
||||||
namespace FileOps {
|
namespace FileOps {
|
||||||
@@ -7,6 +8,7 @@ namespace FileOps {
|
|||||||
GetSize = 0x08040000,
|
GetSize = 0x08040000,
|
||||||
SetSize = 0x08050080,
|
SetSize = 0x08050080,
|
||||||
Close = 0x08080000,
|
Close = 0x08080000,
|
||||||
|
Flush = 0x08090000,
|
||||||
SetPriority = 0x080A0040,
|
SetPriority = 0x080A0040,
|
||||||
OpenLinkFile = 0x080C0000
|
OpenLinkFile = 0x080C0000
|
||||||
};
|
};
|
||||||
@@ -47,6 +49,24 @@ void Kernel::closeFile(u32 messagePointer, Handle fileHandle) {
|
|||||||
fclose(session->fd);
|
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);
|
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");
|
Helpers::panic("Called ReadFile on non-existent file");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x0802, 2, 2));
|
||||||
|
|
||||||
FileSession* file = p->getData<FileSession>();
|
FileSession* file = p->getData<FileSession>();
|
||||||
if (!file->isOpen) {
|
if (!file->isOpen) {
|
||||||
Helpers::panic("Tried to read closed file");
|
Helpers::panic("Tried to read closed file");
|
||||||
@@ -131,6 +153,7 @@ void Kernel::writeFile(u32 messagePointer, Handle fileHandle) {
|
|||||||
IOFile f(file->fd);
|
IOFile f(file->fd);
|
||||||
auto [success, bytesWritten] = f.writeBytes(data.get(), size);
|
auto [success, bytesWritten] = f.writeBytes(data.get(), size);
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x0803, 2, 2));
|
||||||
if (!success) {
|
if (!success) {
|
||||||
Helpers::panic("Kernel::WriteFile failed");
|
Helpers::panic("Kernel::WriteFile failed");
|
||||||
} else {
|
} else {
|
||||||
@@ -151,6 +174,7 @@ void Kernel::setFileSize(u32 messagePointer, Handle fileHandle) {
|
|||||||
if (!file->isOpen) {
|
if (!file->isOpen) {
|
||||||
Helpers::panic("Tried to get size of closed file");
|
Helpers::panic("Tried to get size of closed file");
|
||||||
}
|
}
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x0805, 1, 0));
|
||||||
|
|
||||||
if (file->fd) {
|
if (file->fd) {
|
||||||
const u64 newSize = mem.read64(messagePointer + 4);
|
const u64 newSize = mem.read64(messagePointer + 4);
|
||||||
@@ -179,6 +203,7 @@ void Kernel::getFileSize(u32 messagePointer, Handle fileHandle) {
|
|||||||
if (!file->isOpen) {
|
if (!file->isOpen) {
|
||||||
Helpers::panic("Tried to get size of closed file");
|
Helpers::panic("Tried to get size of closed file");
|
||||||
}
|
}
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x0804, 3, 0));
|
||||||
|
|
||||||
if (file->fd) {
|
if (file->fd) {
|
||||||
IOFile f(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
|
// However we do seek properly on every file access so this shouldn't matter
|
||||||
cloneFile.data = new FileSession(*file);
|
cloneFile.data = new FileSession(*file);
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x080C, 1, 2));
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
mem.write32(messagePointer + 12, handle);
|
mem.write32(messagePointer + 12, handle);
|
||||||
}
|
}
|
||||||
@@ -236,5 +262,6 @@ void Kernel::setFilePriority(u32 messagePointer, Handle fileHandle) {
|
|||||||
}
|
}
|
||||||
file->priority = priority;
|
file->priority = priority;
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x080A, 1, 0));
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user