7 # define DEBUG_S printf
10 # define DONT_INCLUDE_SYSCALL_NAMES
22 # include <sys/socket.h>
23 # include <netinet/in.h>
26 #include "../syscalls.h"
31 void SendData(void *Data, int Length);
32 int ReadData(void *Dest, int MaxLen, int Timeout);
37 SOCKET gSocket = INVALID_SOCKET;
39 # define INVALID_SOCKET -1
40 int gSocket = INVALID_SOCKET;
42 // Client ID to pass to server
43 // TODO: Implement such that each thread gets a different one
44 int giSyscall_ClientID = 0;
45 struct sockaddr_in gSyscall_ServerAddr;
48 void Request_Preinit(void)
51 memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in));
52 gSyscall_ServerAddr.sin_family = AF_INET;
53 gSyscall_ServerAddr.sin_port = htons(SERVER_PORT);
56 int _InitSyscalls(void)
59 /* Open windows connection */
60 if (WSAStartup(0x0101, &gWinsock) != 0)
62 fprintf(stderr, "Could not open Windows connection.\n");
68 // Open TCP Connection
69 gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
71 // Open UDP Connection
72 gSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
74 if (gSocket == INVALID_SOCKET)
76 fprintf(stderr, "Could not create socket.\n");
85 memset((void *)&client, '\0', sizeof(struct sockaddr_in));
86 client.sin_family = AF_INET;
87 client.sin_port = htons(0);
88 client.sin_addr.s_addr = htonl(0x7F000001);
92 if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 )
94 fprintf(stderr, "[ERROR -] Cannot connect to server (localhost:%i)\n", SERVER_PORT);
95 perror("_InitSyscalls");
108 if( bind(gSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1 )
110 fprintf(stderr, "Cannot bind address to socket.\n");
112 closesocket(gSocket);
123 tRequestAuthHdr auth;
124 auth.pid = giSyscall_ClientID;
126 SendData(&auth, sizeof(auth));
127 int len = ReadData(&auth, sizeof(auth), 5);
129 fprintf(stderr, "Timeout waiting for auth response\n");
132 giSyscall_ClientID = auth.pid;
135 // Ask server for a client ID
136 if( !giSyscall_ClientID )
144 SendData(&req, sizeof(req));
146 len = ReadData(&req, sizeof(req), 5);
148 fprintf(stderr, "Unable to connect to server (localhost:%i)\n", SERVER_PORT);
152 giSyscall_ClientID = req.ClientID;
160 * \brief Close the syscall socket
161 * \note Used in acess_fork to get a different port number
163 void _CloseSyscalls(void)
166 closesocket(gSocket);
173 int SendRequest(tRequestHeader *Request, int RequestSize, int ResponseSize)
175 if( gSocket == INVALID_SOCKET )
181 Request->ClientID = giSyscall_ClientID;
185 for(i=0;i<RequestSize;i++)
187 printf("%02x ", ((uint8_t*)Request)[i]);
188 if( i % 16 == 15 ) printf("\n");
195 char *data = (char*)&Request->Params[Request->NParams];
196 DEBUG_S("Request #%i (%s) -", Request->CallID, casSYSCALL_NAMES[Request->CallID]);
197 for( i = 0; i < Request->NParams; i ++ )
199 switch(Request->Params[i].Type)
202 DEBUG_S(" 0x%08x", *(uint32_t*)data);
203 data += sizeof(uint32_t);
206 DEBUG_S(" 0x%016"PRIx64"", *(uint64_t*)data);
207 data += sizeof(uint64_t);
209 case ARG_TYPE_STRING:
210 DEBUG_S(" '%s'", (char*)data);
211 data += Request->Params[i].Length;
214 DEBUG_S(" %p:0x%x", (char*)data, Request->Params[i].Length);
215 if( !(Request->Params[i].Flags & ARG_FLAG_ZEROED) )
216 data += Request->Params[i].Length;
224 SendData(Request, RequestSize);
226 if( Request->CallID == SYS_EXIT ) return 0;
228 // Wait for a response (no timeout)
229 return ReadData(Request, ResponseSize, 0);
232 void SendData(void *Data, int Length)
237 len = send(gSocket, Data, Length, 0);
239 len = sendto(gSocket, Data, Length, 0,
240 (struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr));
243 if( len != Length ) {
244 fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID);
250 int ReadData(void *Dest, int MaxLength, int Timeout)
255 struct timeval *timeoutPtr;
258 FD_SET(gSocket, &fds);
269 ret = select(gSocket+1, &fds, NULL, NULL, timeoutPtr);
271 fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID);
272 perror("ReadData - select");
277 printf("[ERROR %i] Timeout reading from socket\n", giSyscall_ClientID);
282 ret = recv(gSocket, Dest, MaxLength, 0);
284 ret = recvfrom(gSocket, Dest, MaxLength, 0, NULL, 0);
288 fprintf(stderr, "[ERROR %i] ", giSyscall_ClientID);
293 DEBUG_S("%i bytes read from socket\n", ret);