mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
Implemented arg parsing for NRO env. When args aren't available, set __system_argv to {ptr to NULL} instead of NULL.
This commit is contained in:
parent
a1462c8b0b
commit
20cd940095
@ -13,6 +13,8 @@ extern char* fake_heap_end;
|
|||||||
|
|
||||||
extern u32 __argdata__;
|
extern u32 __argdata__;
|
||||||
|
|
||||||
|
static char* g_argv_empty = NULL;
|
||||||
|
|
||||||
void argvSetup(void)
|
void argvSetup(void)
|
||||||
{
|
{
|
||||||
Result rc=0;
|
Result rc=0;
|
||||||
@ -21,22 +23,20 @@ void argvSetup(void)
|
|||||||
|
|
||||||
u8 *argdata = (u8*)&__argdata__;
|
u8 *argdata = (u8*)&__argdata__;
|
||||||
u32 *arg32 = (u32*)argdata;
|
u32 *arg32 = (u32*)argdata;
|
||||||
u64 argdata_allocsize;
|
u64 argdata_allocsize=0;
|
||||||
u64 argdata_strsize;
|
u64 argdata_strsize=0;
|
||||||
u32 argvptr_pos;
|
u32 argvptr_pos=0;
|
||||||
u32 max_argv;
|
u32 max_argv;
|
||||||
u32 argi;
|
u32 argi;
|
||||||
u32 arglen=0;
|
u32 arglen=0;
|
||||||
bool quote_flag=0;
|
bool quote_flag=0;
|
||||||
bool end_flag=0;
|
bool end_flag=0;
|
||||||
char *args;
|
char *args = NULL;
|
||||||
char *argstart;
|
char *argstart;
|
||||||
char *argstorage;
|
char *argstorage;
|
||||||
|
|
||||||
__system_argc = 0;
|
__system_argc = 0;
|
||||||
__system_argv = NULL;
|
__system_argv = &g_argv_empty;
|
||||||
|
|
||||||
// TODO: Use envHasArgv()/envGetArgv() here for the NRO case.
|
|
||||||
|
|
||||||
if (envIsNso()) {
|
if (envIsNso()) {
|
||||||
memset(&meminfo, 0, sizeof(meminfo));
|
memset(&meminfo, 0, sizeof(meminfo));
|
||||||
@ -57,67 +57,84 @@ void argvSetup(void)
|
|||||||
|
|
||||||
argvptr_pos = 0x20 + argdata_strsize+1;
|
argvptr_pos = 0x20 + argdata_strsize+1;
|
||||||
if (argvptr_pos >= argdata_allocsize) return;
|
if (argvptr_pos >= argdata_allocsize) return;
|
||||||
argstorage = (char*)&argdata[argvptr_pos];
|
|
||||||
|
|
||||||
argvptr_pos += (argdata_strsize+1 + 0x9) & ~0x7;
|
|
||||||
if (argvptr_pos >= argdata_allocsize) return;
|
|
||||||
|
|
||||||
max_argv = (argdata_allocsize - argvptr_pos) >> 3;
|
|
||||||
if (max_argv < 2) return;
|
|
||||||
|
|
||||||
__system_argv = (char**)&argdata[argvptr_pos];
|
|
||||||
|
|
||||||
argstart = NULL;
|
|
||||||
|
|
||||||
for(argi=0; argi<argdata_strsize; argi++) {
|
|
||||||
if (argstart == NULL && isspace(args[argi])) continue;
|
|
||||||
|
|
||||||
if (argstart == NULL) {
|
|
||||||
if (args[argi] == '"') {
|
|
||||||
argstart = &args[argi+1];
|
|
||||||
quote_flag = 1;
|
|
||||||
}
|
|
||||||
else if(args[argi]!=0) {
|
|
||||||
argstart = &args[argi];
|
|
||||||
arglen++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
end_flag = 0;
|
|
||||||
|
|
||||||
if (quote_flag && args[argi] == '"') {
|
|
||||||
end_flag = 1;
|
|
||||||
}
|
|
||||||
else if (isspace(args[argi])) {
|
|
||||||
end_flag = 1;
|
|
||||||
}
|
|
||||||
else if(args[argi]!=0) {
|
|
||||||
arglen++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((args[argi]==0 || end_flag) && arglen) {
|
|
||||||
strncpy(argstorage, argstart, arglen);
|
|
||||||
argstorage[arglen] = 0;
|
|
||||||
__system_argv[__system_argc] = argstorage;
|
|
||||||
__system_argc++;
|
|
||||||
argstart = NULL;
|
|
||||||
quote_flag = 0;
|
|
||||||
argstorage+= arglen+1;
|
|
||||||
arglen = 0;
|
|
||||||
|
|
||||||
if (__system_argc >= max_argv) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arglen && __system_argc < max_argv) {
|
|
||||||
strncpy(argstorage, argstart, arglen);
|
|
||||||
argstorage[arglen] = 0;
|
|
||||||
__system_argv[__system_argc] = argstorage;
|
|
||||||
__system_argc++;
|
|
||||||
}
|
|
||||||
|
|
||||||
__system_argv[__system_argc] = NULL;
|
|
||||||
}
|
}
|
||||||
|
else if (envHasArgv()) {
|
||||||
|
args = envGetArgv();
|
||||||
|
argdata_allocsize = 0x9000;//Use the same size as NSO.
|
||||||
|
argdata_strsize = strlen(args);
|
||||||
|
argdata = (u8*)fake_heap_start;
|
||||||
|
|
||||||
|
if (argdata_strsize==0) return;
|
||||||
|
|
||||||
|
if (fake_heap_end - fake_heap_start < argdata_allocsize) return;
|
||||||
|
|
||||||
|
fake_heap_start += argdata_allocsize;
|
||||||
|
|
||||||
|
argvptr_pos = 0;
|
||||||
|
|
||||||
|
memset(argdata, 0, argdata_allocsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
argstorage = (char*)&argdata[argvptr_pos];
|
||||||
|
|
||||||
|
argvptr_pos += (argdata_strsize+1 + 0x9) & ~0x7;
|
||||||
|
if (argvptr_pos >= argdata_allocsize) return;
|
||||||
|
|
||||||
|
max_argv = (argdata_allocsize - argvptr_pos) >> 3;
|
||||||
|
if (max_argv < 2) return;
|
||||||
|
|
||||||
|
__system_argv = (char**)&argdata[argvptr_pos];
|
||||||
|
|
||||||
|
argstart = NULL;
|
||||||
|
|
||||||
|
for(argi=0; argi<argdata_strsize; argi++) {
|
||||||
|
if (argstart == NULL && isspace(args[argi])) continue;
|
||||||
|
|
||||||
|
if (argstart == NULL) {
|
||||||
|
if (args[argi] == '"') {
|
||||||
|
argstart = &args[argi+1];
|
||||||
|
quote_flag = 1;
|
||||||
|
}
|
||||||
|
else if(args[argi]!=0) {
|
||||||
|
argstart = &args[argi];
|
||||||
|
arglen++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
end_flag = 0;
|
||||||
|
|
||||||
|
if (quote_flag && args[argi] == '"') {
|
||||||
|
end_flag = 1;
|
||||||
|
}
|
||||||
|
else if (isspace(args[argi])) {
|
||||||
|
end_flag = 1;
|
||||||
|
}
|
||||||
|
else if(args[argi]!=0) {
|
||||||
|
arglen++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((args[argi]==0 || end_flag) && arglen) {
|
||||||
|
strncpy(argstorage, argstart, arglen);
|
||||||
|
argstorage[arglen] = 0;
|
||||||
|
__system_argv[__system_argc] = argstorage;
|
||||||
|
__system_argc++;
|
||||||
|
argstart = NULL;
|
||||||
|
quote_flag = 0;
|
||||||
|
argstorage+= arglen+1;
|
||||||
|
arglen = 0;
|
||||||
|
|
||||||
|
if (__system_argc >= max_argv) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arglen && __system_argc < max_argv) {
|
||||||
|
strncpy(argstorage, argstart, arglen);
|
||||||
|
argstorage[arglen] = 0;
|
||||||
|
__system_argv[__system_argc] = argstorage;
|
||||||
|
__system_argc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
__system_argv[__system_argc] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user