X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fserver.c;h=7bb503364b0f8894943981c61fec6c73ce739f54;hb=695800da5d26cd12d5dfa0a93d0ef1eed0533c78;hp=0cede83c38a64d1fcfe0e2dd237b943d5790935c;hpb=b391a1b79e12096b561e68a48eb096dcb77fca47;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/server.c b/AcessNative/acesskernel_src/server.c index 0cede83c..7bb50336 100644 --- a/AcessNative/acesskernel_src/server.c +++ b/AcessNative/acesskernel_src/server.c @@ -38,6 +38,7 @@ typedef struct { // === IMPORTS === extern tRequestHeader *SyscallRecieve(tRequestHeader *Request, int *ReturnLength); extern int Threads_CreateRootProcess(void); +extern void Threads_SetThread(int TID); // HACK: Should have these in a header extern void Log_Debug(const char *Subsys, const char *Message, ...); extern void Log_Notice(const char *Subsys, const char *Message, ...); @@ -46,6 +47,7 @@ extern void Log_Notice(const char *Subsys, const char *Message, ...); tClient *Server_GetClient(int ClientID); int Server_WorkerThread(void *ClientPtr); int SyscallServer(void); + int Server_ListenThread(void *Unused); // === GLOBALS === #ifdef __WIN32__ @@ -56,6 +58,7 @@ SOCKET gSocket = INVALID_SOCKET; int gSocket = INVALID_SOCKET; #endif tClient gaServer_Clients[MAX_CLIENTS]; +SDL_Thread *gpServer_ListenThread; // === CODE === int Server_GetClientID(void) @@ -133,11 +136,17 @@ int Server_WorkerThread(void *ClientPtr) cur_client_id = Client->ClientID; } - Log_Debug("AcessSrv", "Worker %i takes %p", - Client->ClientID, Client->CurrentRequest); - // Get the response retHeader = SyscallRecieve(Client->CurrentRequest, &retSize); + + { + int callid = Client->CurrentRequest->CallID; + Log_Debug("AcessSrv", "Client %i request %i %s", + Client->ClientID, callid, + callid < N_SYSCALLS ? casSYSCALL_NAMES[callid] : "UNK" + ); + } + if( !retHeader ) { // Return an error to the client @@ -152,13 +161,14 @@ int Server_WorkerThread(void *ClientPtr) retHeader->ClientID = Client->ClientID; // Mark the thread as ready for another job + free(Client->CurrentRequest); Client->CurrentRequest = 0; - Log_Debug("AcessSrv", "Sending %i to %x:%i (Client %i)", - retSize, ntohl(Client->ClientAddr.sin_addr.s_addr), - ntohs(Client->ClientAddr.sin_port), - Client->ClientID - ); +// Log_Debug("AcessSrv", "Sending %i to %x:%i (Client %i)", +// retSize, ntohl(Client->ClientAddr.sin_addr.s_addr), +// ntohs(Client->ClientAddr.sin_port), +// Client->ClientID +// ); // Return the data sentSize = sendto(gSocket, retHeader, retSize, 0, @@ -229,7 +239,12 @@ int SyscallServer(void) #endif Log_Notice("AcessSrv", "Listening on 0.0.0.0:%i", SERVER_PORT); - + gpServer_ListenThread = SDL_CreateThread( Server_ListenThread, NULL ); + return 0; +} + +int Server_ListenThread(void *Unused) +{ // Wait for something to do :) for( ;; ) { @@ -263,11 +278,12 @@ int SyscallServer(void) // Hand off to a worker thread // - TODO: Actually have worker threads - printf("%i bytes from %x:%i\n", length, - ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)); +// Log_Debug("Server", "%i bytes from %x:%i", length, +// ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port)); client = Server_GetClient(req->ClientID); - if( req->ClientID == 0 ) + // NOTE: Hack - Should check if all zero + if( req->ClientID == 0 || client->ClientAddr.sin_port == 0 ) { memcpy(&client->ClientAddr, &addr, sizeof(addr)); } @@ -288,11 +304,13 @@ int SyscallServer(void) Log_Debug("AcessSrv", "Message from Client %i (%p)", client->ClientID, client); - + + // Make a copy of the request data + req = malloc(length); + memcpy(req, data, length); client->CurrentRequest = req; SDL_CondSignal(client->WaitFlag); #endif } - return -1; }