AcessNative - Fixing errors caused by API changes
[tpg/acess2.git] / AcessNative / ld-acess_src / request.c
index 3bef3d3..7d80a45 100644 (file)
@@ -1,5 +1,15 @@
 /*
  */
+#define DEBUG  0
+
+
+#if DEBUG
+# define DEBUG_S       printf
+#else
+# define DEBUG_S(...)
+# define DONT_INCLUDE_SYSCALL_NAMES
+#endif
+
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
@@ -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,6 +120,7 @@ int _InitSyscalls()
        
        #if !USE_TCP
        // Ask server for a client ID
+       if( !giSyscall_ClientID )
        {
                tRequestHeader  req;
                 int    len;
@@ -130,7 +143,7 @@ int _InitSyscalls()
        return 0;
 }
 
-int SendRequest(tRequestHeader *Request, int RequestSize)
+int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize)
 {
        if( gSocket == INVALID_SOCKET )
        {
@@ -150,12 +163,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 +214,7 @@ void SendData(void *Data, int Length)
        #endif
        
        if( len != Length ) {
+               fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID);
                perror("SendData");
                exit(-1);
        }
@@ -180,21 +225,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 +258,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;
 }

UCC git Repository :: git.ucc.asn.au