/*
+ * AcessNative ld-acess dynamic linker
+ * - By John Hodge (thePowersGang)
+ *
+ * request.c
+ * - IPC interface
*/
#define DEBUG 0
-
#if DEBUG
# define DEBUG_S printf
#else
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)
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
#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 )
{
{
tRequestAuthHdr auth;
auth.pid = giSyscall_ClientID;
+ auth.key = 0;
SendData(&auth, sizeof(auth));
int len = ReadData(&auth, sizeof(auth), 5);
if( len == 0 ) {
printf("\n");
}
#endif
+ #if DEBUG
{
int i;
char *data = (char*)&Request->Params[Request->NParams];
}
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);
+ // TODO: Sanity
+ size_t recvbytes = sizeof(*Request), 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)
if( !ret ) {
printf("[ERROR %i] Timeout reading from socket\n", giSyscall_ClientID);
- return 0; // Timeout
+ return -2; // Timeout
}
#if USE_TCP
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);