mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-23 10:35:03 +00:00
stdio file io functions
This commit is contained in:
parent
ee3b9adb45
commit
42599f10b0
@ -41,6 +41,11 @@ bool File::read(void* data, u64 size, u64* bytes_read) const {
|
|||||||
return isOpen() && *bytes_read == size;
|
return isOpen() && *bytes_read == size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool File::read(void* data, u64 size,u64 count, u64* bytes_read) const {
|
||||||
|
*bytes_read = std::fread(data, count, size, m_file);
|
||||||
|
return isOpen() && *bytes_read == size;
|
||||||
|
}
|
||||||
|
|
||||||
bool File::seek(s64 offset, SeekMode mode) {
|
bool File::seek(s64 offset, SeekMode mode) {
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
if (!isOpen() || _fseeki64(m_file, offset, getSeekMode(mode)) != 0) {
|
if (!isOpen() || _fseeki64(m_file, offset, getSeekMode(mode)) != 0) {
|
||||||
|
@ -31,6 +31,7 @@ class File {
|
|||||||
bool open(const std::string& path, OpenMode mode = OpenMode::Read);
|
bool open(const std::string& path, OpenMode mode = OpenMode::Read);
|
||||||
bool close();
|
bool close();
|
||||||
bool read(void* data, u64 size, u64* bytes_read) const;
|
bool read(void* data, u64 size, u64* bytes_read) const;
|
||||||
|
bool File::read(void* data, u64 size, u64 count, u64* bytes_read) const;
|
||||||
bool write(std::span<const u08> data);
|
bool write(std::span<const u08> data);
|
||||||
bool seek(s64 offset, SeekMode mode);
|
bool seek(s64 offset, SeekMode mode);
|
||||||
u64 getFileSize();
|
u64 getFileSize();
|
||||||
|
@ -28,7 +28,9 @@ int PS4_SYSV_ABI ps4_fprintf(FILE* file, VA_ARGS) {
|
|||||||
|
|
||||||
int PS4_SYSV_ABI ps4_vsnprintf(char* s, size_t n, const char* format, VaList* arg) { return vsnprintf_ctx(s, n, format, arg); }
|
int PS4_SYSV_ABI ps4_vsnprintf(char* s, size_t n, const char* format, VaList* arg) { return vsnprintf_ctx(s, n, format, arg); }
|
||||||
|
|
||||||
int PS4_SYSV_ABI ps4_puts(const char* s) { return std::puts(s); }
|
int PS4_SYSV_ABI ps4_puts(const char* s) {
|
||||||
|
return std::puts(s);
|
||||||
|
}
|
||||||
|
|
||||||
FILE* PS4_SYSV_ABI ps4_fopen(const char* filename, const char* mode) {
|
FILE* PS4_SYSV_ABI ps4_fopen(const char* filename, const char* mode) {
|
||||||
LOG_INFO_IF(log_file_libc, "fopen filename={} , mode ={}\n", filename, mode);
|
LOG_INFO_IF(log_file_libc, "fopen filename={} , mode ={}\n", filename, mode);
|
||||||
@ -37,26 +39,66 @@ FILE* PS4_SYSV_ABI ps4_fopen(const char* filename, const char* mode) {
|
|||||||
|
|
||||||
u32 handle = h->createHandle();
|
u32 handle = h->createHandle();
|
||||||
auto* file = h->getFile(handle);
|
auto* file = h->getFile(handle);
|
||||||
|
//file->m_mutex.lock();
|
||||||
file->m_guest_name = filename;
|
file->m_guest_name = filename;
|
||||||
file->m_host_name = mnt->getHostFile(file->m_guest_name);
|
file->m_host_name = mnt->getHostFile(file->m_guest_name);
|
||||||
FILE* f = std::fopen(file->m_host_name.c_str(), mode);
|
if (!file->f.open(file->m_host_name.c_str(), Common::FS::OpenMode::Read)) {
|
||||||
if (!f) {
|
|
||||||
LOG_ERROR_IF(log_file_libc, "fopen can't open file={}\n", filename);
|
LOG_ERROR_IF(log_file_libc, "fopen can't open file={}\n", filename);
|
||||||
}
|
}
|
||||||
return f;
|
FILE* descr = file->f.fileDescr();
|
||||||
|
int handle1 = _fileno(descr);
|
||||||
|
file->isOpened = true;
|
||||||
|
//file->m_mutex.unlock();
|
||||||
|
return descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI ps4_fseek(FILE* stream, long int offset, int origin) { return std::fseek(stream, offset, origin); }
|
int PS4_SYSV_ABI ps4_fseek(FILE* stream, long int offset, int origin) {
|
||||||
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
||||||
|
int handle = _fileno(stream);
|
||||||
|
auto* file = h->getFile(handle - 2);
|
||||||
|
file->m_mutex.lock();
|
||||||
|
int seek = 0;
|
||||||
|
switch (origin) {
|
||||||
|
case 0: seek = file->f.seek(offset, Common::FS::SeekMode::Set); break;
|
||||||
|
case 1: seek = file->f.seek(offset, Common::FS::SeekMode::Cur); break;
|
||||||
|
case 2: seek = file->f.seek(offset, Common::FS::SeekMode::End); break;
|
||||||
|
}
|
||||||
|
file->m_mutex.unlock();
|
||||||
|
return seek;
|
||||||
|
}
|
||||||
|
|
||||||
long PS4_SYSV_ABI ps4_ftell(FILE* stream) { return std::ftell(stream); }
|
long PS4_SYSV_ABI ps4_ftell(FILE* stream) {
|
||||||
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
||||||
|
int handle = _fileno(stream);
|
||||||
|
auto* file = h->getFile(handle - 2);
|
||||||
|
//file->m_mutex.lock();
|
||||||
|
long ftell = file->f.tell();
|
||||||
|
//file->m_mutex.unlock();
|
||||||
|
return ftell;
|
||||||
|
}
|
||||||
|
|
||||||
size_t PS4_SYSV_ABI ps4_fread(void* ptr, size_t size, size_t count, FILE* stream) { return std::fread(ptr, size, count, stream); }
|
size_t PS4_SYSV_ABI ps4_fread(void* ptr, size_t size, size_t count, FILE* stream) {
|
||||||
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
||||||
|
int handle = _fileno(stream);
|
||||||
|
auto* file = h->getFile(handle - 2);
|
||||||
|
file->m_mutex.lock();
|
||||||
|
u64 bytes_read = 0;
|
||||||
|
file->f.read(ptr, size,count, &bytes_read);
|
||||||
|
file->m_mutex.unlock();
|
||||||
|
return bytes_read;
|
||||||
|
}
|
||||||
|
|
||||||
int PS4_SYSV_ABI ps4_fclose(FILE* stream) {
|
int PS4_SYSV_ABI ps4_fclose(FILE* stream) {
|
||||||
LOG_INFO_IF(log_file_libc, "fclose\n");
|
LOG_INFO_IF(log_file_libc, "fclose\n");
|
||||||
if (stream != nullptr) {
|
auto* h = Common::Singleton<Core::FileSys::HandleTable>::Instance();
|
||||||
std::fclose(stream);
|
int handle = _fileno(stream);
|
||||||
|
auto* file = h->getFile(handle - 2);
|
||||||
|
//file->m_mutex.lock();
|
||||||
|
if (file->isOpened) {
|
||||||
|
file->f.close();
|
||||||
}
|
}
|
||||||
|
h->deleteHandle(handle-2);
|
||||||
|
//file->m_mutex.unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user