X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet.c;h=8fe3c516c14d08646ffad222a4bce8edb116c5e0;hb=46a5aa0d674914f4220d8583b1b2f87c7f05a804;hp=8a63615d658b6321ac1df565dc708be177037f59;hpb=fc119fb0096a9221f2cff279b07c886bcd794d28;p=tinc diff --git a/src/net.c b/src/net.c index 8a63615d..8fe3c516 100644 --- a/src/net.c +++ b/src/net.c @@ -32,15 +32,20 @@ #include "names.h" #include "net.h" #include "netutl.h" -#include "process.h" #include "protocol.h" #include "subnet.h" #include "xalloc.h" +#ifdef HAVE_RESOLV_H +#include +#endif + 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 +133,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 } /* @@ -197,7 +208,7 @@ static void periodic_handler(void *data) { nc++; } - if(nc < autoconnect) { + if(nc < 3) { /* Not enough active connections, try to add one. Choose a random node, if we don't have a connection to it, and we are not already trying to make one, create an @@ -231,7 +242,7 @@ static void periodic_handler(void *data) { } break; } - } else if(nc > autoconnect) { + } else if(nc > 3) { /* Too many active connections, try to remove one. Choose a random outgoing connection to a node that has at least one other connection. @@ -257,7 +268,7 @@ static void periodic_handler(void *data) { } } - if(nc >= autoconnect) { + if(nc >= 3) { /* If we have enough active connections, remove any pending outgoing connections. */ @@ -296,11 +307,15 @@ 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) { logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum)); +#ifdef HAVE_DECL_RES_INIT + res_init(); +#endif retry(); } #endif @@ -314,8 +329,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; } @@ -333,11 +347,14 @@ int reload_configuration(void) { if(strictsubnets) { for splay_each(subnet_t, subnet, subnet_tree) - subnet->expires = 1; + if (subnet->owner) + subnet->expires = 1; load_all_subnets(); for splay_each(subnet_t, subnet, subnet_tree) { + if (!subnet->owner) + continue; if(subnet->expires == 1) { send_del_subnet(everyone, subnet); if(subnet->owner->status.reachable) @@ -412,24 +429,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}); @@ -448,15 +468,16 @@ int main_loop(void) { #endif if(!event_loop()) { - logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", strerror(errno)); + logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", sockstrerror(sockerrno)); return 1; } #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);