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

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