From b59ef61113f9dec720f18fd2909cb5565f473c7f Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Thu, 28 Sep 2017 22:02:23 +0200 Subject: [PATCH] Upgrade to devkitPro v29 and reorganize --- Makefile | 7 +- README.md | 5 +- meta/meta.xml | 2 +- src/common/fs_defs.h | 1 - src/common/kernel_types.h | 10 - src/common/retain_vars.h | 1 - src/dynamic_libs/aoc_functions.c | 2 +- src/dynamic_libs/ax_functions.c | 2 +- src/dynamic_libs/fs_functions.c | 4 +- src/dynamic_libs/fs_functions.h | 4 +- src/dynamic_libs/gx2_functions.c | 2 +- src/dynamic_libs/os_functions.c | 2 +- src/dynamic_libs/os_functions.h | 2 +- src/dynamic_libs/padscore_functions.c | 2 +- src/dynamic_libs/socket_functions.c | 4 +- src/dynamic_libs/sys_functions.c | 2 +- src/dynamic_libs/vpad_functions.c | 2 +- src/entry.c | 17 +- src/fs/sd_fat_devoptab.c | 370 +++++++----- src/link.ld | 2 +- src/patcher/function_patcher_coreinit.c | 2 +- ...eption_handler.c => exception_handler.cpp} | 2 +- src/system/exception_handler.h | 3 +- src/{system => tcpgecko}/address.cpp | 1 - src/{system => tcpgecko}/address.h | 0 src/{utils => tcpgecko}/assertions.h | 0 src/{common => tcpgecko}/cafe.h | 2 - src/{ => tcpgecko}/code_handler.h | 0 .../disassembler.cpp} | 9 +- src/{system => tcpgecko}/disassembler.h | 0 .../hardware_breakpoints.hpp} | 5 +- src/{system => tcpgecko}/kernel.h | 4 +- src/{utils => tcpgecko}/linked_list.cpp | 0 src/{utils => tcpgecko}/linked_list.h | 0 src/{ => tcpgecko}/main.cpp | 28 +- src/{ => tcpgecko}/main.h | 4 +- src/tcpgecko/net.c | 561 ++++++++++++++++++ src/{utils => tcpgecko}/net.h | 0 src/{system => tcpgecko}/pause.h | 2 +- .../raw_assembly_cheats.h | 0 src/{ => tcpgecko}/sd_cheats.cpp | 12 +- src/{ => tcpgecko}/sd_cheats.h | 0 src/{utils => tcpgecko}/sd_ip_reader.cpp | 2 +- .../sd_ip_reader.h} | 2 +- .../software_breakpoints.h | 4 +- src/{system => tcpgecko}/stack.h | 4 +- src/{utils => tcpgecko}/stringify.h | 0 src/{ => tcpgecko}/tcp_gecko.cpp | 63 +- src/{ => tcpgecko}/tcp_gecko.h | 0 src/{patcher => tcpgecko}/texture.h | 0 src/{system => tcpgecko}/threads.cpp | 2 +- src/{system => tcpgecko}/threads.h | 0 src/{ => tcpgecko}/title.c | 2 +- src/{ => tcpgecko}/title.h | 0 src/{system => tcpgecko}/utilities.h | 1 - ...unction_patcher.c => function_patcher.cpp} | 2 +- src/utils/logger.c | 4 +- src/utils/net.c | 561 ------------------ tcpgecko.elf | Bin 207948 -> 159756 bytes 59 files changed, 905 insertions(+), 820 deletions(-) delete mode 100644 src/common/kernel_types.h rename src/system/{exception_handler.c => exception_handler.cpp} (99%) rename src/{system => tcpgecko}/address.cpp (95%) rename src/{system => tcpgecko}/address.h (100%) rename src/{utils => tcpgecko}/assertions.h (100%) rename src/{common => tcpgecko}/cafe.h (97%) rename src/{ => tcpgecko}/code_handler.h (100%) rename src/{system/disassembler.c => tcpgecko/disassembler.cpp} (84%) rename src/{system => tcpgecko}/disassembler.h (100%) rename src/{system/hardware_breakpoints.h => tcpgecko/hardware_breakpoints.hpp} (97%) rename src/{system => tcpgecko}/kernel.h (98%) rename src/{utils => tcpgecko}/linked_list.cpp (100%) rename src/{utils => tcpgecko}/linked_list.h (100%) rename src/{ => tcpgecko}/main.cpp (91%) rename src/{ => tcpgecko}/main.h (77%) create mode 100644 src/tcpgecko/net.c rename src/{utils => tcpgecko}/net.h (100%) rename src/{system => tcpgecko}/pause.h (97%) rename src/{system => tcpgecko}/raw_assembly_cheats.h (100%) rename src/{ => tcpgecko}/sd_cheats.cpp (94%) rename src/{ => tcpgecko}/sd_cheats.h (100%) rename src/{utils => tcpgecko}/sd_ip_reader.cpp (96%) rename src/{utils/sd_ip_reader.hpp => tcpgecko/sd_ip_reader.h} (64%) rename src/{system => tcpgecko}/software_breakpoints.h (98%) rename src/{system => tcpgecko}/stack.h (90%) rename src/{utils => tcpgecko}/stringify.h (100%) rename src/{ => tcpgecko}/tcp_gecko.cpp (97%) rename src/{ => tcpgecko}/tcp_gecko.h (100%) rename src/{patcher => tcpgecko}/texture.h (100%) rename src/{system => tcpgecko}/threads.cpp (97%) rename src/{system => tcpgecko}/threads.h (100%) rename src/{ => tcpgecko}/title.c (92%) rename src/{ => tcpgecko}/title.h (100%) rename src/{system => tcpgecko}/utilities.h (94%) rename src/utils/{function_patcher.c => function_patcher.cpp} (99%) delete mode 100644 src/utils/net.c diff --git a/Makefile b/Makefile index 51f7691..8328afb 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,8 @@ SOURCES := src \ src/kernel \ src/patcher \ src/system \ - src/utils + src/utils \ + src/tcpgecko DATA := INCLUDES := src @@ -47,9 +48,9 @@ INCLUDES := src # options for code generation #--------------------------------------------------------------------------------- CFLAGS := -std=gnu11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ - -O3 -Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) + -O3 -Wall -Wextra -D_GNU_SOURCE -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) CXXFLAGS := -std=gnu++11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ - -O3 -Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) + -O3 -Wall -Wextra -D_GNU_SOURCE -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) ASFLAGS := -mregnames LDFLAGS := -nostartfiles -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,-wrap,valloc,-wrap,_valloc_r,-wrap,_pvalloc_r,--gc-sections diff --git a/README.md b/README.md index bb2884d..b3b62aa 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,7 @@ No, you will run into incompatibility problems. It's not supported anymore but f No. Both projects are fundamentally different. # How do I compile? -Just like described [here](https://github.com/dimok789/homebrew_launcher/blob/master/README.md#building-the-homebrew-launcher). - -Also note that you need `devkitPro r27` and not the latest version. Older versions like `r27` can be downloaded from [here](https://sourceforge.net/projects/devkitpro/files/devkitPPC/). -Furthermore, you need to `make install` [`iosuhax`](https://github.com/dimok789/libiosuhax) since it is a dependency as well. +Just like described [here](https://github.com/dimok789/homebrew_launcher/blob/master/README.md#building-the-homebrew-launcher). Furthermore, you need to `make install` [`iosuhax`](https://github.com/dimok789/libiosuhax) since it is a dependency as well. # Credits **dimok** for Homebrew Launcher project engine/base diff --git a/meta/meta.xml b/meta/meta.xml index 23a6b12..cc5584a 100644 --- a/meta/meta.xml +++ b/meta/meta.xml @@ -3,7 +3,7 @@ TCP Gecko BullyWiiPlaza, wj44, dimok, Chadderz, Marionumber1 - 2.5 + 2.51 WiiU RAM Hacking A memory editor that does magical things to your games. In order to develop and apply real-time cheats use JGecko U. diff --git a/src/common/fs_defs.h b/src/common/fs_defs.h index c5aa881..939563f 100644 --- a/src/common/fs_defs.h +++ b/src/common/fs_defs.h @@ -2,7 +2,6 @@ #define FS_DEFS_H #include "types.h" -#include "kernel_types.h" #ifdef __cplusplus extern "C" { diff --git a/src/common/kernel_types.h b/src/common/kernel_types.h deleted file mode 100644 index baadef1..0000000 --- a/src/common/kernel_types.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -// typedef unsigned char u8; -// typedef unsigned int uint8_t; -// typedef unsigned short u16; -// typedef unsigned int uint16_t; -// typedef unsigned int u32; -// typedef unsigned int uint32_t; -// typedef unsigned long uint64_t; -// typedef unsigned long long u64; \ No newline at end of file diff --git a/src/common/retain_vars.h b/src/common/retain_vars.h index e8c353f..9a50978 100644 --- a/src/common/retain_vars.h +++ b/src/common/retain_vars.h @@ -1,7 +1,6 @@ #ifndef RETAINS_VARS_H_ #define RETAINS_VARS_H_ #include -#include "kernel_types.h" extern u8 gSettingLaunchPyGecko; extern u8 gSettingUseUpdatepath; diff --git a/src/dynamic_libs/aoc_functions.c b/src/dynamic_libs/aoc_functions.c index a9faeec..ef75707 100644 --- a/src/dynamic_libs/aoc_functions.c +++ b/src/dynamic_libs/aoc_functions.c @@ -33,7 +33,7 @@ EXPORT_DECL(s32, AOC_CloseTitle, void * title); void InitAocFunctionPointers(void) { - unsigned int aoc_handle = 0; + u32 aoc_handle = 0; OSDynLoad_Acquire("nn_aoc.rpl", &aoc_handle); if(aoc_handle == 0) diff --git a/src/dynamic_libs/ax_functions.c b/src/dynamic_libs/ax_functions.c index d84d6f8..4447d7e 100644 --- a/src/dynamic_libs/ax_functions.c +++ b/src/dynamic_libs/ax_functions.c @@ -48,7 +48,7 @@ EXPORT_DECL(void, AXSetVoiceLoopOffset, void *v, u32 offset); void InitAXFunctionPointers(void) { unsigned int *funcPointer = 0; - unsigned int sound_handle; + u32 sound_handle; OSDynLoad_Acquire("sndcore2.rpl", &sound_handle); OS_FIND_EXPORT(sound_handle, AXInitWithParams); diff --git a/src/dynamic_libs/fs_functions.c b/src/dynamic_libs/fs_functions.c index 9ae7996..9f09866 100644 --- a/src/dynamic_libs/fs_functions.c +++ b/src/dynamic_libs/fs_functions.c @@ -70,12 +70,12 @@ EXPORT_DECL(int, FSRollbackQuota, void *pClient, void *pCmd, const char *path, i EXPORT_DECL(int, FSRollbackQuotaAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -EXPORT_DECL(int, FSOpenDir, void *pClient, void *pCmd, const char *path, int *dh, int errHandling); +EXPORT_DECL(int, FSOpenDir, void *pClient, void *pCmd, const char *path, s32 *dh, int errHandling); EXPORT_DECL(int, FSOpenDirAsync, void *pClient, void *pCmd, const char *path, int *handle, int error, void *asyncParams); -EXPORT_DECL(int, FSReadDir, void *pClient, void *pCmd, int dh, FSDirEntry * dir_entry, int errHandling); +EXPORT_DECL(int, FSReadDir, void *pClient, void *pCmd, s32 dh, FSDirEntry * dir_entry, int errHandling); EXPORT_DECL(int, FSRewindDir, void *pClient, void *pCmd, int dh, int errHandling); diff --git a/src/dynamic_libs/fs_functions.h b/src/dynamic_libs/fs_functions.h index 21c1d47..b460396 100644 --- a/src/dynamic_libs/fs_functions.h +++ b/src/dynamic_libs/fs_functions.h @@ -80,11 +80,11 @@ extern int (*FSRollbackQuota)(void *pClient, void *pCmd, const char *path, int e extern int (*FSRollbackQuotaAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -extern int (*FSOpenDir)(void *pClient, void *pCmd, const char *path, int *dh, int errHandling); +extern int (*FSOpenDir)(void *pClient, void *pCmd, const char *path, s32 *dh, int errHandling); extern int (*FSOpenDirAsync)(void *pClient, void *pCmd, const char *path, int *handle, int error, void *asyncParams); -extern int (*FSReadDir)(void *pClient, void *pCmd, int dh, FSDirEntry *dir_entry, int errHandling); +extern int (*FSReadDir)(void *pClient, void *pCmd, s32 dh, FSDirEntry *dir_entry, int errHandling); extern int (*FSRewindDir)(void *pClient, void *pCmd, int dh, int errHandling); diff --git a/src/dynamic_libs/gx2_functions.c b/src/dynamic_libs/gx2_functions.c index b9bf671..c12c7a1 100644 --- a/src/dynamic_libs/gx2_functions.c +++ b/src/dynamic_libs/gx2_functions.c @@ -94,7 +94,7 @@ EXPORT_DECL(void, GX2RSetAllocator, void * (* allocFunc)(u32, u32, u32), void (* void InitGX2FunctionPointers(void) { unsigned int *funcPointer = 0; - unsigned int gx2_handle; + u32 gx2_handle; OSDynLoad_Acquire("gx2.rpl", &gx2_handle); OS_FIND_EXPORT(gx2_handle, GX2Init); diff --git a/src/dynamic_libs/os_functions.c b/src/dynamic_libs/os_functions.c index 04f90bd..020a568 100644 --- a/src/dynamic_libs/os_functions.c +++ b/src/dynamic_libs/os_functions.c @@ -24,7 +24,7 @@ #include "common/common.h" #include "os_functions.h" -unsigned int coreinit_handle = 0; +u32 coreinit_handle = 0; // unsigned int zlib_handle = 0; //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/dynamic_libs/os_functions.h b/src/dynamic_libs/os_functions.h index 77d3d8c..3fb584a 100644 --- a/src/dynamic_libs/os_functions.h +++ b/src/dynamic_libs/os_functions.h @@ -96,7 +96,7 @@ typedef void *(*DisasmGetSym)(u32 addr, u8 *symbolName, u32 nameBufSize); #define OS_MUTEX_SIZE 44 /* Handle for coreinit */ -extern unsigned int coreinit_handle; +extern u32 coreinit_handle; void InitOSFunctionPointers(void); diff --git a/src/dynamic_libs/padscore_functions.c b/src/dynamic_libs/padscore_functions.c index c51764f..9c7c192 100644 --- a/src/dynamic_libs/padscore_functions.c +++ b/src/dynamic_libs/padscore_functions.c @@ -34,7 +34,7 @@ EXPORT_DECL(s32, KPADRead, s32 chan, void * data, u32 size); void InitPadScoreFunctionPointers(void) { unsigned int *funcPointer = 0; - unsigned int padscore_handle; + u32 padscore_handle; OSDynLoad_Acquire("padscore.rpl", &padscore_handle); OS_FIND_EXPORT(padscore_handle, KPADInit); diff --git a/src/dynamic_libs/socket_functions.c b/src/dynamic_libs/socket_functions.c index b27052c..2f4a7e7 100644 --- a/src/dynamic_libs/socket_functions.c +++ b/src/dynamic_libs/socket_functions.c @@ -43,11 +43,11 @@ EXPORT_DECL(int, inet_aton, const char *cp, struct in_addr *inp); void InitSocketFunctionPointers(void) { - unsigned int nsysnet_handle; + u32 nsysnet_handle; unsigned int *funcPointer = 0; OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle); - unsigned int nn_ac_handle; + u32 nn_ac_handle; int(*ACInitialize)(); int(*ACGetStartupId) (unsigned int *id); int(*ACConnectWithConfigId) (unsigned int id); diff --git a/src/dynamic_libs/sys_functions.c b/src/dynamic_libs/sys_functions.c index b2a1d89..a7dd0e1 100644 --- a/src/dynamic_libs/sys_functions.c +++ b/src/dynamic_libs/sys_functions.c @@ -31,7 +31,7 @@ EXPORT_DECL(int, SYSCheckTitleExists, u64 titleId); void InitSysFunctionPointers(void) { unsigned int *funcPointer = 0; - unsigned int sysapp_handle; + u32 sysapp_handle; OSDynLoad_Acquire("sysapp.rpl", &sysapp_handle); OS_FIND_EXPORT(sysapp_handle, _SYSLaunchTitleByPathFromLauncher); diff --git a/src/dynamic_libs/vpad_functions.c b/src/dynamic_libs/vpad_functions.c index a2d8e3f..f4bb174 100644 --- a/src/dynamic_libs/vpad_functions.c +++ b/src/dynamic_libs/vpad_functions.c @@ -30,7 +30,7 @@ EXPORT_DECL(void, VPADRead, int chan, VPADData *buffer, u32 buffer_size, s32 *er void InitVPadFunctionPointers(void) { unsigned int *funcPointer = 0; - unsigned int vpad_handle; + u32 vpad_handle; OSDynLoad_Acquire("vpad.rpl", &vpad_handle); OS_FIND_EXPORT(vpad_handle, VPADInit); diff --git a/src/entry.c b/src/entry.c index 7712e90..9cd3685 100644 --- a/src/entry.c +++ b/src/entry.c @@ -1,13 +1,12 @@ -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/gx2_functions.h" +#include "tcpgecko/main.h" +#include "tcpgecko/title.h" #include "dynamic_libs/socket_functions.h" -#include "common/common.h" -#include "tcp_gecko.h" -#include "main.h" +#include "dynamic_libs/gx2_functions.h" #include "utils/logger.h" -#include "title.h" +#include "tcpgecko/tcp_gecko.h" +#include "common/common.h" -int __entry_menu(int argc, char **argv) { +int entry() { if (isRunningAllowedTitleID()) { InitOSFunctionPointers(); InitSocketFunctionPointers(); @@ -24,4 +23,8 @@ int __entry_menu(int argc, char **argv) { //! * Jump to our application * //! ******************************************************************* return Menu_Main(); +} + +int __entry_menu(int argc, char **argv) { + return entry(); } \ No newline at end of file diff --git a/src/fs/sd_fat_devoptab.c b/src/fs/sd_fat_devoptab.c index c7d338f..3a42132 100644 --- a/src/fs/sd_fat_devoptab.c +++ b/src/fs/sd_fat_devoptab.c @@ -29,10 +29,12 @@ #include #include #include +#include "dynamic_libs/fs_functions.h" +#include "dynamic_libs/os_functions.h" +#include "fs_utils.h" +#include "utils/logger.h" #include "../dynamic_libs/fs_functions.h" #include "../dynamic_libs/os_functions.h" -#include "fs_utils.h" -#include "../utils/logger.h" #define FS_ALIGNMENT 0x40 #define FS_ALIGN(x) (((x) + FS_ALIGNMENT - 1) & ~(FS_ALIGNMENT - 1)) @@ -62,7 +64,8 @@ typedef struct _sd_fat_dir_entry_t { int dirHandle; } sd_fat_dir_entry_t; -static sd_fat_private_t *sd_fat_get_device_data(const char *path) { +static sd_fat_private_t *sd_fat_get_device_data(const char *path) +{ const devoptab_t *devoptab = NULL; char name[128] = {0}; int i; @@ -79,7 +82,7 @@ static sd_fat_private_t *sd_fat_get_device_data(const char *path) { devoptab = devoptab_list[i]; if (devoptab && devoptab->name) { if (strcmp(name, devoptab->name) == 0) { - return (sd_fat_private_t *) devoptab->deviceData; + return (sd_fat_private_t *)devoptab->deviceData; } } } @@ -87,7 +90,8 @@ static sd_fat_private_t *sd_fat_get_device_data(const char *path) { return NULL; } -static char *sd_fat_real_path(const char *path, sd_fat_private_t *dev) { +static char *sd_fat_real_path (const char *path, sd_fat_private_t *dev) +{ // Sanity check if (!path) return NULL; @@ -99,8 +103,8 @@ static char *sd_fat_real_path(const char *path, sd_fat_private_t *dev) { int mount_len = strlen(dev->mount_path); - char *new_name = (char *) malloc(mount_len + strlen(path) + 1); - if (new_name) { + char *new_name = (char*)malloc(mount_len + strlen(path) + 1); + if(new_name) { strcpy(new_name, dev->mount_path); strcpy(new_name + mount_len, path); return new_name; @@ -108,14 +112,15 @@ static char *sd_fat_real_path(const char *path, sd_fat_private_t *dev) { return new_name; } -static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, int flags, int mode) { +static int sd_fat_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode) +{ sd_fat_private_t *dev = sd_fat_get_device_data(path); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fileStruct; + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fileStruct; file->dev = dev; // Determine which mode the file is opened for @@ -148,7 +153,7 @@ static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, i OSLockMutex(dev->pMutex); char *real_path = sd_fat_real_path(path, dev); - if (!path) { + if(!path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -158,10 +163,11 @@ static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, i free(real_path); - if (result == 0) { + if(result == 0) + { FSStat stats; result = FSGetStatFile(dev->pClient, dev->pCmd, fd, &stats, -1); - if (result != 0) { + if(result != 0) { FSCloseFile(dev->pClient, dev->pCmd, fd, -1); r->_errno = result; OSUnlockMutex(dev->pMutex); @@ -171,7 +177,7 @@ static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, i file->pos = 0; file->len = stats.size; OSUnlockMutex(dev->pMutex); - return (int) file; + return (int)file; } r->_errno = result; @@ -180,9 +186,10 @@ static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, i } -static int sd_fat_close_r(struct _reent *r, int fd) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static int sd_fat_close_r (struct _reent *r, void *fd) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return -1; } @@ -193,23 +200,26 @@ static int sd_fat_close_r(struct _reent *r, int fd) { OSUnlockMutex(file->dev->pMutex); - if (result < 0) { + if(result < 0) + { r->_errno = result; return -1; } return 0; } -static off_t sd_fat_seek_r(struct _reent *r, int fd, off_t pos, int dir) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static off_t sd_fat_seek_r (struct _reent *r, void* fd, off_t pos, int dir) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return 0; } OSLockMutex(file->dev->pMutex); - switch (dir) { + switch(dir) + { case SEEK_SET: file->pos = pos; break; @@ -228,21 +238,24 @@ static off_t sd_fat_seek_r(struct _reent *r, int fd, off_t pos, int dir) { OSUnlockMutex(file->dev->pMutex); - if (result == 0) { + if(result == 0) + { return file->pos; } return result; } -static ssize_t sd_fat_write_r(struct _reent *r, int fd, const char *ptr, size_t len) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static ssize_t sd_fat_write_r (struct _reent *r, void *fd, const char *ptr, size_t len) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return 0; } - if (!file->write) { + if(!file->write) + { r->_errno = EACCES; return 0; } @@ -250,11 +263,11 @@ static ssize_t sd_fat_write_r(struct _reent *r, int fd, const char *ptr, size_t OSLockMutex(file->dev->pMutex); size_t len_aligned = FS_ALIGN(len); - if (len_aligned > 0x4000) + if(len_aligned > 0x4000) len_aligned = 0x4000; - unsigned char *tmpBuf = (unsigned char *) memalign(FS_ALIGNMENT, len_aligned); - if (!tmpBuf) { + unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned); + if(!tmpBuf) { r->_errno = ENOMEM; OSUnlockMutex(file->dev->pMutex); return 0; @@ -262,19 +275,25 @@ static ssize_t sd_fat_write_r(struct _reent *r, int fd, const char *ptr, size_t size_t done = 0; - while (done < len) { + while(done < len) + { size_t write_size = (len_aligned < (len - done)) ? len_aligned : (len - done); memcpy(tmpBuf, ptr + done, write_size); int result = FSWriteFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, write_size, file->fd, 0, -1); - if (result < 0) { + if(result < 0) + { r->_errno = result; break; - } else if (result == 0) { - if (write_size > 0) + } + else if(result == 0) + { + if(write_size > 0) done = 0; break; - } else { + } + else + { done += result; file->pos += result; } @@ -285,14 +304,16 @@ static ssize_t sd_fat_write_r(struct _reent *r, int fd, const char *ptr, size_t return done; } -static ssize_t sd_fat_read_r(struct _reent *r, int fd, char *ptr, size_t len) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static ssize_t sd_fat_read_r (struct _reent *r, void* fd, char *ptr, size_t len) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return 0; } - if (!file->read) { + if(!file->read) + { r->_errno = EACCES; return 0; } @@ -300,11 +321,11 @@ static ssize_t sd_fat_read_r(struct _reent *r, int fd, char *ptr, size_t len) { OSLockMutex(file->dev->pMutex); size_t len_aligned = FS_ALIGN(len); - if (len_aligned > 0x4000) + if(len_aligned > 0x4000) len_aligned = 0x4000; - unsigned char *tmpBuf = (unsigned char *) memalign(FS_ALIGNMENT, len_aligned); - if (!tmpBuf) { + unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned); + if(!tmpBuf) { r->_errno = ENOMEM; OSUnlockMutex(file->dev->pMutex); return 0; @@ -312,18 +333,24 @@ static ssize_t sd_fat_read_r(struct _reent *r, int fd, char *ptr, size_t len) { size_t done = 0; - while (done < len) { + while(done < len) + { size_t read_size = (len_aligned < (len - done)) ? len_aligned : (len - done); int result = FSReadFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, read_size, file->fd, 0, -1); - if (result < 0) { + if(result < 0) + { r->_errno = result; done = 0; break; - } else if (result == 0) { + } + else if(result == 0) + { //! TODO: error on read_size > 0 break; - } else { + } + else + { memcpy(ptr + done, tmpBuf, read_size); done += result; file->pos += result; @@ -336,9 +363,10 @@ static ssize_t sd_fat_read_r(struct _reent *r, int fd, char *ptr, size_t len) { } -static int sd_fat_fstat_r(struct _reent *r, int fd, struct stat *st) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static int sd_fat_fstat_r (struct _reent *r, void* fd, struct stat *st) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return -1; } @@ -350,7 +378,7 @@ static int sd_fat_fstat_r(struct _reent *r, int fd, struct stat *st) { FSStat stats; int result = FSGetStatFile(file->dev->pClient, file->dev->pCmd, file->fd, &stats, -1); - if (result != 0) { + if(result != 0) { r->_errno = result; OSUnlockMutex(file->dev->pMutex); return -1; @@ -373,9 +401,10 @@ static int sd_fat_fstat_r(struct _reent *r, int fd, struct stat *st) { return 0; } -static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static int sd_fat_ftruncate_r (struct _reent *r, void* fd, off_t len) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return -1; } @@ -386,7 +415,7 @@ static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) { OSUnlockMutex(file->dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -394,9 +423,10 @@ static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) { return 0; } -static int sd_fat_fsync_r(struct _reent *r, int fd) { - sd_fat_file_state_t *file = (sd_fat_file_state_t *) fd; - if (!file->dev) { +static int sd_fat_fsync_r (struct _reent *r, void* fd) +{ + sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; + if(!file->dev) { r->_errno = ENODEV; return -1; } @@ -407,7 +437,7 @@ static int sd_fat_fsync_r(struct _reent *r, int fd) { OSUnlockMutex(file->dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -415,9 +445,10 @@ static int sd_fat_fsync_r(struct _reent *r, int fd) { return 0; } -static int sd_fat_stat_r(struct _reent *r, const char *path, struct stat *st) { +static int sd_fat_stat_r (struct _reent *r, const char *path, struct stat *st) +{ sd_fat_private_t *dev = sd_fat_get_device_data(path); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -428,7 +459,7 @@ static int sd_fat_stat_r(struct _reent *r, const char *path, struct stat *st) { memset(st, 0, sizeof(struct stat)); char *real_path = sd_fat_real_path(path, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -440,14 +471,14 @@ static int sd_fat_stat_r(struct _reent *r, const char *path, struct stat *st) { free(real_path); - if (result < 0) { + if(result < 0) { r->_errno = result; OSUnlockMutex(dev->pMutex); return -1; } // mark root also as directory - st->st_mode = ((stats.flag & 0x80000000) || (strlen(dev->mount_path) + 1 == strlen(real_path))) ? S_IFDIR : S_IFREG; + st->st_mode = ((stats.flag & 0x80000000) || (strlen(dev->mount_path) + 1 == strlen(real_path)))? S_IFDIR : S_IFREG; st->st_nlink = 1; st->st_size = stats.size; st->st_blocks = (stats.size + 511) >> 9; @@ -465,14 +496,16 @@ static int sd_fat_stat_r(struct _reent *r, const char *path, struct stat *st) { return 0; } -static int sd_fat_link_r(struct _reent *r, const char *existing, const char *newLink) { +static int sd_fat_link_r (struct _reent *r, const char *existing, const char *newLink) +{ r->_errno = ENOTSUP; return -1; } -static int sd_fat_unlink_r(struct _reent *r, const char *name) { +static int sd_fat_unlink_r (struct _reent *r, const char *name) +{ sd_fat_private_t *dev = sd_fat_get_device_data(name); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -480,7 +513,7 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) { OSLockMutex(dev->pMutex); char *real_path = sd_fat_real_path(name, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -493,7 +526,7 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) { OSUnlockMutex(dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -501,9 +534,10 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) { return 0; } -static int sd_fat_chdir_r(struct _reent *r, const char *name) { +static int sd_fat_chdir_r (struct _reent *r, const char *name) +{ sd_fat_private_t *dev = sd_fat_get_device_data(name); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -511,7 +545,7 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) { OSLockMutex(dev->pMutex); char *real_path = sd_fat_real_path(name, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -523,7 +557,7 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) { OSUnlockMutex(dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -531,9 +565,10 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) { return 0; } -static int sd_fat_rename_r(struct _reent *r, const char *oldName, const char *newName) { +static int sd_fat_rename_r (struct _reent *r, const char *oldName, const char *newName) +{ sd_fat_private_t *dev = sd_fat_get_device_data(oldName); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -541,13 +576,13 @@ static int sd_fat_rename_r(struct _reent *r, const char *oldName, const char *ne OSLockMutex(dev->pMutex); char *real_oldpath = sd_fat_real_path(oldName, dev); - if (!real_oldpath) { + if(!real_oldpath) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; } char *real_newpath = sd_fat_real_path(newName, dev); - if (!real_newpath) { + if(!real_newpath) { r->_errno = ENOMEM; free(real_oldpath); OSUnlockMutex(dev->pMutex); @@ -561,7 +596,7 @@ static int sd_fat_rename_r(struct _reent *r, const char *oldName, const char *ne OSUnlockMutex(dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -570,9 +605,10 @@ static int sd_fat_rename_r(struct _reent *r, const char *oldName, const char *ne } -static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) { +static int sd_fat_mkdir_r (struct _reent *r, const char *path, int mode) +{ sd_fat_private_t *dev = sd_fat_get_device_data(path); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -580,7 +616,7 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) { OSLockMutex(dev->pMutex); char *real_path = sd_fat_real_path(path, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -592,7 +628,7 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) { OSUnlockMutex(dev->pMutex); - if (result < 0) { + if(result < 0) { r->_errno = result; return -1; } @@ -600,9 +636,10 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) { return 0; } -static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs *buf) { +static int sd_fat_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf) +{ sd_fat_private_t *dev = sd_fat_get_device_data(path); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return -1; } @@ -613,7 +650,7 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs * memset(buf, 0, sizeof(struct statvfs)); char *real_path = sd_fat_real_path(path, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; @@ -625,7 +662,7 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs * free(real_path); - if (result < 0) { + if(result < 0) { r->_errno = result; OSUnlockMutex(dev->pMutex); return -1; @@ -650,7 +687,7 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs * buf->f_ffree = 0xffffffff; // File system id - buf->f_fsid = (int) dev; + buf->f_fsid = (int)dev; // Bit mask of f_flag values. buf->f_flag = 0; @@ -663,25 +700,26 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs * return 0; } -static DIR_ITER *sd_fat_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path) { +static DIR_ITER *sd_fat_diropen_r (struct _reent *r, DIR_ITER *dirState, const char *path) +{ sd_fat_private_t *dev = sd_fat_get_device_data(path); - if (!dev) { + if(!dev) { r->_errno = ENODEV; return NULL; } - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *) dirState->dirStruct; + sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; OSLockMutex(dev->pMutex); char *real_path = sd_fat_real_path(path, dev); - if (!real_path) { + if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return NULL; } - int dirHandle; + s32 dirHandle; int result = FSOpenDir(dev->pClient, dev->pCmd, real_path, &dirHandle, -1); @@ -689,7 +727,8 @@ static DIR_ITER *sd_fat_diropen_r(struct _reent *r, DIR_ITER *dirState, const ch OSUnlockMutex(dev->pMutex); - if (result < 0) { + if(result < 0) + { r->_errno = result; return NULL; } @@ -700,9 +739,10 @@ static DIR_ITER *sd_fat_diropen_r(struct _reent *r, DIR_ITER *dirState, const ch return dirState; } -static int sd_fat_dirclose_r(struct _reent *r, DIR_ITER *dirState) { - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *) dirState->dirStruct; - if (!dirIter->dev) { +static int sd_fat_dirclose_r (struct _reent *r, DIR_ITER *dirState) +{ + sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; + if(!dirIter->dev) { r->_errno = ENODEV; return -1; } @@ -713,16 +753,18 @@ static int sd_fat_dirclose_r(struct _reent *r, DIR_ITER *dirState) { OSUnlockMutex(dirIter->dev->pMutex); - if (result < 0) { + if(result < 0) + { r->_errno = result; return -1; } return 0; } -static int sd_fat_dirreset_r(struct _reent *r, DIR_ITER *dirState) { - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *) dirState->dirStruct; - if (!dirIter->dev) { +static int sd_fat_dirreset_r (struct _reent *r, DIR_ITER *dirState) +{ + sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; + if(!dirIter->dev) { r->_errno = ENODEV; return -1; } @@ -733,26 +775,29 @@ static int sd_fat_dirreset_r(struct _reent *r, DIR_ITER *dirState) { OSUnlockMutex(dirIter->dev->pMutex); - if (result < 0) { + if(result < 0) + { r->_errno = result; return -1; } return 0; } -static int sd_fat_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) { - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *) dirState->dirStruct; - if (!dirIter->dev) { +static int sd_fat_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) +{ + sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; + if(!dirIter->dev) { r->_errno = ENODEV; return -1; } OSLockMutex(dirIter->dev->pMutex); - FSDirEntry *dir_entry = malloc(sizeof(FSDirEntry)); + FSDirEntry * dir_entry = malloc(sizeof(FSDirEntry)); int result = FSReadDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, dir_entry, -1); - if (result < 0) { + if(result < 0) + { free(dir_entry); r->_errno = result; OSUnlockMutex(dirIter->dev->pMutex); @@ -762,7 +807,8 @@ static int sd_fat_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename // Fetch the current entry strcpy(filename, dir_entry->name); - if (st) { + if(st) + { memset(st, 0, sizeof(struct stat)); st->st_mode = (dir_entry->stat.flag & 0x80000000) ? S_IFDIR : S_IFREG; st->st_nlink = 1; @@ -782,10 +828,10 @@ static int sd_fat_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename return 0; } -// NTFS device driver devoptab +// SD device driver devoptab static const devoptab_t devops_sd_fat = { NULL, /* Device name */ - sizeof(sd_fat_file_state_t), + sizeof (sd_fat_file_state_t), sd_fat_open_r, sd_fat_close_r, sd_fat_write_r, @@ -798,7 +844,7 @@ static const devoptab_t devops_sd_fat = { sd_fat_chdir_r, sd_fat_rename_r, sd_fat_mkdir_r, - sizeof(sd_fat_dir_entry_t), + sizeof (sd_fat_dir_entry_t), sd_fat_diropen_r, sd_fat_dirreset_r, sd_fat_dirnext_r, @@ -806,12 +852,15 @@ static const devoptab_t devops_sd_fat = { sd_fat_statvfs_r, sd_fat_ftruncate_r, sd_fat_fsync_r, + NULL, /* Device data */ NULL, /* sd_fat_chmod_r */ NULL, /* sd_fat_fchmod_r */ - NULL /* Device data */ + NULL /* sd_fat_rmdir_r */ }; -static int sd_fat_add_device(const char *name, const char *mount_path, void *pClient, void *pCmd) { + +static int sd_fat_add_device (const char *name, const char *mount_path, void *pClient, void *pCmd) +{ devoptab_t *dev = NULL; char *devname = NULL; char *devpath = NULL; @@ -831,19 +880,25 @@ static int sd_fat_add_device(const char *name, const char *mount_path, void *pCl } // Use the space allocated at the end of the devoptab for storing the device name - devname = (char *) (dev + 1); + devname = (char*)(dev + 1); strcpy(devname, name); // create private data - sd_fat_private_t *priv = (sd_fat_private_t *) malloc(sizeof(sd_fat_private_t) + strlen(mount_path) + 1); - if (!priv) { + int mount_path_len = 0; + if(mount_path != NULL){ + mount_path_len = strlen(mount_path); + } + sd_fat_private_t *priv = (sd_fat_private_t *)malloc(sizeof(sd_fat_private_t) + mount_path_len + 1); + if(!priv) { free(dev); errno = ENOMEM; return -1; } - devpath = (char *) (priv + 1); - strcpy(devpath, mount_path); + devpath = (char*)(priv+1); + if(mount_path != NULL){ + strcpy(devpath, mount_path); + } // setup private data priv->mount_path = devpath; @@ -851,7 +906,7 @@ static int sd_fat_add_device(const char *name, const char *mount_path, void *pCl priv->pCmd = pCmd; priv->pMutex = malloc(OS_MUTEX_SIZE); - if (!priv->pMutex) { + if(!priv->pMutex) { free(dev); free(priv); errno = ENOMEM; @@ -882,7 +937,31 @@ static int sd_fat_add_device(const char *name, const char *mount_path, void *pCl return -1; } -static int sd_fat_remove_device(const char *path, void **pClient, void **pCmd, char **mountPath) { +/* +Because of some weird reason unmounting doesn't work properly. +This fix if mainly when a usb drive is connected. +It resets the devoptab_list, otherwise mounting again would throw an exception (in strlen). +No memory is free'd here. Maybe a problem?!?!? +*/ + +void deleteDevTabsNames(){ + const devoptab_t * devoptab = NULL; + u32 last_entry = (u32) devoptab_list[STD_MAX-1]; + for (int i = 3; i < STD_MAX; i++) { + devoptab = devoptab_list[i]; + + if (devoptab) { + //log_printf("check devotab %d %08X\n",i,devoptab); + if((u32) devoptab != last_entry){ + devoptab_list[i] = (const devoptab_t *)last_entry; + //log_printf("Removed devotab %d %08X %08X %08X\n",i,devoptab,devoptab->name,devoptab->deviceData); + } + } + } +} + +static int sd_fat_remove_device (const char *path, void **pClient, void **pCmd, char **mountPath) +{ const devoptab_t *devoptab = NULL; char name[128] = {0}; int i; @@ -901,19 +980,22 @@ static int sd_fat_remove_device(const char *path, void **pClient, void **pCmd, c if (strcmp(name, devoptab->name) == 0) { devoptab_list[i] = devoptab_list[0]; - if (devoptab->deviceData) { - sd_fat_private_t *priv = (sd_fat_private_t *) devoptab->deviceData; - *pClient = priv->pClient; - *pCmd = priv->pCmd; - *mountPath = (char *) malloc(strlen(priv->mount_path) + 1); - if (*mountPath) - strcpy(*mountPath, priv->mount_path); - if (priv->pMutex) + if(devoptab->deviceData) + { + sd_fat_private_t *priv = (sd_fat_private_t *)devoptab->deviceData; + if(pClient != NULL) *pClient = priv->pClient; + if(pCmd != NULL) *pCmd = priv->pCmd; + if(mountPath != NULL){ + *mountPath = (char*) malloc(strlen(priv->mount_path)+1); + if(*mountPath) + strcpy(*mountPath, priv->mount_path); + } + if(priv->pMutex) free(priv->pMutex); free(devoptab->deviceData); } - free((devoptab_t *) devoptab); + free((devoptab_t*)devoptab); return 0; } } @@ -922,18 +1004,19 @@ static int sd_fat_remove_device(const char *path, void **pClient, void **pCmd, c return -1; } -int mount_sd_fat(const char *path) { +int mount_sd_fat(const char *path) +{ int result = -1; // get command and client - void *pClient = malloc(FS_CLIENT_SIZE); - void *pCmd = malloc(FS_CMD_BLOCK_SIZE); + void* pClient = malloc(FS_CLIENT_SIZE); + void* pCmd = malloc(FS_CMD_BLOCK_SIZE); - if (!pClient || !pCmd) { + if(!pClient || !pCmd) { // just in case free if not 0 - if (pClient) + if(pClient) free(pClient); - if (pCmd) + if(pCmd) free(pCmd); return -2; } @@ -944,26 +1027,23 @@ int mount_sd_fat(const char *path) { char *mountPath = NULL; - result = MountFS(pClient, pCmd, &mountPath); - if (result == 0) { - log_print("MountFS success\n"); + if(MountFS(pClient, pCmd, &mountPath) == 0) { result = sd_fat_add_device(path, mountPath, pClient, pCmd); - log_printf("sd_fat_add_device result: %i\n", result); free(mountPath); - } else { - log_printf("MountFS error: %i\n", result); } return result; } -int unmount_sd_fat(const char *path) { +int unmount_sd_fat(const char *path) +{ void *pClient = 0; void *pCmd = 0; char *mountPath = 0; int result = sd_fat_remove_device(path, &pClient, &pCmd, &mountPath); - if (result == 0) { + if(result == 0) + { UmountFS(pClient, pCmd, mountPath); FSDelClient(pClient); free(pClient); @@ -973,3 +1053,11 @@ int unmount_sd_fat(const char *path) { } return result; } + +int mount_fake(){ + return sd_fat_add_device("fake", NULL, NULL, NULL); +} + +int unmount_fake(){ + return sd_fat_remove_device ("fake", NULL,NULL,NULL); +} \ No newline at end of file diff --git a/src/link.ld b/src/link.ld index da0fb16..5b205b2 100644 --- a/src/link.ld +++ b/src/link.ld @@ -40,4 +40,4 @@ SECTIONS { } /******************************************************** FS ********************************************************/ -/* coreinit.rpl difference in addresses 0xFE3C00 */ +/* coreinit.rpl difference in addresses 0xFE3C00 */ \ No newline at end of file diff --git a/src/patcher/function_patcher_coreinit.c b/src/patcher/function_patcher_coreinit.c index 9d2ec72..d4ef0c1 100644 --- a/src/patcher/function_patcher_coreinit.c +++ b/src/patcher/function_patcher_coreinit.c @@ -11,7 +11,7 @@ declareFunctionHook(int, FSOpenFileAsync, void *pClient, void *pCmd, const char return real_FSOpenFileAsync(pClient, pCmd, path, mode, handle, error, asyncParams); } -declareFunctionHook(int, FSOpenDir, void *pClient, void *pCmd, const char *path, int *dh, int errHandling) { +declareFunctionHook(int, FSOpenDir, void *pClient, void *pCmd, const char *path, s32 *dh, int errHandling) { log_printf("FSOpenDir(): %s", path); return real_FSOpenDir(pClient, pCmd, path, dh, errHandling); } diff --git a/src/system/exception_handler.c b/src/system/exception_handler.cpp similarity index 99% rename from src/system/exception_handler.c rename to src/system/exception_handler.cpp index fd262bc..dee3ecb 100644 --- a/src/system/exception_handler.c +++ b/src/system/exception_handler.cpp @@ -77,7 +77,7 @@ static unsigned char exceptionCallback(void *c, unsigned char exception_type) { register frame_rec_t l, p = (frame_rec_t) lr; l = p; - p = r1; + p = (frame_rec_t) r1; if (!p) asm volatile("mr %0,%%r1" : "=r"(p)); diff --git a/src/system/exception_handler.h b/src/system/exception_handler.h index 4f1d8ce..707960d 100644 --- a/src/system/exception_handler.h +++ b/src/system/exception_handler.h @@ -5,8 +5,7 @@ extern "C" { #endif -#include "../utils/stringify.h" -#include "../common/kernel_types.h" +#include "../tcpgecko/stringify.h" #define OS_EXCEPTION_DSI 2 #define OS_EXCEPTION_ISI 3 diff --git a/src/system/address.cpp b/src/tcpgecko/address.cpp similarity index 95% rename from src/system/address.cpp rename to src/tcpgecko/address.cpp index d562fbd..23a2b7e 100644 --- a/src/system/address.cpp +++ b/src/tcpgecko/address.cpp @@ -1,4 +1,3 @@ -#include "address.h" #include "../dynamic_libs/os_functions.h" int validateAddressRange(int starting_address, int ending_address) { diff --git a/src/system/address.h b/src/tcpgecko/address.h similarity index 100% rename from src/system/address.h rename to src/tcpgecko/address.h diff --git a/src/utils/assertions.h b/src/tcpgecko/assertions.h similarity index 100% rename from src/utils/assertions.h rename to src/tcpgecko/assertions.h diff --git a/src/common/cafe.h b/src/tcpgecko/cafe.h similarity index 97% rename from src/common/cafe.h rename to src/tcpgecko/cafe.h index b6b6d1c..0eeff56 100644 --- a/src/common/cafe.h +++ b/src/tcpgecko/cafe.h @@ -1,8 +1,6 @@ #ifndef TCPGECKO_STACK_H #define TCPGECKO_STACK_H -#include "kernel_types.h" - typedef struct OSThread; typedef struct OSThreadLink { diff --git a/src/code_handler.h b/src/tcpgecko/code_handler.h similarity index 100% rename from src/code_handler.h rename to src/tcpgecko/code_handler.h diff --git a/src/system/disassembler.c b/src/tcpgecko/disassembler.cpp similarity index 84% rename from src/system/disassembler.c rename to src/tcpgecko/disassembler.cpp index 1cdbcab..3557e2f 100644 --- a/src/system/disassembler.c +++ b/src/tcpgecko/disassembler.cpp @@ -1,10 +1,9 @@ -#include "disassembler.h" -#include "../utils/assertions.h" #include "../dynamic_libs/os_functions.h" +#include "assertions.h" #include +#include #include #include -#include char *disassemblerBuffer; void *disassemblerBufferPointer; @@ -13,7 +12,7 @@ void *disassemblerBufferPointer; void formatDisassembled(char *format, ...) { if (!disassemblerBuffer) { - disassemblerBuffer = malloc(DISASSEMBLER_BUFFER_SIZE); + disassemblerBuffer = (char *) malloc(DISASSEMBLER_BUFFER_SIZE); ASSERT_ALLOCATED(disassemblerBuffer, "Disassembler buffer") disassemblerBufferPointer = disassemblerBuffer; } @@ -27,7 +26,7 @@ void formatDisassembled(char *format, ...) { va_end(variableArguments); // Do not smash the buffer - long projectedSize = (void *) disassemblerBuffer - disassemblerBufferPointer + printedBytesCount; + long projectedSize = disassemblerBuffer - (char *) disassemblerBufferPointer + printedBytesCount; if (projectedSize < DISASSEMBLER_BUFFER_SIZE) { memcpy(disassemblerBuffer, temporaryBuffer, printedBytesCount); disassemblerBuffer += printedBytesCount; diff --git a/src/system/disassembler.h b/src/tcpgecko/disassembler.h similarity index 100% rename from src/system/disassembler.h rename to src/tcpgecko/disassembler.h diff --git a/src/system/hardware_breakpoints.h b/src/tcpgecko/hardware_breakpoints.hpp similarity index 97% rename from src/system/hardware_breakpoints.h rename to src/tcpgecko/hardware_breakpoints.hpp index e1cfbd7..2b4e2c2 100644 --- a/src/system/hardware_breakpoints.h +++ b/src/tcpgecko/hardware_breakpoints.hpp @@ -1,11 +1,10 @@ -#include "../utils/stringify.h" +#include "stringify.h" #include "../dynamic_libs/os_functions.h" #include "threads.h" #include "../utils/logger.h" -#include "../main.h" +#include "main.h" #include "utilities.h" #include "software_breakpoints.h" -#include "../common/kernel_types.h" #ifndef TCPGECKO_BREAKPOINTS_H #define TCPGECKO_BREAKPOINTS_H diff --git a/src/system/kernel.h b/src/tcpgecko/kernel.h similarity index 98% rename from src/system/kernel.h rename to src/tcpgecko/kernel.h index 335c93d..bc11df6 100644 --- a/src/system/kernel.h +++ b/src/tcpgecko/kernel.h @@ -1,9 +1,9 @@ #pragma once #include "../kernel/syscalls.h" -#include "../utils/assertions.h" +#include "assertions.h" #include "../dynamic_libs/os_functions.h" -#include "../tcp_gecko.h" +#include "tcp_gecko.h" #include "../utils/logger.h" // TODO Variable size, not hard-coded diff --git a/src/utils/linked_list.cpp b/src/tcpgecko/linked_list.cpp similarity index 100% rename from src/utils/linked_list.cpp rename to src/tcpgecko/linked_list.cpp diff --git a/src/utils/linked_list.h b/src/tcpgecko/linked_list.h similarity index 100% rename from src/utils/linked_list.h rename to src/tcpgecko/linked_list.h diff --git a/src/main.cpp b/src/tcpgecko/main.cpp similarity index 91% rename from src/main.cpp rename to src/tcpgecko/main.cpp index 03ad761..9473b00 100644 --- a/src/main.cpp +++ b/src/tcpgecko/main.cpp @@ -5,21 +5,23 @@ #include #include #include -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/fs_functions.h" -#include "dynamic_libs/sys_functions.h" -#include "dynamic_libs/vpad_functions.h" -#include "dynamic_libs/socket_functions.h" -#include "kernel/kernel_functions.h" -#include "system/memory.h" -#include "common/common.h" +#include "../dynamic_libs/os_functions.h" +#include "../dynamic_libs/fs_functions.h" +#include "../dynamic_libs/sys_functions.h" +#include "../dynamic_libs/vpad_functions.h" +#include "../dynamic_libs/socket_functions.h" +#include "../kernel/kernel_functions.h" +#include "../system/memory.h" +#include "../common/common.h" #include "main.h" #include "code_handler.h" -#include "utils/logger.h" -#include "utils/function_patcher.h" -#include "patcher/function_patcher_gx2.h" -#include "patcher/function_patcher_coreinit.h" -#include "utils/sd_ip_reader.hpp" +#include "../utils/logger.h" +#include "../utils/function_patcher.h" +#include "../patcher/function_patcher_gx2.h" +#include "../patcher/function_patcher_coreinit.h" +#include "sd_ip_reader.h" +#include "title.h" +#include "tcp_gecko.h" bool isCodeHandlerInstalled = false; bool areSDCheatsEnabled = false; diff --git a/src/main.h b/src/tcpgecko/main.h similarity index 77% rename from src/main.h rename to src/tcpgecko/main.h index ae91dd4..7316087 100644 --- a/src/main.h +++ b/src/tcpgecko/main.h @@ -1,8 +1,8 @@ #ifndef _MAIN_H_ #define _MAIN_H_ -#include "common/types.h" -#include "dynamic_libs/os_functions.h" +#include "../common/types.h" +#include "../dynamic_libs/os_functions.h" /* Main */ #ifdef __cplusplus diff --git a/src/tcpgecko/net.c b/src/tcpgecko/net.c new file mode 100644 index 0000000..59d72d4 --- /dev/null +++ b/src/tcpgecko/net.c @@ -0,0 +1,561 @@ +#include +#include +#include "../dynamic_libs/os_functions.h" +#include "../dynamic_libs/socket_functions.h" +#include "net.h" + +static volatile int iLock = 0; + +#define CHECK_ERROR(cond) if (cond) { goto error; } + +void cafiine_connect(int *psock, u32 server_ip) { + struct sockaddr_in addr; + int sock, ret; + + socket_lib_init(); + + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + CHECK_ERROR(sock == -1); + + addr.sin_family = AF_INET; + addr.sin_port = 7332; + addr.sin_addr.s_addr = server_ip; + + ret = connect(sock, (void *) &addr, sizeof(addr)); + CHECK_ERROR(ret < 0); + ret = cafiine_handshake(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret == BYTE_NORMAL); + + *psock = sock; + return; + error: + if (sock != -1) + socketclose(sock); + *psock = -1; + return; +} + +void cafiine_disconnect(int sock) { + CHECK_ERROR(sock == -1); + socketclose(sock); + error: + return; +} + +int cafiine_handshake(int sock) { + int ret; + + unsigned char buffer[16]; + + u64 title_id = OSGetTitleID(); + memcpy(buffer, &title_id, 16); + + ret = sendwait(sock, buffer, sizeof(buffer)); + CHECK_ERROR(ret < 0); + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + return ret; + error: + return ret; +} + +int getMode(int sock, int *result) { + while (iLock) + usleep(5000); + iLock = 1; + int ret = 0; + CHECK_ERROR(sock == -1); + + // create and send buffer with : [cmd id][fd][size][buffer data ...] + { + ret = sendbyte(sock, BYTE_G_MODE); + + // wait reply + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + if (ret == BYTE_MODE_D) *result = BYTE_MODE_D; + if (ret == BYTE_MODE_I) *result = BYTE_MODE_I; + ret = 1; + } + error: + iLock = 0; + return ret; +} + +int cafiine_fsetpos(int sock, int *result, int fd, int set) { + while (iLock) + usleep(5000); + iLock = 1; + + CHECK_ERROR(sock == -1); + + int ret; + char buffer[1 + 8]; + buffer[0] = BYTE_SETPOS; + *(int *) (buffer + 1) = fd; + *(int *) (buffer + 5) = set; + ret = sendwait(sock, buffer, 1 + 8); + CHECK_ERROR(ret < 0); + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret == BYTE_NORMAL); + ret = recvwait(sock, result, 4); + CHECK_ERROR(ret < 0); + + iLock = 0; + return 0; + error: + iLock = 0; + return -1; +} + +int cafiine_send_handle(int sock, const char *path, int handle) { + while (iLock) + usleep(5000); + iLock = 1; + + CHECK_ERROR(sock == -1); + + // create and send buffer with : [cmd id][handle][path length][path data ...] + { + int ret; + int len_path = 0; + while (path[len_path++]); + char buffer[1 + 4 + 4 + len_path]; + + buffer[0] = BYTE_HANDLE; + *(int *) (buffer + 1) = handle; + *(int *) (buffer + 5) = len_path; + for (ret = 0; ret < len_path; ret++) + buffer[9 + ret] = path[ret]; + + // send buffer, wait for reply + ret = sendwait(sock, buffer, 1 + 4 + 4 + len_path); + CHECK_ERROR(ret < 0); + + // wait reply + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret == BYTE_SPECIAL); + if (ret == BYTE_REQUEST) { + ret = 1; + } else { + ret = 2; + } + // wait reply + int special_ret = recvbyte(sock); + CHECK_ERROR(special_ret < 0); + CHECK_ERROR(special_ret != BYTE_SPECIAL); + iLock = 0; + return ret; + } + + error: + iLock = 0; + return -1; +} + +int cafiine_fopen(int sock, int *result, const char *path, const char *mode, int *handle) { + while (iLock) + usleep(5000); + iLock = 1; + + int final_result = -1; + CHECK_ERROR(sock == -1); + + int ret; + int len_path = 0; + len_path++; + // while (path[len_path++]); + int len_mode = 0; + len_mode++; + // while (mode[len_mode++]); + + // + { + char buffer[1 + 8 + len_path + len_mode]; + buffer[0] = BYTE_OPEN; + *(int *) (buffer + 1) = len_path; + *(int *) (buffer + 5) = len_mode; + for (ret = 0; ret < len_path; ret++) + buffer[9 + ret] = path[ret]; + for (ret = 0; ret < len_mode; ret++) + buffer[9 + len_path + ret] = mode[ret]; + + ret = sendwait(sock, buffer, 1 + 8 + len_path + len_mode); + CHECK_ERROR(ret < 0); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret == BYTE_NORMAL); + + ret = recvwait(sock, result, 4); + CHECK_ERROR(ret < 0); + ret = recvwait(sock, handle, 4); + CHECK_ERROR(ret < 0); + } + final_result = 0; + + + error: + iLock = 0; + return final_result; +} + +void cafiine_send_file(int sock, char *file, int size, int fd) { + while (iLock) + usleep(5000); + iLock = 1; + + CHECK_ERROR(sock == -1); + + int ret; + + // create and send buffer with : [cmd id][fd][size][buffer data ...] + { + char buffer[1 + 4 + 4 + size]; + + buffer[0] = BYTE_DUMP; + *(int *) (buffer + 1) = fd; + *(int *) (buffer + 5) = size; + for (ret = 0; ret < size; ret++) + buffer[9 + ret] = file[ret]; + + // send buffer, wait for reply + ret = sendwait(sock, buffer, 1 + 4 + 4 + size); + CHECK_ERROR(ret < 0); + // wait reply + ret = recvbyte(sock); + CHECK_ERROR(ret != BYTE_SPECIAL); + } + + error: + iLock = 0; + return; +} + +int cafiine_fread(int sock, int *result, void *ptr, int size, int fd) { + while (iLock) + usleep(5000); + iLock = 1; + + CHECK_ERROR(sock == -1); + + int ret; + char buffer[1 + 8]; + buffer[0] = BYTE_READ; + *(int *) (buffer + 1) = size; + *(int *) (buffer + 5) = fd; + ret = sendwait(sock, buffer, 1 + 8); + CHECK_ERROR(ret < 0); + ret = recvbyte(sock); + CHECK_ERROR(ret == BYTE_NORMAL); + int sz; + ret = recvwait(sock, &sz, 4); + CHECK_ERROR(ret < 0); + ret = recvwaitlen(sock, ptr, sz); + *result = sz - ret; + ret = sendbyte(sock, BYTE_OK); + CHECK_ERROR(ret < 0); + + iLock = 0; + return 0; + error: + iLock = 0; + return -1; +} + +int cafiine_fclose(int sock, int *result, int fd, int dumpclose) { + while (iLock) + usleep(5000); + iLock = 1; + + CHECK_ERROR(sock == -1); + + int ret; + char buffer[1 + 4]; + buffer[0] = BYTE_CLOSE; + if (dumpclose)buffer[0] = BYTE_CLOSE_DUMP; + *(int *) (buffer + 1) = fd; + ret = sendwait(sock, buffer, 1 + 4); + CHECK_ERROR(ret < 0); + ret = recvbyte(sock); + CHECK_ERROR(ret == BYTE_NORMAL); + ret = recvwait(sock, result, 4); + CHECK_ERROR(ret < 0); + + iLock = 0; + return 0; + error: + iLock = 0; + return -1; +} + +int saviine_start_injection(int sock, long persistentID, int *mask) { + while (iLock) + usleep(5000); + iLock = 1; + + int result = 0; + CHECK_ERROR(sock == -1); + int ret; + { + char buffer[1 + 4]; + + buffer[0] = BYTE_INJECTSTART; + *(long *) (buffer + 1) = persistentID; + ret = sendwait(sock, buffer, 1 + 4); + CHECK_ERROR(ret < 0); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_SPECIAL); + + ret = recvwait(sock, mask, 4); + CHECK_ERROR(ret < 0); + CHECK_ERROR((*mask & MASK_NORMAL) != MASK_NORMAL); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_SPECIAL); + result = 1; + } + error: + iLock = 0; + return result; +} + +int saviine_end_injection(int sock) { + while (iLock) + usleep(5000); + iLock = 1; + + int result = 0; + CHECK_ERROR(sock == -1); + int ret; + { + ret = sendbyte(sock, BYTE_INJECTEND); + CHECK_ERROR(ret < 0); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_OK); + result = 1; + } + error: + iLock = 0; + return result; +} + +int saviine_start_dump(int sock, long persistentID, int *mask) { + while (iLock) + usleep(5000); + iLock = 1; + + int result = 0; + CHECK_ERROR(sock == -1); + int ret; + { + char buffer[1 + 4]; + + buffer[0] = BYTE_DUMPSTART; + *(long *) (buffer + 1) = persistentID; + ret = sendwait(sock, buffer, 1 + 4); + CHECK_ERROR(ret < 0); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_SPECIAL); + + ret = recvwait(sock, mask, 4); + CHECK_ERROR(ret < 0); + CHECK_ERROR((*mask & MASK_NORMAL) != MASK_NORMAL); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_SPECIAL); + result = 1; + } + error: + iLock = 0; + return result; +} + +int saviine_end_dump(int sock) { + while (iLock) + usleep(5000); + iLock = 1; + + int result = 0; + CHECK_ERROR(sock == -1); + int ret; + { + ret = sendbyte(sock, BYTE_DUMPEND); + CHECK_ERROR(ret < 0); + + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_OK); + result = 1; + } + error: + iLock = 0; + return result; +} + +int saviine_readdir(int sock, char *path, char *resultname, int *resulttype, int *filesize) { + while (iLock) + usleep(5000); + iLock = 1; + + int result = 0; + CHECK_ERROR(sock == -1); + int ret; + // create and send buffer with : [cmd id][len_path][path][filesize] + { + int size = 0; + while (path[size++]); + char buffer[1 + 4 + size]; + + buffer[0] = BYTE_READ_DIR; + *(int *) (buffer + 1) = size; + for (ret = 0; ret < size; ret++) + buffer[5 + ret] = path[ret]; + + // send buffer, wait for reply + ret = sendwait(sock, buffer, 1 + 4 + size); + CHECK_ERROR(ret < 0); + + // wait reply + ret = recvbyte(sock); + CHECK_ERROR(ret != BYTE_OK); + + ret = recvbyte(sock); + CHECK_ERROR(ret != BYTE_FILE && ret != BYTE_FOLDER); + *resulttype = ret; + size = 0; + ret = recvwait(sock, &size, 4); + CHECK_ERROR(ret < 0); + + ret = recvwait(sock, resultname, size + 1); + CHECK_ERROR(ret < 0); + + size = 0; + ret = recvwait(sock, &size, 4); + CHECK_ERROR(ret < 0); + *filesize = size; + ret = recvbyte(sock); + CHECK_ERROR(ret < 0); + CHECK_ERROR(ret != BYTE_SPECIAL); + result = 1; + + } + error: + iLock = 0; + return result; +} + +void cafiine_send_ping(int sock, int val1, int val2) { + while (iLock) + usleep(5000); + iLock = 1; + + int ret; + char buffer[1 + 4 + 4]; + buffer[0] = BYTE_PING; + *(int *) (buffer + 1) = val1; + *(int *) (buffer + 5) = val2; + + ret = sendwait(sock, buffer, 1 + 4 + 4); + CHECK_ERROR(ret < 0); + + error: + iLock = 0; + return; +} + +int recvwait(int sock, void *buffer, int len) { + int ret; + while (len > 0) { + ret = recv(sock, buffer, len, 0); + CHECK_ERROR(ret < 0); + len -= ret; + buffer += ret; + } + return 0; + error: + return ret; +} + +int recvwaitlen(int sock, void *buffer, int len) { + int ret; + while (len > 0) { + ret = recv(sock, buffer, len, 0); + CHECK_ERROR(ret < 0); + len -= ret; + buffer += ret; + } + return 0; + error: + return len; +} + + +int recvbyte(int sock) { + unsigned char buffer[1]; + int ret; + + ret = recvwait(sock, buffer, 1); + if (ret < 0) return ret; + return buffer[0]; +} + +int sendwait(int sock, const void *buffer, int len) { + int ret; + while (len > 0) { + ret = send(sock, buffer, len, 0); + CHECK_ERROR(ret < 0); + len -= ret; + buffer += ret; + } + return 0; + error: + return ret; +} + +void log_string(int sock, const char *str, char flag_byte) { + if (sock == -1) { + return; + } + while (iLock) + usleep(5000); + iLock = 1; + + int i; + int len_str = 0; + len_str++; + // while (str[len_str++]); + + // + { + char buffer[1 + 4 + len_str]; + buffer[0] = flag_byte; + *(int *) (buffer + 1) = len_str; + for (i = 0; i < len_str; i++) + buffer[5 + i] = str[i]; + + buffer[5 + i] = 0; + + sendwait(sock, buffer, 1 + 4 + len_str); + } + + iLock = 0; +} + +int sendbyte(int sock, unsigned char byte) { + unsigned char buffer[1]; + + buffer[0] = byte; + return sendwait(sock, buffer, 1); +} diff --git a/src/utils/net.h b/src/tcpgecko/net.h similarity index 100% rename from src/utils/net.h rename to src/tcpgecko/net.h diff --git a/src/system/pause.h b/src/tcpgecko/pause.h similarity index 97% rename from src/system/pause.h rename to src/tcpgecko/pause.h index 1192590..eb058a0 100644 --- a/src/system/pause.h +++ b/src/tcpgecko/pause.h @@ -1,7 +1,7 @@ #pragma once #include "../utils/logger.h" -#include "../utils/assertions.h" +#include "assertions.h" #include "../dynamic_libs/os_functions.h" #include "../common/fs_defs.h" #include "kernel.h" diff --git a/src/system/raw_assembly_cheats.h b/src/tcpgecko/raw_assembly_cheats.h similarity index 100% rename from src/system/raw_assembly_cheats.h rename to src/tcpgecko/raw_assembly_cheats.h diff --git a/src/sd_cheats.cpp b/src/tcpgecko/sd_cheats.cpp similarity index 94% rename from src/sd_cheats.cpp rename to src/tcpgecko/sd_cheats.cpp index c9a289e..7d318f6 100644 --- a/src/sd_cheats.cpp +++ b/src/tcpgecko/sd_cheats.cpp @@ -1,11 +1,11 @@ #include // snprintf #include // memcpy, memset -#include "utils/logger.h" -#include "fs/sd_fat_devoptab.h" -#include "fs/fs_utils.h" -#include "dynamic_libs/os_functions.h" +#include "../utils/logger.h" +#include "../fs/sd_fat_devoptab.h" +#include "../fs/fs_utils.h" +#include "../dynamic_libs/os_functions.h" #include "tcp_gecko.h" -#include "kernel/syscalls.h" +#include "../kernel/syscalls.h" #include #include @@ -103,7 +103,7 @@ void considerApplyingSDCheats() { } log_print("Copying...\n"); - kernelCopyData2((unsigned char *) CODE_LIST_START_ADDRESS, codes, codesSize); + kernelCopyData2((unsigned char *) CODE_LIST_START_ADDRESS, codes, (unsigned int) codesSize); log_print("Copied!\n"); setCodeHandlerEnabled(true); diff --git a/src/sd_cheats.h b/src/tcpgecko/sd_cheats.h similarity index 100% rename from src/sd_cheats.h rename to src/tcpgecko/sd_cheats.h diff --git a/src/utils/sd_ip_reader.cpp b/src/tcpgecko/sd_ip_reader.cpp similarity index 96% rename from src/utils/sd_ip_reader.cpp rename to src/tcpgecko/sd_ip_reader.cpp index 4be8b8d..e8329ab 100644 --- a/src/utils/sd_ip_reader.cpp +++ b/src/tcpgecko/sd_ip_reader.cpp @@ -1,4 +1,4 @@ -#include "sd_ip_reader.hpp" +#include "sd_ip_reader.h" char ipFromSd[16]; bool hasReadIP = false; diff --git a/src/utils/sd_ip_reader.hpp b/src/tcpgecko/sd_ip_reader.h similarity index 64% rename from src/utils/sd_ip_reader.hpp rename to src/tcpgecko/sd_ip_reader.h index 1f97e38..4ba1761 100644 --- a/src/utils/sd_ip_reader.hpp +++ b/src/tcpgecko/sd_ip_reader.h @@ -1,6 +1,6 @@ #pragma once -#include "logger.h" +#include "../utils/logger.h" #include "../common/common.h" #include "../fs/CFile.hpp" diff --git a/src/system/software_breakpoints.h b/src/tcpgecko/software_breakpoints.h similarity index 98% rename from src/system/software_breakpoints.h rename to src/tcpgecko/software_breakpoints.h index 28c5834..01915dd 100644 --- a/src/system/software_breakpoints.h +++ b/src/tcpgecko/software_breakpoints.h @@ -4,7 +4,7 @@ #define TCPGECKO_BREAKPOINT_EXECUTE_H #include "utilities.h" -#include "exception_handler.h" +#include "../system/exception_handler.h" #define OS_EXCEPTION_DSI 2 #define OS_EXCEPTION_ISI 3 @@ -77,7 +77,7 @@ struct Breakpoint *getBreakpoint(u32 address, int size) { } void pokeRegisters(OSContext context, uint32_t gpr[32], double fpr[32]) { - memcpy(&context.gpr, &gpr, sizeof(gpr)); + memcpy(&context.gpr, &gpr, 32 * sizeof(uint32_t)); // memcpy(&context.fpr, &fpr, sizeof(fpr)); } diff --git a/src/system/stack.h b/src/tcpgecko/stack.h similarity index 90% rename from src/system/stack.h rename to src/tcpgecko/stack.h index 426b1b1..643ff6e 100644 --- a/src/system/stack.h +++ b/src/tcpgecko/stack.h @@ -1,8 +1,8 @@ #ifndef TCPGECKO_STACK_H #define TCPGECKO_STACK_H -#include "../utils/linked_list.h" -#include "../common/cafe.h" +#include "linked_list.h" +#include "cafe.h" bool isValidStackPointer(u32 stackPointer) { return stackPointer >= 0x10000000 && stackPointer < 0x20000000; diff --git a/src/utils/stringify.h b/src/tcpgecko/stringify.h similarity index 100% rename from src/utils/stringify.h rename to src/tcpgecko/stringify.h diff --git a/src/tcp_gecko.cpp b/src/tcpgecko/tcp_gecko.cpp similarity index 97% rename from src/tcp_gecko.cpp rename to src/tcpgecko/tcp_gecko.cpp index 42b2f82..96eed7e 100644 --- a/src/tcp_gecko.cpp +++ b/src/tcpgecko/tcp_gecko.cpp @@ -4,24 +4,24 @@ #include #include // #include -#include "common/common.h" +#include "../common/common.h" #include // Actually must be included before os_functions -#include "dynamic_libs/os_functions.h" +#include "../dynamic_libs/os_functions.h" #include #include #include "main.h" -#include "dynamic_libs/socket_functions.h" -#include "dynamic_libs/gx2_functions.h" -#include "dynamic_libs/fs_functions.h" -#include "utils/logger.h" -#include "system/hardware_breakpoints.h" -#include "utils/linked_list.h" -#include "system/address.h" -#include "system/stack.h" -#include "system/pause.h" -#include "utils/sd_ip_reader.hpp" -#include "patcher/function_patcher_gx2.h" -#include "system/raw_assembly_cheats.h" +#include "../dynamic_libs/socket_functions.h" +#include "../dynamic_libs/gx2_functions.h" +#include "../dynamic_libs/fs_functions.h" +#include "../utils/logger.h" +#include "hardware_breakpoints.hpp" +#include "linked_list.h" +#include "address.h" +#include "stack.h" +#include "pause.h" +#include "sd_ip_reader.h" +#include "../patcher/function_patcher_gx2.h" +#include "raw_assembly_cheats.h" #include "sd_cheats.h" void *client; @@ -81,9 +81,9 @@ struct pygecko_bss_t { #define COMMAND_CLEAR_ASSEMBLY 0xE2 #define CHECK_ERROR(cond) if (cond) { bss->line = __LINE__; goto error; } -#define errno (*__gh_errno_ptr()) +#define errno2 (*__gh_errno_ptr()) #define MSG_DONT_WAIT 32 -#define EWOULDBLOCK 6 +#define E_WOULD_BLOCK 6 // #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100 #define SERVER_VERSION "06/03/2017" #define ONLY_ZEROS_READ 0xB0 @@ -242,8 +242,9 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { ret = checkbyte(clientfd); if (ret < 0) { - CHECK_ERROR(errno != EWOULDBLOCK); + CHECK_ERROR(errno2 != E_WOULD_BLOCK); GX2WaitForVsync(); + continue; } @@ -729,8 +730,11 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_GET_DATA_BUFFER_SIZE: { + log_printf("COMMAND_GET_DATA_BUFFER_SIZE...\n"); ((int *) buffer)[0] = DATA_BUFFER_SIZE; + log_printf("Sending buffer size...\n"); ret = sendwait(bss, clientfd, buffer, sizeof(int)); + log_printf("Sent: %i\n", ret); CHECK_ERROR(ret < 0) break; @@ -798,7 +802,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { considerInitializingFileSystem(); - int handle; + s32 handle; FSDirEntry entry; ret = FSOpenDir(client, commandBlock, directory_path, &handle, FS_RET_ALL_ERROR); @@ -1136,13 +1140,14 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_REMOTE_PROCEDURE_CALL: { - long long (*function)(int, int, int, int, int, int, int, int); int r3, r4, r5, r6, r7, r8, r9, r10; - long long result; - ret = recvwait(bss, clientfd, buffer, 4 + 8 * 4); - CHECK_ERROR(ret < 0); + log_print("Receiving RPC information...\n"); + ret = recvwait(bss, clientfd, buffer, sizeof(int) + 8 * sizeof(int)); + ASSERT_FUNCTION_SUCCEEDED(ret, "revcwait() Receiving RPC information") + log_print("RPC information received...\n"); + long long (*function)(int, int, int, int, int, int, int, int); function = (long long int (*)(int, int, int, int, int, int, int, int)) ((void **) buffer)[0]; r3 = ((int *) buffer)[1]; r4 = ((int *) buffer)[2]; @@ -1153,11 +1158,16 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) { r9 = ((int *) buffer)[7]; r10 = ((int *) buffer)[8]; - result = function(r3, r4, r5, r6, r7, r8, r9, r10); + log_print("Calling function...\n"); + long long result = function(r3, r4, r5, r6, r7, r8, r9, r10); + log_printf("Function successfully called with return value: 0x%08x 0x%08x\n", (int) (result >> 32), + (int) result); + log_print("Sending result...\n"); ((long long *) buffer)[0] = result; - ret = sendwait(bss, clientfd, buffer, 8); - CHECK_ERROR(ret < 0) + ret = sendwait(bss, clientfd, buffer, sizeof(long long)); + ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait() Sending return value") + log_print("Result successfully sent...\n"); break; } @@ -1457,9 +1467,10 @@ static int runTCPGeckoServer(int argc, void *argv) { CHECK_ERROR(ret < 0) while (true) { - log_printf("accept()...\n"); len = 16; + log_printf("before accept()...\n"); clientfd = accept(sockfd, (struct sockaddr *) &socketAddress, (s32 * ) & len); + log_printf("after accept()...\n"); CHECK_ERROR(clientfd == -1) log_printf("commands()...\n"); ret = processCommands(bss, clientfd); diff --git a/src/tcp_gecko.h b/src/tcpgecko/tcp_gecko.h similarity index 100% rename from src/tcp_gecko.h rename to src/tcpgecko/tcp_gecko.h diff --git a/src/patcher/texture.h b/src/tcpgecko/texture.h similarity index 100% rename from src/patcher/texture.h rename to src/tcpgecko/texture.h diff --git a/src/system/threads.cpp b/src/tcpgecko/threads.cpp similarity index 97% rename from src/system/threads.cpp rename to src/tcpgecko/threads.cpp index e91bc43..a738a2e 100644 --- a/src/system/threads.cpp +++ b/src/tcpgecko/threads.cpp @@ -1,5 +1,5 @@ #include "threads.h" -#include "../utils/linked_list.h" +#include "linked_list.h" #include "../dynamic_libs/os_functions.h" #include "../utils/logger.h" diff --git a/src/system/threads.h b/src/tcpgecko/threads.h similarity index 100% rename from src/system/threads.h rename to src/tcpgecko/threads.h diff --git a/src/title.c b/src/tcpgecko/title.c similarity index 92% rename from src/title.c rename to src/tcpgecko/title.c index 9800cbe..7e4e893 100644 --- a/src/title.c +++ b/src/tcpgecko/title.c @@ -1,4 +1,4 @@ -#include "dynamic_libs/os_functions.h" +#include "../dynamic_libs/os_functions.h" #include "title.h" bool isRunningTitleID(unsigned long long int japaneseTitleID) { diff --git a/src/title.h b/src/tcpgecko/title.h similarity index 100% rename from src/title.h rename to src/tcpgecko/title.h diff --git a/src/system/utilities.h b/src/tcpgecko/utilities.h similarity index 94% rename from src/system/utilities.h rename to src/tcpgecko/utilities.h index 370dad4..912f010 100644 --- a/src/system/utilities.h +++ b/src/tcpgecko/utilities.h @@ -4,7 +4,6 @@ #include "../dynamic_libs/os_functions.h" #include "../utils/logger.h" #include "kernel.h" -#include "../common/kernel_types.h" void writeCode(u32 address, u32 instruction) { u32 *pointer = (u32 *) (address + 0xA0000000); diff --git a/src/utils/function_patcher.c b/src/utils/function_patcher.cpp similarity index 99% rename from src/utils/function_patcher.c rename to src/utils/function_patcher.cpp index 18ed37a..f2657d8 100644 --- a/src/utils/function_patcher.c +++ b/src/utils/function_patcher.cpp @@ -215,6 +215,7 @@ bool isDynamicFunction(unsigned int physicalAddress) { unsigned int getRPLHandle(int library, const char *functionName) { unsigned int rplHandle = 0; + u32 gx2_handle = 0; switch (library) { case LIB_CORE_INIT: @@ -228,7 +229,6 @@ unsigned int getRPLHandle(int library, const char *functionName) { case LIB_GX2: if (DEBUG_LOG_DYN)log_printf("FindExport of %s! From LIB_GX2\n", functionName); - unsigned int gx2_handle = 0; OSDynLoad_Acquire("gx2.rpl", &gx2_handle); if (gx2_handle == 0) { log_print("LIB_GX2 not acquired\n"); diff --git a/src/utils/logger.c b/src/utils/logger.c index b962cd4..d8bff40 100644 --- a/src/utils/logger.c +++ b/src/utils/logger.c @@ -1,7 +1,9 @@ +#include #include #include #include -#include +#include +#include #include "../dynamic_libs/os_functions.h" #include "../dynamic_libs/socket_functions.h" #include "logger.h" diff --git a/src/utils/net.c b/src/utils/net.c deleted file mode 100644 index a1b259e..0000000 --- a/src/utils/net.c +++ /dev/null @@ -1,561 +0,0 @@ -#include -#include -#include "../common/common.h" -#include "../dynamic_libs/os_functions.h" -#include "../dynamic_libs/socket_functions.h" -#include "net.h" - -static volatile int iLock = 0; - -#define CHECK_ERROR(cond) if (cond) { goto error; } - -void cafiine_connect(int *psock,u32 server_ip) { - struct sockaddr_in addr; - int sock, ret; - - socket_lib_init(); - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - CHECK_ERROR(sock == -1); - - addr.sin_family = AF_INET; - addr.sin_port = 7332; - addr.sin_addr.s_addr = server_ip; - - ret = connect(sock, (void *)&addr, sizeof(addr)); - CHECK_ERROR(ret < 0); - ret = cafiine_handshake(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret == BYTE_NORMAL); - - *psock = sock; - return; -error: - if (sock != -1) - socketclose(sock); - *psock = -1; - return; -} - -void cafiine_disconnect(int sock) { - CHECK_ERROR(sock == -1); - socketclose(sock); -error: - return; -} - -int cafiine_handshake(int sock) { - int ret; - - unsigned char buffer[16]; - - u64 title_id = OSGetTitleID(); - memcpy(buffer, &title_id, 16); - - ret = sendwait(sock, buffer, sizeof(buffer)); - CHECK_ERROR(ret < 0); - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - return ret; -error: - return ret; -} - -int getMode(int sock,int * result) -{ - while (iLock) - usleep(5000); - iLock = 1; - int ret = 0; - CHECK_ERROR(sock == -1); - - // create and send buffer with : [cmd id][fd][size][buffer data ...] - { - ret = sendbyte(sock, BYTE_G_MODE); - - // wait reply - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - if(ret == BYTE_MODE_D) *result = BYTE_MODE_D; - if(ret == BYTE_MODE_I) *result = BYTE_MODE_I; - ret = 1; - } -error: - iLock = 0; - return ret; -} - -int cafiine_fsetpos(int sock, int *result, int fd, int set) { - while (iLock) - usleep(5000); - iLock = 1; - - CHECK_ERROR(sock == -1); - - int ret; - char buffer[1 + 8]; - buffer[0] = BYTE_SETPOS; - *(int *)(buffer + 1) = fd; - *(int *)(buffer + 5) = set; - ret = sendwait(sock, buffer, 1 + 8); - CHECK_ERROR(ret < 0); - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret == BYTE_NORMAL); - ret = recvwait(sock, result, 4); - CHECK_ERROR(ret < 0); - - iLock = 0; - return 0; -error: - iLock = 0; - return -1; -} - -int cafiine_send_handle(int sock, const char *path, int handle) -{ - while (iLock) - usleep(5000); - iLock = 1; - - CHECK_ERROR(sock == -1); - - // create and send buffer with : [cmd id][handle][path length][path data ...] - { - int ret; - int len_path = 0; - while (path[len_path++]); - char buffer[1 + 4 + 4 + len_path]; - - buffer[0] = BYTE_HANDLE; - *(int *)(buffer + 1) = handle; - *(int *)(buffer + 5) = len_path; - for (ret = 0; ret < len_path; ret++) - buffer[9 + ret] = path[ret]; - - // send buffer, wait for reply - ret = sendwait(sock, buffer, 1 + 4 + 4 + len_path); - CHECK_ERROR(ret < 0); - - // wait reply - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret == BYTE_SPECIAL); - if(ret == BYTE_REQUEST){ - ret = 1; - }else{ - ret = 2; - } - // wait reply - int special_ret = recvbyte(sock); - CHECK_ERROR(special_ret < 0); - CHECK_ERROR(special_ret != BYTE_SPECIAL); - iLock = 0; - return ret; - } - -error: - iLock = 0; - return -1; -} - -int cafiine_fopen(int sock, int *result, const char *path, const char *mode, int *handle) { - while (iLock) - usleep(5000); - iLock = 1; - - int final_result = -1; - CHECK_ERROR(sock == -1); - - int ret; - int len_path = 0; - while (path[len_path++]); - int len_mode = 0; - while (mode[len_mode++]); - - // - { - char buffer[1 + 8 + len_path + len_mode]; - buffer[0] = BYTE_OPEN; - *(int *)(buffer + 1) = len_path; - *(int *)(buffer + 5) = len_mode; - for (ret = 0; ret < len_path; ret++) - buffer[9 + ret] = path[ret]; - for (ret = 0; ret < len_mode; ret++) - buffer[9 + len_path + ret] = mode[ret]; - - ret = sendwait(sock, buffer, 1 + 8 + len_path + len_mode); - CHECK_ERROR(ret < 0); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret == BYTE_NORMAL); - - ret = recvwait(sock, result, 4); - CHECK_ERROR(ret < 0); - ret = recvwait(sock, handle, 4); - CHECK_ERROR(ret < 0); - } - final_result = 0; - - -error: - iLock = 0; - return final_result; -} - -void cafiine_send_file(int sock, char *file, int size, int fd) { - while (iLock) - usleep(5000); - iLock = 1; - - CHECK_ERROR(sock == -1); - - int ret; - - // create and send buffer with : [cmd id][fd][size][buffer data ...] - { - char buffer[1 + 4 + 4 + size]; - - buffer[0] = BYTE_DUMP; - *(int *)(buffer + 1) = fd; - *(int *)(buffer + 5) = size; - for (ret = 0; ret < size; ret++) - buffer[9 + ret] = file[ret]; - - // send buffer, wait for reply - ret = sendwait(sock, buffer, 1 + 4 + 4 + size); - CHECK_ERROR(ret < 0); - // wait reply - ret = recvbyte(sock); - CHECK_ERROR(ret != BYTE_SPECIAL); - } - -error: - iLock = 0; - return; -} - -int cafiine_fread(int sock, int *result, void *ptr, int size, int fd) { - while (iLock) - usleep(5000); - iLock = 1; - - CHECK_ERROR(sock == -1); - - int ret; - char buffer[1 + 8]; - buffer[0] = BYTE_READ; - *(int *)(buffer + 1) = size; - *(int *)(buffer + 5) = fd; - ret = sendwait(sock, buffer, 1 + 8); - CHECK_ERROR(ret < 0); - ret = recvbyte(sock); - CHECK_ERROR(ret == BYTE_NORMAL); - int sz; - ret = recvwait(sock, &sz, 4); - CHECK_ERROR(ret < 0); - ret = recvwaitlen(sock, ptr, sz); - *result = sz - ret; - ret = sendbyte(sock, BYTE_OK); - CHECK_ERROR(ret < 0); - - iLock = 0; - return 0; -error: - iLock = 0; - return -1; -} - -int cafiine_fclose(int sock, int *result, int fd,int dumpclose) { - while (iLock) - usleep(5000); - iLock = 1; - - CHECK_ERROR(sock == -1); - - int ret; - char buffer[1 + 4]; - buffer[0] = BYTE_CLOSE; - if(dumpclose)buffer[0] = BYTE_CLOSE_DUMP; - *(int *)(buffer + 1) = fd; - ret = sendwait(sock, buffer, 1 + 4); - CHECK_ERROR(ret < 0); - ret = recvbyte(sock); - CHECK_ERROR(ret == BYTE_NORMAL); - ret = recvwait(sock, result, 4); - CHECK_ERROR(ret < 0); - - iLock = 0; - return 0; -error: - iLock = 0; - return -1; -} - -int saviine_start_injection(int sock, long persistentID,int * mask){ - while (iLock) - usleep(5000); - iLock = 1; - - int result = 0; - CHECK_ERROR(sock == -1); - int ret; - { - char buffer[1+4]; - - buffer[0] = BYTE_INJECTSTART; - *(long *)(buffer + 1) = persistentID; - ret = sendwait(sock, buffer, 1 + 4); - CHECK_ERROR(ret < 0); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_SPECIAL); - - ret = recvwait(sock, mask, 4); - CHECK_ERROR(ret < 0); - CHECK_ERROR((*mask & MASK_NORMAL) != MASK_NORMAL); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_SPECIAL); - result = 1; - } -error: - iLock = 0; - return result; -} - -int saviine_end_injection(int sock){ - while (iLock) - usleep(5000); - iLock = 1; - - int result = 0; - CHECK_ERROR(sock == -1); - int ret; - { - ret = sendbyte(sock, BYTE_INJECTEND); - CHECK_ERROR(ret < 0); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_OK); - result = 1; - } -error: - iLock = 0; - return result; -} - -int saviine_start_dump(int sock, long persistentID,int * mask){ - while (iLock) - usleep(5000); - iLock = 1; - - int result = 0; - CHECK_ERROR(sock == -1); - int ret; - { - char buffer[1+4]; - - buffer[0] = BYTE_DUMPSTART; - *(long *)(buffer + 1) = persistentID; - ret = sendwait(sock, buffer, 1 + 4); - CHECK_ERROR(ret < 0); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_SPECIAL); - - ret = recvwait(sock, mask, 4); - CHECK_ERROR(ret < 0); - CHECK_ERROR((*mask & MASK_NORMAL) != MASK_NORMAL); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_SPECIAL); - result = 1; - } -error: - iLock = 0; - return result; -} - -int saviine_end_dump(int sock){ - while (iLock) - usleep(5000); - iLock = 1; - - int result = 0; - CHECK_ERROR(sock == -1); - int ret; - { - ret = sendbyte(sock, BYTE_DUMPEND); - CHECK_ERROR(ret < 0); - - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_OK); - result = 1; - } -error: - iLock = 0; - return result; -} - -int saviine_readdir(int sock, char * path,char * resultname, int * resulttype, int * filesize){ - while (iLock) - usleep(5000); - iLock = 1; - - int result = 0; - CHECK_ERROR(sock == -1); - int ret; - // create and send buffer with : [cmd id][len_path][path][filesize] - { - int size = 0; - while (path[size++]); - char buffer[1+4+size]; - - buffer[0] = BYTE_READ_DIR; - *(int *)(buffer + 1) = size; - for (ret = 0; ret < size; ret++) - buffer[5 + ret] = path[ret]; - - // send buffer, wait for reply - ret = sendwait(sock, buffer, 1+4+size); - CHECK_ERROR(ret < 0); - - // wait reply - ret = recvbyte(sock); - CHECK_ERROR(ret != BYTE_OK); - - ret = recvbyte(sock); - CHECK_ERROR(ret != BYTE_FILE && ret != BYTE_FOLDER); - *resulttype = ret; - size = 0; - ret = recvwait(sock, &size, 4); - CHECK_ERROR(ret < 0); - - ret = recvwait(sock, resultname, size+1); - CHECK_ERROR(ret < 0); - - size = 0; - ret = recvwait(sock, &size, 4); - CHECK_ERROR(ret < 0); - *filesize = size; - ret = recvbyte(sock); - CHECK_ERROR(ret < 0); - CHECK_ERROR(ret != BYTE_SPECIAL); - result = 1; - - } -error: - iLock = 0; - return result; -} - -void cafiine_send_ping(int sock, int val1, int val2) { - while (iLock) - usleep(5000); - iLock = 1; - - int ret; - char buffer[1 + 4 + 4]; - buffer[0] = BYTE_PING; - *(int *)(buffer + 1) = val1; - *(int *)(buffer + 5) = val2; - - ret = sendwait(sock, buffer, 1 + 4 + 4); - CHECK_ERROR(ret < 0); - - error: - iLock = 0; - return; -} - - int recvwait(int sock, void *buffer, int len) { - int ret; - while (len > 0) { - ret = recv(sock, buffer, len, 0); - CHECK_ERROR(ret < 0); - len -= ret; - buffer += ret; - } - return 0; -error: - return ret; -} - - int recvwaitlen(int sock, void *buffer, int len) { - int ret; - while (len > 0) { - ret = recv(sock, buffer, len, 0); - CHECK_ERROR(ret < 0); - len -= ret; - buffer += ret; - } - return 0; -error: - return len; -} - - - int recvbyte(int sock) { - unsigned char buffer[1]; - int ret; - - ret = recvwait(sock, buffer, 1); - if (ret < 0) return ret; - return buffer[0]; -} - - int sendwait(int sock, const void *buffer, int len) { - int ret; - while (len > 0) { - ret = send(sock, buffer, len, 0); - CHECK_ERROR(ret < 0); - len -= ret; - buffer += ret; - } - return 0; -error: - return ret; -} - -void log_string(int sock, const char* str, char flag_byte) { - if(sock == -1) { - return; - } - while (iLock) - usleep(5000); - iLock = 1; - - int i; - int len_str = 0; - while (str[len_str++]); - - // - { - char buffer[1 + 4 + len_str]; - buffer[0] = flag_byte; - *(int *)(buffer + 1) = len_str; - for (i = 0; i < len_str; i++) - buffer[5 + i] = str[i]; - - buffer[5 + i] = 0; - - sendwait(sock, buffer, 1 + 4 + len_str); - } - - iLock = 0; -} - -int sendbyte(int sock, unsigned char byte) { - unsigned char buffer[1]; - - buffer[0] = byte; - return sendwait(sock, buffer, 1); -} diff --git a/tcpgecko.elf b/tcpgecko.elf index 2274627f12652bf8ccb27a1c070ff6bb1ff06854..4342b82a2eaafa2c689ae0b5c170a88969c4c363 100644 GIT binary patch literal 159756 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 literal 207948 zcmdqK4}2Tdl`nqBc7l>9L{LG!#Wc!dTALW+KqzBNwxp1>N}TS`Q1QWqbdg^|>ul4v zZVB&+MY2YgNo{cVC[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