AcessNative - Fixing Fixing Fixing
[tpg/acess2.git] / AcessNative / ld-acess_src / main.c
index e310a84..8363ce6 100644 (file)
@@ -4,6 +4,10 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <string.h>
+
+// === PROTOTYPES ===
+void   CallUser(void *Entry, int argc, char *argv[], char **envp) __attribute__((noreturn));
 
 // === CODE ===
 int main(int argc, char *argv[], char **envp)
@@ -11,21 +15,48 @@ 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) {
+                       syscall_handle = 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 <executable> [arguments ...]\n");
+               fprintf(stderr,
+                       "Usage: ld-acess <executable> [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];
@@ -37,14 +68,35 @@ int main(int argc, char *argv[], char **envp)
        printf("base = %p\n", base);
        if( !base )     return 127;
        
+       printf("==============================\n");
+       printf("%i %p ", appArgc, appArgv);
+       for(i = 0; i < appArgc; i ++)
+               printf("\"%s\" ", appArgv[i]);
+       printf("\n");
+       printf("appMain = %p\n", 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, ...)

UCC git Repository :: git.ucc.asn.au