X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Fsyscalls.c;h=26f6c44c88737b86543cb727c0014500f81b3c40;hb=a01b96ccf4ec884e5b894d08a819a37ea3f5f749;hp=c8348f5b55096c67cfff07f3d4b506f0c0cff708;hpb=a4d8188f730bcc25cd4a6f4799ac7d65eb707cf2;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/syscalls.c b/AcessNative/ld-acess_src/syscalls.c index c8348f5b..26f6c44c 100644 --- a/AcessNative/ld-acess_src/syscalls.c +++ b/AcessNative/ld-acess_src/syscalls.c @@ -8,9 +8,15 @@ #include #include #include +#include +#include // posix_spawn #include "request.h" +#if SYSCALL_TRACE #define DEBUG(str, x...) Debug(str, x) +#else +#define DEBUG(...) do{}while(0) +#endif #define MAX_FPS 16 @@ -107,7 +113,7 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const break; // Data (special handling) case 'd': - len = va_arg(*Args, int); + len = va_arg(*Args, size_t); str = va_arg(*Args, char*); // Save the pointer for later @@ -115,7 +121,7 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const // Create parameter block Dest->Type = ARG_TYPE_DATA; - Dest->Length = len; + Dest->Length = str ? len : 0; Dest->Flags = 0; if( direction & 2 ) Dest->Flags |= ARG_FLAG_RETURN; @@ -123,7 +129,7 @@ const char *ReadEntry(tRequestValue *Dest, void *DataDest, void **PtrDest, const // Has data? if( direction & 1 ) { - if( DataDest ) + if( DataDest && str ) memcpy(DataDest, str, len); } else @@ -205,6 +211,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) req->ClientID = 0; //< Filled later req->CallID = SyscallID; req->NParams = paramCount; + req->MessageLength = dataLength; dataPtr = &req->Params[paramCount]; // Fill `output` and `input` @@ -252,6 +259,11 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) } // Write changes to buffers + if( req->NParams - 1 != retCount ) { + fprintf(stderr, "syscalls.c: Return count inbalance (%i - 1 != exp %i) [Call %i]\n", + req->NParams, retCount, SyscallID); + exit(127); + } retCount = 0; for( i = 1; i < req->NParams; i ++ ) { @@ -269,7 +281,7 @@ uint64_t _Syscall(int SyscallID, const char *ArgTypes, ...) free( req ); free( retPtrs ); - DEBUG(": %llx", retValue); + DEBUG(": %i 0x%llx", SyscallID, retValue); return retValue; } @@ -316,3 +328,20 @@ uint64_t native_tell(int FD) { return ftell( gaSyscall_LocalFPs[FD] ); } + +int native_execve(const char *filename, const char *const argv[], const char *const envp[]) +{ + int ret; + ret = execve(filename, (void*)argv, (void*)envp); + perror("native_execve"); + return ret; +} + +int native_spawn(const char *filename, const char *const argv[], const char *const envp[]) +{ + int rv; + + rv = posix_spawn(NULL, filename, NULL, NULL, (void*)argv, (void*)envp); + + return rv; +}