- Misc changes
[tpg/acess2.git] / AcessNative / ld-acess.so_src / request.c
index 5a64119..f9526b3 100644 (file)
@@ -1,16 +1,32 @@
 /*
  */
-#include <windows.h>
+#include <stdlib.h>
+#include <string.h>
 #include <stdio.h>
-#include <winsock.h>
+#ifdef __WIN32__
+# include <windows.h>
+# include <winsock.h>
+#else
+# include <unistd.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+#endif
+#include "request.h"
+#include "../syscalls.h"
 
 #define        SERVER_PORT     0xACE
 
 // === GLOBALS ===
 #ifdef __WIN32__
 WSADATA        gWinsock;
-SOCKET gSocket;
+SOCKET gSocket = INVALID_SOCKET;
+#else
+# define INVALID_SOCKET -1
+ int   gSocket = INVALID_SOCKET;
 #endif
+// Client ID to pass to server
+// TODO: Implement such that each thread gets a different one
+static int     siSyscall_ClientID = 0;
 
 // === CODE ===
 int _InitSyscalls()
@@ -32,7 +48,9 @@ int _InitSyscalls()
        if (gSocket == INVALID_SOCKET)
        {
                fprintf(stderr, "Could not create socket.\n");
+               #if __WIN32__
                WSACleanup();
+               #endif
                exit(0);
        }
        
@@ -40,31 +58,94 @@ int _InitSyscalls()
        memset((void *)&server, '\0', sizeof(struct sockaddr_in));
        server.sin_family = AF_INET;
        server.sin_port = htons(SERVER_PORT);
-       server.sin_addr.S_un.S_un_b.s_b1 = (unsigned char)127;
-       server.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)0;
-       server.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)0;
-       server.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)1;
+       server.sin_addr.s_addr = htonl(0x7F00001);
        
        // 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_un.S_un_b.s_b1 = (unsigned char)127;
-       client.sin_addr.S_un.S_un_b.s_b2 = (unsigned char)0;
-       client.sin_addr.S_un.S_un_b.s_b3 = (unsigned char)0;
-       client.sin_addr.S_un.S_un_b.s_b4 = (unsigned char)1;
+       client.sin_addr.s_addr = htonl(0x7F00001);
        
        // Bind
        if( bind(gSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1 )
        {
                fprintf(stderr, "Cannot bind address to socket.\n");
+               #if __WIN32__
                closesocket(gSocket);
                WSACleanup();
+               #else
+               close(gSocket);
+               #endif
                exit(0);
        }
+       return 0;
 }
 
-int _Syscall(const char *ArgTypes, ...)
+int SendRequest(int RequestID, int NumOutput, tOutValue **Output, int NumInput, tInValue **Input)
 {
+       tRequestHeader  *request;
+       tRequestValue   *value;
+       char    *data;
+        int    requestLen;
+        int    i;
+       
+       // 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 = siSyscall_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;
+               default:
+                       return -1;
+               }
+               value->Length = Output[i]->Length;
+               
+               memcpy(data, Output[i]->Data, Output[i]->Length);
+               
+               data += Output[i]->Length;
+       }
+       
+       // 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:
+                       return -1;
+               }
+               value->Length = Input[i]->Length;
+       }
+       
+       // Send it off
+       send(gSocket, request, requestLen, 0);
+       
+       // Wait for a response
+       recv(gSocket, request, requestLen, 0);
+       
+       // Parse response out
+       
        return 0;
 }

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