ret->Mutex = SDL_CreateMutex();
SDL_mutexP( ret->Mutex );
#endif
+ Log_Debug("Server", "Creating worker for %p", ret);
ret->WorkerThread = SDL_CreateThread( Server_WorkerThread, ret );
}
int Server_WorkerThread(void *ClientPtr)
{
tClient *Client = ClientPtr;
-
+
+ Log_Debug("Server", "Worker %p", ClientPtr);
+
#if USE_TCP
+
+ while( *((volatile typeof(Client->Socket)*)&Client->Socket) == 0 )
+ ;
+ Threads_SetThread( Client->ClientID );
+
for( ;; )
{
fd_set fds;
FD_SET(Client->Socket, &fds);
int rv = select(nfd, &fds, NULL, NULL, NULL); // TODO: Timeouts?
- if(rv <= 0) {
+ if(rv < 0) {
perror("select");
continue ;
}
-
+ Log_Debug("Server", "%p: rv=%i", Client, rv);
+
if( FD_ISSET(Client->Socket, &fds) )
{
const int ciMaxParamCount = 6;
// Allocate full buffer
hdr = malloc(bufsize);
memcpy(hdr, lbuf, 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?
+ 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?
+ }
}
+ else
+ Log_Debug("Server", "no data");
int retlen;
tRequestHeader *retHeader;
free( retHeader );
}
#endif
+ Log_Notice("Server", "Terminated Worker %p", ClientPtr);
+ return 0;
}
int SyscallServer(void)
char addrstr[4*8+8+1];
inet_ntop(clientaddr.sin_family, &clientaddr.sin_addr, addrstr, sizeof(addrstr));
- Log_Debug("Server", "Client connection %s:%i\n", addrstr, ntohs(clientaddr.sin_port));
+ Log_Debug("Server", "Client connection %s:%i", addrstr, ntohs(clientaddr.sin_port));
// Perform auth
size_t len;
// Some form of error?
Log_Warning("Server", "Client auth block bad size (%i != exp %i)",
len, sizeof(authhdr));
+ close(clientSock);
continue ;
}
// Get client structure and make sure it's unused
// - Auth token / verifcation?
client = Server_GetClient(authhdr.pid);
+ if( !client ) {
+ Log_Warning("Server", "Can't allocate a client struct for %s:%i",
+ addrstr, clientaddr.sin_port);
+ close(clientSock);
+ continue ;
+ }
if( client->Socket != 0 ) {
Log_Warning("Server", "Client (%i)%p owned by FD%i but %s:%i tried to use it",
authhdr.pid, client, addrstr, clientaddr.sin_port);
- authhdr.pid = 0;
+ close(clientSock);
+ continue;
}
else {
client->Socket = clientSock;
}
}
- Log_Debug("Server", "Client given PID %i", authhdr.pid);
+ Log_Debug("Server", "Client given PID %i - info %p", authhdr.pid, client);
len = send(clientSock, &authhdr, sizeof(authhdr), 0);
if( len != sizeof(authhdr) ) {