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

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