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

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