From 96a1320977d76b6d1afbb526449a9fac735ce136 Mon Sep 17 00:00:00 2001 From: CrystalCT Date: Mon, 15 Mar 2021 08:38:34 +0100 Subject: [PATCH] Improved vfs implementation on PSL1GHT using lv2 functions --- defines/ps3_defines.h | 28 ++++++++++++++++++ libretro-common/vfs/vfs_implementation.c | 36 +++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/defines/ps3_defines.h b/defines/ps3_defines.h index 3f71673268..04fe3318ca 100644 --- a/defines/ps3_defines.h +++ b/defines/ps3_defines.h @@ -614,4 +614,32 @@ extern int audioAddData(uint32_t portNum, float *data, #endif #endif +/*============================================================ + FS PROTOTYPES +============================================================ */ +#define FS_SUCCEEDED 0 +#define FS_TYPE_DIR 1 +#ifdef __PSL1GHT__ +#include +#define O_RDONLY SYS_O_RDONLY +#define O_WRONLY SYS_O_WRONLY +#define O_CREAT SYS_O_CREAT +#define O_TRUNC SYS_O_TRUNC +#define O_RDWR SYS_O_RDWR +#else +#include +#define O_RDONLY CELL_FS_O_RDONLY +#define O_WRONLY CELL_FS_O_WRONLY +#define O_CREAT CELL_FS_O_CREAT +#define O_TRUNC CELL_FS_O_TRUNC +#define O_RDWR CELL_FS_O_RDWR +#define sysFsStat cellFsStat +#define sysFSStat CellFsStat +#define sysFSDirent CellFsDirent +#define sysFsOpendir cellFsOpendir +#define sysFsReaddir cellFsReaddir +#define sysFSDirent CellFsDirent +#define sysFsClosedir cellFsClosedir +#endif + #endif diff --git a/libretro-common/vfs/vfs_implementation.c b/libretro-common/vfs/vfs_implementation.c index 034d8f35f1..ca953022a1 100644 --- a/libretro-common/vfs/vfs_implementation.c +++ b/libretro-common/vfs/vfs_implementation.c @@ -130,6 +130,10 @@ #include #endif +#if defined(__PSL1GHT__) +#include +#endif + #if defined(VITA) #define FIO_S_ISDIR SCE_S_ISDIR #endif @@ -909,6 +913,19 @@ int retro_vfs_stat_impl(const char *path, int32_t *size) orbisDclose(dir_ret); is_character_special = S_ISCHR(buf.st_mode); +#elif defined(__PSL1GHT__) || defined(__PS3__) + /* Lowlevel Lv2 */ + sysFSStat buf; + + if (!path || !*path) + return 0; + if (sysFsStat(path, &buf) < 0) + return 0; + + if (size) + *size = (int32_t)buf.st_size; + + is_dir = ((buf.st_mode & S_IFMT) == S_IFDIR); #elif defined(_WIN32) /* Windows */ DWORD file_info; @@ -1081,6 +1098,10 @@ struct libretro_vfs_implementation_dir #elif defined(VITA) || defined(PSP) SceUID directory; SceIoDirent entry; +#elif defined(__PSL1GHT__) || defined(__PS3__) + int error; + int directory; + sysFSDirent entry; #elif defined(ORBIS) int directory; struct dirent entry; @@ -1096,6 +1117,8 @@ static bool dirent_check_error(libretro_vfs_implementation_dir *rdir) return (rdir->directory == INVALID_HANDLE_VALUE); #elif defined(VITA) || defined(PSP) || defined(ORBIS) return (rdir->directory < 0); +#elif defined(__PSL1GHT__) || defined(__PS3__) + return (rdir->error != FS_SUCCEEDED); #else return !(rdir->directory); #endif @@ -1159,6 +1182,8 @@ libretro_vfs_implementation_dir *retro_vfs_opendir_impl( #elif defined(_3DS) rdir->directory = !string_is_empty(name) ? opendir(name) : NULL; rdir->entry = NULL; +#elif defined(__PSL1GHT__) || defined(__PS3__) + rdir->error = sysFsOpendir(name, &rdir->directory); #elif defined(ORBIS) rdir->directory = orbisDopen(name); #else @@ -1194,6 +1219,10 @@ bool retro_vfs_readdir_impl(libretro_vfs_implementation_dir *rdir) return (rdir->directory != INVALID_HANDLE_VALUE); #elif defined(VITA) || defined(PSP) return (sceIoDread(rdir->directory, &rdir->entry) > 0); +#elif defined(__PSL1GHT__) || defined(__PS3__) + uint64_t nread; + rdir->error = sysFsReaddir(rdir->directory, &rdir->entry, &nread); + return (nread != 0); #elif defined(ORBIS) return (orbisDread(rdir->directory, &rdir->entry) > 0); #else @@ -1214,7 +1243,7 @@ const char *retro_vfs_dirent_get_name_impl(libretro_vfs_implementation_dir *rdir if (name) free(name); return (char*)rdir->entry.cFileName; -#elif defined(VITA) || defined(PSP) || defined(ORBIS) +#elif defined(VITA) || defined(PSP) || defined(ORBIS) || defined(__PSL1GHT__) || defined(__PS3__) return rdir->entry.d_name; #else if (!rdir || !rdir->entry) @@ -1235,6 +1264,9 @@ bool retro_vfs_dirent_is_dir_impl(libretro_vfs_implementation_dir *rdir) #elif defined(VITA) return SCE_S_ISDIR(entry->d_stat.st_mode); #endif +#elif defined(__PSL1GHT__) || defined(__PS3__) + sysFSDirent *entry = (sysFSDirent*)&rdir->entry; + return (entry->d_type == FS_TYPE_DIR); #elif defined(ORBIS) const struct dirent *entry = &rdir->entry; if (entry->d_type == DT_DIR) @@ -1271,6 +1303,8 @@ int retro_vfs_closedir_impl(libretro_vfs_implementation_dir *rdir) FindClose(rdir->directory); #elif defined(VITA) || defined(PSP) sceIoDclose(rdir->directory); +#elif defined(__PSL1GHT__) || defined(__PS3__) + rdir->error = sysFsClosedir(rdir->directory); #elif defined(ORBIS) orbisDclose(rdir->directory); #else