X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Fld-acess_src%2Frequest.c;h=b8a3239bb04c4f780841537577aa50d086c31ccc;hb=4cbfb47ebf71128b57cf25a131550b3f66a295a3;hp=1fff68e8091a420d41d58afe778c2cb1f551ac07;hpb=8cdfaebb825cb8d0f78dbf1b4f29fd0bff796045;p=tpg%2Facess2.git diff --git a/AcessNative/ld-acess_src/request.c b/AcessNative/ld-acess_src/request.c index 1fff68e8..b8a3239b 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 @@ -79,7 +89,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); @@ -89,6 +100,7 @@ int _InitSyscalls() #endif exit(0); } + giSyscall_ClientID = gSocket; // A bit of a hack really :( #endif #if 0 @@ -108,17 +120,21 @@ int _InitSyscalls() #if !USE_TCP // Ask server for a client ID + if( !giSyscall_ClientID ) { tRequestHeader req; int len; req.ClientID = 0; req.CallID = 0; req.NParams = 0; - req.NReturn = 0; SendData(&req, sizeof(req)); len = ReadData(&req, sizeof(req), 5); + if( len == 0 ) { + fprintf(stderr, "Unable to connect to server (localhost:%i)\n", SERVER_PORT); + exit(-1); + } giSyscall_ClientID = req.ClientID; } @@ -127,106 +143,61 @@ int _InitSyscalls() return 0; } -int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, tInValue **Input) +int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize) { - tRequestHeader *request; - tRequestValue *value; - char *data; - int requestLen; - int i; - if( gSocket == INVALID_SOCKET ) { _InitSyscalls(); } - // See ../syscalls.h for details of request format - requestLen = sizeof(tRequestHeader) + (NumOutput + NumInput) * sizeof(tRequestValue); - - // Get total param length - for( i = 0; i < NumOutput; i ++ ) - requestLen += Output[i]->Length; - - // Allocate request - request = malloc( requestLen ); - value = request->Params; - data = (char*)&request->Params[ NumOutput + NumInput ]; - // Set header - request->ClientID = giSyscall_ClientID; - request->CallID = RequestID; // Syscall - request->NParams = NumOutput; - request->NReturn = NumInput; - - // Set parameters - for( i = 0; i < NumOutput; i ++ ) - { - switch(Output[i]->Type) - { - case 'i': value->Type = ARG_TYPE_INT32; break; - case 'I': value->Type = ARG_TYPE_INT64; break; - case 'd': value->Type = ARG_TYPE_DATA; break; - case 's': value->Type = ARG_TYPE_DATA; break; - default: - fprintf(stderr, __FILE__" SendRequest: Unknown output type '%c'\n", - Output[i]->Type); - return -1; - } - value->Length = Output[i]->Length; - - memcpy(data, Output[i]->Data, Output[i]->Length); - - value ++; - data += Output[i]->Length; - } + Request->ClientID = giSyscall_ClientID; - // Set return values - for( i = 0; i < NumInput; i ++ ) - { - switch(Input[i]->Type) - { - case 'i': value->Type = ARG_TYPE_INT32; break; - case 'I': value->Type = ARG_TYPE_INT64; break; - case 'd': value->Type = ARG_TYPE_DATA; break; - default: - fprintf(stderr, " SendRequest: Unknown input type '%c'\n", - Input[i]->Type); - return -1; - } - value->Length = Input[i]->Length; - value ++; - } #if 0 - printf("value = %p\n", value); { - for(i=0;iParams[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, requestLen); + SendData(Request, RequestSize); // Wait for a response (no timeout) - requestLen = ReadData(request, requestLen, -1); - - // Parse response out - if( request->NParams != NumInput ) { - fprintf(stderr, "SendRequest: Unexpected number of values retured (%i, exp %i)\n", - request->NParams, NumInput - ); - free( request ); - return -1; - } - - // Free memory - free( request ); - - return 0; + return ReadData(Request, ResponseSize, 0); } void SendData(void *Data, int Length) @@ -241,6 +212,7 @@ void SendData(void *Data, int Length) #endif if( len != Length ) { + fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID); perror("SendData"); exit(-1); } @@ -251,21 +223,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 } @@ -276,9 +256,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; }