Upgrade to devkitPro v29 and reorganize
This commit is contained in:
parent
c431bce8dc
commit
b59ef61113
7
Makefile
7
Makefile
@ -38,7 +38,8 @@ SOURCES := src \
|
|||||||
src/kernel \
|
src/kernel \
|
||||||
src/patcher \
|
src/patcher \
|
||||||
src/system \
|
src/system \
|
||||||
src/utils
|
src/utils \
|
||||||
|
src/tcpgecko
|
||||||
DATA :=
|
DATA :=
|
||||||
|
|
||||||
INCLUDES := src
|
INCLUDES := src
|
||||||
@ -47,9 +48,9 @@ INCLUDES := src
|
|||||||
# options for code generation
|
# options for code generation
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
CFLAGS := -std=gnu11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \
|
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 \
|
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
|
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
|
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
|
||||||
|
|
||||||
|
@ -11,10 +11,7 @@ No, you will run into incompatibility problems. It's not supported anymore but f
|
|||||||
No. Both projects are fundamentally different.
|
No. Both projects are fundamentally different.
|
||||||
|
|
||||||
# How do I compile?
|
# How do I compile?
|
||||||
Just like described [here](https://github.com/dimok789/homebrew_launcher/blob/master/README.md#building-the-homebrew-launcher).
|
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.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
**dimok** for Homebrew Launcher project engine/base
|
**dimok** for Homebrew Launcher project engine/base
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<app>
|
<app>
|
||||||
<name>TCP Gecko</name>
|
<name>TCP Gecko</name>
|
||||||
<coder>BullyWiiPlaza, wj44, dimok, Chadderz, Marionumber1</coder>
|
<coder>BullyWiiPlaza, wj44, dimok, Chadderz, Marionumber1</coder>
|
||||||
<version>2.5</version>
|
<version>2.51</version>
|
||||||
<short_description>WiiU RAM Hacking</short_description>
|
<short_description>WiiU RAM Hacking</short_description>
|
||||||
<long_description>A memory editor that does magical things to your games. In order to develop and apply real-time
|
<long_description>A memory editor that does magical things to your games. In order to develop and apply real-time
|
||||||
cheats use JGecko U.
|
cheats use JGecko U.
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#define FS_DEFS_H
|
#define FS_DEFS_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "kernel_types.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -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;
|
|
@ -1,7 +1,6 @@
|
|||||||
#ifndef RETAINS_VARS_H_
|
#ifndef RETAINS_VARS_H_
|
||||||
#define RETAINS_VARS_H_
|
#define RETAINS_VARS_H_
|
||||||
#include <gctypes.h>
|
#include <gctypes.h>
|
||||||
#include "kernel_types.h"
|
|
||||||
|
|
||||||
extern u8 gSettingLaunchPyGecko;
|
extern u8 gSettingLaunchPyGecko;
|
||||||
extern u8 gSettingUseUpdatepath;
|
extern u8 gSettingUseUpdatepath;
|
||||||
|
@ -33,7 +33,7 @@ EXPORT_DECL(s32, AOC_CloseTitle, void * title);
|
|||||||
|
|
||||||
void InitAocFunctionPointers(void)
|
void InitAocFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int aoc_handle = 0;
|
u32 aoc_handle = 0;
|
||||||
OSDynLoad_Acquire("nn_aoc.rpl", &aoc_handle);
|
OSDynLoad_Acquire("nn_aoc.rpl", &aoc_handle);
|
||||||
|
|
||||||
if(aoc_handle == 0)
|
if(aoc_handle == 0)
|
||||||
|
@ -48,7 +48,7 @@ EXPORT_DECL(void, AXSetVoiceLoopOffset, void *v, u32 offset);
|
|||||||
void InitAXFunctionPointers(void)
|
void InitAXFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
unsigned int sound_handle;
|
u32 sound_handle;
|
||||||
OSDynLoad_Acquire("sndcore2.rpl", &sound_handle);
|
OSDynLoad_Acquire("sndcore2.rpl", &sound_handle);
|
||||||
|
|
||||||
OS_FIND_EXPORT(sound_handle, AXInitWithParams);
|
OS_FIND_EXPORT(sound_handle, AXInitWithParams);
|
||||||
|
@ -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, 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,
|
EXPORT_DECL(int, FSOpenDirAsync, void *pClient, void *pCmd, const char *path, int *handle, int error,
|
||||||
void *asyncParams);
|
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);
|
EXPORT_DECL(int, FSRewindDir, void *pClient, void *pCmd, int dh, int errHandling);
|
||||||
|
|
||||||
|
@ -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 (*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 (*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);
|
extern int (*FSRewindDir)(void *pClient, void *pCmd, int dh, int errHandling);
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ EXPORT_DECL(void, GX2RSetAllocator, void * (* allocFunc)(u32, u32, u32), void (*
|
|||||||
void InitGX2FunctionPointers(void)
|
void InitGX2FunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
unsigned int gx2_handle;
|
u32 gx2_handle;
|
||||||
OSDynLoad_Acquire("gx2.rpl", &gx2_handle);
|
OSDynLoad_Acquire("gx2.rpl", &gx2_handle);
|
||||||
|
|
||||||
OS_FIND_EXPORT(gx2_handle, GX2Init);
|
OS_FIND_EXPORT(gx2_handle, GX2Init);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "common/common.h"
|
#include "common/common.h"
|
||||||
#include "os_functions.h"
|
#include "os_functions.h"
|
||||||
|
|
||||||
unsigned int coreinit_handle = 0;
|
u32 coreinit_handle = 0;
|
||||||
// unsigned int zlib_handle = 0;
|
// unsigned int zlib_handle = 0;
|
||||||
|
|
||||||
//!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
//!----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -96,7 +96,7 @@ typedef void *(*DisasmGetSym)(u32 addr, u8 *symbolName, u32 nameBufSize);
|
|||||||
#define OS_MUTEX_SIZE 44
|
#define OS_MUTEX_SIZE 44
|
||||||
|
|
||||||
/* Handle for coreinit */
|
/* Handle for coreinit */
|
||||||
extern unsigned int coreinit_handle;
|
extern u32 coreinit_handle;
|
||||||
|
|
||||||
void InitOSFunctionPointers(void);
|
void InitOSFunctionPointers(void);
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ EXPORT_DECL(s32, KPADRead, s32 chan, void * data, u32 size);
|
|||||||
void InitPadScoreFunctionPointers(void)
|
void InitPadScoreFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
unsigned int padscore_handle;
|
u32 padscore_handle;
|
||||||
OSDynLoad_Acquire("padscore.rpl", &padscore_handle);
|
OSDynLoad_Acquire("padscore.rpl", &padscore_handle);
|
||||||
|
|
||||||
OS_FIND_EXPORT(padscore_handle, KPADInit);
|
OS_FIND_EXPORT(padscore_handle, KPADInit);
|
||||||
|
@ -43,11 +43,11 @@ EXPORT_DECL(int, inet_aton, const char *cp, struct in_addr *inp);
|
|||||||
|
|
||||||
void InitSocketFunctionPointers(void)
|
void InitSocketFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int nsysnet_handle;
|
u32 nsysnet_handle;
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle);
|
OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle);
|
||||||
|
|
||||||
unsigned int nn_ac_handle;
|
u32 nn_ac_handle;
|
||||||
int(*ACInitialize)();
|
int(*ACInitialize)();
|
||||||
int(*ACGetStartupId) (unsigned int *id);
|
int(*ACGetStartupId) (unsigned int *id);
|
||||||
int(*ACConnectWithConfigId) (unsigned int id);
|
int(*ACConnectWithConfigId) (unsigned int id);
|
||||||
|
@ -31,7 +31,7 @@ EXPORT_DECL(int, SYSCheckTitleExists, u64 titleId);
|
|||||||
void InitSysFunctionPointers(void)
|
void InitSysFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
unsigned int sysapp_handle;
|
u32 sysapp_handle;
|
||||||
OSDynLoad_Acquire("sysapp.rpl", &sysapp_handle);
|
OSDynLoad_Acquire("sysapp.rpl", &sysapp_handle);
|
||||||
|
|
||||||
OS_FIND_EXPORT(sysapp_handle, _SYSLaunchTitleByPathFromLauncher);
|
OS_FIND_EXPORT(sysapp_handle, _SYSLaunchTitleByPathFromLauncher);
|
||||||
|
@ -30,7 +30,7 @@ EXPORT_DECL(void, VPADRead, int chan, VPADData *buffer, u32 buffer_size, s32 *er
|
|||||||
void InitVPadFunctionPointers(void)
|
void InitVPadFunctionPointers(void)
|
||||||
{
|
{
|
||||||
unsigned int *funcPointer = 0;
|
unsigned int *funcPointer = 0;
|
||||||
unsigned int vpad_handle;
|
u32 vpad_handle;
|
||||||
OSDynLoad_Acquire("vpad.rpl", &vpad_handle);
|
OSDynLoad_Acquire("vpad.rpl", &vpad_handle);
|
||||||
|
|
||||||
OS_FIND_EXPORT(vpad_handle, VPADInit);
|
OS_FIND_EXPORT(vpad_handle, VPADInit);
|
||||||
|
17
src/entry.c
17
src/entry.c
@ -1,13 +1,12 @@
|
|||||||
#include "dynamic_libs/os_functions.h"
|
#include "tcpgecko/main.h"
|
||||||
#include "dynamic_libs/gx2_functions.h"
|
#include "tcpgecko/title.h"
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include "dynamic_libs/socket_functions.h"
|
||||||
#include "common/common.h"
|
#include "dynamic_libs/gx2_functions.h"
|
||||||
#include "tcp_gecko.h"
|
|
||||||
#include "main.h"
|
|
||||||
#include "utils/logger.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()) {
|
if (isRunningAllowedTitleID()) {
|
||||||
InitOSFunctionPointers();
|
InitOSFunctionPointers();
|
||||||
InitSocketFunctionPointers();
|
InitSocketFunctionPointers();
|
||||||
@ -25,3 +24,7 @@ int __entry_menu(int argc, char **argv) {
|
|||||||
//! *******************************************************************
|
//! *******************************************************************
|
||||||
return Menu_Main();
|
return Menu_Main();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __entry_menu(int argc, char **argv) {
|
||||||
|
return entry();
|
||||||
|
}
|
@ -29,10 +29,12 @@
|
|||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#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/fs_functions.h"
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "fs_utils.h"
|
|
||||||
#include "../utils/logger.h"
|
|
||||||
|
|
||||||
#define FS_ALIGNMENT 0x40
|
#define FS_ALIGNMENT 0x40
|
||||||
#define FS_ALIGN(x) (((x) + FS_ALIGNMENT - 1) & ~(FS_ALIGNMENT - 1))
|
#define FS_ALIGN(x) (((x) + FS_ALIGNMENT - 1) & ~(FS_ALIGNMENT - 1))
|
||||||
@ -62,7 +64,8 @@ typedef struct _sd_fat_dir_entry_t {
|
|||||||
int dirHandle;
|
int dirHandle;
|
||||||
} sd_fat_dir_entry_t;
|
} 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;
|
const devoptab_t *devoptab = NULL;
|
||||||
char name[128] = {0};
|
char name[128] = {0};
|
||||||
int i;
|
int i;
|
||||||
@ -79,7 +82,7 @@ static sd_fat_private_t *sd_fat_get_device_data(const char *path) {
|
|||||||
devoptab = devoptab_list[i];
|
devoptab = devoptab_list[i];
|
||||||
if (devoptab && devoptab->name) {
|
if (devoptab && devoptab->name) {
|
||||||
if (strcmp(name, devoptab->name) == 0) {
|
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;
|
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
|
// Sanity check
|
||||||
if (!path)
|
if (!path)
|
||||||
return NULL;
|
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);
|
int mount_len = strlen(dev->mount_path);
|
||||||
|
|
||||||
char *new_name = (char *) malloc(mount_len + strlen(path) + 1);
|
char *new_name = (char*)malloc(mount_len + strlen(path) + 1);
|
||||||
if (new_name) {
|
if(new_name) {
|
||||||
strcpy(new_name, dev->mount_path);
|
strcpy(new_name, dev->mount_path);
|
||||||
strcpy(new_name + mount_len, path);
|
strcpy(new_name + mount_len, path);
|
||||||
return new_name;
|
return new_name;
|
||||||
@ -108,14 +112,15 @@ static char *sd_fat_real_path(const char *path, sd_fat_private_t *dev) {
|
|||||||
return new_name;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(path);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
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;
|
file->dev = dev;
|
||||||
// Determine which mode the file is opened for
|
// 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);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(path, dev);
|
char *real_path = sd_fat_real_path(path, dev);
|
||||||
if (!path) {
|
if(!path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -158,10 +163,11 @@ static int sd_fat_open_r(struct _reent *r, void *fileStruct, const char *path, i
|
|||||||
|
|
||||||
free(real_path);
|
free(real_path);
|
||||||
|
|
||||||
if (result == 0) {
|
if(result == 0)
|
||||||
|
{
|
||||||
FSStat stats;
|
FSStat stats;
|
||||||
result = FSGetStatFile(dev->pClient, dev->pCmd, fd, &stats, -1);
|
result = FSGetStatFile(dev->pClient, dev->pCmd, fd, &stats, -1);
|
||||||
if (result != 0) {
|
if(result != 0) {
|
||||||
FSCloseFile(dev->pClient, dev->pCmd, fd, -1);
|
FSCloseFile(dev->pClient, dev->pCmd, fd, -1);
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
OSUnlockMutex(dev->pMutex);
|
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->pos = 0;
|
||||||
file->len = stats.size;
|
file->len = stats.size;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return (int) file;
|
return (int)file;
|
||||||
}
|
}
|
||||||
|
|
||||||
r->_errno = result;
|
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) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -193,23 +200,26 @@ static int sd_fat_close_r(struct _reent *r, int fd) {
|
|||||||
|
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0)
|
||||||
|
{
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static off_t sd_fat_seek_r(struct _reent *r, int fd, off_t pos, int dir) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSLockMutex(file->dev->pMutex);
|
OSLockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
switch (dir) {
|
switch(dir)
|
||||||
|
{
|
||||||
case SEEK_SET:
|
case SEEK_SET:
|
||||||
file->pos = pos;
|
file->pos = pos;
|
||||||
break;
|
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);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
if (result == 0) {
|
if(result == 0)
|
||||||
|
{
|
||||||
return file->pos;
|
return file->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t sd_fat_write_r(struct _reent *r, int fd, const char *ptr, size_t len) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file->write) {
|
if(!file->write)
|
||||||
|
{
|
||||||
r->_errno = EACCES;
|
r->_errno = EACCES;
|
||||||
return 0;
|
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);
|
OSLockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
size_t len_aligned = FS_ALIGN(len);
|
size_t len_aligned = FS_ALIGN(len);
|
||||||
if (len_aligned > 0x4000)
|
if(len_aligned > 0x4000)
|
||||||
len_aligned = 0x4000;
|
len_aligned = 0x4000;
|
||||||
|
|
||||||
unsigned char *tmpBuf = (unsigned char *) memalign(FS_ALIGNMENT, len_aligned);
|
unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned);
|
||||||
if (!tmpBuf) {
|
if(!tmpBuf) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
return 0;
|
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;
|
size_t done = 0;
|
||||||
|
|
||||||
while (done < len) {
|
while(done < len)
|
||||||
|
{
|
||||||
size_t write_size = (len_aligned < (len - done)) ? len_aligned : (len - done);
|
size_t write_size = (len_aligned < (len - done)) ? len_aligned : (len - done);
|
||||||
memcpy(tmpBuf, ptr + done, write_size);
|
memcpy(tmpBuf, ptr + done, write_size);
|
||||||
|
|
||||||
int result = FSWriteFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, write_size, file->fd, 0, -1);
|
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;
|
r->_errno = result;
|
||||||
break;
|
break;
|
||||||
} else if (result == 0) {
|
}
|
||||||
if (write_size > 0)
|
else if(result == 0)
|
||||||
|
{
|
||||||
|
if(write_size > 0)
|
||||||
done = 0;
|
done = 0;
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
done += result;
|
done += result;
|
||||||
file->pos += 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;
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t sd_fat_read_r(struct _reent *r, int fd, char *ptr, size_t len) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file->read) {
|
if(!file->read)
|
||||||
|
{
|
||||||
r->_errno = EACCES;
|
r->_errno = EACCES;
|
||||||
return 0;
|
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);
|
OSLockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
size_t len_aligned = FS_ALIGN(len);
|
size_t len_aligned = FS_ALIGN(len);
|
||||||
if (len_aligned > 0x4000)
|
if(len_aligned > 0x4000)
|
||||||
len_aligned = 0x4000;
|
len_aligned = 0x4000;
|
||||||
|
|
||||||
unsigned char *tmpBuf = (unsigned char *) memalign(FS_ALIGNMENT, len_aligned);
|
unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned);
|
||||||
if (!tmpBuf) {
|
if(!tmpBuf) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
return 0;
|
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;
|
size_t done = 0;
|
||||||
|
|
||||||
while (done < len) {
|
while(done < len)
|
||||||
|
{
|
||||||
size_t read_size = (len_aligned < (len - done)) ? len_aligned : (len - done);
|
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);
|
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;
|
r->_errno = result;
|
||||||
done = 0;
|
done = 0;
|
||||||
break;
|
break;
|
||||||
} else if (result == 0) {
|
}
|
||||||
|
else if(result == 0)
|
||||||
|
{
|
||||||
//! TODO: error on read_size > 0
|
//! TODO: error on read_size > 0
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
memcpy(ptr + done, tmpBuf, read_size);
|
memcpy(ptr + done, tmpBuf, read_size);
|
||||||
done += result;
|
done += result;
|
||||||
file->pos += 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) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -350,7 +378,7 @@ static int sd_fat_fstat_r(struct _reent *r, int fd, struct stat *st) {
|
|||||||
|
|
||||||
FSStat stats;
|
FSStat stats;
|
||||||
int result = FSGetStatFile(file->dev->pClient, file->dev->pCmd, file->fd, &stats, -1);
|
int result = FSGetStatFile(file->dev->pClient, file->dev->pCmd, file->fd, &stats, -1);
|
||||||
if (result != 0) {
|
if(result != 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -373,9 +401,10 @@ static int sd_fat_fstat_r(struct _reent *r, int fd, struct stat *st) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -386,7 +415,7 @@ static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) {
|
|||||||
|
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -394,9 +423,10 @@ static int sd_fat_ftruncate_r(struct _reent *r, int fd, off_t len) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sd_fat_fsync_r(struct _reent *r, int fd) {
|
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) {
|
sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd;
|
||||||
|
if(!file->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -407,7 +437,7 @@ static int sd_fat_fsync_r(struct _reent *r, int fd) {
|
|||||||
|
|
||||||
OSUnlockMutex(file->dev->pMutex);
|
OSUnlockMutex(file->dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -415,9 +445,10 @@ static int sd_fat_fsync_r(struct _reent *r, int fd) {
|
|||||||
return 0;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(path);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
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));
|
memset(st, 0, sizeof(struct stat));
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(path, dev);
|
char *real_path = sd_fat_real_path(path, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -440,14 +471,14 @@ static int sd_fat_stat_r(struct _reent *r, const char *path, struct stat *st) {
|
|||||||
|
|
||||||
free(real_path);
|
free(real_path);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// mark root also as directory
|
// 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_nlink = 1;
|
||||||
st->st_size = stats.size;
|
st->st_size = stats.size;
|
||||||
st->st_blocks = (stats.size + 511) >> 9;
|
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;
|
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;
|
r->_errno = ENOTSUP;
|
||||||
return -1;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(name);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -480,7 +513,7 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) {
|
|||||||
OSLockMutex(dev->pMutex);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(name, dev);
|
char *real_path = sd_fat_real_path(name, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -493,7 +526,7 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) {
|
|||||||
|
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -501,9 +534,10 @@ static int sd_fat_unlink_r(struct _reent *r, const char *name) {
|
|||||||
return 0;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(name);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -511,7 +545,7 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) {
|
|||||||
OSLockMutex(dev->pMutex);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(name, dev);
|
char *real_path = sd_fat_real_path(name, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -523,7 +557,7 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) {
|
|||||||
|
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -531,9 +565,10 @@ static int sd_fat_chdir_r(struct _reent *r, const char *name) {
|
|||||||
return 0;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(oldName);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -541,13 +576,13 @@ static int sd_fat_rename_r(struct _reent *r, const char *oldName, const char *ne
|
|||||||
OSLockMutex(dev->pMutex);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_oldpath = sd_fat_real_path(oldName, dev);
|
char *real_oldpath = sd_fat_real_path(oldName, dev);
|
||||||
if (!real_oldpath) {
|
if(!real_oldpath) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
char *real_newpath = sd_fat_real_path(newName, dev);
|
char *real_newpath = sd_fat_real_path(newName, dev);
|
||||||
if (!real_newpath) {
|
if(!real_newpath) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
free(real_oldpath);
|
free(real_oldpath);
|
||||||
OSUnlockMutex(dev->pMutex);
|
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);
|
OSUnlockMutex(dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(path);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -580,7 +616,7 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) {
|
|||||||
OSLockMutex(dev->pMutex);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(path, dev);
|
char *real_path = sd_fat_real_path(path, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -592,7 +628,7 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) {
|
|||||||
|
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -600,9 +636,10 @@ static int sd_fat_mkdir_r(struct _reent *r, const char *path, int mode) {
|
|||||||
return 0;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(path);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
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));
|
memset(buf, 0, sizeof(struct statvfs));
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(path, dev);
|
char *real_path = sd_fat_real_path(path, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -625,7 +662,7 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs *
|
|||||||
|
|
||||||
free(real_path);
|
free(real_path);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0) {
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return -1;
|
return -1;
|
||||||
@ -650,7 +687,7 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs *
|
|||||||
buf->f_ffree = 0xffffffff;
|
buf->f_ffree = 0xffffffff;
|
||||||
|
|
||||||
// File system id
|
// File system id
|
||||||
buf->f_fsid = (int) dev;
|
buf->f_fsid = (int)dev;
|
||||||
|
|
||||||
// Bit mask of f_flag values.
|
// Bit mask of f_flag values.
|
||||||
buf->f_flag = 0;
|
buf->f_flag = 0;
|
||||||
@ -663,25 +700,26 @@ static int sd_fat_statvfs_r(struct _reent *r, const char *path, struct statvfs *
|
|||||||
return 0;
|
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);
|
sd_fat_private_t *dev = sd_fat_get_device_data(path);
|
||||||
if (!dev) {
|
if(!dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return NULL;
|
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);
|
OSLockMutex(dev->pMutex);
|
||||||
|
|
||||||
char *real_path = sd_fat_real_path(path, dev);
|
char *real_path = sd_fat_real_path(path, dev);
|
||||||
if (!real_path) {
|
if(!real_path) {
|
||||||
r->_errno = ENOMEM;
|
r->_errno = ENOMEM;
|
||||||
OSUnlockMutex(dev->pMutex);
|
OSUnlockMutex(dev->pMutex);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dirHandle;
|
s32 dirHandle;
|
||||||
|
|
||||||
int result = FSOpenDir(dev->pClient, dev->pCmd, real_path, &dirHandle, -1);
|
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);
|
OSUnlockMutex(dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0)
|
||||||
|
{
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -700,9 +739,10 @@ static DIR_ITER *sd_fat_diropen_r(struct _reent *r, DIR_ITER *dirState, const ch
|
|||||||
return dirState;
|
return dirState;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sd_fat_dirclose_r(struct _reent *r, DIR_ITER *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) {
|
sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct;
|
||||||
|
if(!dirIter->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -713,16 +753,18 @@ static int sd_fat_dirclose_r(struct _reent *r, DIR_ITER *dirState) {
|
|||||||
|
|
||||||
OSUnlockMutex(dirIter->dev->pMutex);
|
OSUnlockMutex(dirIter->dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0)
|
||||||
|
{
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sd_fat_dirreset_r(struct _reent *r, DIR_ITER *dirState) {
|
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) {
|
sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct;
|
||||||
|
if(!dirIter->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -733,26 +775,29 @@ static int sd_fat_dirreset_r(struct _reent *r, DIR_ITER *dirState) {
|
|||||||
|
|
||||||
OSUnlockMutex(dirIter->dev->pMutex);
|
OSUnlockMutex(dirIter->dev->pMutex);
|
||||||
|
|
||||||
if (result < 0) {
|
if(result < 0)
|
||||||
|
{
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sd_fat_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) {
|
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) {
|
sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct;
|
||||||
|
if(!dirIter->dev) {
|
||||||
r->_errno = ENODEV;
|
r->_errno = ENODEV;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
OSLockMutex(dirIter->dev->pMutex);
|
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);
|
int result = FSReadDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, dir_entry, -1);
|
||||||
if (result < 0) {
|
if(result < 0)
|
||||||
|
{
|
||||||
free(dir_entry);
|
free(dir_entry);
|
||||||
r->_errno = result;
|
r->_errno = result;
|
||||||
OSUnlockMutex(dirIter->dev->pMutex);
|
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
|
// Fetch the current entry
|
||||||
strcpy(filename, dir_entry->name);
|
strcpy(filename, dir_entry->name);
|
||||||
|
|
||||||
if (st) {
|
if(st)
|
||||||
|
{
|
||||||
memset(st, 0, sizeof(struct stat));
|
memset(st, 0, sizeof(struct stat));
|
||||||
st->st_mode = (dir_entry->stat.flag & 0x80000000) ? S_IFDIR : S_IFREG;
|
st->st_mode = (dir_entry->stat.flag & 0x80000000) ? S_IFDIR : S_IFREG;
|
||||||
st->st_nlink = 1;
|
st->st_nlink = 1;
|
||||||
@ -782,10 +828,10 @@ static int sd_fat_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NTFS device driver devoptab
|
// SD device driver devoptab
|
||||||
static const devoptab_t devops_sd_fat = {
|
static const devoptab_t devops_sd_fat = {
|
||||||
NULL, /* Device name */
|
NULL, /* Device name */
|
||||||
sizeof(sd_fat_file_state_t),
|
sizeof (sd_fat_file_state_t),
|
||||||
sd_fat_open_r,
|
sd_fat_open_r,
|
||||||
sd_fat_close_r,
|
sd_fat_close_r,
|
||||||
sd_fat_write_r,
|
sd_fat_write_r,
|
||||||
@ -798,7 +844,7 @@ static const devoptab_t devops_sd_fat = {
|
|||||||
sd_fat_chdir_r,
|
sd_fat_chdir_r,
|
||||||
sd_fat_rename_r,
|
sd_fat_rename_r,
|
||||||
sd_fat_mkdir_r,
|
sd_fat_mkdir_r,
|
||||||
sizeof(sd_fat_dir_entry_t),
|
sizeof (sd_fat_dir_entry_t),
|
||||||
sd_fat_diropen_r,
|
sd_fat_diropen_r,
|
||||||
sd_fat_dirreset_r,
|
sd_fat_dirreset_r,
|
||||||
sd_fat_dirnext_r,
|
sd_fat_dirnext_r,
|
||||||
@ -806,12 +852,15 @@ static const devoptab_t devops_sd_fat = {
|
|||||||
sd_fat_statvfs_r,
|
sd_fat_statvfs_r,
|
||||||
sd_fat_ftruncate_r,
|
sd_fat_ftruncate_r,
|
||||||
sd_fat_fsync_r,
|
sd_fat_fsync_r,
|
||||||
|
NULL, /* Device data */
|
||||||
NULL, /* sd_fat_chmod_r */
|
NULL, /* sd_fat_chmod_r */
|
||||||
NULL, /* sd_fat_fchmod_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;
|
devoptab_t *dev = NULL;
|
||||||
char *devname = NULL;
|
char *devname = NULL;
|
||||||
char *devpath = 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
|
// 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);
|
strcpy(devname, name);
|
||||||
|
|
||||||
// create private data
|
// create private data
|
||||||
sd_fat_private_t *priv = (sd_fat_private_t *) malloc(sizeof(sd_fat_private_t) + strlen(mount_path) + 1);
|
int mount_path_len = 0;
|
||||||
if (!priv) {
|
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);
|
free(dev);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
devpath = (char *) (priv + 1);
|
devpath = (char*)(priv+1);
|
||||||
strcpy(devpath, mount_path);
|
if(mount_path != NULL){
|
||||||
|
strcpy(devpath, mount_path);
|
||||||
|
}
|
||||||
|
|
||||||
// setup private data
|
// setup private data
|
||||||
priv->mount_path = devpath;
|
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->pCmd = pCmd;
|
||||||
priv->pMutex = malloc(OS_MUTEX_SIZE);
|
priv->pMutex = malloc(OS_MUTEX_SIZE);
|
||||||
|
|
||||||
if (!priv->pMutex) {
|
if(!priv->pMutex) {
|
||||||
free(dev);
|
free(dev);
|
||||||
free(priv);
|
free(priv);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@ -882,7 +937,31 @@ static int sd_fat_add_device(const char *name, const char *mount_path, void *pCl
|
|||||||
return -1;
|
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;
|
const devoptab_t *devoptab = NULL;
|
||||||
char name[128] = {0};
|
char name[128] = {0};
|
||||||
int i;
|
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) {
|
if (strcmp(name, devoptab->name) == 0) {
|
||||||
devoptab_list[i] = devoptab_list[0];
|
devoptab_list[i] = devoptab_list[0];
|
||||||
|
|
||||||
if (devoptab->deviceData) {
|
if(devoptab->deviceData)
|
||||||
sd_fat_private_t *priv = (sd_fat_private_t *) devoptab->deviceData;
|
{
|
||||||
*pClient = priv->pClient;
|
sd_fat_private_t *priv = (sd_fat_private_t *)devoptab->deviceData;
|
||||||
*pCmd = priv->pCmd;
|
if(pClient != NULL) *pClient = priv->pClient;
|
||||||
*mountPath = (char *) malloc(strlen(priv->mount_path) + 1);
|
if(pCmd != NULL) *pCmd = priv->pCmd;
|
||||||
if (*mountPath)
|
if(mountPath != NULL){
|
||||||
strcpy(*mountPath, priv->mount_path);
|
*mountPath = (char*) malloc(strlen(priv->mount_path)+1);
|
||||||
if (priv->pMutex)
|
if(*mountPath)
|
||||||
|
strcpy(*mountPath, priv->mount_path);
|
||||||
|
}
|
||||||
|
if(priv->pMutex)
|
||||||
free(priv->pMutex);
|
free(priv->pMutex);
|
||||||
free(devoptab->deviceData);
|
free(devoptab->deviceData);
|
||||||
}
|
}
|
||||||
|
|
||||||
free((devoptab_t *) devoptab);
|
free((devoptab_t*)devoptab);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -922,18 +1004,19 @@ static int sd_fat_remove_device(const char *path, void **pClient, void **pCmd, c
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mount_sd_fat(const char *path) {
|
int mount_sd_fat(const char *path)
|
||||||
|
{
|
||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
// get command and client
|
// get command and client
|
||||||
void *pClient = malloc(FS_CLIENT_SIZE);
|
void* pClient = malloc(FS_CLIENT_SIZE);
|
||||||
void *pCmd = malloc(FS_CMD_BLOCK_SIZE);
|
void* pCmd = malloc(FS_CMD_BLOCK_SIZE);
|
||||||
|
|
||||||
if (!pClient || !pCmd) {
|
if(!pClient || !pCmd) {
|
||||||
// just in case free if not 0
|
// just in case free if not 0
|
||||||
if (pClient)
|
if(pClient)
|
||||||
free(pClient);
|
free(pClient);
|
||||||
if (pCmd)
|
if(pCmd)
|
||||||
free(pCmd);
|
free(pCmd);
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
@ -944,26 +1027,23 @@ int mount_sd_fat(const char *path) {
|
|||||||
|
|
||||||
char *mountPath = NULL;
|
char *mountPath = NULL;
|
||||||
|
|
||||||
result = MountFS(pClient, pCmd, &mountPath);
|
if(MountFS(pClient, pCmd, &mountPath) == 0) {
|
||||||
if (result == 0) {
|
|
||||||
log_print("MountFS success\n");
|
|
||||||
result = sd_fat_add_device(path, mountPath, pClient, pCmd);
|
result = sd_fat_add_device(path, mountPath, pClient, pCmd);
|
||||||
log_printf("sd_fat_add_device result: %i\n", result);
|
|
||||||
free(mountPath);
|
free(mountPath);
|
||||||
} else {
|
|
||||||
log_printf("MountFS error: %i\n", result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int unmount_sd_fat(const char *path) {
|
int unmount_sd_fat(const char *path)
|
||||||
|
{
|
||||||
void *pClient = 0;
|
void *pClient = 0;
|
||||||
void *pCmd = 0;
|
void *pCmd = 0;
|
||||||
char *mountPath = 0;
|
char *mountPath = 0;
|
||||||
|
|
||||||
int result = sd_fat_remove_device(path, &pClient, &pCmd, &mountPath);
|
int result = sd_fat_remove_device(path, &pClient, &pCmd, &mountPath);
|
||||||
if (result == 0) {
|
if(result == 0)
|
||||||
|
{
|
||||||
UmountFS(pClient, pCmd, mountPath);
|
UmountFS(pClient, pCmd, mountPath);
|
||||||
FSDelClient(pClient);
|
FSDelClient(pClient);
|
||||||
free(pClient);
|
free(pClient);
|
||||||
@ -973,3 +1053,11 @@ int unmount_sd_fat(const char *path) {
|
|||||||
}
|
}
|
||||||
return result;
|
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);
|
||||||
|
}
|
@ -11,7 +11,7 @@ declareFunctionHook(int, FSOpenFileAsync, void *pClient, void *pCmd, const char
|
|||||||
return real_FSOpenFileAsync(pClient, pCmd, path, mode, handle, error, asyncParams);
|
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);
|
log_printf("FSOpenDir(): %s", path);
|
||||||
return real_FSOpenDir(pClient, pCmd, path, dh, errHandling);
|
return real_FSOpenDir(pClient, pCmd, path, dh, errHandling);
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ static unsigned char exceptionCallback(void *c, unsigned char exception_type) {
|
|||||||
register frame_rec_t l, p = (frame_rec_t) lr;
|
register frame_rec_t l, p = (frame_rec_t) lr;
|
||||||
|
|
||||||
l = p;
|
l = p;
|
||||||
p = r1;
|
p = (frame_rec_t) r1;
|
||||||
if (!p)
|
if (!p)
|
||||||
asm volatile("mr %0,%%r1" : "=r"(p));
|
asm volatile("mr %0,%%r1" : "=r"(p));
|
||||||
|
|
@ -5,8 +5,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../utils/stringify.h"
|
#include "../tcpgecko/stringify.h"
|
||||||
#include "../common/kernel_types.h"
|
|
||||||
|
|
||||||
#define OS_EXCEPTION_DSI 2
|
#define OS_EXCEPTION_DSI 2
|
||||||
#define OS_EXCEPTION_ISI 3
|
#define OS_EXCEPTION_ISI 3
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include "address.h"
|
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
|
|
||||||
int validateAddressRange(int starting_address, int ending_address) {
|
int validateAddressRange(int starting_address, int ending_address) {
|
@ -1,8 +1,6 @@
|
|||||||
#ifndef TCPGECKO_STACK_H
|
#ifndef TCPGECKO_STACK_H
|
||||||
#define TCPGECKO_STACK_H
|
#define TCPGECKO_STACK_H
|
||||||
|
|
||||||
#include "kernel_types.h"
|
|
||||||
|
|
||||||
typedef struct OSThread;
|
typedef struct OSThread;
|
||||||
|
|
||||||
typedef struct OSThreadLink {
|
typedef struct OSThreadLink {
|
@ -1,10 +1,9 @@
|
|||||||
#include "disassembler.h"
|
|
||||||
#include "../utils/assertions.h"
|
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
|
#include "assertions.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
char *disassemblerBuffer;
|
char *disassemblerBuffer;
|
||||||
void *disassemblerBufferPointer;
|
void *disassemblerBufferPointer;
|
||||||
@ -13,7 +12,7 @@ void *disassemblerBufferPointer;
|
|||||||
|
|
||||||
void formatDisassembled(char *format, ...) {
|
void formatDisassembled(char *format, ...) {
|
||||||
if (!disassemblerBuffer) {
|
if (!disassemblerBuffer) {
|
||||||
disassemblerBuffer = malloc(DISASSEMBLER_BUFFER_SIZE);
|
disassemblerBuffer = (char *) malloc(DISASSEMBLER_BUFFER_SIZE);
|
||||||
ASSERT_ALLOCATED(disassemblerBuffer, "Disassembler buffer")
|
ASSERT_ALLOCATED(disassemblerBuffer, "Disassembler buffer")
|
||||||
disassemblerBufferPointer = disassemblerBuffer;
|
disassemblerBufferPointer = disassemblerBuffer;
|
||||||
}
|
}
|
||||||
@ -27,7 +26,7 @@ void formatDisassembled(char *format, ...) {
|
|||||||
va_end(variableArguments);
|
va_end(variableArguments);
|
||||||
|
|
||||||
// Do not smash the buffer
|
// Do not smash the buffer
|
||||||
long projectedSize = (void *) disassemblerBuffer - disassemblerBufferPointer + printedBytesCount;
|
long projectedSize = disassemblerBuffer - (char *) disassemblerBufferPointer + printedBytesCount;
|
||||||
if (projectedSize < DISASSEMBLER_BUFFER_SIZE) {
|
if (projectedSize < DISASSEMBLER_BUFFER_SIZE) {
|
||||||
memcpy(disassemblerBuffer, temporaryBuffer, printedBytesCount);
|
memcpy(disassemblerBuffer, temporaryBuffer, printedBytesCount);
|
||||||
disassemblerBuffer += printedBytesCount;
|
disassemblerBuffer += printedBytesCount;
|
@ -1,11 +1,10 @@
|
|||||||
#include "../utils/stringify.h"
|
#include "stringify.h"
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "threads.h"
|
#include "threads.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "../main.h"
|
#include "main.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
#include "software_breakpoints.h"
|
#include "software_breakpoints.h"
|
||||||
#include "../common/kernel_types.h"
|
|
||||||
|
|
||||||
#ifndef TCPGECKO_BREAKPOINTS_H
|
#ifndef TCPGECKO_BREAKPOINTS_H
|
||||||
#define TCPGECKO_BREAKPOINTS_H
|
#define TCPGECKO_BREAKPOINTS_H
|
@ -1,9 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../kernel/syscalls.h"
|
#include "../kernel/syscalls.h"
|
||||||
#include "../utils/assertions.h"
|
#include "assertions.h"
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "../tcp_gecko.h"
|
#include "tcp_gecko.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
|
|
||||||
// TODO Variable size, not hard-coded
|
// TODO Variable size, not hard-coded
|
@ -5,21 +5,23 @@
|
|||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "dynamic_libs/fs_functions.h"
|
#include "../dynamic_libs/fs_functions.h"
|
||||||
#include "dynamic_libs/sys_functions.h"
|
#include "../dynamic_libs/sys_functions.h"
|
||||||
#include "dynamic_libs/vpad_functions.h"
|
#include "../dynamic_libs/vpad_functions.h"
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include "../dynamic_libs/socket_functions.h"
|
||||||
#include "kernel/kernel_functions.h"
|
#include "../kernel/kernel_functions.h"
|
||||||
#include "system/memory.h"
|
#include "../system/memory.h"
|
||||||
#include "common/common.h"
|
#include "../common/common.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "code_handler.h"
|
#include "code_handler.h"
|
||||||
#include "utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "utils/function_patcher.h"
|
#include "../utils/function_patcher.h"
|
||||||
#include "patcher/function_patcher_gx2.h"
|
#include "../patcher/function_patcher_gx2.h"
|
||||||
#include "patcher/function_patcher_coreinit.h"
|
#include "../patcher/function_patcher_coreinit.h"
|
||||||
#include "utils/sd_ip_reader.hpp"
|
#include "sd_ip_reader.h"
|
||||||
|
#include "title.h"
|
||||||
|
#include "tcp_gecko.h"
|
||||||
|
|
||||||
bool isCodeHandlerInstalled = false;
|
bool isCodeHandlerInstalled = false;
|
||||||
bool areSDCheatsEnabled = false;
|
bool areSDCheatsEnabled = false;
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef _MAIN_H_
|
#ifndef _MAIN_H_
|
||||||
#define _MAIN_H_
|
#define _MAIN_H_
|
||||||
|
|
||||||
#include "common/types.h"
|
#include "../common/types.h"
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
|
|
||||||
/* Main */
|
/* Main */
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
561
src/tcpgecko/net.c
Normal file
561
src/tcpgecko/net.c
Normal file
@ -0,0 +1,561 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <malloc.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;
|
||||||
|
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);
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "../utils/assertions.h"
|
#include "assertions.h"
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "../common/fs_defs.h"
|
#include "../common/fs_defs.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
@ -1,11 +1,11 @@
|
|||||||
#include <stdio.h> // snprintf
|
#include <stdio.h> // snprintf
|
||||||
#include <string.h> // memcpy, memset
|
#include <string.h> // memcpy, memset
|
||||||
#include "utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "fs/sd_fat_devoptab.h"
|
#include "../fs/sd_fat_devoptab.h"
|
||||||
#include "fs/fs_utils.h"
|
#include "../fs/fs_utils.h"
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "tcp_gecko.h"
|
#include "tcp_gecko.h"
|
||||||
#include "kernel/syscalls.h"
|
#include "../kernel/syscalls.h"
|
||||||
#include <fat.h>
|
#include <fat.h>
|
||||||
#include <iosuhax.h>
|
#include <iosuhax.h>
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ void considerApplyingSDCheats() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log_print("Copying...\n");
|
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");
|
log_print("Copied!\n");
|
||||||
setCodeHandlerEnabled(true);
|
setCodeHandlerEnabled(true);
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
#include "sd_ip_reader.hpp"
|
#include "sd_ip_reader.h"
|
||||||
|
|
||||||
char ipFromSd[16];
|
char ipFromSd[16];
|
||||||
bool hasReadIP = false;
|
bool hasReadIP = false;
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "../common/common.h"
|
#include "../common/common.h"
|
||||||
#include "../fs/CFile.hpp"
|
#include "../fs/CFile.hpp"
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
#define TCPGECKO_BREAKPOINT_EXECUTE_H
|
#define TCPGECKO_BREAKPOINT_EXECUTE_H
|
||||||
|
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
#include "exception_handler.h"
|
#include "../system/exception_handler.h"
|
||||||
|
|
||||||
#define OS_EXCEPTION_DSI 2
|
#define OS_EXCEPTION_DSI 2
|
||||||
#define OS_EXCEPTION_ISI 3
|
#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]) {
|
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));
|
// memcpy(&context.fpr, &fpr, sizeof(fpr));
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef TCPGECKO_STACK_H
|
#ifndef TCPGECKO_STACK_H
|
||||||
#define TCPGECKO_STACK_H
|
#define TCPGECKO_STACK_H
|
||||||
|
|
||||||
#include "../utils/linked_list.h"
|
#include "linked_list.h"
|
||||||
#include "../common/cafe.h"
|
#include "cafe.h"
|
||||||
|
|
||||||
bool isValidStackPointer(u32 stackPointer) {
|
bool isValidStackPointer(u32 stackPointer) {
|
||||||
return stackPointer >= 0x10000000 && stackPointer < 0x20000000;
|
return stackPointer >= 0x10000000 && stackPointer < 0x20000000;
|
@ -4,24 +4,24 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
// #include <inttypes.h>
|
// #include <inttypes.h>
|
||||||
#include "common/common.h"
|
#include "../common/common.h"
|
||||||
#include <zlib.h> // Actually must be included before os_functions
|
#include <zlib.h> // Actually must be included before os_functions
|
||||||
#include "dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "dynamic_libs/socket_functions.h"
|
#include "../dynamic_libs/socket_functions.h"
|
||||||
#include "dynamic_libs/gx2_functions.h"
|
#include "../dynamic_libs/gx2_functions.h"
|
||||||
#include "dynamic_libs/fs_functions.h"
|
#include "../dynamic_libs/fs_functions.h"
|
||||||
#include "utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "system/hardware_breakpoints.h"
|
#include "hardware_breakpoints.hpp"
|
||||||
#include "utils/linked_list.h"
|
#include "linked_list.h"
|
||||||
#include "system/address.h"
|
#include "address.h"
|
||||||
#include "system/stack.h"
|
#include "stack.h"
|
||||||
#include "system/pause.h"
|
#include "pause.h"
|
||||||
#include "utils/sd_ip_reader.hpp"
|
#include "sd_ip_reader.h"
|
||||||
#include "patcher/function_patcher_gx2.h"
|
#include "../patcher/function_patcher_gx2.h"
|
||||||
#include "system/raw_assembly_cheats.h"
|
#include "raw_assembly_cheats.h"
|
||||||
#include "sd_cheats.h"
|
#include "sd_cheats.h"
|
||||||
|
|
||||||
void *client;
|
void *client;
|
||||||
@ -81,9 +81,9 @@ struct pygecko_bss_t {
|
|||||||
#define COMMAND_CLEAR_ASSEMBLY 0xE2
|
#define COMMAND_CLEAR_ASSEMBLY 0xE2
|
||||||
|
|
||||||
#define CHECK_ERROR(cond) if (cond) { bss->line = __LINE__; goto error; }
|
#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 MSG_DONT_WAIT 32
|
||||||
#define EWOULDBLOCK 6
|
#define E_WOULD_BLOCK 6
|
||||||
// #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100
|
// #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100
|
||||||
#define SERVER_VERSION "06/03/2017"
|
#define SERVER_VERSION "06/03/2017"
|
||||||
#define ONLY_ZEROS_READ 0xB0
|
#define ONLY_ZEROS_READ 0xB0
|
||||||
@ -242,8 +242,9 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
|||||||
ret = checkbyte(clientfd);
|
ret = checkbyte(clientfd);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
CHECK_ERROR(errno != EWOULDBLOCK);
|
CHECK_ERROR(errno2 != E_WOULD_BLOCK);
|
||||||
GX2WaitForVsync();
|
GX2WaitForVsync();
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,8 +730,11 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case COMMAND_GET_DATA_BUFFER_SIZE: {
|
case COMMAND_GET_DATA_BUFFER_SIZE: {
|
||||||
|
log_printf("COMMAND_GET_DATA_BUFFER_SIZE...\n");
|
||||||
((int *) buffer)[0] = DATA_BUFFER_SIZE;
|
((int *) buffer)[0] = DATA_BUFFER_SIZE;
|
||||||
|
log_printf("Sending buffer size...\n");
|
||||||
ret = sendwait(bss, clientfd, buffer, sizeof(int));
|
ret = sendwait(bss, clientfd, buffer, sizeof(int));
|
||||||
|
log_printf("Sent: %i\n", ret);
|
||||||
CHECK_ERROR(ret < 0)
|
CHECK_ERROR(ret < 0)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -798,7 +802,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
|||||||
|
|
||||||
considerInitializingFileSystem();
|
considerInitializingFileSystem();
|
||||||
|
|
||||||
int handle;
|
s32 handle;
|
||||||
FSDirEntry entry;
|
FSDirEntry entry;
|
||||||
|
|
||||||
ret = FSOpenDir(client, commandBlock, directory_path, &handle, FS_RET_ALL_ERROR);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case COMMAND_REMOTE_PROCEDURE_CALL: {
|
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;
|
int r3, r4, r5, r6, r7, r8, r9, r10;
|
||||||
long long result;
|
|
||||||
|
|
||||||
ret = recvwait(bss, clientfd, buffer, 4 + 8 * 4);
|
log_print("Receiving RPC information...\n");
|
||||||
CHECK_ERROR(ret < 0);
|
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];
|
function = (long long int (*)(int, int, int, int, int, int, int, int)) ((void **) buffer)[0];
|
||||||
r3 = ((int *) buffer)[1];
|
r3 = ((int *) buffer)[1];
|
||||||
r4 = ((int *) buffer)[2];
|
r4 = ((int *) buffer)[2];
|
||||||
@ -1153,11 +1158,16 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
|||||||
r9 = ((int *) buffer)[7];
|
r9 = ((int *) buffer)[7];
|
||||||
r10 = ((int *) buffer)[8];
|
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;
|
((long long *) buffer)[0] = result;
|
||||||
ret = sendwait(bss, clientfd, buffer, 8);
|
ret = sendwait(bss, clientfd, buffer, sizeof(long long));
|
||||||
CHECK_ERROR(ret < 0)
|
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait() Sending return value")
|
||||||
|
log_print("Result successfully sent...\n");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1457,9 +1467,10 @@ static int runTCPGeckoServer(int argc, void *argv) {
|
|||||||
CHECK_ERROR(ret < 0)
|
CHECK_ERROR(ret < 0)
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
log_printf("accept()...\n");
|
|
||||||
len = 16;
|
len = 16;
|
||||||
|
log_printf("before accept()...\n");
|
||||||
clientfd = accept(sockfd, (struct sockaddr *) &socketAddress, (s32 * ) & len);
|
clientfd = accept(sockfd, (struct sockaddr *) &socketAddress, (s32 * ) & len);
|
||||||
|
log_printf("after accept()...\n");
|
||||||
CHECK_ERROR(clientfd == -1)
|
CHECK_ERROR(clientfd == -1)
|
||||||
log_printf("commands()...\n");
|
log_printf("commands()...\n");
|
||||||
ret = processCommands(bss, clientfd);
|
ret = processCommands(bss, clientfd);
|
@ -1,5 +1,5 @@
|
|||||||
#include "threads.h"
|
#include "threads.h"
|
||||||
#include "../utils/linked_list.h"
|
#include "linked_list.h"
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
#include "dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "title.h"
|
#include "title.h"
|
||||||
|
|
||||||
bool isRunningTitleID(unsigned long long int japaneseTitleID) {
|
bool isRunningTitleID(unsigned long long int japaneseTitleID) {
|
@ -4,7 +4,6 @@
|
|||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "../utils/logger.h"
|
#include "../utils/logger.h"
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "../common/kernel_types.h"
|
|
||||||
|
|
||||||
void writeCode(u32 address, u32 instruction) {
|
void writeCode(u32 address, u32 instruction) {
|
||||||
u32 *pointer = (u32 *) (address + 0xA0000000);
|
u32 *pointer = (u32 *) (address + 0xA0000000);
|
@ -215,6 +215,7 @@ bool isDynamicFunction(unsigned int physicalAddress) {
|
|||||||
|
|
||||||
unsigned int getRPLHandle(int library, const char *functionName) {
|
unsigned int getRPLHandle(int library, const char *functionName) {
|
||||||
unsigned int rplHandle = 0;
|
unsigned int rplHandle = 0;
|
||||||
|
u32 gx2_handle = 0;
|
||||||
|
|
||||||
switch (library) {
|
switch (library) {
|
||||||
case LIB_CORE_INIT:
|
case LIB_CORE_INIT:
|
||||||
@ -228,7 +229,6 @@ unsigned int getRPLHandle(int library, const char *functionName) {
|
|||||||
|
|
||||||
case LIB_GX2:
|
case LIB_GX2:
|
||||||
if (DEBUG_LOG_DYN)log_printf("FindExport of %s! From LIB_GX2\n", functionName);
|
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);
|
OSDynLoad_Acquire("gx2.rpl", &gx2_handle);
|
||||||
if (gx2_handle == 0) {
|
if (gx2_handle == 0) {
|
||||||
log_print("LIB_GX2 not acquired\n");
|
log_print("LIB_GX2 not acquired\n");
|
@ -1,7 +1,9 @@
|
|||||||
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <wchar.h>
|
||||||
|
#include <gctypes.h>
|
||||||
#include "../dynamic_libs/os_functions.h"
|
#include "../dynamic_libs/os_functions.h"
|
||||||
#include "../dynamic_libs/socket_functions.h"
|
#include "../dynamic_libs/socket_functions.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
|
561
src/utils/net.c
561
src/utils/net.c
@ -1,561 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
#include <malloc.h>
|
|
||||||
#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);
|
|
||||||
}
|
|
BIN
tcpgecko.elf
BIN
tcpgecko.elf
Binary file not shown.
Loading…
Reference in New Issue
Block a user