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

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