Clean up child processes from proxy type exec.
[tinc] / src / net.c
index d2eacf3..baf576d 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -32,7 +32,6 @@
 #include "names.h"
 #include "net.h"
 #include "netutl.h"
-#include "process.h"
 #include "protocol.h"
 #include "subnet.h"
 #include "xalloc.h"
@@ -41,6 +40,8 @@ int contradicting_add_edge = 0;
 int contradicting_del_edge = 0;
 static int sleeptime = 10;
 time_t last_config_check = 0;
+static timeout_t pingtimer;
+static timeout_t periodictimer;
 
 /* Purge edges and subnets of unreachable nodes. Use carefully. */
 
@@ -128,6 +129,12 @@ void terminate_connection(connection_t *c, bool report) {
 
        if(outgoing)
                do_outgoing_connection(outgoing);
+
+#ifndef HAVE_MINGW
+       /* Clean up dead proxy processes */
+
+       while(waitpid(-1, NULL, WNOHANG) > 0);
+#endif
 }
 
 /*
@@ -296,7 +303,8 @@ static void sigterm_handler(void *data) {
 static void sighup_handler(void *data) {
        logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum));
        reopenlogger();
-       reload_configuration();
+       if(reload_configuration())
+               exit(1);
 }
 
 static void sigalrm_handler(void *data) {
@@ -306,7 +314,7 @@ static void sigalrm_handler(void *data) {
 #endif
 
 int reload_configuration(void) {
-       char *fname;
+       char *fname = NULL;
 
        /* Reread our own configuration file */
 
@@ -314,8 +322,7 @@ int reload_configuration(void) {
        init_configuration(&config_tree);
 
        if(!read_server_config()) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Unable to reread configuration file, exitting.");
-               event_exit();
+               logger(DEBUG_ALWAYS, LOG_ERR, "Unable to reread configuration file.");
                return EINVAL;
        }
 
@@ -412,24 +419,27 @@ int reload_configuration(void) {
 }
 
 void retry(void) {
+       /* Reset the reconnection timers for all outgoing connections */
+       for list_each(outgoing_t, outgoing, outgoing_list) {
+               outgoing->timeout = 0;
+               if(outgoing->ev.cb)
+                       timeout_set(&outgoing->ev, &(struct timeval){0, 0});
+       }
+
+       /* Check for outgoing connections that are in progress, and reset their ping timers */
        for list_each(connection_t, c, connection_list) {
-               if(c->outgoing && !c->node) {
-                       timeout_del(&c->outgoing->ev);
-                       if(c->status.connecting)
-                               close(c->socket);
-                       c->outgoing->timeout = 0;
-                       terminate_connection(c, c->status.active);
-               }
+               if(c->outgoing && !c->node)
+                       c->last_ping_time = 0;
        }
+
+       /* Kick the ping timeout handler */
+       timeout_set(&pingtimer, &(struct timeval){0, 0});
 }
 
 /*
   this is where it all happens...
 */
 int main_loop(void) {
-       timeout_t pingtimer = {{0}};
-       timeout_t periodictimer = {{0}};
-
        timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
        timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){pingtimeout, rand() % 100000});
 
@@ -454,9 +464,10 @@ int main_loop(void) {
 
 #ifndef HAVE_MINGW
        signal_del(&sighup);
-       signal_del(&sigalrm);
-       signal_del(&sigquit);
        signal_del(&sigterm);
+       signal_del(&sigquit);
+       signal_del(&sigint);
+       signal_del(&sigalrm);
 #endif
 
        timeout_del(&periodictimer);