Important Update:
- FunctionCore:
- Fix Memory Leaks:
- Recreate Name in LoadConfig()
- Setting FirstChannel to NULL in LoadConfig()
- Fix fault on empty Log/Output in LoadConfig()
- Check if Log/Level exists in LoadConfig()
- Do not auto-create all config parameters
- SelectableCore:
- Fix Memory Leaks:
- Setting FirstHandle to NULL in LoadConfig()
- Do not auto-create all config parameters
- Update logs to specifically refer to "TCP" server/client
This commit is contained in:
@@ -127,24 +127,25 @@ bool CFunctionCore::LoadConfigData()
|
||||
TDataMember * TempMember;
|
||||
char * TempStr;
|
||||
|
||||
// Set Name
|
||||
Name = (char*)malloc( strlen(BaseMember->Name)+1 );
|
||||
strcpy( Name, BaseMember->Name );
|
||||
|
||||
// Get debug level
|
||||
LogLevel = dlNone;
|
||||
TempStr = (char*)DataTree->GetStr( BaseMember, "Log/Level", "Medium", true );
|
||||
if (TempStr)
|
||||
{
|
||||
if (!strcasecmp( TempStr, "Low" ))
|
||||
LogLevel = dlLow;
|
||||
else if (!strcasecmp( TempStr, "Medium" ))
|
||||
LogLevel = dlMedium;
|
||||
else if (!strcasecmp( TempStr, "High" ))
|
||||
LogLevel = dlHigh;
|
||||
}
|
||||
|
||||
// Set debug output
|
||||
LogOutput = 0;
|
||||
TempMember = DataTree->GetMember( BaseMember, "Log/Output[0]", true );
|
||||
while (TempMember)
|
||||
{
|
||||
if (TempMember->Value)
|
||||
{
|
||||
if (!strcasecmp( TempMember->Value, "Normal"))
|
||||
LogOutput |= OUT_NORMAL;
|
||||
@@ -158,6 +159,7 @@ bool CFunctionCore::LoadConfigData()
|
||||
LogOutput |= OUT_ASIS;
|
||||
else if (!strcasecmp( TempMember->Value, "CRLF"))
|
||||
LogOutput |= OUT_CRLF;
|
||||
}
|
||||
|
||||
// Next
|
||||
TempMember = DataTree->GetNextChild( TempMember );
|
||||
@@ -167,8 +169,7 @@ bool CFunctionCore::LoadConfigData()
|
||||
InitLogging( LogLevel, LogOutput );
|
||||
|
||||
// Set debug output
|
||||
FirstChannel = NULL;
|
||||
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels", true ) );
|
||||
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels" ) );
|
||||
while (TempMember)
|
||||
{
|
||||
AddChannel( DataTree->GetStr( TempMember, "Name" ),
|
||||
|
||||
@@ -74,7 +74,6 @@ bool CSelectableCore::LoadConfigData()
|
||||
CFunctionCore::LoadConfigData();
|
||||
|
||||
// Set debug output
|
||||
FirstHandle = NULL;
|
||||
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Handles", true ) );
|
||||
while (TempMember)
|
||||
{
|
||||
@@ -85,8 +84,8 @@ bool CSelectableCore::LoadConfigData()
|
||||
Type = (char*)DataTree->GetStr( TempMember, "Type", "TCPclient", true );
|
||||
if (!strcasecmp( Type, "Port" ))
|
||||
{
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL, true ); // Get default value
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL, true ))) {
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL ); // Get default value
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL ))) {
|
||||
sprintf( Path, "Address/%s/Address", Name );
|
||||
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value
|
||||
}
|
||||
@@ -94,9 +93,9 @@ bool CSelectableCore::LoadConfigData()
|
||||
}
|
||||
else if (!strcasecmp( Type, "TCPserver" ))
|
||||
{
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL ); // Get default Address value
|
||||
Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) {
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL ))) {
|
||||
sprintf( Path, "Address/%s/Address", Name );
|
||||
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
|
||||
sprintf( Path, "Address/%s/Port", Name );
|
||||
@@ -106,9 +105,9 @@ bool CSelectableCore::LoadConfigData()
|
||||
}
|
||||
else if (!strcasecmp( Type, "TCPclient" ))
|
||||
{
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value
|
||||
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL ); // Get default Address value
|
||||
Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) {
|
||||
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL ))) {
|
||||
sprintf( Path, "Address/%s/Address", Name );
|
||||
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
|
||||
sprintf( Path, "Address/%s/Port", Name );
|
||||
@@ -126,11 +125,11 @@ bool CSelectableCore::LoadConfigData()
|
||||
DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) );
|
||||
|
||||
// Input buffer
|
||||
SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 100, true ),
|
||||
DataTree->GetInt( TempMember, "OutputBuffer/Size", 0, true ),
|
||||
DataTree->GetInt( TempMember, "InputBuffer/Timeout", 200, true ),
|
||||
DataTree->GetStr( TempMember, "InputBuffer/Marker", "\n", true ),
|
||||
DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 1, true ) );
|
||||
SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ),
|
||||
DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ),
|
||||
DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ),
|
||||
DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ),
|
||||
DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) );
|
||||
|
||||
// Next
|
||||
TempMember = DataTree->GetNextChild( TempMember );
|
||||
@@ -570,7 +569,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
||||
if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csFailed );
|
||||
@@ -612,7 +611,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
||||
if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0)
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to bind TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
close( Handle->FD );
|
||||
@@ -625,7 +624,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
||||
if (listen( Handle->FD, 5 ) < 0)
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to listen on TCP Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Set state
|
||||
close( Handle->FD );
|
||||
@@ -635,7 +634,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
||||
};
|
||||
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||
|
||||
// Add to Select Lists
|
||||
if (Select) {
|
||||
@@ -672,10 +671,10 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
||||
{
|
||||
// Log Event
|
||||
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||
}
|
||||
else {
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -709,7 +708,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
||||
(*RemoteClient)->State = csWaitingtoOpen;
|
||||
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server accepted Remote TCP Client connection [%s]", Name, Handle->Name, ClientAddress );
|
||||
|
||||
// Add to Select Lists
|
||||
if (Select) {
|
||||
@@ -729,7 +728,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
||||
else if (Handle->State == csWaitingtoOpen)
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote TCP Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
||||
|
||||
// Update state
|
||||
ChangeState( Handle, csOpen );
|
||||
@@ -763,7 +762,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
||||
if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0)
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create TCP Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Set Status
|
||||
ChangeState( Handle, csFailed );
|
||||
@@ -800,7 +799,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
||||
|
||||
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len ))
|
||||
{
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||
|
||||
// Add to Select Lists
|
||||
if (Select) {
|
||||
@@ -814,7 +813,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
||||
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Add to Select Lists
|
||||
if (Select) {
|
||||
@@ -828,7 +827,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
||||
else
|
||||
{
|
||||
// Log Event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||
|
||||
// Remove from Select List
|
||||
if (Select) {
|
||||
@@ -933,15 +932,15 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren )
|
||||
break;
|
||||
|
||||
case ctServer:
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||
break;
|
||||
|
||||
case ctRemoteClient:
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote TCP Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
||||
break;
|
||||
|
||||
case ctClient:
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - TCP Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||
break;
|
||||
|
||||
case ctNone:
|
||||
|
||||
Reference in New Issue
Block a user