Code:
/****************************************************************/
/* FileName: cSCore.cpp */
/* Author: David Estes(Chrono) */
/* CopyRight 2004,2005 David Estes */
/* Under the GPL License */
/* FOR NON-COMMERCIAL USE ONLY */
/****************************************************************/
//====================
//Revisement History |
//====================
//02/23/2005 -- Moved Several Functions into cSCore-2.cpp to make file smaller
//
//
//====================
#include"cSCore.h"
#include"getarg.h"
void cSCore::runcore(void)
{
/*Lets Initialize Some Variables*/
int lsfd; //Listening File Descriptor
int nsfd; //Sfd For New Connections
int returnval;
int maxfd = 0;
char *buffer; //Temporary Message Buffer
char *charbuffer = new char[1];
struct sockaddr_in newc;
fd_set *cset = new fd_set;
fd_set *master = new fd_set;
memset(charbuffer,0,1);
lsfd = Socket->cs_serve(Port);
int optval = 1;
setsockopt(lsfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));
setsockopt(lsfd,SOL_SOCKET,SO_LINGER,&optval,sizeof(optval));
//FD_ZERO(cset);
FD_ZERO(master);
FD_ZERO(cset);
FD_SET(lsfd, master); //Add the listening sfd to the FD set
maxfd = lsfd;
sMainUsers *tempuser;
int SelReturnVal=0;
printf("Max FD_SIZE = %d\n",FD_SETSIZE);
while(enabled)
{
*cset = *master;
SelReturnVal = select((maxfd)+1,cset,NULL,NULL,NULL);
printf("Select Returned %d\n",SelReturnVal);
if(FD_ISSET(lsfd, cset)) //If It is a New Connection
{
nsfd = accept(lsfd,NULL,(socklen_t *)sizeof(newc));
ErrorHandler->ProduceError(0,"cSCore::runcore()","New Connection Received");
if(!UserHandler->AddUser(nsfd,"unsupported"))
{
ErrorHandler->ProduceError(0,"cSCore::runcore()","Failed To Add User");
close(nsfd);
}
else
{
info("cSCore::runcore()","Adding to FD Set");
FD_SET(nsfd,master);
if(nsfd > maxfd)
maxfd = nsfd;
}
}
else
{
ErrorHandler->ProduceError(0,"cSCore::runcore()","Data Received");
tempuser = UserHandler->GetUser(0);
//ErrorHandler->ProduceError(0,"cSCore::runcore()","UserPtr Caught");
while(tempuser != NULL)
{
//ErrorHandler->ProduceError(0,"cSCore::runcore()","looping list");
/*A User wants to send something*/
if(FD_ISSET(tempuser->sfd,cset) && tempuser->sfd != lsfd)
{
nsfd = tempuser->sfd;
ErrorHandler->ProduceError(0,"cSCore::runcore()","reading data");
returnval = Socket->cs_read(nsfd,charbuffer,1);
if(returnval == 0) //Check To See If The User Disconnected
{
//UserDisconnected -- Notify Channels
ChannelHandler->UserDisconnected(nsfd);
info("cSCore::runcore()","User Disconnected From Channels");
//Notify UserHandler Of Disconnect and Remove All Memory Allocation of User
UserHandler->RemoveUser(nsfd);
info("cSCore::runcore()","User Disconnected");
close(nsfd);
FD_CLR(nsfd,master);
printf("%s%sUsers Connected: %d%s\n",FOREBLACK,BACKGREEN,UserHandler->numusers,NORMAL);
if(UserHandler->numusers == 0)
{
FD_ZERO(master);
FD_SET(lsfd,master);
}
break;
}
else
{
sUserBuffers *UserBuffer = tempuser->UserBuffer;
if(int(charbuffer[0]) == -1) //Byte 255
{
this->parsecmd(nsfd,GetUserBufferData(UserBuffer));
MarkUserBufferComplete(UserBuffer);
}
else
{
if(AddCharToUserBuffer(UserBuffer,charbuffer[0]) == -1)
MarkUserBufferComplete(UserBuffer);
}
if(IsBufferComplete(UserBuffer))
ResetUserBuffer(UserBuffer);
}
break;
}
tempuser=tempuser->next;
}
}
}
close(lsfd);
delete master;
delete cset;
delete [] charbuffer;
}