From 3a6834113e49b92966f93d9edfeb8fd6527dcfe0 Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Fri, 14 Feb 2025 18:57:01 -0600 Subject: [PATCH] sceKernelOpen: Fix errors Based on POSIX spec, if part of the path is missing, ENOENT is the correct return. Additionally, decompilation suggests that open sets errno too. --- src/core/libraries/kernel/file_system.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index af7029704..48a747d91 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -99,7 +99,7 @@ s32 PS4_SYSV_ABI sceKernelOpen(const char* raw_path, s32 flags, u16 mode) { file->m_host_name = mnt->GetHostPath(file->m_guest_name); if (!std::filesystem::is_directory(file->m_host_name)) { // directory doesn't exist h->DeleteHandle(handle); - return ORBIS_KERNEL_ERROR_ENOTDIR; + return ORBIS_KERNEL_ERROR_ENOENT; } else { if (create) { return handle; // dir already exists @@ -174,6 +174,7 @@ s32 PS4_SYSV_ABI posix_open(const char* path, s32 flags, /* SceKernelMode*/ u16 s32 PS4_SYSV_ABI open(const char* filename, s32 flags) { s32 result = sceKernelOpen(filename, flags, 0); if (result < 0) { + ErrSceToPosix(result); return -1; } return result;