From 56cfe1d603104784ec40d94d8ac689391ef2e0eb Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 5 Jan 2015 11:47:22 -0800 Subject: [PATCH] Strip out old Service code, add new service message type. --- node/IncomingPacket.cpp | 60 ---------- node/IncomingPacket.hpp | 1 - node/Node.cpp | 109 ------------------ node/Packet.cpp | 1 + node/Packet.hpp | 49 +++++--- node/RuntimeEnvironment.hpp | 7 -- node/Service.cpp | 222 ------------------------------------ node/Service.hpp | 122 -------------------- objects.mk | 1 - 9 files changed, 37 insertions(+), 535 deletions(-) delete mode 100644 node/Service.cpp delete mode 100644 node/Service.hpp diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp index c8197eb64..93be95ec1 100644 --- a/node/IncomingPacket.cpp +++ b/node/IncomingPacket.cpp @@ -39,7 +39,6 @@ #include "Switch.hpp" #include "Peer.hpp" #include "NodeConfig.hpp" -#include "Service.hpp" #include "SoftwareUpdater.hpp" namespace ZeroTier { @@ -85,7 +84,6 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR) case Packet::VERB_MULTICAST_LIKE: return _doMULTICAST_LIKE(RR,peer); case Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE: return _doNETWORK_MEMBERSHIP_CERTIFICATE(RR,peer); case Packet::VERB_NETWORK_CONFIG_REQUEST: return _doNETWORK_CONFIG_REQUEST(RR,peer); - case Packet::VERB_NETWORK_CONFIG_REFRESH: return _doNETWORK_CONFIG_REFRESH(RR,peer); case Packet::VERB_MULTICAST_GATHER: return _doMULTICAST_GATHER(RR,peer); case Packet::VERB_MULTICAST_FRAME: return _doMULTICAST_FRAME(RR,peer); } @@ -714,43 +712,6 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,cons { try { uint64_t nwid = at(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_NETWORK_ID); - -#ifndef __WINDOWS__ - if (RR->netconfService) { - char tmp[128]; - unsigned int dictLen = at(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN); - - Dictionary request; - if (dictLen) - request["meta"] = std::string((const char *)field(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT,dictLen),dictLen); - request["type"] = "netconf-request"; - request["peerId"] = peer->identity().toString(false); - Utils::snprintf(tmp,sizeof(tmp),"%.16llx",(unsigned long long)nwid); - request["nwid"] = tmp; - Utils::snprintf(tmp,sizeof(tmp),"%.16llx",(unsigned long long)packetId()); - request["requestId"] = tmp; - if (!hops()) - request["from"] = _remoteAddress.toString(); - //TRACE("to netconf:\n%s",request.toString().c_str()); - RR->netconfService->send(request); - } else { -#endif // !__WINDOWS__ - - // Send unsupported operation if there is no netconf service - // configured on this node (or if this is a Windows machine, - // which doesn't support that at all). - Packet outp(source(),RR->identity.address(),Packet::VERB_ERROR); - outp.append((unsigned char)Packet::VERB_NETWORK_CONFIG_REQUEST); - outp.append(packetId()); - outp.append((unsigned char)Packet::ERROR_UNSUPPORTED_OPERATION); - outp.append(nwid); - outp.armor(peer->key(),true); - _fromSock->send(_remoteAddress,outp.data(),outp.size()); - -#ifndef __WINDOWS__ - } -#endif // !__WINDOWS__ - peer->received(RR,_fromSock,_remoteAddress,hops(),packetId(),Packet::VERB_NETWORK_CONFIG_REQUEST,0,Packet::VERB_NOP,Utils::now()); } catch (std::exception &exc) { TRACE("dropped NETWORK_CONFIG_REQUEST from %s(%s): unexpected exception: %s",source().toString().c_str(),_remoteAddress.toString().c_str(),exc.what()); @@ -760,27 +721,6 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,cons return true; } -bool IncomingPacket::_doNETWORK_CONFIG_REFRESH(const RuntimeEnvironment *RR,const SharedPtr &peer) -{ - try { - unsigned int ptr = ZT_PACKET_IDX_PAYLOAD; - while ((ptr + sizeof(uint64_t)) <= size()) { - uint64_t nwid = at(ptr); ptr += sizeof(uint64_t); - SharedPtr nw(RR->nc->network(nwid)); - if ((nw)&&(source() == nw->controller())) { // only respond to requests from controller - TRACE("NETWORK_CONFIG_REFRESH from %s, refreshing network %.16llx",source().toString().c_str(),nwid); - nw->requestConfiguration(); - } - } - peer->received(RR,_fromSock,_remoteAddress,hops(),packetId(),Packet::VERB_NETWORK_CONFIG_REFRESH,0,Packet::VERB_NOP,Utils::now()); - } catch (std::exception &exc) { - TRACE("dropped NETWORK_CONFIG_REFRESH from %s(%s): unexpected exception: %s",source().toString().c_str(),_remoteAddress.toString().c_str(),exc.what()); - } catch ( ... ) { - TRACE("dropped NETWORK_CONFIG_REFRESH from %s(%s): unexpected exception: (unknown)",source().toString().c_str(),_remoteAddress.toString().c_str()); - } - return true; -} - bool IncomingPacket::_doMULTICAST_GATHER(const RuntimeEnvironment *RR,const SharedPtr &peer) { try { diff --git a/node/IncomingPacket.hpp b/node/IncomingPacket.hpp index 2102d15e7..25c076d42 100644 --- a/node/IncomingPacket.hpp +++ b/node/IncomingPacket.hpp @@ -125,7 +125,6 @@ private: bool _doMULTICAST_LIKE(const RuntimeEnvironment *RR,const SharedPtr &peer); bool _doNETWORK_MEMBERSHIP_CERTIFICATE(const RuntimeEnvironment *RR,const SharedPtr &peer); bool _doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,const SharedPtr &peer); - bool _doNETWORK_CONFIG_REFRESH(const RuntimeEnvironment *RR,const SharedPtr &peer); bool _doMULTICAST_GATHER(const RuntimeEnvironment *RR,const SharedPtr &peer); bool _doMULTICAST_FRAME(const RuntimeEnvironment *RR,const SharedPtr &peer); diff --git a/node/Node.cpp b/node/Node.cpp index 19badced4..58dbc4f05 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -71,7 +71,6 @@ #include "MulticastGroup.hpp" #include "Multicaster.hpp" #include "Mutex.hpp" -#include "Service.hpp" #include "SoftwareUpdater.hpp" #include "Buffer.hpp" #include "AntiRecursion.hpp" @@ -101,9 +100,6 @@ struct _NodeImpl running = false; -#ifndef __WINDOWS__ - delete renv.netconfService; -#endif delete renv.updater; renv.updater = (SoftwareUpdater *)0; delete renv.nc; renv.nc = (NodeConfig *)0; // shut down all networks, close taps, etc. delete renv.topology; renv.topology = (Topology *)0; // now we no longer need routing info @@ -125,93 +121,6 @@ struct _NodeImpl } }; -#ifndef __WINDOWS__ // "services" are not supported on Windows -static void _netconfServiceMessageHandler(void *renv,Service &svc,const Dictionary &msg) -{ - if (!renv) - return; // sanity check - const RuntimeEnvironment *RR = (const RuntimeEnvironment *)renv; - - try { - //TRACE("from netconf:\n%s",msg.toString().c_str()); - const std::string &type = msg.get("type"); - if (type == "ready") { - LOG("received 'ready' from netconf.service, sending netconf-init with identity information..."); - Dictionary initMessage; - initMessage["type"] = "netconf-init"; - initMessage["netconfId"] = RR->identity.toString(true); - RR->netconfService->send(initMessage); - } else if (type == "netconf-response") { - uint64_t inRePacketId = strtoull(msg.get("requestId").c_str(),(char **)0,16); - uint64_t nwid = strtoull(msg.get("nwid").c_str(),(char **)0,16); - Address peerAddress(msg.get("peer").c_str()); - - if (peerAddress) { - if (msg.contains("error")) { - Packet::ErrorCode errCode = Packet::ERROR_INVALID_REQUEST; - const std::string &err = msg.get("error"); - if (err == "OBJ_NOT_FOUND") - errCode = Packet::ERROR_OBJ_NOT_FOUND; - else if (err == "ACCESS_DENIED") - errCode = Packet::ERROR_NETWORK_ACCESS_DENIED_; - - Packet outp(peerAddress,RR->identity.address(),Packet::VERB_ERROR); - outp.append((unsigned char)Packet::VERB_NETWORK_CONFIG_REQUEST); - outp.append(inRePacketId); - outp.append((unsigned char)errCode); - outp.append(nwid); - RR->sw->send(outp,true); - } else if (msg.contains("netconf")) { - const std::string &netconf = msg.get("netconf"); - if (netconf.length() < 2048) { // sanity check - Packet outp(peerAddress,RR->identity.address(),Packet::VERB_OK); - outp.append((unsigned char)Packet::VERB_NETWORK_CONFIG_REQUEST); - outp.append(inRePacketId); - outp.append(nwid); - outp.append((uint16_t)netconf.length()); - outp.append(netconf.data(),netconf.length()); - outp.compress(); - RR->sw->send(outp,true); - } - } - } - } else if (type == "netconf-push") { - if (msg.contains("to")) { - Dictionary to(msg.get("to")); // key: peer address, value: comma-delimited network list - for(Dictionary::iterator t(to.begin());t!=to.end();++t) { - Address ztaddr(t->first); - if (ztaddr) { - Packet outp(ztaddr,RR->identity.address(),Packet::VERB_NETWORK_CONFIG_REFRESH); - - char *saveptr = (char *)0; - // Note: this loop trashes t->second, which is quasi-legal C++ but - // shouldn't break anything as long as we don't try to use 'to' - // for anything interesting after doing this. - for(char *p=Utils::stok(const_cast(t->second.c_str()),",",&saveptr);(p);p=Utils::stok((char *)0,",",&saveptr)) { - uint64_t nwid = Utils::hexStrToU64(p); - if (nwid) { - if ((outp.size() + sizeof(uint64_t)) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) { - RR->sw->send(outp,true); - outp.reset(ztaddr,RR->identity.address(),Packet::VERB_NETWORK_CONFIG_REFRESH); - } - outp.append(nwid); - } - } - - if (outp.payloadLength()) - RR->sw->send(outp,true); - } - } - } - } - } catch (std::exception &exc) { - LOG("unexpected exception parsing response from netconf service: %s",exc.what()); - } catch ( ... ) { - LOG("unexpected exception parsing response from netconf service: unknown exception"); - } -} -#endif // !__WINDOWS__ - Node::Node( const char *hp, EthernetTapFactory *tf, @@ -450,24 +359,6 @@ Node::ReasonForTermination Node::run() return impl->terminateBecause(Node::NODE_UNRECOVERABLE_ERROR,"unknown exception during initialization"); } - // Start external service subprocesses, which is only used by special nodes - // right now and isn't available on Windows. -#ifndef __WINDOWS__ - try { - std::string netconfServicePath(RR->homePath + ZT_PATH_SEPARATOR_S + "services.d" + ZT_PATH_SEPARATOR_S + "netconf.service"); - if (Utils::fileExists(netconfServicePath.c_str())) { - LOG("netconf.d/netconf.service appears to exist, starting..."); - RR->netconfService = new Service(RR,"netconf",netconfServicePath.c_str(),&_netconfServiceMessageHandler,RR); - Dictionary initMessage; - initMessage["type"] = "netconf-init"; - initMessage["netconfId"] = RR->identity.toString(true); - RR->netconfService->send(initMessage); - } - } catch ( ... ) { - LOG("unexpected exception attempting to start services"); - } -#endif - // Core I/O loop try { /* Shut down if this file exists but fails to open. This is used on Mac to diff --git a/node/Packet.cpp b/node/Packet.cpp index e7870a984..c20fac42e 100644 --- a/node/Packet.cpp +++ b/node/Packet.cpp @@ -50,6 +50,7 @@ const char *Packet::verbString(Verb v) case VERB_NETWORK_CONFIG_REFRESH: return "NETWORK_CONFIG_REFRESH"; case VERB_MULTICAST_GATHER: return "MULTICAST_GATHER"; case VERB_MULTICAST_FRAME: return "MULTICAST_FRAME"; + case VERB_SERVICE_MESSAGE: return "SERVICE_MESSAGE"; } return "(unknown)"; } diff --git a/node/Packet.hpp b/node/Packet.hpp index 35cc5c7d2..9b400976b 100644 --- a/node/Packet.hpp +++ b/node/Packet.hpp @@ -55,7 +55,7 @@ * 3 - 0.5.0 ... 0.6.0 * * Yet another multicast redesign * * New crypto completely changes key agreement cipher - * 4 - 0.6.0 ... 0.9.2 + * 4 - 0.6.0 ... CURRENT * * New identity format based on hashcash design * * This isn't going to change again for a long time unless your @@ -722,17 +722,7 @@ public: */ VERB_NETWORK_CONFIG_REQUEST = 11, - /* Network configuration refresh request: - * <[...] array of 64-bit network IDs> - * - * This message can be sent by the network configuration master node - * to request that nodes refresh their network configuration. It can - * thus be used to "push" updates so that network config changes will - * take effect quickly. - * - * It does not generate an OK or ERROR message, and is treated only as - * a hint to refresh now. - */ + /* DEPRECATED -- was never actually used */ VERB_NETWORK_CONFIG_REFRESH = 12, /* Request endpoints for multicast distribution: @@ -812,7 +802,40 @@ public: * <[6] multicast group MAC> * <[4] 32-bit multicast group ADI> */ - VERB_MULTICAST_FRAME = 14 + VERB_MULTICAST_FRAME = 14, + + /* Message or query to a service: + * <[8] 64-bit service identifier> + * <[1] flags> + * [<[...] payload to service>] + * + * Flags are currently unused and must be zero. + * + * Services allow out-of-band extensions to be added to the + * ZeroTier peer-to-peer network without having to mix them + * with the Ethernet virtualization layer. Right now this + * includes the network configuration (netconf) service, and + * in the future could include things like DHTs, caching, + * mesh net functionality, extensions to cryptographic or + * authentication services, remote administration, remote + * debugging, etc. + * + * Service identifiers less than or equal to 0xffff (65535) + * are reserved for use by ZeroTier Networks, with ID 0 being + * the netconf service that provisions and configures virtual + * networks. These IDs should not be used by third party + * developers. IDs above 65535 can be used, and should be + * assigned using something like a cryptographic random number + * generator to minimize the potential for collisions. + * + * OK responses to this message contain the same fields as + * above, and their meaning is service-dependent. + * + * ERROR_UNSUPPORTED_OPERATION may optionally be returned if + * the queried service ID is not available on this node. + * Payload consists of the 64-bit service ID queried. + */ + VERB_SERVICE_MESSAGE = 15 }; /** diff --git a/node/RuntimeEnvironment.hpp b/node/RuntimeEnvironment.hpp index 360524b90..68f61143f 100644 --- a/node/RuntimeEnvironment.hpp +++ b/node/RuntimeEnvironment.hpp @@ -40,7 +40,6 @@ class Logger; class Switch; class Topology; class CMWC4096; -class Service; class Node; class SoftwareUpdater; class SocketManager; @@ -85,9 +84,6 @@ public: nc((NodeConfig *)0), node((Node *)0), updater((SoftwareUpdater *)0) -#ifndef __WINDOWS__ - ,netconfService((Service *)0) -#endif { } @@ -133,9 +129,6 @@ public: NodeConfig *nc; Node *node; SoftwareUpdater *updater; // null if software updates are not enabled -#ifndef __WINDOWS__ - Service *netconfService; // null if no netconf service running -#endif }; } // namespace ZeroTier diff --git a/node/Service.cpp b/node/Service.cpp deleted file mode 100644 index 09d07b08b..000000000 --- a/node/Service.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * ZeroTier One - Global Peer to Peer Ethernet - * Copyright (C) 2011-2014 ZeroTier Networks LLC - * - * 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 . - * - * -- - * - * ZeroTier may be used and distributed under the terms of the GPLv3, which - * are available at: http://www.gnu.org/licenses/gpl-3.0.html - * - * If you would like to embed ZeroTier into a commercial application or - * redistribute it in a modified binary form, please contact ZeroTier Networks - * LLC. Start here: http://www.zerotier.com/ - */ - -#include "Constants.hpp" - -#ifndef __WINDOWS__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Constants.hpp" -#include "Service.hpp" -#include "RuntimeEnvironment.hpp" -#include "Utils.hpp" -#include "Logger.hpp" - -namespace ZeroTier { - -Service::Service(const RuntimeEnvironment *renv,const char *name,const char *path,void (*handler)(void *,Service &,const Dictionary &),void *arg) : - RR(renv), - _path(path), - _name(name), - _arg(arg), - _handler(handler), - _pid(-1), - _childStdin(0), - _childStdout(0), - _childStderr(0), - _run(true) -{ - _thread = Thread::start(this); -} - -Service::~Service() -{ - _run = false; - long pid = _pid; - if (pid > 0) { - int st = 0; - ::kill(pid,SIGTERM); - for(int i=0;i<20;++i) { - if (waitpid(pid,&st,WNOHANG) == pid) { - pid = 0; - break; - } - Thread::sleep(100); - } - if (pid > 0) { - ::kill(pid,SIGKILL); - waitpid(pid,&st,0); - } - } - Thread::join(_thread); -} - -bool Service::send(const Dictionary &msg) -{ - if (_childStdin <= 0) - return false; - std::string mser(msg.toString()); - mser.append(ZT_EOL_S); - return ((long)::write(_childStdin,mser.data(),mser.length()) == (long)mser.length()); -} - -void Service::threadMain() - throw() -{ - char buf[16384]; - fd_set readfds,writefds,exceptfds; - struct timeval tv; - int eolsInARow = 0; - std::string stderrBuf,stdoutBuf; - - while (_run) { - if (_pid <= 0) { - LOG("launching service %s...",_name.c_str()); - - int in[2],out[2],err[2]; - pipe(in); - pipe(out); - pipe(err); - - long pid = vfork(); - if (pid < 0) { - LOG("service %s terminating: could not fork!",_name.c_str()); - return; - } else if (pid) { - // Parent - close(in[0]); - close(out[1]); - close(err[1]); - Thread::sleep(500); // give child time to start - _childStdin = in[1]; - _childStdout = out[0]; - _childStderr = err[0]; - fcntl(_childStdout,F_SETFL,O_NONBLOCK); - fcntl(_childStderr,F_SETFL,O_NONBLOCK); - _pid = pid; - } else { - // Child - close(in[1]); - close(out[0]); - close(err[0]); - dup2(in[0],STDIN_FILENO); - dup2(out[1],STDOUT_FILENO); - dup2(err[1],STDERR_FILENO); - setenv("ZT_HOME",RR->homePath.c_str(),1); - chdir(RR->homePath.c_str()); - execl(_path.c_str(),_path.c_str(),RR->homePath.c_str(),(const char *)0); - exit(-1); - } - } else { - int st = 0; - if (waitpid(_pid,&st,WNOHANG) == _pid) { - if (_childStdin > 0) close(_childStdin); - _childStdin = 0; - if (_childStdout > 0) close(_childStdout); - if (_childStderr > 0) close(_childStderr); - _pid = 0; - - if (!_run) - return; - - LOG("service %s exited with exit code: %d, delaying 1s to attempt relaunch",_name.c_str(),st); - - Thread::sleep(1000); // wait to relaunch - continue; - } - } - - // If we've made it here, _pid is running last we checked. - - FD_ZERO(&readfds); - FD_ZERO(&writefds); - FD_ZERO(&exceptfds); - - FD_SET(_childStdout,&readfds); - FD_SET(_childStderr,&readfds); - - tv.tv_sec = 1; - tv.tv_usec = 0; - ::select(std::max(_childStdout,_childStderr)+1,&readfds,&writefds,&exceptfds,&tv); - - if (!_run) { - if (_childStdin > 0) ::close(_childStdin); - _childStdin = 0; - if (_childStdout > 0) ::close(_childStdout); - if (_childStderr > 0) ::close(_childStderr); - return; - } - - if ((_childStderr > 0)&&(FD_ISSET(_childStderr,&readfds))) { - int n = (int)::read(_childStderr,buf,sizeof(buf)); - for(int i=0;i 0)&&(FD_ISSET(_childStdout,&readfds))) { - int n = (int)::read(_childStdout,buf,sizeof(buf)); - for(int i=0;i= 2) { - // Two CRs in a row ends a message - try { - _handler(_arg,*this,Dictionary(stdoutBuf)); - stdoutBuf = ""; - } catch ( ... ) {} // handlers should not throw - } else stdoutBuf.push_back(buf[i]); - } - } - } -} - -} // namespace ZeroTier - -#endif // __WINDOWS__ - diff --git a/node/Service.hpp b/node/Service.hpp deleted file mode 100644 index f0e7be54c..000000000 --- a/node/Service.hpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * ZeroTier One - Global Peer to Peer Ethernet - * Copyright (C) 2011-2014 ZeroTier Networks LLC - * - * 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 . - * - * -- - * - * ZeroTier may be used and distributed under the terms of the GPLv3, which - * are available at: http://www.gnu.org/licenses/gpl-3.0.html - * - * If you would like to embed ZeroTier into a commercial application or - * redistribute it in a modified binary form, please contact ZeroTier Networks - * LLC. Start here: http://www.zerotier.com/ - */ - -#ifndef ZT_SERVICE_HPP -#define ZT_SERVICE_HPP - -#include -#include - -#include "Constants.hpp" -#include "Dictionary.hpp" -#include "Thread.hpp" - -namespace ZeroTier { - -class RuntimeEnvironment; - -#ifndef __WINDOWS__ -/** - * A subprocess that communicates with the host via a simple protocol - * - * This is currently only supported on *nix systems, and is used to implement - * special plugins that are used by supernodes and network configuration - * master nodes. Users will probably have no use for it. - * - * The simple binary protocol consists of a bidirectional stream of string- - * serialized Dictionaries prefixed by a 32-bit message length. Input - * messages are sent to the subprocess via its stdin, and output is read - * from its stdout. Messages printed by the subprocess on its stderr are - * logged via the standard Logger instance. If the subprocess dies, an - * attempt is made to restart it every second. - */ -class Service -{ -public: - /** - * Create and launch a new service - * - * @param renv Runtime environment - * @param name Name of service - * @param path Path to service binary - * @param handler Handler function to call when service generates output - * @param arg First argument to service - */ - Service(const RuntimeEnvironment *renv, - const char *name, - const char *path, - void (*handler)(void *,Service &,const Dictionary &), - void *arg); - - ~Service(); - - /** - * Send a message to service subprocess - * - * @param msg Message in key/value dictionary form - * @return True if message was sent - */ - bool send(const Dictionary &msg); - - /** - * @return Name of service - */ - inline const char *name() const throw() { return _name.c_str(); } - - /** - * @return True if subprocess is running - */ - inline bool running() const throw() { return (_pid > 0); } - - /** - * Thread main method; do not call elsewhere - */ - void threadMain() - throw(); - -private: - const RuntimeEnvironment *RR; - - Thread _thread; - - std::string _path; - std::string _name; - void *_arg; - void (*_handler)(void *,Service &,const Dictionary &); - volatile long _pid; - - volatile int _childStdin; - volatile int _childStdout; - volatile int _childStderr; - - volatile bool _run; -}; -#endif // __WINDOWS__ - -} // namespace ZeroTier - -#endif diff --git a/objects.mk b/objects.mk index eefd302ab..0b6c9c4f9 100644 --- a/objects.mk +++ b/objects.mk @@ -25,7 +25,6 @@ OBJS=\ node/Poly1305.o \ node/RoutingTable.o \ node/Salsa20.o \ - node/Service.o \ node/SoftwareUpdater.o \ node/SHA512.o \ node/Switch.o \