sceKernelOpen: Clean up flag handling

This commit is contained in:
Stephen Miller 2025-02-14 18:53:35 -06:00
parent 32763b7af6
commit e29e3f1985

View file

@ -117,22 +117,40 @@ int PS4_SYSV_ABI sceKernelOpen(const char* raw_path, int flags, u16 mode) {
file->m_guest_name = path; file->m_guest_name = path;
file->m_host_name = mnt->GetHostPath(file->m_guest_name); file->m_host_name = mnt->GetHostPath(file->m_guest_name);
int e = 0; int e = 0;
if (read) {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read); if (create) {
} else if (write && (create || truncate)) { if (excl && std::filesystem::exists(file->m_host_name)) {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); // Error if file exists
} else if (write && create && append) { // CUSA04729 (appends app0/shaderlist.txt) return ORBIS_KERNEL_ERROR_EEXIST;
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append);
} else if (rdwr) {
if (create) { // Create an empty file first.
Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write);
} }
// RW, then scekernelWrite is called and savedata is written just fine now. // Create file if it doesn't exist
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite); Common::FS::IOFile out(file->m_host_name, Common::FS::FileAccessMode::Write);
}
if (truncate && std::filesystem::exists(file->m_host_name)) {
// If the file exists, it's size should be truncated to 0
file->f.SetSize(0);
}
if (read) {
// Read only
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Read);
} else if (write) { } else if (write) {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write); // Write only
if (append) {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append);
} else {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Write);
}
} else if (rdwr) {
// Read and write
if (append) {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::Append);
} else {
e = file->f.Open(file->m_host_name, Common::FS::FileAccessMode::ReadWrite);
}
} else { } else {
UNREACHABLE(); UNREACHABLE_MSG("Invalid flags!");
} }
if (e != 0) { if (e != 0) {
h->DeleteHandle(handle); h->DeleteHandle(handle);