#ifdef WIN_SERVICE
#include "../threadUtils.hpp"
+#include "../signalController.h"
class WinService
{
public:
- static WinService& instance();
#define SVC_NAME "anytun"
static void install();
static void uninstall();
static void start();
- void waitForStop();
- void stop();
-
static VOID WINAPI main(DWORD dwArgc, LPTSTR *lpszArgv);
static VOID WINAPI ctrlHandler(DWORD dwCtrl);
+
+ void reportStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode);
+ int handleCtrlSignal(int sig, const std::string& msg);
+
+ void initPrivs(std::string const& username, std::string const& groupname);
+ void dropPrivs();
+ void chroot(std::string const& dir);
+ void daemonize();
+ bool isDaemonized();
+
private:
- WinService() : started_(false) {};
- ~WinService();
+ WinService() {};
+ ~WinService() {};
WinService(const WinService &w);
void operator=(const WinService &w);
- void reportStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint=0);
-
- static WinService* inst;
- static Mutex instMutex;
- class instanceCleaner {
- public: ~instanceCleaner() {
- if(WinService::inst != NULL)
- delete WinService::inst;
- }
- };
- friend class instanceCleaner;
-
- bool started_;
SERVICE_STATUS status_;
SERVICE_STATUS_HANDLE status_handle_;
- HANDLE stop_event_;
};
-extern WinService& gWinService;
+typedef WinService DaemonService;
#endif