summaryrefslogtreecommitdiff
path: root/windows
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@zerotier.com>2014-02-27 16:28:55 -0800
committerAdam Ierymenko <adam.ierymenko@zerotier.com>2014-02-27 16:28:55 -0800
commit9d05897f7a3d06f5504b3bb75dd7e822e5faebf9 (patch)
tree94b4fca19138ef431d547fa9cbee4f429c7b7de9 /windows
parentcbeb9c523644a49abb679bc4c97859238d28da2d (diff)
downloadinfinitytier-9d05897f7a3d06f5504b3bb75dd7e822e5faebf9.tar.gz
infinitytier-9d05897f7a3d06f5504b3bb75dd7e822e5faebf9.zip
Windows service works now!
Diffstat (limited to 'windows')
-rw-r--r--windows/ZeroTierOne/ServiceInstaller.cpp7
-rw-r--r--windows/ZeroTierOne/ZeroTierOneService.cpp33
-rw-r--r--windows/ZeroTierOne/ZeroTierOneService.h16
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