b5f066f70809e5bc4868aec4c2affc7413b8e7bc
[tpg/acess2.git] / AcessNative / libacess-native.so_src / main.c
1 /*
2  */
3 #include <stdarg.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdbool.h>
9 #include "common.h"
10 #include <stdint.h>
11 #include "../ld-acess_src/exports.h"
12
13 extern int      gbSyscallDebugEnabled;
14
15 #ifdef __WINDOWS__
16 int DllMain(void)
17 {
18         fprintf(stderr, "TODO: Windows libacessnative setup\n");
19         return 0;
20 }
21
22 #endif
23
24 #ifdef __linux__
25 int __attribute__ ((constructor(102))) libacessnative_init(int argc, char *argv[], char **envp);
26
27 const char *getenv_p(char **envp, const char *name)
28 {
29         size_t  namelen = strlen(name);
30         for(; *envp; envp ++)
31         {
32                 if( strncmp(*envp, name, namelen) != 0 )
33                         continue ;
34                 if( (*envp)[namelen] != '=' )
35                         continue ;
36                 return (*envp)+namelen+1;
37         }
38         return 0;
39 }
40
41 int libacessnative_init(int argc, char *argv[], char **envp)
42 {
43         Request_Preinit();
44         
45         //gbSyscallDebugEnabled = 1;
46         
47         const char *preopens = getenv_p(envp, ENV_VAR_PREOPENS);
48         printf("preopens = %s\n", preopens);
49         if( preopens )
50         {
51                  int    exp_fd = 0;
52                 while( *preopens )
53                 {
54                         const char *splitter = strchr(preopens, ':');
55                         size_t  len;
56                         if( !splitter ) {
57                                 len = strlen(preopens);
58                         }
59                         else {
60                                 len = splitter - preopens;
61                         }
62                         char path[len+1];
63                         memcpy(path, preopens, len);
64                         path[len] = 0;
65                         int fd = acess__SysOpen(path, 6);       // WRITE,READ,no EXEC
66                         if( fd == -1 ) {
67                                 fprintf(stderr, "Unable to preopen '%s' errno=%i\n", path, acess__errno);
68                                 exit(1);
69                         }
70                         if( fd != exp_fd ) {
71                                 //  Oh... this is bad
72                                 fprintf(stderr, "Pre-opening '%s' resulted in an incorrect FD (expected %i, got %i)",
73                                         path, exp_fd, fd);
74                                 exit(1);
75                         }
76                         exp_fd += 1;
77                         
78                         if( !splitter )
79                                 break;
80                         preopens = splitter + 1;
81                 }
82         }
83
84 //      if( !getenv(ENV_VAR_KEY)
85         
86         return 0;
87 }
88 #endif
89
90 int acessnative_spawn(const char *Binary, int SyscallID, const char * const * argv, const char * const * envp)
91 {
92          int    envc = 0;
93         while( envp && envp[envc++] )
94                 envc ++;
95
96         // Set environment variables for libacess-native
97         // > ACESSNATIVE_KEY=`newID`
98         size_t keystr_len = snprintf(NULL, 0, "%s=%i", ENV_VAR_KEY, SyscallID);
99         char keystr[keystr_len+1];
100         snprintf(keystr, keystr_len+1, "%s=%i", ENV_VAR_KEY, SyscallID);
101         bool    bKeyHit = false;
102         
103         const char *newenv[envc+2+1];
104          int    i = 0;
105         for( ; envp && envp[i]; i ++ )
106         {
107                 const char      *ev = envp[i];
108                 if( strncmp(ev, ENV_VAR_KEY"=", sizeof(ENV_VAR_KEY"=")) == 0 ) {
109                         ev = keystr;
110                         bKeyHit = true;
111                 }
112                 newenv[i] = ev;
113         }
114         if( !bKeyHit )
115                 newenv[i++] = keystr;
116         newenv[i++] = getenv("LD_LIBRARY_PATH") - (sizeof("LD_LIBRARY_PATH=")-1);       // VERY hacky
117         newenv[i] = NULL;
118         
119         // TODO: Detect native_spawn failing
120         return native_spawn(Binary, argv, newenv);
121 }
122
123 void Debug(const char *format, ...)
124 {
125         va_list args;
126         printf("Debug: ");
127         va_start(args, format);
128         vfprintf(stdout, format, args);
129         va_end(args);
130         printf("\n");
131 }
132
133 void Warning(const char *format, ...)
134 {
135         va_list args;
136         printf("Warning: ");
137         va_start(args, format);
138         vfprintf(stdout, format, args);
139         va_end(args);
140         printf("\n");
141 }
142

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