From 28a5b1f0b339f1f0a5dde6ac04a5e5454b9be77c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Thu, 14 Mar 2024 17:59:26 +0200 Subject: [PATCH] added lseek in file_system --- .../hle/libraries/libkernel/file_system.cpp | 24 +++++++++++++++++++ .../hle/libraries/libkernel/file_system.h | 1 + 2 files changed, 25 insertions(+) diff --git a/src/core/hle/libraries/libkernel/file_system.cpp b/src/core/hle/libraries/libkernel/file_system.cpp index 6d4c61629..0046b9d5c 100644 --- a/src/core/hle/libraries/libkernel/file_system.cpp +++ b/src/core/hle/libraries/libkernel/file_system.cpp @@ -51,10 +51,34 @@ size_t PS4_SYSV_ABI _readv(int d, const SceKernelIovec* iov, int iovcnt) { return total_read; } +s64 PS4_SYSV_ABI lseek(int d, s64 offset, int whence) { + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(d); + + file->m_mutex.lock(); + + if (whence == 1) { + offset = static_cast(file->f.Tell()) + offset; + whence = 0; + } + + if (whence == 2) { + offset = static_cast(file->f.GetSize()) + offset; + whence = 0; + } + + file->f.Seek(offset); + auto pos = static_cast(file->f.Tell()); + + file->m_mutex.unlock(); + return pos; +} + void fileSystemSymbolsRegister(Loader::SymbolsResolver* sym) { LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); LIB_FUNCTION("+WRlkKjZvag", "libkernel", 1, "libkernel", 1, 1, _readv); + LIB_FUNCTION("Oy6IpwgtYOk", "libkernel", 1, "libkernel", 1, 1, lseek); // openOrbis (to check if it is valid out of OpenOrbis LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1, diff --git a/src/core/hle/libraries/libkernel/file_system.h b/src/core/hle/libraries/libkernel/file_system.h index a6319da51..6b3c88aa5 100644 --- a/src/core/hle/libraries/libkernel/file_system.h +++ b/src/core/hle/libraries/libkernel/file_system.h @@ -19,6 +19,7 @@ struct SceKernelIovec { int PS4_SYSV_ABI sceKernelOpen(const char* path, int flags, /* SceKernelMode*/ u16 mode); int PS4_SYSV_ABI posix_open(const char* path, int flags, /* SceKernelMode*/ u16 mode); +s64 PS4_SYSV_ABI lseek(int d, s64 offset, int whence); void fileSystemSymbolsRegister(Loader::SymbolsResolver* sym);