mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-08 23:25:40 +12:00
[FS] Implement File::Flush and fix file function headers
This commit is contained in:
parent
e9a8c2cb2e
commit
7cc7dc09f4
2 changed files with 28 additions and 0 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Add table
Reference in a new issue