AcessNative - Fixing bad handling of errors, add run script for ARCH=native
[tpg/acess2.git] / AcessNative / ld-acess_src / request.c
index 7a9b3b3..690c7f7 100644 (file)
@@ -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 <unistd.h>
 # include <sys/socket.h>
 # include <netinet/in.h>
+# include <sys/select.h>
 #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 )
        {
@@ -190,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];
@@ -219,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)
@@ -275,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
@@ -289,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);
        

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