#include "stdafx.h" #include "Emu/SysCalls/SysCalls.h" typedef u64 GPRtype; enum Lv2FsOflag { LV2_O_RDONLY = 000000, LV2_O_WRONLY = 000001, LV2_O_RDWR = 000002, LV2_O_ACCMODE = 000003, LV2_O_CREAT = 000100, LV2_O_EXCL = 000200, LV2_O_TRUNC = 001000, LV2_O_APPEND = 002000, LV2_O_MSELF = 010000, }; #define CELL_FS_TYPE_UNKNOWN 0 enum Lv2FsSeek { LV2_SEEK_SET, LV2_SEEK_CUR, LV2_SEEK_END, }; enum Lv2FsLength { LV2_MAX_FS_PATH_LENGTH = 1024, LV2_MAX_FS_FILE_NAME_LENGTH = 255, LV2_MAX_FS_MP_LENGTH = 31, }; enum { CELL_FS_S_IFDIR = 0040000, //directory CELL_FS_S_IFREG = 0100000, //regular CELL_FS_S_IFLNK = 0120000, //symbolic link CELL_FS_S_IFWHT = 0160000, //unknown CELL_FS_S_IRUSR = 0000400, //R for owner CELL_FS_S_IWUSR = 0000200, //W for owner CELL_FS_S_IXUSR = 0000100, //X for owner CELL_FS_S_IRGRP = 0000040, //R for group CELL_FS_S_IWGRP = 0000020, //W for group CELL_FS_S_IXGRP = 0000010, //X for group CELL_FS_S_IROTH = 0000004, //R for other CELL_FS_S_IWOTH = 0000002, //W for other CELL_FS_S_IXOTH = 0000001, //X for other }; struct Lv2FsStat { u32 st_mode; s32 st_uid; s32 st_gid; time_t st_atime; time_t st_mtime; time_t st_ctime; u64 st_size; u64 st_blksize; }; struct Lv2FsUtimbuf { time_t actime; time_t modtime; }; struct Lv2FsDirent { u8 d_type; u8 d_namlen; char d_name[LV2_MAX_FS_FILE_NAME_LENGTH + 1]; }; enum FsDirentType { CELL_FS_TYPE_DIRECTORY = 1, CELL_FS_TYPE_REGULAR = 2, CELL_FS_TYPE_SYMLINK = 3, }; SysCallBase sc_log("cellFs"); wxString ReadString(const u32 addr) { return GetWinPath(Memory.ReadString(addr)); } int cellFsOpen(const u32 path_addr, const int flags, const u32 fd_addr, const u32 arg_addr, const u64 size) { const wxString& path = Memory.ReadString(path_addr); sc_log.Log("cellFsOpen(path: %s, flags: 0x%x, fd_addr: 0x%x, arg_addr: 0x%x, size: 0x%llx)", path, flags, fd_addr, arg_addr, size); const wxString& ppath = GetWinPath(path); //ConLog.Warning("path: %s [%s]", ppath, path); s32 _oflags = flags; if(flags & LV2_O_CREAT) { _oflags &= ~LV2_O_CREAT; //create path for(uint p=1;p