diff options
| author | Joseph Henry <[email protected]> | 2016-07-25 18:07:43 -0700 |
|---|---|---|
| committer | Joseph Henry <[email protected]> | 2016-07-25 18:07:43 -0700 |
| commit | a1fcd50be8716bbb1bace7f402daa6c913375141 (patch) | |
| tree | 9f789a4eb2b150c5bd3b8ece6f72f05f5594bfc5 /zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp | |
| parent | a933232ef203704a14195801fdeb02af97b89fab (diff) | |
re-added zto dir with no git info0.3.0
Diffstat (limited to 'zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp')
| -rw-r--r-- | zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp b/zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp new file mode 100644 index 0000000..8e0b9c3 --- /dev/null +++ b/zerotierone/windows/ZeroTierOne/ZeroTierOneService.cpp @@ -0,0 +1,157 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma region Includes + +#include <WinSock2.h> +#include <Windows.h> +#include <stdio.h> +#include <stdlib.h> + +#include "ZeroTierOneService.h" + +#include "../../version.h" +#include "../../include/ZeroTierOne.h" + +#include "../../node/Constants.hpp" +#include "../../node/Utils.hpp" +#include "../../osdep/OSUtils.hpp" +#include "../../service/OneService.hpp" + +#pragma endregion // Includes + +#ifdef ZT_DEBUG_SERVICE +FILE *SVCDBGfile = (FILE *)0; +ZeroTier::Mutex SVCDBGfile_m; +#endif + +ZeroTierOneService::ZeroTierOneService() : + CServiceBase(ZT_SERVICE_NAME,TRUE,TRUE,FALSE), + _service((ZeroTier::OneService *)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 { + { + ZeroTier::Mutex::Lock _l(_lock); + delete _service; + _service = (ZeroTier::OneService *)0; // in case newInstance() fails + _service = ZeroTier::OneService::newInstance( + ZeroTier::OneService::platformDefaultHomePath().c_str(), + ZT_DEFAULT_PORT); + } + switch(_service->run()) { + case ZeroTier::OneService::ONE_UNRECOVERABLE_ERROR: { + std::string err("ZeroTier One encountered an unrecoverable error: "); + err.append(_service->fatalErrorMessage()); + err.append(" (restarting in 5 seconds)"); + WriteEventLogEntry(const_cast <PSTR>(err.c_str()),EVENTLOG_ERROR_TYPE); + Sleep(5000); + } goto restart_node; + + case ZeroTier::OneService::ONE_IDENTITY_COLLISION: { + std::string homeDir(ZeroTier::OneService::platformDefaultHomePath()); + delete _service; + _service = (ZeroTier::OneService *)0; + std::string oldid; + ZeroTier::OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid); + if (oldid.length()) { + ZeroTier::OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid); + ZeroTier::OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str()); + ZeroTier::OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str()); + } + } goto restart_node; + + default: // normal termination + break; + } + } catch ( ... ) { + // sanity check, shouldn't happen since Node::run() should catch all its own errors + // could also happen if we're out of memory though! + WriteEventLogEntry("unexpected exception (out of memory?) (trying again in 5 seconds)",EVENTLOG_ERROR_TYPE); + Sleep(5000); + goto restart_node; + } + + { + ZeroTier::Mutex::Lock _l(_lock); + delete _service; + _service = (ZeroTier::OneService *)0; + } +} + +void ZeroTierOneService::OnStart(DWORD dwArgc, LPSTR *lpszArgv) +{ + ZT_SVCDBG("ZeroTierOneService::OnStart()\r\n"); + + try { + _thread = ZeroTier::Thread::start(this); + } catch ( ... ) { + throw (DWORD)ERROR_EXCEPTION_IN_SERVICE; + } +} + +void ZeroTierOneService::OnStop() +{ + ZT_SVCDBG("ZeroTierOneService::OnStop()\r\n"); + + _lock.lock(); + ZeroTier::OneService *s = _service; + _lock.unlock(); + + if (s) { + s->terminate(); + ZeroTier::Thread::join(_thread); + } +} + +void ZeroTierOneService::OnShutdown() +{ + ZT_SVCDBG("ZeroTierOneService::OnShutdown()\r\n"); + + // stop thread on system shutdown (if it hasn't happened already) + OnStop(); +} |
