RetroArch/ctr/exec-3dsx/exec_3dsx.c

85 lines
2.0 KiB
C
Raw Normal View History

#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include "mini-hb-menu/common.h"
extern const loaderFuncs_s loader_Ninjhax1;
extern const loaderFuncs_s loader_Ninjhax2;
extern const loaderFuncs_s loader_Rosalina;
2018-05-15 10:30:34 -07:00
static void (*launch_3dsx)(const char* path, argData_s* args, executableMetadata_s* em);
2018-05-16 16:26:38 -07:00
static int exec_3dsx_actual(const char* path, const char** args, bool appendPath){
struct stat sBuff;
2018-05-15 10:30:34 -07:00
argData_s newProgramArgs;
2018-05-16 16:26:38 -07:00
unsigned int argChars = 0;
unsigned int argNum = 0;
bool fileExists;
bool inited;
if(path == NULL || path[0] == '\0'){
errno = EINVAL;
return -1;
}
fileExists = stat(path, &sBuff) == 0;
if(!fileExists){
errno = ENOENT;
return -1;
}
else if(S_ISDIR(sBuff.st_mode)){
2018-05-15 10:30:34 -07:00
errno = EINVAL;
return -1;
}
2018-05-15 10:30:34 -07:00
//args the string functions write to the passed string, this will cause a write to read only memory sot the string must be cloned
memset(newProgramArgs.buf, '\0', sizeof(newProgramArgs.buf));
newProgramArgs.dst = (char*)&newProgramArgs.buf[1];
if(appendPath){
2018-05-16 16:26:38 -07:00
strcpy(newProgramArgs.dst, path);
newProgramArgs.dst += strlen(path) + 1;
newProgramArgs.buf[0]++;
2018-05-15 10:30:34 -07:00
}
2018-05-16 16:26:38 -07:00
while(args[argNum] != NULL){
strcpy(newProgramArgs.dst, args[argNum]);
newProgramArgs.dst += strlen(args[argNum]) + 1;
newProgramArgs.buf[0]++;
argNum++;
2018-05-15 10:30:34 -07:00
}
inited = loader_Rosalina.init();
2018-05-15 10:30:34 -07:00
launch_3dsx = loader_Rosalina.launchFile;
2018-05-15 10:30:34 -07:00
if(!inited){
inited = loader_Ninjhax2.init();
launch_3dsx = loader_Ninjhax2.launchFile;
}
if(!inited){
inited = loader_Ninjhax1.init();
launch_3dsx = loader_Ninjhax1.launchFile;
}
if(inited){
2018-05-15 10:30:34 -07:00
osSetSpeedupEnable(false);
launch_3dsx(path, &newProgramArgs, NULL);
exit(0);
}
//should never be reached
2018-05-15 10:30:34 -07:00
errno = ENOTSUP;
return -1;
}
2018-05-16 16:28:32 -07:00
int exec_3dsx(const char* path, const char** args){
2018-05-15 10:30:34 -07:00
return exec_3dsx_actual(path, args, true/*appendPath*/);
}
2018-05-16 16:28:32 -07:00
int exec_3dsx_no_path_in_args(const char* path, const char** args){
2018-05-15 10:30:34 -07:00
return exec_3dsx_actual(path, args, false/*appendPath*/);
}