From b489bc8c854c8c670d55d1cc39f14c04353eea64 Mon Sep 17 00:00:00 2001 From: Stephen Miller <56742918+StevenMiller123@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:16:25 -0600 Subject: [PATCH] fflush + compile fixes --- .../libc_internal/libc_internal_io.cpp | 45 ++++++++++++++++++- .../libc_internal/libc_internal_io.h | 4 +- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/libc_internal/libc_internal_io.cpp b/src/core/libraries/libc_internal/libc_internal_io.cpp index 31b2b54f4..dd3d4b528 100644 --- a/src/core/libraries/libc_internal/libc_internal_io.cpp +++ b/src/core/libraries/libc_internal/libc_internal_io.cpp @@ -100,7 +100,7 @@ OrbisFILE* PS4_SYSV_ABI internal__Foprep(const char* path, const char* mode, Orb file->_WRback = &file->unk1; // Parse inputted mode string - char* mode_str = *mode; + const char* mode_str = mode; u16 calc_mode = 0; u16 access_mode = 0; if (mode_str[0] == 'r') { @@ -198,6 +198,48 @@ OrbisFILE* PS4_SYSV_ABI internal_fopen(const char* path, const char* mode) { return internal__Foprep(path, mode, file, -1, 0, 0); } +s32 PS4_SYSV_ABI internal_fflush(OrbisFILE* stream) { + if (stream == nullptr) { + std::scoped_lock lk{g_stream_mtx}; + s32 fflush_result = 0; + for (OrbisFILE* file : g_files) { + s32 res = internal_fflush(file); + if (res < 0) { + fflush_result = -1; + } + } + return fflush_result; + } + if ((stream->_Mode & 0x2000) != 0) { + internal__Lockfilelock(stream); + u16 file_mode = stream->_Mode; + u8* file_buf_start = stream->_Buf; + u8* file_buf_end = stream->_Next; + while (file_buf_start < file_buf_end) { + u64 size_to_write = static_cast(file_buf_end - file_buf_start); + s32 write_bytes = + Libraries::Kernel::sceKernelWrite(stream->_Handle, file_buf_start, size_to_write); + if (write_bytes < 1) { + file_buf_start = stream->_Buf; + stream->_Next = file_buf_start; + stream->_Wend = file_buf_start; + stream->_WWend = file_buf_start; + stream->_Mode = (stream->_Mode + 1) | 2; + internal__Unlockfilelock(stream); + return -1; + } + file_buf_end = stream->_Next; + file_buf_start += write_bytes; + } + stream->_Next = file_buf_start; + stream->_Wend = file_buf_start; + stream->_WWend = file_buf_start; + stream->_Mode = file_mode & 0xdfff; + internal__Unlockfilelock(stream); + } + return 0; +} + s32 PS4_SYSV_ABI internal_fseek(OrbisFILE* stream, s64 offset, s32 whence) { return 0; } @@ -212,6 +254,7 @@ s32 PS4_SYSV_ABI internal_fclose(OrbisFILE* stream) { void RegisterlibSceLibcInternalIo(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("eLdDw6l0-bU", "libSceLibcInternal", 1, "libSceLibcInternal", internal_snprintf); + LIB_FUNCTION("MUjC4lbHrK4", "libSceLibcInternal", 1, "libSceLibcInternal", internal_fflush); LIB_FUNCTION("xGT4Mc55ViQ", "libSceLibcInternal", 1, "libSceLibcInternal", internal__Fofind); LIB_FUNCTION("dREVnZkAKRE", "libSceLibcInternal", 1, "libSceLibcInternal", internal__Foprep); LIB_FUNCTION("sQL8D-jio7U", "libSceLibcInternal", 1, "libSceLibcInternal", internal__Fopen); diff --git a/src/core/libraries/libc_internal/libc_internal_io.h b/src/core/libraries/libc_internal/libc_internal_io.h index 7d4a58ff7..c21ccf3d0 100644 --- a/src/core/libraries/libc_internal/libc_internal_io.h +++ b/src/core/libraries/libc_internal/libc_internal_io.h @@ -78,12 +78,14 @@ struct OrbisFILE { }; s32 PS4_SYSV_ABI internal_snprintf(char* s, u64 n, VA_ARGS); -OrbisFILE* PS4_SYSV_ABI internal__Fofind(); void PS4_SYSV_ABI internal__Lockfilelock(OrbisFILE* file); void PS4_SYSV_ABI internal__Unlockfilelock(OrbisFILE* file); +OrbisFILE* PS4_SYSV_ABI internal__Fofind(); OrbisFILE* PS4_SYSV_ABI internal__Foprep(const char* path, const char* mode, OrbisFILE* file, s32 fd, s32 flag1, s32 flag2); +s32 PS4_SYSV_ABI internal__Fopen(const char* path, u16 mode, bool flag); OrbisFILE* PS4_SYSV_ABI internal_fopen(const char* path, const char* mode); +s32 PS4_SYSV_ABI internal_fflush(OrbisFILE* stream); s32 PS4_SYSV_ABI internal_fseek(OrbisFILE* stream, s64 offset, s32 whence); u64 PS4_SYSV_ABI internal_fread(void* ptr, u64 size, u64 nmemb, OrbisFILE* stream); s32 PS4_SYSV_ABI internal_fclose(OrbisFILE* stream);