summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.cpp8
-rw-r--r--node/Node.cpp15
-rw-r--r--node/Node.hpp6
3 files changed, 27 insertions, 2 deletions
diff --git a/main.cpp b/main.cpp
index 56cc9d84..97b01c60 100644
--- a/main.cpp
+++ b/main.cpp
@@ -357,6 +357,12 @@ static int main(int argc,char **argv)
} // namespace ZeroTierIdTool ------------------------------------------------
#ifdef __UNIX_LIKE__
+static void sighandlerHup(int sig)
+{
+ Node *n = node;
+ if (n)
+ n->resync();
+}
static void sighandlerQuit(int sig)
{
Node *n = node;
@@ -569,7 +575,7 @@ int main(int argc,char **argv)
#endif
{
#ifdef __UNIX_LIKE__
- signal(SIGHUP,SIG_IGN);
+ signal(SIGHUP,&sighandlerHup);
signal(SIGPIPE,SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2,SIG_IGN);
diff --git a/node/Node.cpp b/node/Node.cpp
index 9fc8ee1f..106c508d 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -224,6 +224,7 @@ struct _NodeImpl
volatile Node::ReasonForTermination reasonForTermination;
volatile bool started;
volatile bool running;
+ volatile bool resynchronize;
inline Node::ReasonForTermination terminate()
{
@@ -359,6 +360,7 @@ Node::Node(const char *hp,unsigned int port,unsigned int controlPort)
impl->reasonForTermination = Node::NODE_RUNNING;
impl->started = false;
impl->running = false;
+ impl->resynchronize = false;
}
Node::~Node()
@@ -528,7 +530,11 @@ Node::ReasonForTermination Node::run()
}
uint64_t now = Utils::now();
- bool resynchronize = false;
+ bool resynchronize = impl->resynchronize;
+ if (resynchronize) {
+ LOG("manual resynchronize ordered, resyncing with network");
+ }
+ impl->resynchronize = false;
// If it looks like the computer slept and woke, resynchronize.
if (lastDelayDelta >= ZT_SLEEP_WAKE_DETECTION_THRESHOLD) {
@@ -657,6 +663,13 @@ void Node::terminate(ReasonForTermination reason,const char *reasonText)
((_NodeImpl *)_impl)->renv.mainLoopWaitCondition.signal();
}
+void Node::resync()
+ throw()
+{
+ ((_NodeImpl *)_impl)->resynchronize = true;
+ ((_NodeImpl *)_impl)->renv.mainLoopWaitCondition.signal();
+}
+
class _VersionStringMaker
{
public:
diff --git a/node/Node.hpp b/node/Node.hpp
index 974a51b6..0eb96cae 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -181,6 +181,12 @@ public:
throw();
/**
+ * Forget p2p links and resynchronize with peers
+ */
+ void resync()
+ throw();
+
+ /**
* Get the ZeroTier version in major.minor.revision string format
*
* @return Version in string form