AcessNative - Fixing Fixing Fixing
[tpg/acess2.git] / AcessNative / ld-acess_src / main.c
1 /*
2  */
3 #include "common.h"
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <stdarg.h>
7 #include <string.h>
8
9 // === PROTOTYPES ===
10 void    CallUser(void *Entry, int argc, char *argv[], char **envp) __attribute__((noreturn));
11
12 // === CODE ===
13 int main(int argc, char *argv[], char **envp)
14 {
15          int    i;
16          int    appArgc;
17         char    **appArgv;
18         char    *appPath = NULL;
19          int    (*appMain)(int, char *[], char **);
20         void    *base;
21         
22          int    syscall_handle = -1;
23         
24         for( i = 1; i < argc; i ++ )
25         {
26                 if(strcmp(argv[i], "--key") == 0) {
27                         syscall_handle = atoi(argv[++i]);
28                         continue ;
29                 }
30                 
31                 if(strcmp(argv[i], "--binary") == 0) {
32                         appPath = argv[++i];
33                         continue ;
34                 }
35                 
36                 if(strcmp(argv[i], "--open") == 0) {
37                         if( acess_open(argv[++i], 6) == -1 ) {  // Read/Write
38                                 fprintf(stderr, "Unable to open '%s'\n", argv[i]);
39                                 exit(1);
40                         }
41                         continue ;
42                 }
43                 
44                 if( argv[i][0] != '-' ) break;
45         }
46
47         if( i >= argc ) {
48                 fprintf(stderr,
49                         "Usage: ld-acess <executable> [arguments ...]\n"
50                         "\n"
51                         "--key\t(internal) used to pass the system call handle when run with execve\n"
52                         "--binary\tLoad a local binary directly\n"
53                         "--open\tOpen a file before executing\n"
54                         );
55                 return 1;
56         }
57         
58         if( !appPath )
59                 appPath = argv[i];
60
61         appArgc = argc - i;
62         appArgv = &argv[i];
63
64         printf("Exectutable Path: '%s'\n", appPath);
65         printf("Executable argc = %i\n", appArgc);
66
67         base = Binary_Load(appPath, (uintptr_t*)&appMain);
68         printf("base = %p\n", base);
69         if( !base )     return 127;
70         
71         printf("==============================\n");
72         printf("%i %p ", appArgc, appArgv);
73         for(i = 0; i < appArgc; i ++)
74                 printf("\"%s\" ", appArgv[i]);
75         printf("\n");
76         printf("appMain = %p\n", appMain);
77         #if 0
78         __asm__ __volatile__ (
79                 "push %0;\n\t"
80                 "push %1;\n\t"
81                 "push %2;\n\t"
82                 "jmp *%3;\n\t"
83                 : : "r" (envp), "r" (appArgv), "r" (appArgc), "r" (appMain) );
84         return -1;
85         #elif 1
86         CallUser(appMain, appArgc, appArgv, envp);
87         #else
88         return appMain(appArgc, appArgv, NULL);
89         #endif
90 }
91
92 void CallUser(void *Entry, int argc, char *argv[], char **envp)
93 {
94         __asm__ __volatile__ (
95                 "mov %1, %%esp;\n\t"
96                 "jmp *%0"
97                 : : "r" (Entry), "r" (&argc)
98                 );
99         for(;;);
100 }
101
102 void Warning(const char *Format, ...)
103 {
104         va_list args;
105         printf("Warning: ");
106         va_start(args, Format);
107         vprintf(Format, args);
108         va_end(args);
109         printf("\n");
110 }
111
112 void Notice(const char *Format, ...)
113 {
114         va_list args;
115         printf("Notice: ");
116         va_start(args, Format);
117         vprintf(Format, args);
118         va_end(args);
119         printf("\n");
120 }
121

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