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,37 +127,39 @@ 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 (!strcasecmp( TempStr, "Low" ))
|
if (TempStr)
|
||||||
LogLevel = dlLow;
|
{
|
||||||
else if (!strcasecmp( TempStr, "Medium" ))
|
if (!strcasecmp( TempStr, "Low" ))
|
||||||
LogLevel = dlMedium;
|
LogLevel = dlLow;
|
||||||
else if (!strcasecmp( TempStr, "High" ))
|
else if (!strcasecmp( TempStr, "Medium" ))
|
||||||
LogLevel = dlHigh;
|
LogLevel = dlMedium;
|
||||||
|
else if (!strcasecmp( TempStr, "High" ))
|
||||||
|
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 (!strcasecmp( TempMember->Value, "Normal"))
|
if (TempMember->Value)
|
||||||
LogOutput |= OUT_NORMAL;
|
{
|
||||||
else if (!strcasecmp( TempMember->Value, "Bin"))
|
if (!strcasecmp( TempMember->Value, "Normal"))
|
||||||
LogOutput |= OUT_BIN;
|
LogOutput |= OUT_NORMAL;
|
||||||
else if (!strcasecmp( TempMember->Value, "Hex"))
|
else if (!strcasecmp( TempMember->Value, "Bin"))
|
||||||
LogOutput |= OUT_HEX;
|
LogOutput |= OUT_BIN;
|
||||||
else if (!strcasecmp( TempMember->Value, "Count"))
|
else if (!strcasecmp( TempMember->Value, "Hex"))
|
||||||
LogOutput |= OUT_COUNT;
|
LogOutput |= OUT_HEX;
|
||||||
else if (!strcasecmp( TempMember->Value, "AsIs"))
|
else if (!strcasecmp( TempMember->Value, "Count"))
|
||||||
LogOutput |= OUT_ASIS;
|
LogOutput |= OUT_COUNT;
|
||||||
else if (!strcasecmp( TempMember->Value, "CRLF"))
|
else if (!strcasecmp( TempMember->Value, "AsIs"))
|
||||||
LogOutput |= OUT_CRLF;
|
LogOutput |= OUT_ASIS;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "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" ),
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user