Important update:

- DataTreeCore:
  - Renamed Get/SetMemXxx() methods to Get/SetChXxx()
  - Renamed GetMember() to GetChild()
  - Updated: JSONparse, ApplicationCore, FunctionCore, SelectableCore,
             and WatchdogCore
  - Remove unused PrevChild & Last vars in GetChild (GetMember)
- JSONparseCore:
  - Use return values from write() and PrintXxx() methods to report fail
- SelectableCore:
  - Fix possible uninitialised FlowCtrl & Parity value
- DateTimeCore:
  - Fix possible memory overrun in temp buffer
- EventBufferCore:
  - Fix possible uninitialised value error in AddEvent
This commit is contained in:
Charl Wentzel
2018-11-20 11:27:09 +02:00
parent 278198171d
commit 6263c0f508
9 changed files with 248 additions and 213 deletions

View File

@@ -84,7 +84,7 @@ bool CSelectableCore::LoadConfigData()
CFunctionCore::LoadConfigData();
// Load Handles
if ((TempMember = ConfigMember->GetMember( "Handles", false ))) {
if ((TempMember = ConfigMember->GetChild( "Handles", false ))) {
TempMember = TempMember->GetFirstChild();
}
while (TempMember)
@@ -95,24 +95,24 @@ bool CSelectableCore::LoadConfigData()
// Create Handle and channel link
Handle = CreateHandle( TempMember->GetName(), false );
Handle->Channel = GetChannel( TempMember->GetMemStr( "Channel" ) );
Handle->Channel = GetChannel( TempMember->GetChStr( "Channel" ) );
Type = (char*)TempMember->GetMemStr( "Type", "TCPclient", true );
Type = (char*)TempMember->GetChStr( "Type", "TCPclient", true );
if (!strcasecmp( Type, "Serial" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Port/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Port/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get address list value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get address list value
}
else {
Address = (char*)TempMember->GetMemStr( "Port/Address", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Port/Address", NULL, true ); // Get default value
}
SetSerialHandle( Handle, Address );
// Update configuration if specified
if ((SerialConfig = TempMember->GetMember( "Port/SerialConfig", false )))
if ((SerialConfig = TempMember->GetChild( "Port/SerialConfig", false )))
{
ParityText = (char*)SerialConfig->GetMemStr( "Parity", "none", true );
ParityText = (char*)SerialConfig->GetChStr( "Parity", "none", true );
if (!strcasecmp( ParityText, "none" ))
Parity = NO_PARITY;
else if (!strcasecmp( ParityText, "odd" ))
@@ -121,132 +121,136 @@ bool CSelectableCore::LoadConfigData()
Parity = EVEN_PARITY;
else if (!strcasecmp( ParityText, "mark" ))
Parity = MARK_PARITY;
else
Parity = NO_PARITY;
FlowCtrlText = (char*)SerialConfig->GetMemStr( "FlowCtrl", "none", true );
FlowCtrlText = (char*)SerialConfig->GetChStr( "FlowCtrl", "none", true );
if (!strcasecmp( FlowCtrlText, "none" ))
FlowCtrl = NO_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "hardware" ))
FlowCtrl = HW_FLOWCTRL;
else if (!strcasecmp( FlowCtrlText, "software" ))
FlowCtrl = SW_FLOWCTRL;
else
FlowCtrl = NO_FLOWCTRL;
Handle->SerialConfig = true;
SetSerialHandleConfig( Handle, SerialConfig->GetMemInt( "BaudRate", 19200, true ),
SerialConfig->GetMemInt( "DataBits", 8, true ),
Parity, SerialConfig->GetMemInt( "StopBits", 1, true ),
FlowCtrl, SerialConfig->GetMemInt( "DataWait", 0, true ));
SetSerialHandleConfig( Handle, SerialConfig->GetChInt( "BaudRate", 19200, true ),
SerialConfig->GetChInt( "DataBits", 8, true ),
Parity, SerialConfig->GetChInt( "StopBits", 1, true ),
FlowCtrl, SerialConfig->GetChInt( "DataWait", 0, true ));
}
}
else if (!strcasecmp( Type, "LinePrinter" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Port/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Port/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get address list value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get address list value
}
else {
Address = (char*)TempMember->GetMemStr( "Port/Address", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Port/Address", NULL, true ); // Get default value
}
SetLinePrinterHandle( Handle, Address );
}
else if (!strcasecmp( Type, "UNIXserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
}
SetUnixHandle( Handle, ctUNIXserver, Address );
}
else if (!strcasecmp( Type, "UNIXclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
}
SetUnixHandle( Handle, ctUNIXclient, Address );
}
else if (!strcasecmp( Type, "UDPserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctUDPserver, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "UDPclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctUDPclient, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "TCPserver" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctTCPserver, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "TCPclient" ))
{
if ((Name = (char*)TempMember->GetMemStr( "Socket/Name", NULL ))) {
if ((Name = (char*)TempMember->GetChStr( "Socket/Name", NULL ))) {
sprintf( Path, "Address/%s/Address", Name );
Address = (char*)DataTree->GetMemStr( Path, NULL, true ); // Get AddressList Address value
Address = (char*)DataTree->GetChStr( Path, NULL, true ); // Get AddressList Address value
sprintf( Path, "Address/%s/Port", Name );
Port = (char*)DataTree->GetMemStr( Path, "0", true ); // Get AddressList Port value
Port = (char*)DataTree->GetChStr( Path, "0", true ); // Get AddressList Port value
}
else {
Address = (char*)TempMember->GetMemStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetMemStr( "Socket/Port", "0", true ); // Get default Port value
Address = (char*)TempMember->GetChStr( "Socket/Address", NULL, true ); // Get default Address value
Port = (char*)TempMember->GetChStr( "Socket/Port", "0", true ); // Get default Port value
}
Delay = TempMember->GetMemInt( "Socket/ResolveDelay", 0, true );
Delay = TempMember->GetChInt( "Socket/ResolveDelay", 0, true );
SetSocketHandle( Handle, ctTCPclient, Address, strlcase(Port), Delay );
}
else if (!strcasecmp( Type, "ForkPipe" )) {
Address = (char*)TempMember->GetMemStr( "Fork/ExecPath", NULL, true ); // Get default value
Address = (char*)TempMember->GetChStr( "Fork/ExecPath", NULL, true ); // Get default value
SetForkPipeHandle( Handle, Address );
}
// Set Auto Mange
SetAutoManage( Handle, TempMember->GetMemBool( "AutoManage/Enabled", true, true ),
TempMember->GetMemBool( "AutoManage/Persistent", false, true ),
TempMember->GetMemInt( "AutoManage/ReopenDelay", 2000, true ),
TempMember->GetMemInt( "AutoManage/CloseTimeout", 2000, true ));
SetAutoManage( Handle, TempMember->GetChBool( "AutoManage/Enabled", true, true ),
TempMember->GetChBool( "AutoManage/Persistent", false, true ),
TempMember->GetChInt( "AutoManage/ReopenDelay", 2000, true ),
TempMember->GetChInt( "AutoManage/CloseTimeout", 2000, true ));
// Input buffer
SetInBuffer( Handle, TempMember->GetMemInt( "InputBuffer/Size", 0 ),
TempMember->GetMemInt( "InputBuffer/Timeout", 250 ),
TempMember->GetMemStr( "InputBuffer/Marker", "" ),
TempMember->GetMemInt( "InputBuffer/MarkerLen", 0 ) );
SetOutBuffer( Handle, TempMember->GetMemInt( "OutputBuffer/Size", 0 ) );
SetInBuffer( Handle, TempMember->GetChInt( "InputBuffer/Size", 0 ),
TempMember->GetChInt( "InputBuffer/Timeout", 250 ),
TempMember->GetChStr( "InputBuffer/Marker", "" ),
TempMember->GetChInt( "InputBuffer/MarkerLen", 0 ) );
SetOutBuffer( Handle, TempMember->GetChInt( "OutputBuffer/Size", 0 ) );
// Next
TempMember = TempMember->GetNextPeer();