Major Update:
- Updated all Logged messages, standardised DebugLevel:
- dlNone - Show startup and stop
- dlLow - Show creation/destruction of Function Blocks and Local IO
- dlMedium - Show connection events, eg. open/close
- dlHigh - Show data flow events
-LogCore:
- LogMessage and ShowOutput uses va_list
only run printf if DebugLevel correct
- Remove global LogStr[] variable
- SelectableCore:
- Implemented Auto-management of handles
auto open on startup/fail/close
- Changed simple Open/Close/Read/Write methods to inline
- Do not set Select Write trigger for server socket
- Memory leak, setting address twice on RemoteClient
- Bug fix, only send handle out data if DebugLevel = dlHigh
- Bug fix, do not Read/ProcessBuffer if no InputBuffer
This commit is contained in:
@@ -18,7 +18,6 @@
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
extern char ProcessName[];
|
extern char ProcessName[];
|
||||||
extern char LogStr[]; // Access to global temporary log messages string
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -38,8 +37,7 @@ CFunctionCore::CFunctionCore( const char * FunctionName )
|
|||||||
FirstIO = NULL;
|
FirstIO = NULL;
|
||||||
|
|
||||||
// Report status
|
// Report status
|
||||||
sprintf( LogStr, "Function '%s' - Created", FunctionName );
|
LogMessage( dlLow, "%s: Function '%s' - Created", ProcessName, FunctionName );
|
||||||
LogMessage( ProcessName, dlLow, LogStr );
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -84,8 +82,7 @@ CFunctionCore::~CFunctionCore()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Report status
|
// Report status
|
||||||
sprintf( LogStr, "Function '%s' - Destroyed", Name );
|
LogMessage( dlLow, "%s: Function '%s' - Destroyed", ProcessName, Name );
|
||||||
LogMessage( ProcessName, dlLow, LogStr );
|
|
||||||
|
|
||||||
// Destroy Name
|
// Destroy Name
|
||||||
if (Name) {
|
if (Name) {
|
||||||
@@ -121,8 +118,7 @@ TLocalIO * CFunctionCore::AddLocalIO( const char * IOName )
|
|||||||
strcpy( (*LocalIO)->Name, IOName );
|
strcpy( (*LocalIO)->Name, IOName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Local IO '%s' - Created", IOName );
|
LogMessage( dlLow, "%s: Local IO '%s' - Created", Name, IOName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return *LocalIO;
|
return *LocalIO;
|
||||||
@@ -159,8 +155,7 @@ bool CFunctionCore::AddInput( const char * IOName, CFunctionCore * OutFunction,
|
|||||||
strcpy( (*LinkedIO)->IOName, OutputName );
|
strcpy( (*LinkedIO)->IOName, OutputName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, IOName, OutFunction->GetName(), OutputName );
|
LogMessage( dlLow, "%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, Name, IOName, OutFunction->GetName(), OutputName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -196,8 +191,7 @@ bool CFunctionCore::AddOutput( const char * IOName, CFunctionCore * InFunction,
|
|||||||
strcpy( (*LinkedIO)->IOName, InputName );
|
strcpy( (*LinkedIO)->IOName, InputName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, IOName, InFunction->GetName(), InputName );
|
LogMessage( dlLow, "%s: Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, Name, IOName, InFunction->GetName(), InputName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -221,15 +215,12 @@ int CFunctionCore::Input( const char * IOName, const char * Data, int MaxLen )
|
|||||||
if (!(LocalIO = GetLocalIO( IOName )))
|
if (!(LocalIO = GetLocalIO( IOName )))
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "%s: Local IO '%s' - Input rejected, Local IO not found", Name, IOName );
|
LogMessage( dlHigh, "%s: Local IO '%s' - Input rejected, Local IO not found", Name, IOName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "%s: Local IO '%s' - IN:", Name, IOName );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, MaxLen, "%s: Local IO '%s' - IN:", Name, IOName );
|
||||||
ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, MaxLen );
|
|
||||||
|
|
||||||
// Return processed bytes
|
// Return processed bytes
|
||||||
return MaxLen;
|
return MaxLen;
|
||||||
@@ -251,14 +242,12 @@ int CFunctionCore::Output( const char * IOName, const char * Data, int Len )
|
|||||||
if (!(LocalIO = GetLocalIO( IOName )))
|
if (!(LocalIO = GetLocalIO( IOName )))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "%s: Local IO '%s' - Output rejected, Local IO not found", Name, IOName );
|
LogMessage( dlHigh, "%s: Local IO '%s' - Output rejected, Local IO not found", Name, IOName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "%s: Local IO '%s' - OUT:", Name, IOName );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Local IO '%s' - OUT:", Name, IOName );
|
||||||
ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, Len );
|
|
||||||
|
|
||||||
// Return processed bytes
|
// Return processed bytes
|
||||||
return Len;
|
return Len;
|
||||||
|
|||||||
33
LogCore.cpp
33
LogCore.cpp
@@ -13,6 +13,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -22,10 +23,12 @@ char LogStr[1000]; // Temporary var to create log messages,
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool LogMessage( const char * Heading, EDebugLevel Level, const char *Message )
|
bool LogMessage( EDebugLevel Level, const char * Format, ... )
|
||||||
{
|
{
|
||||||
|
va_list ArgPtr;
|
||||||
|
|
||||||
// Validate values
|
// Validate values
|
||||||
if (!Message)
|
if (!Format || !*Format)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check debug level
|
// Check debug level
|
||||||
@@ -34,20 +37,20 @@ bool LogMessage( const char * Heading, EDebugLevel Level, const char *Message )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show normal output
|
// Show normal output
|
||||||
if (!Heading) {
|
va_start( ArgPtr, Format );
|
||||||
printf( "%s\n", Message );
|
vprintf( Format, ArgPtr );
|
||||||
}
|
printf( "\r\n" );
|
||||||
else {
|
va_end( ArgPtr );
|
||||||
printf( "%s: %s\n", Heading, Message );
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, const char * Buffer, int Len )
|
bool ShowOutput( EDebugLevel Level, const short Show, const char * Buffer, int Len, const char * Format, ... )
|
||||||
{
|
{
|
||||||
|
va_list ArgPtr;
|
||||||
|
|
||||||
// Validate values
|
// Validate values
|
||||||
if (!Buffer)
|
if (!Buffer || !(Show & (OUT_HEX | OUT_NORMAL)))
|
||||||
return false;
|
return false;
|
||||||
if (Len == -1)
|
if (Len == -1)
|
||||||
Len = strlen( Buffer );
|
Len = strlen( Buffer );
|
||||||
@@ -57,9 +60,16 @@ bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, cons
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Show Lead
|
||||||
|
if (Format && *Format) {
|
||||||
|
va_start( ArgPtr, Format );
|
||||||
|
vprintf( Format, ArgPtr );
|
||||||
|
va_end( ArgPtr );
|
||||||
|
}
|
||||||
|
printf( "[%d] ", Len );
|
||||||
|
|
||||||
// Show Hex output
|
// Show Hex output
|
||||||
if (Show & OUT_HEX) {
|
if (Show & OUT_HEX) {
|
||||||
printf( "%s [%d]: ", Heading, Len );
|
|
||||||
for (int i=0; i<Len; i++) {
|
for (int i=0; i<Len; i++) {
|
||||||
printf( "%02X ", Buffer[i] );
|
printf( "%02X ", Buffer[i] );
|
||||||
}
|
}
|
||||||
@@ -68,7 +78,6 @@ bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, cons
|
|||||||
|
|
||||||
// Show normal output
|
// Show normal output
|
||||||
if (Show & OUT_NORMAL) {
|
if (Show & OUT_NORMAL) {
|
||||||
printf( "%s [%d]: ", Heading, Len );
|
|
||||||
if (Show & OUT_ASIS) {
|
if (Show & OUT_ASIS) {
|
||||||
printf( "%s", Buffer );
|
printf( "%s", Buffer );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ typedef enum { dlNone = 0, dlLow = 1, dlMedium = 2, dlHigh = 3 } EDebugLevel;
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool LogMessage( const char * Heading, EDebugLevel Level, const char * Message );
|
bool LogMessage( EDebugLevel Level, const char * Format, ... );
|
||||||
|
|
||||||
bool ShowOutput( const char * Heading, EDebugLevel Level, const short Show, const char * Buffer, int Len = -1 );
|
bool ShowOutput( EDebugLevel Level, const short Show, const char * Buffer, int Len, const char * Format, ... );
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
extern char ProcessName[];
|
extern char ProcessName[];
|
||||||
extern char LogStr[]; // Access to global temporary log messages string
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -40,7 +39,7 @@ CSelect::CSelect( long SelectTimeout )
|
|||||||
SetInterval( &Timeout, SelectTimeout );
|
SetInterval( &Timeout, SelectTimeout );
|
||||||
|
|
||||||
// Show status
|
// Show status
|
||||||
LogMessage( ProcessName, dlMedium, "Select - Created" );
|
LogMessage( dlLow, "%s: Select - Created", ProcessName );
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -58,7 +57,7 @@ CSelect::~CSelect()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show status
|
// Show status
|
||||||
LogMessage( ProcessName, dlMedium, "Select - Destroyed" );
|
LogMessage( dlLow, "%s: Select - Destroyed", ProcessName );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -103,8 +102,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function )
|
|||||||
FD_SET( FD, &ReadTestFDS );
|
FD_SET( FD, &ReadTestFDS );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "FD [%d] - Add Read", FD );
|
LogMessage( dlHigh, "Select: FD [%d] - Add Read", FD );
|
||||||
LogMessage( "Select", dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Write Select
|
// Add Write Select
|
||||||
@@ -113,8 +111,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function )
|
|||||||
FD_SET( FD, &WriteTestFDS );
|
FD_SET( FD, &WriteTestFDS );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "FD [%d] - Add Write", FD );
|
LogMessage( dlHigh, "Select: FD [%d] - Add Write", FD );
|
||||||
LogMessage( "Select", dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check Maximum File Handle
|
// Check Maximum File Handle
|
||||||
@@ -142,8 +139,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
|
|||||||
FD_CLR( FD, &ReadTestFDS);
|
FD_CLR( FD, &ReadTestFDS);
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "FD [%d] - Remove Read", FD );
|
LogMessage( dlHigh, "Select: FD [%d] - Remove Read", FD );
|
||||||
LogMessage( "Select", dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove from set for select write check
|
// Remove from set for select write check
|
||||||
@@ -152,8 +148,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
|
|||||||
FD_CLR( FD, &WriteTestFDS);
|
FD_CLR( FD, &WriteTestFDS);
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "FD [%d] - Remove Write", FD );
|
LogMessage( dlHigh, "Select: FD [%d] - Remove Write", FD );
|
||||||
LogMessage( "Select", dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
// Handle will be removed in Test() if both Read & Write flags are false
|
// Handle will be removed in Test() if both Read & Write flags are false
|
||||||
}
|
}
|
||||||
@@ -174,7 +169,7 @@ bool CSelect::Test()
|
|||||||
Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &Timeout );
|
Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &Timeout );
|
||||||
if (Events < 0)
|
if (Events < 0)
|
||||||
{
|
{
|
||||||
LogMessage( "Select", dlMedium, "Select operation failed" );
|
LogMessage( dlHigh, "Select: Select operation failed" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
//extern char ProcessName[];
|
//extern char ProcessName[];
|
||||||
|
|
||||||
extern EDebugLevel DebugLevel;
|
extern EDebugLevel DebugLevel;
|
||||||
extern char LogStr[]; // Access to global temporary log messages string
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
CSelectableCore::CSelectableCore( const char * Name, CSelect * Selector ) :
|
CSelectableCore::CSelectableCore( const char * Name, CSelect * Selector ) :
|
||||||
@@ -66,7 +65,7 @@ CSelectableCore::~CSelectableCore()
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateIO )
|
THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateLocalIO, bool AutoManage )
|
||||||
{
|
{
|
||||||
THandle ** Handle = NULL;
|
THandle ** Handle = NULL;
|
||||||
|
|
||||||
@@ -92,15 +91,17 @@ THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateIO
|
|||||||
(*Handle)->FD = -1;
|
(*Handle)->FD = -1;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Created", HandleName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Created", Name, HandleName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create Matching IO point
|
// Create Matching IO point
|
||||||
if (CreateIO) {
|
if (CreateLocalIO) {
|
||||||
(*Handle)->LocalIO = AddLocalIO( HandleName );
|
(*Handle)->LocalIO = AddLocalIO( HandleName );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set other params
|
||||||
|
(*Handle)->Auto = AutoManage;
|
||||||
|
|
||||||
return *Handle;
|
return *Handle;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -125,8 +126,7 @@ bool CSelectableCore::RemoveHandle( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Removed", Handle->Name );
|
LogMessage( dlMedium, "%s: Handle '%s' - Removed", Name, Handle->Name );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Destroy Child handle
|
// Destroy Child handle
|
||||||
DestroyHandle( Handle );
|
DestroyHandle( Handle );
|
||||||
@@ -184,9 +184,7 @@ bool CSelectableCore::SetPortHandle( THandle * Handle, const char * FileName )
|
|||||||
strcpy( Handle->FileName, FileName );
|
strcpy( Handle->FileName, FileName );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Set as Port [%s]", Handle->Name, FileName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Set as Port [%s]", Name, Handle->Name, FileName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -213,9 +211,7 @@ bool CSelectableCore::SetSocketHandle( THandle * Handle, EConnectType Type, con
|
|||||||
Handle->PortNo = PortNo;
|
Handle->PortNo = PortNo;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Set as %s [%s:%d]", Handle->Name, ConnectTypeName[Type], Address, PortNo );
|
LogMessage( dlMedium, "%s: Handle '%s' - Set as %s [%s:%d]", Name, Handle->Name, ConnectTypeName[Type], Address, PortNo );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -242,9 +238,7 @@ bool CSelectableCore::ClearHandle( THandle * Handle )
|
|||||||
Handle->Type = ctNone;
|
Handle->Type = ctNone;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Set as None", Handle->Name );
|
LogMessage( dlMedium, "%s: Handle '%s' - Set as None", Name, Handle->Name );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -302,8 +296,7 @@ int CSelectableCore::OpenPort( THandle * Handle )
|
|||||||
if (access( Handle->FileName, F_OK ) != 0)
|
if (access( Handle->FileName, F_OK ) != 0)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Port not found [%s]", Handle->Name, Handle->FileName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Port not found [%s]", Name, Handle->Name, Handle->FileName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,14 +305,12 @@ int CSelectableCore::OpenPort( THandle * Handle )
|
|||||||
if (Handle->FD == -1)
|
if (Handle->FD == -1)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Could not open Port [%s]", Handle->Name, Handle->FileName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Could not open Port [%s]", Name, Handle->Name, Handle->FileName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Port opened [%s]", Handle->Name, Handle->FileName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Port opened [%s]", Name, Handle->Name, Handle->FileName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -364,8 +355,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
|
||||||
sprintf( LogStr, "Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csFailed;
|
Handle->State = csFailed;
|
||||||
@@ -377,8 +367,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_SOCKET, SO_REUSEADDR, &Reuse_opt, sizeof(Reuse_opt)) == -1))
|
(setsockopt( Handle->FD, SOL_SOCKET, SO_REUSEADDR, &Reuse_opt, sizeof(Reuse_opt)) == -1))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Could not set socket options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Could not set socket options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csFailed;
|
Handle->State = csFailed;
|
||||||
@@ -393,8 +382,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csFailed;
|
Handle->State = csFailed;
|
||||||
@@ -409,8 +397,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
|
||||||
sprintf( LogStr, "Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -423,8 +410,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
if (listen( Handle->FD, 5 ) < 0)
|
if (listen( Handle->FD, 5 ) < 0)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -434,12 +420,11 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Server binded and listening [%s:%d]", Handle->Name, Handle->Address, Handle->PortNo );
|
LogMessage( dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
Select->Add( Handle->FD, true, true, this );
|
Select->Add( Handle->FD, true, false, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
@@ -470,13 +455,11 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
addr_len = sizeof( address );
|
addr_len = sizeof( address );
|
||||||
if ((ClientFD = accept( Handle->FD, (struct sockaddr *)&address, &addr_len)) == -1)
|
if ((ClientFD = accept( Handle->FD, (struct sockaddr *)&address, &addr_len)) == -1)
|
||||||
{
|
{
|
||||||
if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
|
|
||||||
sprintf( LogStr, "Handle '%s' - Server failed to accept blocking connection (%s)", Handle->Name, strerror(errno) );
|
|
||||||
else
|
|
||||||
sprintf( LogStr, "Handle '%s' - Server failed to accept connection (%s)", Handle->Name, strerror(errno) );
|
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
|
||||||
|
LogMessage( dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||||
|
else
|
||||||
|
LogMessage( dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -495,7 +478,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
|
|
||||||
// Create Remote Client Handle
|
// Create Remote Client Handle
|
||||||
sprintf( ClientName, "%s-%d", Handle->Name, ClientFD );
|
sprintf( ClientName, "%s-%d", Handle->Name, ClientFD );
|
||||||
*RemoteClient = CreateHandle( ClientName );
|
*RemoteClient = CreateHandle( ClientName, false, false );
|
||||||
SetSocketHandle( *RemoteClient, ctRemoteClient, ClientAddress, 0, Handle->KeepAlive );
|
SetSocketHandle( *RemoteClient, ctRemoteClient, ClientAddress, 0, Handle->KeepAlive );
|
||||||
|
|
||||||
// Copy Parent Buffer setup
|
// Copy Parent Buffer setup
|
||||||
@@ -508,12 +491,8 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
(*RemoteClient)->Parent = Handle;
|
(*RemoteClient)->Parent = Handle;
|
||||||
(*RemoteClient)->State = csWaitingtoOpen;
|
(*RemoteClient)->State = csWaitingtoOpen;
|
||||||
|
|
||||||
(*RemoteClient)->Address = (char*)malloc( strlen(ClientAddress)+1 );
|
|
||||||
strcpy( (*RemoteClient)->Address, ClientAddress );
|
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Server accepted Remote Client connection [%s]", Handle->Name, ClientAddress );
|
LogMessage( dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -533,8 +512,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
else if (Handle->State == csWaitingtoOpen)
|
else if (Handle->State == csWaitingtoOpen)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Remote Client connection open [%s]", Handle->Name, Handle->Address );
|
LogMessage( dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Update state
|
// Update state
|
||||||
Handle->State = csOpen;
|
Handle->State = csOpen;
|
||||||
@@ -568,8 +546,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
|
||||||
sprintf( LogStr, "Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set Status
|
// Set Status
|
||||||
Handle->State = csFailed;
|
Handle->State = csFailed;
|
||||||
@@ -588,8 +565,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle %s - Could not set KeepAlive options [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle %s - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Set State
|
// Set State
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -607,8 +583,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
|
|
||||||
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len ))
|
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len ))
|
||||||
{
|
{
|
||||||
sprintf( LogStr, "Handle %s - Client connected [%s:%d]", Handle->Name, Handle->Address, Handle->PortNo );
|
LogMessage( dlMedium, "%s: Handle %s - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -622,8 +597,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
|
||||||
sprintf( LogStr, "Handle '%s' - Client waiting to connect [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -637,8 +611,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Client could not connect [%s:%d] (%s)", Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
LogMessage( dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Remove from Select List
|
// Remove from Select List
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -654,14 +627,13 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
int CSelectableCore::Open( const char * HandleName )
|
int CSelectableCore::Open( THandle * Handle )
|
||||||
{
|
{
|
||||||
int FD = -1;
|
int FD = -1;
|
||||||
THandle * Handle = NULL;
|
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!HandleName || !(Handle = GetHandle( HandleName ))) {
|
if (!Handle) {
|
||||||
return false;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open correctly
|
// Open correctly
|
||||||
@@ -724,27 +696,26 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren )
|
|||||||
{
|
{
|
||||||
case ctPort:
|
case ctPort:
|
||||||
// Log Event
|
// Log Event
|
||||||
sprintf( LogStr, "Handle '%s' - Port %s [%s]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->FileName );
|
LogMessage( dlMedium, "%s: Handle '%s' - Port %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->FileName );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctServer:
|
case ctServer:
|
||||||
sprintf( LogStr, "Handle '%s' - Server %s [%s:%d]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
LogMessage( dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctRemoteClient:
|
case ctRemoteClient:
|
||||||
sprintf( LogStr, "Handle '%s' - Remote Client connection %s [%s]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
LogMessage( dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctClient:
|
case ctClient:
|
||||||
sprintf( LogStr, "Handle '%s' - Client connection %s [%s:%d]", Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
LogMessage( dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctNone:
|
case ctNone:
|
||||||
default:
|
default:
|
||||||
sprintf( LogStr, "Handle '%s' - %s, invalid Handle type", Handle->Name, ((Fail)? "failed" : "closed") );
|
LogMessage( dlMedium, "%s: Handle '%s' - %s, invalid Handle type", Name, Handle->Name, ((Fail)? "failed" : "closed") );
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
// Remove from Select List
|
// Remove from Select List
|
||||||
if (!Fail && Select) {
|
if (!Fail && Select) {
|
||||||
@@ -770,10 +741,7 @@ bool CSelectableCore::Read( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log Read Event
|
// Log Read Event
|
||||||
if (DebugLevel >= dlMedium) {
|
LogMessage( dlHigh, "%s: Handle '%s' - Read Event", Name, Handle->Name );
|
||||||
sprintf( LogStr, "Handle '%s' - Read Event", Handle->Name );
|
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for closing/opening event on Socket
|
// Check for closing/opening event on Socket
|
||||||
if (Handle->Type == ctServer)
|
if (Handle->Type == ctServer)
|
||||||
@@ -824,7 +792,7 @@ bool CSelectableCore::Read( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read File directly into buffer
|
// Read File directly into buffer
|
||||||
if (!(BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD ))) {
|
if (!Handle->InBuffer || !(BytesRead = Handle->InBuffer->ReadFromFD( Handle->FD ))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -850,10 +818,7 @@ bool CSelectableCore::Write( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log Read Event
|
// Log Read Event
|
||||||
if (DebugLevel >= dlMedium) {
|
LogMessage( dlHigh, "%s: Handle '%s' - Write Event", Name, Handle->Name );
|
||||||
sprintf( LogStr, "Handle '%s' - Write Event", Handle->Name );
|
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Handle->State == csWaitingtoOpen)
|
if (Handle->State == csWaitingtoOpen)
|
||||||
{
|
{
|
||||||
@@ -879,9 +844,8 @@ bool CSelectableCore::Write( THandle * Handle )
|
|||||||
{
|
{
|
||||||
if (DebugLevel >= dlHigh) {
|
if (DebugLevel >= dlHigh) {
|
||||||
// Show event
|
// Show event
|
||||||
Len = Handle->InBuffer->Peek( &Data );
|
Len = Handle->OutBuffer->Peek( &Data );
|
||||||
sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
||||||
ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update Buffer
|
// Update Buffer
|
||||||
@@ -920,7 +884,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force )
|
|||||||
char HeadStr[50];
|
char HeadStr[50];
|
||||||
|
|
||||||
// Check if buffered data
|
// Check if buffered data
|
||||||
if (!Handle || !Handle->InBuffer->Len()) {
|
if (!Handle || !Handle->InBuffer || !Handle->InBuffer->Len()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -928,11 +892,8 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force )
|
|||||||
if (Force)
|
if (Force)
|
||||||
{
|
{
|
||||||
// Show Packet
|
// Show Packet
|
||||||
if (DebugLevel >= dlHigh) {
|
Len = Handle->InBuffer->Peek( &Data );
|
||||||
Len = Handle->InBuffer->Peek( &Data );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - IN-F:", Name, Handle->Name );
|
||||||
sprintf( HeadStr, "%s: Handle '%s' - IN-F:", Name, Handle->Name );
|
|
||||||
ShowOutput( HeadStr, dlHigh, OUT_NORMAL, Data, Len );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write buffer to Outputs
|
// Write buffer to Outputs
|
||||||
if (Handle->Type == ctRemoteClient) {
|
if (Handle->Type == ctRemoteClient) {
|
||||||
@@ -961,11 +922,9 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force )
|
|||||||
// Search for end of packet marker
|
// Search for end of packet marker
|
||||||
while (Handle->InBuffer->FindStr( Handle->InMarker, Handle->InMarkerLen, Pos ))
|
while (Handle->InBuffer->FindStr( Handle->InMarker, Handle->InMarkerLen, Pos ))
|
||||||
{
|
{
|
||||||
if (DebugLevel >= dlHigh) {
|
// Show Packet
|
||||||
// Show Packet
|
Len = Handle->InBuffer->Peek( &Data, 0, Pos+1 );
|
||||||
Len = Handle->InBuffer->Peek( &Data, 0, Pos+1 );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - IN-M:", Name, Handle->Name );
|
||||||
ShowOutput( HeadStr, dlHigh, OUT_NORMAL, Data, Len );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write buffer to Outputs
|
// Write buffer to Outputs
|
||||||
if (Handle->Type == ctRemoteClient) {
|
if (Handle->Type == ctRemoteClient) {
|
||||||
@@ -1035,6 +994,7 @@ int CSelectableCore::WriteToFD( int FD, const char * Data, int Len )
|
|||||||
{
|
{
|
||||||
// Read from file descriptor
|
// Read from file descriptor
|
||||||
BytesWritten = write( FD, Data, DataRemain );
|
BytesWritten = write( FD, Data, DataRemain );
|
||||||
|
//write( FD, "\n", 1 );
|
||||||
if (BytesWritten <= 0)
|
if (BytesWritten <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1065,15 +1025,12 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len )
|
|||||||
if (!(Handle = GetHandle( IOName )))
|
if (!(Handle = GetHandle( IOName )))
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "%s: Local IO '%s' - Input rejected, Input not found", Name, IOName );
|
LogMessage( dlHigh, "%s: Local IO '%s' - Input rejected, Input not found", Name, IOName );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "%s: LocalIO '%s' - IN:", Name, IOName );
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: LocalIO '%s' - IN:", Name, IOName );
|
||||||
ShowOutput( LogStr, dlMedium, OUT_NORMAL, Data, Len );
|
|
||||||
|
|
||||||
if (Handle->Type == ctServer)
|
if (Handle->Type == ctServer)
|
||||||
{
|
{
|
||||||
@@ -1097,11 +1054,8 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (DebugLevel >= dlHigh) {
|
// Show event
|
||||||
// Show event
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name );
|
||||||
sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
|
||||||
ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write directly to handle
|
// Write directly to handle
|
||||||
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len );
|
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len );
|
||||||
@@ -1129,11 +1083,8 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (DebugLevel >= dlHigh) {
|
// Show event
|
||||||
// Show event
|
ShowOutput( dlHigh, OUT_NORMAL, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
||||||
sprintf( LogStr, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
|
||||||
ShowOutput( LogStr, dlHigh, OUT_NORMAL, Data, Len );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write directly to handle
|
// Write directly to handle
|
||||||
BytesWritten = WriteToFD( Handle->FD, Data, Len );
|
BytesWritten = WriteToFD( Handle->FD, Data, Len );
|
||||||
@@ -1149,10 +1100,18 @@ bool CSelectableCore::Process()
|
|||||||
THandle * Handle = NULL;
|
THandle * Handle = NULL;
|
||||||
long Duration = 0;
|
long Duration = 0;
|
||||||
|
|
||||||
// Check all Input buffers
|
// Check all handles
|
||||||
Handle = FirstHandle;
|
Handle = FirstHandle;
|
||||||
while (Handle)
|
while (Handle)
|
||||||
{
|
{
|
||||||
|
// Auto manage handles
|
||||||
|
if (Handle->Auto && ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed)))
|
||||||
|
{
|
||||||
|
// Reopen handle
|
||||||
|
Open( Handle );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Input buffers
|
||||||
if (Handle->InBuffer && (Handle->InBuffer->Len() > 0))
|
if (Handle->InBuffer && (Handle->InBuffer->Len() > 0))
|
||||||
{
|
{
|
||||||
// Check duration since last PortIn
|
// Check duration since last PortIn
|
||||||
@@ -1307,15 +1266,13 @@ bool CSelectableCore::SerialConfig( THandle * Handle, int Baud, short DataBits,
|
|||||||
if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0)
|
if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Port not configured", Handle->Name );
|
LogMessage( dlMedium, "%s: Handle '%s' - Port not configured", Name, Handle->Name );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Port configured
|
// Port configured
|
||||||
// Log event
|
// Log event
|
||||||
sprintf( LogStr, "Handle '%s' - Port configured", Handle->Name );
|
LogMessage( dlMedium, "%s: Handle '%s' - Port configured", Name, Handle->Name );
|
||||||
LogMessage( Name, dlMedium, LogStr );
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ struct SHandle {
|
|||||||
|
|
||||||
int FD;
|
int FD;
|
||||||
EConnectState State;
|
EConnectState State;
|
||||||
|
bool Auto;
|
||||||
|
|
||||||
// Buffers
|
// Buffers
|
||||||
CBuffer * InBuffer;
|
CBuffer * InBuffer;
|
||||||
@@ -168,6 +169,7 @@ protected:
|
|||||||
virtual int OpenClientSocket( THandle * Handle );
|
virtual int OpenClientSocket( THandle * Handle );
|
||||||
|
|
||||||
// Mutual Operations
|
// Mutual Operations
|
||||||
|
virtual int Open( THandle * Handle );
|
||||||
virtual bool Close( THandle * Handle, bool CloseChildren = false );
|
virtual bool Close( THandle * Handle, bool CloseChildren = false );
|
||||||
virtual bool Read( THandle * Handle );
|
virtual bool Read( THandle * Handle );
|
||||||
virtual bool Write( THandle * Handle );
|
virtual bool Write( THandle * Handle );
|
||||||
@@ -202,7 +204,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
THandle * CreateHandle( const char * HandleName, bool CreateIO = false );
|
THandle * CreateHandle( const char * HandleName, bool CreateIO, bool AutoManage );
|
||||||
bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
|
bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
|
||||||
bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait );
|
bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait );
|
||||||
|
|
||||||
@@ -212,16 +214,16 @@ public:
|
|||||||
bool ClearHandle( THandle * Handle );
|
bool ClearHandle( THandle * Handle );
|
||||||
|
|
||||||
// FD operations
|
// FD operations
|
||||||
virtual int Open( const char * HandleName );
|
inline virtual int Open( const char * HandleName ) { return (Open( GetHandle( HandleName ))); };
|
||||||
|
|
||||||
virtual bool Close( const char * HandleName, bool CloseChildren = false ) { return (Close( GetHandle( HandleName ), CloseChildren )); };
|
inline virtual bool Close( const char * HandleName, bool CloseChildren = false ) { return (Close( GetHandle( HandleName ), CloseChildren )); };
|
||||||
virtual bool Close( int FD, bool CloseChildren = false ) { return (Close( GetHandle( FD ), CloseChildren )); };
|
inline virtual bool Close( int FD, bool CloseChildren = false ) { return (Close( GetHandle( FD ), CloseChildren )); };
|
||||||
|
|
||||||
virtual bool Read( const char * HandleName ) { return (Read( GetHandle( HandleName ))); };
|
inline virtual bool Read( const char * HandleName ) { return (Read( GetHandle( HandleName ))); };
|
||||||
virtual bool Read( int FD ) { return (Read( GetHandle( FD ))); };
|
inline virtual bool Read( int FD ) { return (Read( GetHandle( FD ))); };
|
||||||
|
|
||||||
virtual bool Write( const char * HandleName ) { return (Write( GetHandle( HandleName ))); };
|
inline virtual bool Write( const char * HandleName ) { return (Write( GetHandle( HandleName ))); };
|
||||||
virtual bool Write( int FD ) { return (Write( GetHandle( FD ))); };
|
inline virtual bool Write( int FD ) { return (Write( GetHandle( FD ))); };
|
||||||
|
|
||||||
// Function Interface
|
// Function Interface
|
||||||
virtual int Input( const char *IOName, const char * Buffer, int BufLen = -1 );
|
virtual int Input( const char *IOName, const char * Buffer, int BufLen = -1 );
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ void ConfigureSignalHandlers()
|
|||||||
void SignalTerminate( int sig )
|
void SignalTerminate( int sig )
|
||||||
{
|
{
|
||||||
char SigName[10];
|
char SigName[10];
|
||||||
char LogMsg[200];
|
|
||||||
|
|
||||||
// Determine signal name
|
// Determine signal name
|
||||||
switch (sig)
|
switch (sig)
|
||||||
@@ -88,21 +87,16 @@ void SignalTerminate( int sig )
|
|||||||
std::cerr << "\r\n" << ProcessName << ": ***********************************\n";
|
std::cerr << "\r\n" << ProcessName << ": ***********************************\n";
|
||||||
|
|
||||||
// Create Log Entry
|
// Create Log Entry
|
||||||
sprintf( LogMsg, " ** %s signal received [%d] **", SigName, TermCount );
|
LogMessage( dlNone, "%s: ** %s signal received [%d] **", ProcessName, SigName, TermCount );
|
||||||
LogMessage( ProcessName, dlNone, LogMsg );//, ltDefault, -1 );
|
|
||||||
|
|
||||||
if (TermCount < MaxTermCount)
|
if (TermCount < MaxTermCount)
|
||||||
{
|
LogMessage( dlNone, "%s: ** Terminating normally... **", ProcessName );
|
||||||
std::cerr << ProcessName << ": ** Terminating normally... **\n";
|
|
||||||
std::cerr << ProcessName << ": ***********************************\n\n";
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
LogMessage( dlNone, "%s: ** Terminating immediately! **", ProcessName );
|
||||||
std::cerr << ProcessName << ": ** Terminating immediately! **\n";
|
|
||||||
std::cerr << ProcessName << ": ***********************************\n\n";
|
|
||||||
|
|
||||||
|
std::cerr << ProcessName << ": ***********************************\n\n";
|
||||||
|
|
||||||
|
if (TermCount >= MaxTermCount)
|
||||||
exit( sig );
|
exit( sig );
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}//---------------------------------------------------------------------------
|
}//---------------------------------------------------------------------------
|
||||||
@@ -111,7 +105,6 @@ void SignalTerminate( int sig )
|
|||||||
void SignalAbort( int sig )
|
void SignalAbort( int sig )
|
||||||
{
|
{
|
||||||
char SigName[10];
|
char SigName[10];
|
||||||
char LogMsg[200];
|
|
||||||
|
|
||||||
// Determine Signal name
|
// Determine Signal name
|
||||||
switch (sig)
|
switch (sig)
|
||||||
@@ -128,10 +121,9 @@ void SignalAbort( int sig )
|
|||||||
std::cerr << "\n" << ProcessName << ": ********************************\n";
|
std::cerr << "\n" << ProcessName << ": ********************************\n";
|
||||||
|
|
||||||
// Create Log Entry - but don't post
|
// Create Log Entry - but don't post
|
||||||
sprintf( LogMsg, " ** %s signal received **", SigName );
|
LogMessage( dlNone, "%s: ** %s signal received **", ProcessName, SigName );
|
||||||
LogMessage( ProcessName, dlNone, LogMsg );//, ltDefault, -1 );
|
LogMessage( dlNone, "%s: ** Terminating immediately! **", ProcessName );
|
||||||
|
|
||||||
std::cerr << ProcessName << ": ** Terminating immediately! **\n";
|
|
||||||
std::cerr << ProcessName << ": ********************************\n\n";
|
std::cerr << ProcessName << ": ********************************\n\n";
|
||||||
|
|
||||||
// Terminate with signal
|
// Terminate with signal
|
||||||
|
|||||||
Reference in New Issue
Block a user