Windows service works now!
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user