X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fserver.c;h=489146705d01e2b1ae00fe5803a64fa889a00235;hb=3404389a8118dee78c22e5fbbf04ed99094202ef;hp=37694bfcd9eac3376c9ee1318b599a414d2da9a6;hpb=9698333503f59d07ceb7d0b1bb89bacef05f37e8;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/server.c b/AcessNative/acesskernel_src/server.c index 37694bfc..48914670 100644 --- a/AcessNative/acesskernel_src/server.c +++ b/AcessNative/acesskernel_src/server.c @@ -9,16 +9,22 @@ #include #include #ifdef __WIN32__ +# define _WIN32_WINNT 0x0501 # include -# include +# include +# include +# define close(fd) closesocket(fd) +typedef int socklen_t; #else # include # include # include -# include // inet_ntop +# include // getaddrinfo #endif +#define DONT_INCLUDE_SYSCALL_NAMES #include "../syscalls.h" -//#include +#include // acess but std +#include #define USE_TCP 1 #define MAX_CLIENTS 16 @@ -41,10 +47,8 @@ typedef struct { 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, ...); -extern void Log_Warning(const char *Subsys, const char *Message, ...); +extern void *Threads_GetThread(int TID); +extern void Threads_PostEvent(void *Thread, uint32_t Event); // === PROTOTYPES === tClient *Server_GetClient(int ClientID); @@ -137,7 +141,7 @@ int Server_WorkerThread(void *ClientPtr) ; Threads_SetThread( Client->ClientID ); - for( ;; ) + while( Client->ClientID != -1 ) { fd_set fds; int nfd = Client->Socket+1; @@ -156,9 +160,14 @@ int Server_WorkerThread(void *ClientPtr) const int ciMaxParamCount = 6; char lbuf[sizeof(tRequestHeader) + ciMaxParamCount*sizeof(tRequestValue)]; tRequestHeader *hdr = (void*)lbuf; - size_t len = recv(Client->Socket, hdr, sizeof(*hdr), 0); + size_t len = recv(Client->Socket, (void*)hdr, sizeof(*hdr), 0); Log_Debug("Server", "%i bytes of header", len); if( len == 0 ) break; + if( len == -1 ) { + perror("recv header"); +// Log_Warning("Server", "recv() error - %s", strerror(errno)); + break; + } if( len != sizeof(*hdr) ) { // Oops? Log_Warning("Server", "FD%i bad sized (%i != exp %i)", @@ -170,13 +179,23 @@ int Server_WorkerThread(void *ClientPtr) // Oops. Log_Warning("Server", "FD%i too many params (%i > max %i)", Client->Socket, hdr->NParams, ciMaxParamCount); - continue ; + break ; } - len = recv(Client->Socket, hdr->Params, hdr->NParams*sizeof(tRequestValue), 0); - Log_Debug("Server", "%i bytes of params", len); - if( len != hdr->NParams*sizeof(tRequestValue) ) { - // Oops. + if( hdr->NParams > 0 ) + { + len = recv(Client->Socket, (void*)hdr->Params, hdr->NParams*sizeof(tRequestValue), 0); + Log_Debug("Server", "%i bytes of params", len); + if( len != hdr->NParams*sizeof(tRequestValue) ) { + // Oops. + perror("recv params"); + Log_Warning("Sever", "Recieving params failed"); + break ; + } + } + else + { + Log_Debug("Server", "No params?"); } // Get buffer size @@ -197,10 +216,23 @@ int Server_WorkerThread(void *ClientPtr) memcpy(hdr, lbuf, hdrsize); if( bufsize > hdrsize ) { - len = recv(Client->Socket, hdr->Params + hdr->NParams, bufsize - hdrsize, 0); - Log_Debug("Server", "%i bytes of data", len); - if( len != bufsize - hdrsize ) { - // Oops? + size_t rem = bufsize - hdrsize; + char *ptr = (void*)( hdr->Params + hdr->NParams ); + while( rem ) + { + len = recv(Client->Socket, ptr, rem, 0); + Log_Debug("Server", "%i bytes of data", len); + if( len == -1 ) { + // Oops? + perror("recv data"); + Log_Warning("Sever", "Recieving data failed"); + break ; + } + rem -= len; + ptr += len; + } + if( rem ) { + break; } } else @@ -215,7 +247,7 @@ int Server_WorkerThread(void *ClientPtr) continue ; } - send(Client->Socket, retHeader, retlen, 0); + send(Client->Socket, (void*)retHeader, retlen, 0); // Clean up free(hdr); @@ -227,11 +259,13 @@ int Server_WorkerThread(void *ClientPtr) int retSize = 0; int sentSize; int cur_client_id = 0; - for( ;; ) + while( Client->ClientID != -1 ) { // Wait for something to do - while( Client->CurrentRequest == NULL ) + if( Client->CurrentRequest == NULL ) SDL_CondWait(Client->WaitFlag, Client->Mutex); + if( Client->CurrentRequest == NULL ) + continue ; // Log_Debug("AcessSrv", "Worker got message %p", Client->CurrentRequest); @@ -351,6 +385,24 @@ int SyscallServer(void) return 0; } +int Server_Shutdown(void) +{ + close(gSocket); + for( int i = 0; i < MAX_CLIENTS; i ++ ) + { + if( gaServer_Clients[i].ClientID == 0 ) + continue ; + Threads_PostEvent( Threads_GetThread(gaServer_Clients[i].ClientID), 0 ); + gaServer_Clients[i].ClientID = -1; + #if USE_TCP + close(gaServer_Clients[i].Socket); + #else + SDL_CondSignal(gaServer_Clients[i].WaitFlag); + #endif + } + return 0; +} + int Server_ListenThread(void *Unused) { // Wait for something to do :) @@ -366,13 +418,14 @@ int Server_ListenThread(void *Unused) } char addrstr[4*8+8+1]; - inet_ntop(clientaddr.sin_family, &clientaddr.sin_addr, addrstr, sizeof(addrstr)); + getnameinfo((struct sockaddr*)&clientaddr, sizeof(clientaddr), + addrstr, sizeof(addrstr), NULL, 0, NI_NUMERICHOST); Log_Debug("Server", "Client connection %s:%i", addrstr, ntohs(clientaddr.sin_port)); // Perform auth size_t len; tRequestAuthHdr authhdr; - len = recv(clientSock, &authhdr, sizeof(authhdr), 0); + len = recv(clientSock, (void*)&authhdr, sizeof(authhdr), 0); if( len != sizeof(authhdr) ) { // Some form of error? Log_Warning("Server", "Client auth block bad size (%i != exp %i)", @@ -412,7 +465,7 @@ int Server_ListenThread(void *Unused) } Log_Debug("Server", "Client given PID %i - info %p", authhdr.pid, client); - len = send(clientSock, &authhdr, sizeof(authhdr), 0); + len = send(clientSock, (void*)&authhdr, sizeof(authhdr), 0); if( len != sizeof(authhdr) ) { // Ok, this is an error perror("Sending auth reply");