diff --git a/CMakeLists.txt b/CMakeLists.txt index f78cffb..fa308e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,3 @@ PROJECT(lib_redAcore) -ADD_LIBRARY(redAcore LogCore.cpp TimingCore.cpp PortCore.cpp SocketCore.cpp SelectCore.cpp) +ADD_LIBRARY(redAcore LogCore.cpp SignalCore.cpp TimingCore.cpp PortCore.cpp SocketCore.cpp SelectCore.cpp) diff --git a/LogCore.cpp b/LogCore.cpp index 54b3fd1..1acc8ee 100644 --- a/LogCore.cpp +++ b/LogCore.cpp @@ -13,10 +13,31 @@ #include #include #include -#include //--------------------------------------------------------------------------- +// Global vars +char ProcessName[20] = "Connect"; + +//--------------------------------------------------------------------------- + +bool LogMessage( const char * Heading, const char *Message ) +{ + // Validate values + if (!Message) + return false; + + // Show normal output + if (!Heading) { + printf( "%s\n", Message ); + } + else { + printf( "%s: %s\n", Heading, Message ); + } + return true; +} +//--------------------------------------------------------------------------- + bool ShowOutput( const char * Heading, const short Show, const char * Buffer, int Len ) { // Validate values @@ -60,4 +81,3 @@ bool ShowOutput( const char * Heading, const short Show, const char * Buffer, in return true; } //--------------------------------------------------------------------------- - diff --git a/LogCore.h b/LogCore.h index 96fa25f..a0b2b8d 100644 --- a/LogCore.h +++ b/LogCore.h @@ -5,8 +5,8 @@ * Author: wentzelc */ -#ifndef LOGCORE_H_ -#define LOGCORE_H_ +#ifndef REDACORE_LOGCORE_H_ +#define REDACORE_LOGCORE_H_ // redA Libraries /* none */ @@ -25,8 +25,10 @@ const short //--------------------------------------------------------------------------- +bool LogMessage( const char * Heading, const char * Message ); + bool ShowOutput( const char * Heading, const short Show, const char * Buffer, int Len = -1 ); //--------------------------------------------------------------------------- -#endif /* LOGCORE_H_ */ +#endif /* REDACORE_OGCORE_H_ */ diff --git a/PortCore.h b/PortCore.h index b5fe0e9..ddd09b3 100644 --- a/PortCore.h +++ b/PortCore.h @@ -5,8 +5,8 @@ * Author: wentzelc */ -#ifndef PORTCORE_H_ -#define PORTCORE_H_ +#ifndef REDACORE_PORTCORE_H_ +#define REDACORE_PORTCORE_H_ // redA Libraries /* none */ @@ -60,4 +60,4 @@ public: }; //--------------------------------------------------------------------------- -#endif /* PORTCORE_H_ */ +#endif /* REDACORE_PORTCORE_H_ */ diff --git a/SelectCore.h b/SelectCore.h index 858cc00..d346b0a 100644 --- a/SelectCore.h +++ b/SelectCore.h @@ -5,8 +5,8 @@ * Author: wentzelc */ -#ifndef SELECTCORE_H_ -#define SELECTCORE_H_ +#ifndef REDACORE_SELECTCORE_H_ +#define REDACORE_SELECTCORE_H_ // redA Libraries /* none */ @@ -25,4 +25,4 @@ bool SelectCheck( int FD, bool &Read, bool &Write ); //--------------------------------------------------------------------------- -#endif /* SELECTCORE_H_ */ +#endif /* REDACORE_SELECTCORE_H_ */ diff --git a/SignalCore.cpp b/SignalCore.cpp new file mode 100644 index 0000000..10082f7 --- /dev/null +++ b/SignalCore.cpp @@ -0,0 +1,129 @@ +/* + * SignalCore.cpp + * + * Created on: 17 May 2016 + * Author: wentzelc + */ + +// redA Libraries +#include "SignalCore.h" +#include "LogCore.h" + +// Standard C/C++ Libraries +#include +#include +#include +#include + +#include + +//--------------------------------------------------------------------------- + +// Global vars +extern char ProcessName[]; +extern bool Terminate; + +//--------------------------------------------------------------------------- + +// Configure Signal handling +void ConfigureSignalHandlers() +{ + struct sigaction TermAct; + struct sigaction AbortAct; + + // Signals to be ignored + signal( SIGCHLD, SIG_IGN ); + + // Signals for normal termination + TermAct.sa_handler = SignalTerminate; + sigemptyset( &TermAct.sa_mask ); + TermAct.sa_flags = SA_RESTART; + + sigaction( SIGHUP, &TermAct, 0 ); + sigaction( SIGINT, &TermAct, 0 ); + sigaction( SIGQUIT, &TermAct, 0 ); + sigaction( SIGTERM, &TermAct, 0 ); + sigaction( SIGTSTP, &TermAct, 0 ); + + // Signals for immediate termination + AbortAct.sa_handler = SignalAbort; + sigemptyset( &AbortAct.sa_mask ); + AbortAct.sa_flags = 0; + + sigaction( SIGABRT, &AbortAct, 0 ); + sigaction( SIGFPE, &AbortAct, 0 ); + sigaction( SIGILL, &AbortAct, 0 ); + sigaction( SIGPIPE, &AbortAct, 0 ); + sigaction( SIGSEGV, &AbortAct, 0 ); +} +//--------------------------------------------------------------------------- + +// Signal handler to terminate program the standard way +void SignalTerminate( int sig ) +{ + char SigName[10]; + char LogMsg[200]; + + // Determine signal name + switch (sig) + { + case SIGHUP : strcpy( SigName, "SIGHUP " ); break; + case SIGINT : strcpy( SigName, "SIGINT " ); break; + case SIGQUIT : strcpy( SigName, "SIGQUIT" ); break; + case SIGTERM : strcpy( SigName, "SIGTERM" ); break; + case SIGTSTP : strcpy( SigName, "SIGTSTP" ); break; + default : strcpy( SigName, "UNKNOWN" ); break; + } + + // Show signal received if not already terminated + std::cerr << "\r\n" << ProcessName << ": *****************************************\n"; + + // Create Log Entry + sprintf( LogMsg, " ** Terminate signal received (%s) **", SigName ); + LogMessage( ProcessName, LogMsg );//, ltDefault, -1 ); + + std::cerr << ProcessName << ": ** Terminating normally... **\n"; + std::cerr << ProcessName << ": *****************************************\n\n"; + + // Allow process to terminate normally + Terminate = true; + + return; +}//--------------------------------------------------------------------------- + +// Signal Handler to terminate program immediately +void SignalAbort( int sig ) +{ + char SigName[10]; + char LogMsg[200]; + + // Determine Signal name + switch (sig) + { + case SIGABRT : strcpy( SigName, "SIGABRT" ); break; + case SIGFPE : strcpy( SigName, "SIGFPE " ); break; + case SIGILL : strcpy( SigName, "SIGILL " ); break; + case SIGPIPE : strcpy( SigName, "SIGPIPE" ); break; + case SIGSEGV : strcpy( SigName, "SIGSEGV" ); break; + default : strcpy( SigName, "UNKNOWN" ); break; + } + + // Show signal received + std::cerr << "\n" << ProcessName << ": *************************************\n"; + + // Create Log Entry - but don't post + sprintf( LogMsg, " ** Abort signal received (%s) **", SigName ); + LogMessage( ProcessName, LogMsg );//, ltDefault, -1 ); + + std::cerr << ProcessName << ": ** Terminating immediately! **\n"; + std::cerr << ProcessName << ": *************************************\n\n"; + + // Try to stop communications +// if (SocketManager) +// delete SocketManager; + + // Terminate with signal + exit( sig ); +} +//--------------------------------------------------------------------------- + diff --git a/SignalCore.h b/SignalCore.h new file mode 100644 index 0000000..1df30a4 --- /dev/null +++ b/SignalCore.h @@ -0,0 +1,23 @@ +/* + * SignalCore.h + * + * Created on: 17 May 2016 + * Author: wentzelc + */ + +#ifndef REDACORE_SIGNALCORE_H_ +#define REDACORE_SIGNALCORE_H_ + +// redA Libraries +/* none */ + +// Standard C/C++ Libraries +/* none */ + +//--------------------------------------------------------------------------- +void ConfigureSignalHandlers(); +void SignalTerminate( int sig ); +void SignalAbort( int sig ); + +//--------------------------------------------------------------------------- +#endif /* REDACORE_SIGNALCORE_H_ */ diff --git a/SocketCore.h b/SocketCore.h index 83da6bc..bb5f581 100644 --- a/SocketCore.h +++ b/SocketCore.h @@ -5,8 +5,8 @@ * Author: wentzelc */ -#ifndef SOCKETCORE_H_ -#define SOCKETCORE_H_ +#ifndef REDACORE_SOCKETCORE_H_ +#define REDACORE_SOCKETCORE_H_ // redA Libraries /* none */ @@ -39,4 +39,4 @@ bool MaintainSocket( int PortHandle ); //--------------------------------------------------------------------------- -#endif /* SOCKETCORE_H_ */ +#endif /* REDACORE_SOCKETCORE_H_ */ diff --git a/TimingCore.h b/TimingCore.h index b6df75d..bd2fe31 100644 --- a/TimingCore.h +++ b/TimingCore.h @@ -5,8 +5,8 @@ * Author: wentzelc */ -#ifndef TIMINGCORE_H_ -#define TIMINGCORE_H_ +#ifndef REDACORE_TIMINGCORE_H_ +#define REDACORE_TIMINGCORE_H_ // redA Libraries /* none */ @@ -22,4 +22,4 @@ long TimePassed( timeval StartTime ); //--------------------------------------------------------------------------- -#endif /* TIMINGCORE_H_ */ +#endif /* REDACORE_TIMINGCORE_H_ */