mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-06-05 18:23:16 +00:00
sceKernelOpen: Clean up flag handling
This commit is contained in:
parent
32763b7af6
commit
e29e3f1985
1 changed files with 31 additions and 13 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue