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:
Charl Wentzel
2017-07-12 06:19:06 +02:00
parent 3f86de71b1
commit 8933ec1ae6
2 changed files with 51 additions and 51 deletions

View File

@@ -127,24 +127,25 @@ bool CFunctionCore::LoadConfigData()
TDataMember * TempMember; TDataMember * TempMember;
char * TempStr; char * TempStr;
// Set Name
Name = (char*)malloc( strlen(BaseMember->Name)+1 );
strcpy( Name, BaseMember->Name );
// Get debug level // Get debug level
LogLevel = dlNone; LogLevel = dlNone;
TempStr = (char*)DataTree->GetStr( BaseMember, "Log/Level", "Medium", true ); TempStr = (char*)DataTree->GetStr( BaseMember, "Log/Level", "Medium", true );
if (TempStr)
{
if (!strcasecmp( TempStr, "Low" )) if (!strcasecmp( TempStr, "Low" ))
LogLevel = dlLow; LogLevel = dlLow;
else if (!strcasecmp( TempStr, "Medium" )) else if (!strcasecmp( TempStr, "Medium" ))
LogLevel = dlMedium; LogLevel = dlMedium;
else if (!strcasecmp( TempStr, "High" )) else if (!strcasecmp( TempStr, "High" ))
LogLevel = dlHigh; LogLevel = dlHigh;
}
// Set debug output // Set debug output
LogOutput = 0; LogOutput = 0;
TempMember = DataTree->GetMember( BaseMember, "Log/Output[0]", true ); TempMember = DataTree->GetMember( BaseMember, "Log/Output[0]", true );
while (TempMember) while (TempMember)
{
if (TempMember->Value)
{ {
if (!strcasecmp( TempMember->Value, "Normal")) if (!strcasecmp( TempMember->Value, "Normal"))
LogOutput |= OUT_NORMAL; LogOutput |= OUT_NORMAL;
@@ -158,6 +159,7 @@ bool CFunctionCore::LoadConfigData()
LogOutput |= OUT_ASIS; LogOutput |= OUT_ASIS;
else if (!strcasecmp( TempMember->Value, "CRLF")) else if (!strcasecmp( TempMember->Value, "CRLF"))
LogOutput |= OUT_CRLF; LogOutput |= OUT_CRLF;
}
// Next // Next
TempMember = DataTree->GetNextChild( TempMember ); TempMember = DataTree->GetNextChild( TempMember );
@@ -167,8 +169,7 @@ bool CFunctionCore::LoadConfigData()
InitLogging( LogLevel, LogOutput ); InitLogging( LogLevel, LogOutput );
// Set debug output // Set debug output
FirstChannel = NULL; TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels" ) );
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels", true ) );
while (TempMember) while (TempMember)
{ {
AddChannel( DataTree->GetStr( TempMember, "Name" ), AddChannel( DataTree->GetStr( TempMember, "Name" ),

View File

@@ -74,7 +74,6 @@ bool CSelectableCore::LoadConfigData()
CFunctionCore::LoadConfigData(); CFunctionCore::LoadConfigData();
// Set debug output // Set debug output
FirstHandle = NULL;
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Handles", true ) ); TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Handles", true ) );
while (TempMember) while (TempMember)
{ {
@@ -85,8 +84,8 @@ bool CSelectableCore::LoadConfigData()
Type = (char*)DataTree->GetStr( TempMember, "Type", "TCPclient", true ); Type = (char*)DataTree->GetStr( TempMember, "Type", "TCPclient", true );
if (!strcasecmp( Type, "Port" )) if (!strcasecmp( Type, "Port" ))
{ {
Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL, true ); // Get default value Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL ); // Get default value
if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL, true ))) { if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name ); sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value
} }
@@ -94,9 +93,9 @@ bool CSelectableCore::LoadConfigData()
} }
else if (!strcasecmp( Type, "TCPserver" )) 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 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 ); sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name ); sprintf( Path, "Address/%s/Port", Name );
@@ -106,9 +105,9 @@ bool CSelectableCore::LoadConfigData()
} }
else if (!strcasecmp( Type, "TCPclient" )) 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 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 ); sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name ); sprintf( Path, "Address/%s/Port", Name );
@@ -126,11 +125,11 @@ bool CSelectableCore::LoadConfigData()
DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) ); DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) );
// Input buffer // Input buffer
SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 100, true ), SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 0 ),
DataTree->GetInt( TempMember, "OutputBuffer/Size", 0, true ), DataTree->GetInt( TempMember, "OutputBuffer/Size", 0 ),
DataTree->GetInt( TempMember, "InputBuffer/Timeout", 200, true ), DataTree->GetInt( TempMember, "InputBuffer/Timeout", 250 ),
DataTree->GetStr( TempMember, "InputBuffer/Marker", "\n", true ), DataTree->GetStr( TempMember, "InputBuffer/Marker", "" ),
DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 1, true ) ); DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 0 ) );
// Next // Next
TempMember = DataTree->GetNextChild( TempMember ); TempMember = DataTree->GetNextChild( TempMember );
@@ -570,7 +569,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0) if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{ {
// Log Event // 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 // Set state
ChangeState( Handle, csFailed ); ChangeState( Handle, csFailed );
@@ -612,7 +611,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0) if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0)
{ {
// Log Event // 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 // Set state
close( Handle->FD ); close( Handle->FD );
@@ -625,7 +624,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
if (listen( Handle->FD, 5 ) < 0) if (listen( Handle->FD, 5 ) < 0)
{ {
// Log Event // 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 // Set state
close( Handle->FD ); close( Handle->FD );
@@ -635,7 +634,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
}; };
// Log Event // 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 // Add to Select Lists
if (Select) { if (Select) {
@@ -672,10 +671,10 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
{ {
// Log Event // Log Event
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) { 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 { 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; return -1;
} }
@@ -709,7 +708,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
(*RemoteClient)->State = csWaitingtoOpen; (*RemoteClient)->State = csWaitingtoOpen;
// Log Event // 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 // Add to Select Lists
if (Select) { if (Select) {
@@ -729,7 +728,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
else if (Handle->State == csWaitingtoOpen) else if (Handle->State == csWaitingtoOpen)
{ {
// Log Event // 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 // Update state
ChangeState( Handle, csOpen ); ChangeState( Handle, csOpen );
@@ -763,7 +762,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0) if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0)
{ {
// Log Event // 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 // Set Status
ChangeState( Handle, csFailed ); ChangeState( Handle, csFailed );
@@ -800,7 +799,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len )) 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 // Add to Select Lists
if (Select) { if (Select) {
@@ -814,7 +813,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY)) else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
{ {
// Log Event // 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 // Add to Select Lists
if (Select) { if (Select) {
@@ -828,7 +827,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
else else
{ {
// Log Event // 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 // Remove from Select List
if (Select) { if (Select) {
@@ -933,15 +932,15 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren )
break; break;
case ctServer: 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; break;
case ctRemoteClient: 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; break;
case ctClient: 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; break;
case ctNone: case ctNone: