X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fexports.c;h=07662a5bd36d27a50b84cdc0d401ac30d9ca4b10;hb=590ae24e57553f79a92d6ef52c0468c07aa5de22;hp=cd1924b2502eed00f81bc02256f166d12079e78d;hpb=57e4db716b3e7db0be336abd9f256962e3b19aa3;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/exports.c b/AcessNative/ld-acess_src/exports.c index cd1924b2..07662a5b 100644 --- a/AcessNative/ld-acess_src/exports.c +++ b/AcessNative/ld-acess_src/exports.c @@ -11,12 +11,11 @@ #include #include -#define DEBUG(v...) Debug(v) +#define DEBUG(v...) do{}while(0)//Debug(v) #define PAGE_SIZE 4096 typedef struct sFILE FILE; -extern FILE *stderr; extern void exit(int) __attribute__ ((noreturn)); extern int printf(const char *, ...); extern int fprintf(FILE *,const char *, ...); @@ -29,6 +28,7 @@ extern int giSyscall_ClientID; // Needed for execve extern void _InitSyscalls(void); extern void _CloseSyscalls(void); +extern void Warning(const char *Format, ...); extern void Debug(const char *Format, ...); extern int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount); @@ -37,6 +37,7 @@ extern int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount); // === GLOBALS === int acess__errno; +char *gsExecutablePath = "./ld-acess"; // === CODE === // --- VFS Calls @@ -176,6 +177,10 @@ uint64_t acess__SysAllocate(uint vaddr) // --- Process Management --- int acess_clone(int flags, void *stack) { + #ifdef __WIN32__ + Warning("Win32 does not support anything like fork(2), cannot emulate"); + exit(-1); + #else extern int fork(void); if(flags & CLONE_VM) { int ret, newID, kernel_tid=0; @@ -200,12 +205,13 @@ int acess_clone(int flags, void *stack) } else { - fprintf(stderr, "ERROR: Threads currently unsupported\n"); + Warning("ERROR: Threads currently unsupported\n"); exit(-1); } + #endif } -int acess_execve(char *path, char **argv, char **envp) +int acess_execve(char *path, char **argv, const char **envp) { int i, argc; @@ -215,7 +221,7 @@ int acess_execve(char *path, char **argv, char **envp) for( argc = 0; argv[argc]; argc ++ ) ; DEBUG(" acess_execve: argc = %i", argc); - char *new_argv[7+argc+1]; + const char *new_argv[7+argc+1]; char client_id_str[11]; char socket_fd_str[11]; sprintf(client_id_str, "%i", giSyscall_ClientID); @@ -248,6 +254,40 @@ int acess_execve(char *path, char **argv, char **envp) return native_execve("./ld-acess", new_argv, envp); } +int acess__SysSpawn(const char *binary, const char **argv, const char **envp, int nfd, int fds[], struct s_sys_spawninfo *info) +{ + int argc = 0; + while( argv[argc++] ); + + Debug("_SysSpawn('%s', %p (%i), %p, %i, %p, %p)", + binary, argv, argc, envp, nfd, fds, info); + + int kernel_tid; + int newID; + newID = _Syscall(SYS_AN_SPAWN, "d >d", sizeof(int), &kernel_tid, + nfd*sizeof(int), fds, + info ? sizeof(*info) : 0, info); + + const char *new_argv[5+argc+1]; + int new_argc = 0, i; + char client_id_str[11]; + sprintf(client_id_str, "%i", newID); + new_argv[new_argc++] = gsExecutablePath; // TODO: Get path to ld-acess executable + new_argv[new_argc++] = "--key"; + new_argv[new_argc++] = client_id_str; + new_argv[new_argc++] = "--binary"; + new_argv[new_argc++] = binary; + for( i = 0; argv[i]; i ++) + new_argv[new_argc++] = argv[i]; + new_argv[new_argc++] = NULL; + + // TODO: Debug output? + + native_spawn(gsExecutablePath, new_argv, envp); + + return kernel_tid; +} + void acess_sleep(void) { DEBUG("%s()", __func__); @@ -334,12 +374,15 @@ const tSym caBuiltinSymbols[] = { DEFSYM(clone), DEFSYM(execve), + DEFSYM(_SysSpawn), DEFSYM(sleep), DEFSYM(waittid), + DEFSYM(gettid), DEFSYM(setuid), DEFSYM(setgid), - DEFSYM(gettid), + DEFSYM(getuid), + DEFSYM(getgid), DEFSYM(SysSendMessage), DEFSYM(SysGetMessage),