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

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