X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Frequest.c;h=2117591db8795443077c1aa7bde52577021dd902;hb=b3398bcfe17be9751d98a0dcd8ccd27bb1568039;hp=3bef3d3e65030f687ced30a7085dc4fec924b248;hpb=d599a063b3b453b705925c58180c93e1f9cb3d79;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index 3bef3d3e..2117591d 100644 --- a/AcessNative/ld-acess_src/request.c +++ b/AcessNative/ld-acess_src/request.c @@ -1,5 +1,15 @@ /* */ +#define DEBUG 0 + + +#if DEBUG +# define DEBUG_S printf +#else +# define DEBUG_S(...) +# define DONT_INCLUDE_SYSCALL_NAMES +#endif + #include #include #include @@ -34,9 +44,16 @@ 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); +} + +int _InitSyscalls(void) { - #ifdef __WIN32__ /* Open windows connection */ if (WSAStartup(0x0101, &gWinsock) != 0) @@ -62,12 +79,6 @@ 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)); @@ -79,7 +90,8 @@ int _InitSyscalls() #if USE_TCP if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 ) { - fprintf(stderr, "Cannot connect to server (localhost:%i)\n", SERVER_PORT); + fprintf(stderr, "[ERROR -] Cannot connect to server (localhost:%i)\n", SERVER_PORT); + fprintf(stderr, "[ERROR -] ", giSyscall_ClientID); perror("_InitSyscalls"); #if __WIN32__ closesocket(gSocket); @@ -108,6 +120,7 @@ int _InitSyscalls() #if !USE_TCP // Ask server for a client ID + if( !giSyscall_ClientID ) { tRequestHeader req; int len; @@ -130,7 +143,21 @@ int _InitSyscalls() return 0; } -int SendRequest(tRequestHeader *Request, int RequestSize) +/** + * \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 ) { @@ -150,12 +177,43 @@ int SendRequest(tRequestHeader *Request, int RequestSize) printf("\n"); } #endif + { + int i; + char *data = (char*)&Request->Params[Request->NParams]; + DEBUG_S("Request #%i (%s) -", Request->CallID, casSYSCALL_NAMES[Request->CallID]); + 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%016llx", *(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"); + } // Send it off SendData(Request, RequestSize); - + + if( Request->CallID == SYS_EXIT ) return 0; + // Wait for a response (no timeout) - return ReadData(Request, RequestSize, -1); + return ReadData(Request, ResponseSize, 0); } void SendData(void *Data, int Length) @@ -170,6 +228,7 @@ void SendData(void *Data, int Length) #endif if( len != Length ) { + fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID); perror("SendData"); exit(-1); } @@ -180,21 +239,29 @@ int ReadData(void *Dest, int MaxLength, int Timeout) int ret; fd_set fds; struct timeval tv; + struct timeval *timeoutPtr; FD_ZERO(&fds); FD_SET(gSocket, &fds); - tv.tv_sec = Timeout; - tv.tv_usec = 0; + if( Timeout ) { + tv.tv_sec = Timeout; + tv.tv_usec = 0; + timeoutPtr = &tv; + } + else { + timeoutPtr = NULL; + } - ret = select(1, &fds, NULL, NULL, &tv); + ret = select(gSocket+1, &fds, NULL, NULL, timeoutPtr); if( ret == -1 ) { + fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID); perror("ReadData - select"); exit(-1); } if( !ret ) { - printf("Timeout reading from socket\n"); + printf("[ERROR %i] Timeout reading from socket\n", giSyscall_ClientID); return 0; // Timeout } @@ -205,9 +272,12 @@ int ReadData(void *Dest, int MaxLength, int Timeout) #endif if( ret < 0 ) { + fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID); perror("ReadData"); exit(-1); } + DEBUG_S("%i bytes read from socket\n", ret); + return ret; }