From 12dc1adf66ab56027075a4f8f5a803f1497722b9 Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Thu, 27 Feb 2025 15:00:36 -0600 Subject: [PATCH] Revert "Remove SetPosixErrno" This reverts commit bdfc0c246ce35cde015f3e48a284052ca4caf45e. --- src/core/libraries/kernel/file_system.cpp | 12 ++++++------ src/core/libraries/kernel/kernel.cpp | 12 ++++++++++++ src/core/libraries/kernel/kernel.h | 1 + 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index 75430e0d8..0a4877855 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -166,9 +166,9 @@ s32 PS4_SYSV_ABI open(const char* raw_path, s32 flags, u16 mode) { } if (e != 0) { - // IOFile code uses platform specific errnos. Use POSIX_EIO for now + // IOFile code uses platform specific errnos, they must be converted to POSIX errnos. h->DeleteHandle(handle); - *__Error() = POSIX_EIO; + SetPosixErrno(e); return -1; } } @@ -375,8 +375,8 @@ s64 PS4_SYSV_ABI posix_lseek(s32 fd, s64 offset, s32 whence) { if (!file->f.Seek(offset, origin)) { if (errno != 0) { - // Seek failed in platform-specific code. Use POSIX_EIO for now. - *__Error() = POSIX_EIO; + // Seek failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); } else { // Seek failed because offset is beyond the end of the file. *__Error() = POSIX_ENXIO; @@ -386,8 +386,8 @@ s64 PS4_SYSV_ABI posix_lseek(s32 fd, s64 offset, s32 whence) { s64 result = file->f.Tell(); if (result < 0) { - // Tell failed in platform-specific code. Use POSIX_EIO for now. - *__Error() = POSIX_EIO; + // Tell failed in platform-specific code, errno needs to be converted. + SetPosixErrno(errno); return -1; } return result; diff --git a/src/core/libraries/kernel/kernel.cpp b/src/core/libraries/kernel/kernel.cpp index d42f440c7..0ab8fac29 100644 --- a/src/core/libraries/kernel/kernel.cpp +++ b/src/core/libraries/kernel/kernel.cpp @@ -84,6 +84,18 @@ int ErrnoToSceKernelError(int error) { return error + ORBIS_KERNEL_ERROR_UNKNOWN; } +void SetPosixErrno(int e) { + // Some error numbers are different between supported OSes + switch (e) { + case ENOENT: + g_posix_errno = POSIX_ENOENT; + break; + default: + UNREACHABLE_MSG("errno = {}", e); + g_posix_errno = e; + } +} + static uint64_t g_mspace_atomic_id_mask = 0; static uint64_t g_mstate_table[64] = {0}; diff --git a/src/core/libraries/kernel/kernel.h b/src/core/libraries/kernel/kernel.h index 96ad4a876..8e7f475ad 100644 --- a/src/core/libraries/kernel/kernel.h +++ b/src/core/libraries/kernel/kernel.h @@ -16,6 +16,7 @@ namespace Libraries::Kernel { void ErrSceToPosix(int result); int ErrnoToSceKernelError(int e); +void SetPosixErrno(int e); template struct StringLiteral {