X-Git-Url: https://git.syn-net.org/debian/?p=anytun.git;a=blobdiff_plain;f=src%2FsignalController.h;h=fa5f0fb21711eaca51a13839611406f1e18b4bdd;hp=6108bea9bae1804addbe40b4a9966b023b125c5a;hb=ece844834d2cecc028ce81ca283f5d441088580e;hpb=bb834fe0ed7a38b724f49b944adb801634eb6194 diff --git a/src/signalController.h b/src/signalController.h index 6108bea..fa5f0fb 100644 --- a/src/signalController.h +++ b/src/signalController.h @@ -35,138 +35,37 @@ #include #include +#include #include "threadUtils.hpp" -#ifndef _MSC_VER -#include +#ifdef WIN_SERVICE +//#include "win32/winService.h" +class WinService; +typedef WinService DaemonService; +#else +class DaemonService; #endif #define SIGERROR -1 +#define SIGUNKNOWN -2 -class SignalHandler -{ -public: - virtual ~SignalHandler() {} - - virtual int handle() { return 0; } - virtual int handle(const std::string& msg) { return 0; } - -protected: - SignalHandler(int s) : sigNum(s) {} - -private: - int sigNum; - friend class SignalController; -}; - -class SigErrorHandler : public SignalHandler -{ -public: - SigErrorHandler() : SignalHandler(SIGERROR) {} - int handle(const std::string& msg); -}; - -#ifndef _MSC_VER -class SigIntHandler : public SignalHandler -{ -public: - SigIntHandler() : SignalHandler(SIGINT) {} - int handle(); -}; - -class SigQuitHandler : public SignalHandler -{ -public: - SigQuitHandler() : SignalHandler(SIGQUIT) {} - int handle(); -}; - -class SigHupHandler : public SignalHandler -{ -public: - SigHupHandler() : SignalHandler(SIGHUP) {} - int handle(); -}; - -class SigUsr1Handler : public SignalHandler -{ -public: - SigUsr1Handler() : SignalHandler(SIGUSR1) {} - int handle(); -}; - -class SigUsr2Handler : public SignalHandler -{ -public: - SigUsr2Handler() : SignalHandler(SIGUSR2) {} - int handle(); -}; - -class SigTermHandler : public SignalHandler -{ -public: - SigTermHandler() : SignalHandler(SIGTERM) {} - int handle(); -}; - -#else - -class CtrlCHandler : public SignalHandler -{ -public: - CtrlCHandler() : SignalHandler(CTRL_C_EVENT) {} - int handle(); -}; - -class CtrlBreakHandler : public SignalHandler -{ -public: - CtrlBreakHandler() : SignalHandler(CTRL_BREAK_EVENT) {} - int handle(); -}; - -class CtrlCloseHandler : public SignalHandler -{ -public: - CtrlCloseHandler() : SignalHandler(CTRL_BREAK_EVENT) {} - int handle(); -}; - -class CtrlLogoffHandler : public SignalHandler -{ -public: - CtrlLogoffHandler() : SignalHandler(CTRL_BREAK_EVENT) {} - int handle(); -}; - -class CtrlShutdownHandler : public SignalHandler -{ -public: - CtrlShutdownHandler() : SignalHandler(CTRL_BREAK_EVENT) {} - int handle(); -}; -#endif +typedef boost::function SignalHandler; +typedef enum { CALLB_RUNNING, CALLB_STOPPING } CallbackType; +typedef boost::function ServiceCallback; class SignalController { public: static SignalController& instance(); -#ifndef _MSC_VER - void handle(); -#else - static bool handle(DWORD ctrlType); -#endif - void init(); + void init(DaemonService& service); int run(); void inject(int sig, const std::string& msg = ""); private: - typedef std::map HandlerMap; - SignalController() {}; - ~SignalController(); + ~SignalController() {}; SignalController(const SignalController &s); void operator=(const SignalController &s); @@ -185,7 +84,12 @@ private: Mutex sigQueueMutex; Semaphore sigQueueSem; + typedef std::map HandlerMap; HandlerMap handler; + typedef std::map CallbackMap; + CallbackMap callbacks; + + friend void registerSignalHandler(SignalController& ctrl, DaemonService& service); }; extern SignalController& gSignalController;