X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Frequest.c;h=690c7f7ff35221542b3a1b8e5c4064d8adc9b6ce;hb=feb0895318d823867b858ec841589ca3ab81f510;hp=7d80a45bd0064edb93f52509decbc25ad5d2eb70;hpb=b0e7f44c01b9779093fd8ba65f69cb29a9308841;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index 7d80a45b..690c7f7f 100644 --- a/AcessNative/ld-acess_src/request.c +++ b/AcessNative/ld-acess_src/request.c @@ -1,8 +1,12 @@ /* + * AcessNative ld-acess dynamic linker + * - By John Hodge (thePowersGang) + * + * request.c + * - IPC interface */ #define DEBUG 0 - #if DEBUG # define DEBUG_S printf #else @@ -13,6 +17,7 @@ #include #include #include +#include #ifdef __WIN32__ # include # include @@ -20,11 +25,12 @@ # include # include # include +# include #endif #include "request.h" #include "../syscalls.h" -#define USE_TCP 0 +#define USE_TCP 1 // === PROTOTYPES === void SendData(void *Data, int Length); @@ -44,9 +50,17 @@ SOCKET gSocket = INVALID_SOCKET; struct sockaddr_in gSyscall_ServerAddr; // === CODE === -int _InitSyscalls() +void Request_Preinit(void) +{ + // Set server address + memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in)); + gSyscall_ServerAddr.sin_family = AF_INET; + gSyscall_ServerAddr.sin_port = htons(SERVER_PORT); + gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001); +} + +int _InitSyscalls(void) { - #ifdef __WIN32__ /* Open windows connection */ if (WSAStartup(0x0101, &gWinsock) != 0) @@ -72,27 +86,13 @@ int _InitSyscalls() exit(0); } - // Set server address - memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in)); - gSyscall_ServerAddr.sin_family = AF_INET; - gSyscall_ServerAddr.sin_port = htons(SERVER_PORT); - gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001); - - #if 0 - // Set client address - memset((void *)&client, '\0', sizeof(struct sockaddr_in)); - client.sin_family = AF_INET; - client.sin_port = htons(0); - client.sin_addr.s_addr = htonl(0x7F000001); - #endif - #if USE_TCP if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 ) { fprintf(stderr, "[ERROR -] Cannot connect to server (localhost:%i)\n", SERVER_PORT); - fprintf(stderr, "[ERROR -] ", giSyscall_ClientID); perror("_InitSyscalls"); #if __WIN32__ + fprintf(stderr, "[ERROR -] - WSAGetLastError said %i", WSAGetLastError()); closesocket(gSocket); WSACleanup(); #else @@ -100,10 +100,14 @@ int _InitSyscalls() #endif exit(0); } - giSyscall_ClientID = gSocket; // A bit of a hack really :( #endif #if 0 + // Set client address + memset((void *)&client, '\0', sizeof(struct sockaddr_in)); + client.sin_family = AF_INET; + client.sin_port = htons(0); + client.sin_addr.s_addr = htonl(0x7F000001); // Bind if( bind(gSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1 ) { @@ -118,7 +122,20 @@ int _InitSyscalls() } #endif - #if !USE_TCP + #if USE_TCP + { + tRequestAuthHdr auth; + auth.pid = giSyscall_ClientID; + auth.key = 0; + SendData(&auth, sizeof(auth)); + int len = ReadData(&auth, sizeof(auth), 5); + if( len == 0 ) { + fprintf(stderr, "Timeout waiting for auth response\n"); + exit(-1); + } + giSyscall_ClientID = auth.pid; + } + #else // Ask server for a client ID if( !giSyscall_ClientID ) { @@ -143,6 +160,20 @@ int _InitSyscalls() return 0; } +/** + * \brief Close the syscall socket + * \note Used in acess_fork to get a different port number + */ +void _CloseSyscalls(void) +{ + #if __WIN32__ + closesocket(gSocket); + WSACleanup(); + #else + close(gSocket); + #endif +} + int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) { if( gSocket == INVALID_SOCKET ) @@ -163,6 +194,7 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) printf("\n"); } #endif + #if DEBUG { int i; char *data = (char*)&Request->Params[Request->NParams]; @@ -176,7 +208,7 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) data += sizeof(uint32_t); break; case ARG_TYPE_INT64: - DEBUG_S(" 0x%016llx", *(uint64_t*)data); + DEBUG_S(" 0x%016"PRIx64"", *(uint64_t*)data); data += sizeof(uint64_t); break; case ARG_TYPE_STRING: @@ -192,14 +224,63 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) } DEBUG_S("\n"); } + #endif // Send it off SendData(Request, RequestSize); - if( Request->CallID == SYS_EXIT ) return 0; - // Wait for a response (no timeout) - return ReadData(Request, ResponseSize, 0); + ReadData(Request, sizeof(*Request), 0); + + size_t recvbytes = sizeof(*Request); + // TODO: Sanity + size_t expbytes = Request->MessageLength; + char *ptr = (void*)Request->Params; + while( recvbytes < expbytes ) + { + size_t len = ReadData(ptr, expbytes - recvbytes, 1000); + if( len == -1 ) { + return -1; + } + recvbytes += len; + ptr += len; + } + if( recvbytes > expbytes ) { + // TODO: Warning + } + + #if DEBUG + { + int i; + char *data = (char*)&Request->Params[Request->NParams]; + DEBUG_S(" Reply:"); + for( i = 0; i < Request->NParams; i ++ ) + { + switch(Request->Params[i].Type) + { + case ARG_TYPE_INT32: + DEBUG_S(" 0x%08x", *(uint32_t*)data); + data += sizeof(uint32_t); + break; + case ARG_TYPE_INT64: + DEBUG_S(" 0x%016"PRIx64"", *(uint64_t*)data); + data += sizeof(uint64_t); + break; + case ARG_TYPE_STRING: + DEBUG_S(" '%s'", (char*)data); + data += Request->Params[i].Length; + break; + case ARG_TYPE_DATA: + DEBUG_S(" %p:0x%x", (char*)data, Request->Params[i].Length); + if( !(Request->Params[i].Flags & ARG_FLAG_ZEROED) ) + data += Request->Params[i].Length; + break; + } + } + DEBUG_S("\n"); + } + #endif + return recvbytes; } void SendData(void *Data, int Length) @@ -207,7 +288,7 @@ void SendData(void *Data, int Length) int len; #if USE_TCP - len = send(Data, Length, 0); + len = send(gSocket, Data, Length, 0); #else len = sendto(gSocket, Data, Length, 0, (struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr)); @@ -248,7 +329,7 @@ int ReadData(void *Dest, int MaxLength, int Timeout) if( !ret ) { printf("[ERROR %i] Timeout reading from socket\n", giSyscall_ClientID); - return 0; // Timeout + return -2; // Timeout } #if USE_TCP @@ -262,6 +343,15 @@ int ReadData(void *Dest, int MaxLength, int Timeout) perror("ReadData"); exit(-1); } + if( ret == 0 ) { + fprintf(stderr, "[ERROR %i] Connection closed.\n", giSyscall_ClientID); + #if __WIN32__ + closesocket(gSocket); + #else + close(gSocket); + #endif + exit(0); + } DEBUG_S("%i bytes read from socket\n", ret);