X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Frequest.c;h=690c7f7ff35221542b3a1b8e5c4064d8adc9b6ce;hb=feb0895318d823867b858ec841589ca3ab81f510;hp=5bcf8cd302c65b9e9e73fcc9f5c3ef3aed350540;hpb=9b61291b136d9fdc196ddab582cdb6cff8b70b09;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index 5bcf8cd3..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 @@ -21,6 +25,7 @@ # include # include # include +# include #endif #include "request.h" #include "../syscalls.h" @@ -51,6 +56,7 @@ void Request_Preinit(void) 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) @@ -80,20 +86,13 @@ int _InitSyscalls(void) exit(0); } - #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); perror("_InitSyscalls"); #if __WIN32__ + fprintf(stderr, "[ERROR -] - WSAGetLastError said %i", WSAGetLastError()); closesocket(gSocket); WSACleanup(); #else @@ -104,6 +103,11 @@ int _InitSyscalls(void) #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 ) { @@ -225,12 +229,12 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) // Send it off SendData(Request, RequestSize); - if( Request->CallID == SYS_EXIT ) return 0; - // Wait for a response (no timeout) ReadData(Request, sizeof(*Request), 0); + + size_t recvbytes = sizeof(*Request); // TODO: Sanity - size_t recvbytes = sizeof(*Request), expbytes = Request->MessageLength; + size_t expbytes = Request->MessageLength; char *ptr = (void*)Request->Params; while( recvbytes < expbytes ) { @@ -244,6 +248,38 @@ int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) 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; } @@ -309,7 +345,11 @@ int ReadData(void *Dest, int MaxLength, int Timeout) } if( ret == 0 ) { fprintf(stderr, "[ERROR %i] Connection closed.\n", giSyscall_ClientID); + #if __WIN32__ + closesocket(gSocket); + #else close(gSocket); + #endif exit(0); }