diff options
author | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-02-27 16:28:55 -0800 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@zerotier.com> | 2014-02-27 16:28:55 -0800 |
commit | 9d05897f7a3d06f5504b3bb75dd7e822e5faebf9 (patch) | |
tree | 94b4fca19138ef431d547fa9cbee4f429c7b7de9 /windows | |
parent | cbeb9c523644a49abb679bc4c97859238d28da2d (diff) | |
download | infinitytier-9d05897f7a3d06f5504b3bb75dd7e822e5faebf9.tar.gz infinitytier-9d05897f7a3d06f5504b3bb75dd7e822e5faebf9.zip |
Windows service works now!
Diffstat (limited to 'windows')
-rw-r--r-- | windows/ZeroTierOne/ServiceInstaller.cpp | 7 | ||||
-rw-r--r-- | windows/ZeroTierOne/ZeroTierOneService.cpp | 33 | ||||
-rw-r--r-- | windows/ZeroTierOne/ZeroTierOneService.h | 16 |
3 files changed, 51 insertions, 5 deletions
diff --git a/windows/ZeroTierOne/ServiceInstaller.cpp b/windows/ZeroTierOne/ServiceInstaller.cpp index 5945ecdf..d302d9f6 100644 --- a/windows/ZeroTierOne/ServiceInstaller.cpp +++ b/windows/ZeroTierOne/ServiceInstaller.cpp @@ -50,16 +50,19 @@ std::string InstallService(PSTR pszServiceName, PSTR pszPassword) { std::string ret; - char szPath[MAX_PATH]; + char szPathTmp[MAX_PATH],szPath[MAX_PATH]; SC_HANDLE schSCManager = NULL; SC_HANDLE schService = NULL; - if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0) + if (GetModuleFileName(NULL, szPathTmp, ARRAYSIZE(szPath)) == 0) { ret = "GetModuleFileName failed, unable to get path to self"; goto Cleanup; } + // Quote path in case it contains spaces + _snprintf_s(szPath,sizeof(szPath),"\"%s\"",szPathTmp); + // Open the local default service control manager database schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE); diff --git a/windows/ZeroTierOne/ZeroTierOneService.cpp b/windows/ZeroTierOne/ZeroTierOneService.cpp index daff0bb0..364e93cb 100644 --- a/windows/ZeroTierOne/ZeroTierOneService.cpp +++ b/windows/ZeroTierOne/ZeroTierOneService.cpp @@ -36,19 +36,44 @@ #include "../../node/Utils.hpp" #pragma endregion +#ifdef ZT_DEBUG_SERVICE +FILE *SVCDBGfile = (FILE *)0; +ZeroTier::Mutex SVCDBGfile_m; +#endif + ZeroTierOneService::ZeroTierOneService() : CServiceBase(ZT_SERVICE_NAME,TRUE,TRUE,FALSE), _node((ZeroTier::Node *)0) { +#ifdef ZT_DEBUG_SERVICE + SVCDBGfile_m.lock(); + if (!SVCDBGfile) + SVCDBGfile = fopen(ZT_DEBUG_SERVICE,"a"); + SVCDBGfile_m.unlock(); +#endif + + ZT_SVCDBG("ZeroTierOneService::ZeroTierOneService()\r\n"); } ZeroTierOneService::~ZeroTierOneService(void) { + ZT_SVCDBG("ZeroTierOneService::~ZeroTierOneService()\r\n"); + +#ifdef ZT_DEBUG_SERVICE + SVCDBGfile_m.lock(); + if (SVCDBGfile) { + fclose(SVCDBGfile); + SVCDBGfile = (FILE *)0; + } + SVCDBGfile_m.unlock(); +#endif } void ZeroTierOneService::threadMain() throw() { + ZT_SVCDBG("ZeroTierOneService::threadMain()\r\n"); + restart_node: try { { @@ -144,8 +169,8 @@ bool ZeroTierOneService::doStartUpgrade(const std::string &msiPath) void ZeroTierOneService::OnStart(DWORD dwArgc, LPSTR *lpszArgv) { - if (_node) - return; // sanity check + ZT_SVCDBG("ZeroTierOneService::OnStart()\r\n"); + try { _thread = ZeroTier::Thread::start(this); } catch ( ... ) { @@ -155,6 +180,8 @@ void ZeroTierOneService::OnStart(DWORD dwArgc, LPSTR *lpszArgv) void ZeroTierOneService::OnStop() { + ZT_SVCDBG("ZeroTierOneService::OnStop()\r\n"); + _lock.lock(); ZeroTier::Node *n = _node; _lock.unlock(); @@ -166,6 +193,8 @@ void ZeroTierOneService::OnStop() void ZeroTierOneService::OnShutdown() { + ZT_SVCDBG("ZeroTierOneService::OnShutdown()\r\n"); + // stop thread on system shutdown (if it hasn't happened already) OnStop(); } diff --git a/windows/ZeroTierOne/ZeroTierOneService.h b/windows/ZeroTierOne/ZeroTierOneService.h index 042a398a..2f6f733d 100644 --- a/windows/ZeroTierOne/ZeroTierOneService.h +++ b/windows/ZeroTierOne/ZeroTierOneService.h @@ -27,6 +27,8 @@ #pragma once +#include <stdio.h> + #include "ServiceBase.h" #include <string> @@ -37,11 +39,23 @@ #include "../../node/Mutex.hpp" #include "../../node/Utils.hpp" +// Uncomment to make debugging Windows services suck slightly less hard. +//#define ZT_DEBUG_SERVICE "C:\\ZeroTierOneServiceDebugLog.txt" + +#ifdef ZT_DEBUG_SERVICE +extern FILE *SVCDBGfile; +extern ZeroTier::Mutex SVCDBGfile_m; +#define ZT_SVCDBG(f,...) { SVCDBGfile_m.lock(); fprintf(SVCDBGfile,f,##__VA_ARGS__); fflush(SVCDBGfile); SVCDBGfile_m.unlock(); } +#else +#define ZT_SVCDBG(f,...) {} +#endif + #define ZT_SERVICE_NAME "ZeroTierOneService" #define ZT_SERVICE_DISPLAY_NAME "ZeroTier One" #define ZT_SERVICE_START_TYPE SERVICE_AUTO_START #define ZT_SERVICE_DEPENDENCIES "" -#define ZT_SERVICE_ACCOUNT "NT AUTHORITY\\LocalService" +//#define ZT_SERVICE_ACCOUNT "NT AUTHORITY\\LocalService" +#define ZT_SERVICE_ACCOUNT NULL #define ZT_SERVICE_PASSWORD NULL class ZeroTierOneService : public CServiceBase |