X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fmain.c;h=598055f426687940a3f8d9d2d0affa21c9879807;hb=a173ab5b104f596bfe2f4df85de541c2c4583ba7;hp=b2a8660e909a0a13175f6248d68e035d5d9f26b3;hpb=02cbaac1233be9c5228973a787431fa5e0aa178e;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/main.c b/AcessNative/ld-acess_src/main.c index b2a8660e..598055f4 100644 --- a/AcessNative/ld-acess_src/main.c +++ b/AcessNative/ld-acess_src/main.c @@ -4,6 +4,13 @@ #include #include #include +#include + +// === IMPORTS === +extern int giSyscall_ClientID; + +// === PROTOTYPES === +void CallUser(void *Entry, int argc, char *argv[], char **envp) __attribute__((noreturn)); // === CODE === int main(int argc, char *argv[], char **envp) @@ -11,50 +18,94 @@ int main(int argc, char *argv[], char **envp) int i; int appArgc; char **appArgv; - char *appPath; + char *appPath = NULL; int (*appMain)(int, char *[], char **); void *base; +// int syscall_handle = -1; + for( i = 1; i < argc; i ++ ) { + if(strcmp(argv[i], "--key") == 0) { + giSyscall_ClientID = atoi(argv[++i]); + continue ; + } + + if(strcmp(argv[i], "--binary") == 0) { + appPath = argv[++i]; + continue ; + } + + if(strcmp(argv[i], "--open") == 0) { + if( acess_open(argv[++i], 6) == -1 ) { // Read/Write + fprintf(stderr, "Unable to open '%s'\n", argv[i]); + exit(1); + } + continue ; + } + if( argv[i][0] != '-' ) break; } if( i >= argc ) { - fprintf(stderr, "Usage: ld-acess [arguments ...]\n"); + fprintf(stderr, + "Usage: ld-acess [arguments ...]\n" + "\n" + "--key\t(internal) used to pass the system call handle when run with execve\n" + "--binary\tLoad a local binary directly\n" + "--open\tOpen a file before executing\n" + ); return 1; } - appPath = argv[i]; + if( !appPath ) + appPath = argv[i]; appArgc = argc - i; appArgv = &argv[i]; - printf("Exectutable Path: '%s'\n", appPath); - printf("Executable argc = %i\n", appArgc); +// printf("Exectutable Path: '%s'\n", appPath); +// printf("Executable argc = %i\n", appArgc); base = Binary_Load(appPath, (uintptr_t*)&appMain); - printf("base = %p\n", base); + printf("[DEBUG %i] base = %p\n", giSyscall_ClientID, base); if( !base ) return 127; printf("==============================\n"); + printf("[DEBUG %i] %i %p ", giSyscall_ClientID, appArgc, appArgv); for(i = 0; i < appArgc; i ++) printf("\"%s\" ", appArgv[i]); printf("\n"); + printf("[DEBUG %i] appMain = %p\n", giSyscall_ClientID, appMain); + #if 0 __asm__ __volatile__ ( "push %0;\n\t" "push %1;\n\t" "push %2;\n\t" "jmp *%3;\n\t" : : "r" (envp), "r" (appArgv), "r" (appArgc), "r" (appMain) ); - //return appMain(appArgc, appArgv, envp); return -1; + #elif 1 + CallUser(appMain, appArgc, appArgv, envp); + #else + return appMain(appArgc, appArgv, NULL); + #endif +} + +void CallUser(void *Entry, int argc, char *argv[], char **envp) +{ + __asm__ __volatile__ ( + "mov %1, %%esp;\n\t" + "jmp *%0" + : : "r" (Entry), "r" (&argc) + ); + for(;;); } void Warning(const char *Format, ...) { va_list args; - printf("Warning: "); + printf("[WARN %i] ", giSyscall_ClientID); va_start(args, Format); vprintf(Format, args); va_end(args); @@ -64,7 +115,17 @@ void Warning(const char *Format, ...) void Notice(const char *Format, ...) { va_list args; - printf("Notice: "); + printf("[NOTICE %i] ", giSyscall_ClientID); + va_start(args, Format); + vprintf(Format, args); + va_end(args); + printf("\n"); +} + +void Debug(const char *Format, ...) +{ + va_list args; + printf("[DEBUG %i] ", giSyscall_ClientID); va_start(args, Format); vprintf(Format, args); va_end(args);