X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet.c;h=91b93056e44c1573a7f4eef6f71a01fb8687bfe7;hb=19e42b76f546dc3baee4a5d6a4f161155d279c74;hp=bf6cfcf177d58a18572a4947e62a45e11f73c617;hpb=76c90e1639ee900fca4fc858260f0078ba32b9b1;p=tinc diff --git a/src/net.c b/src/net.c index bf6cfcf1..91b93056 100644 --- a/src/net.c +++ b/src/net.c @@ -32,11 +32,14 @@ #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; @@ -94,8 +97,6 @@ void purge(void) { void terminate_connection(connection_t *c, bool report) { logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Closing connection with %s (%s)", c->name, c->hostname); - c->status.active = false; - if(c->node && c->node->connection == c) c->node->connection = NULL; @@ -130,6 +131,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 } /* @@ -146,7 +153,7 @@ static void timeout_handler(void *data) { continue; if(c->last_ping_time + pingtimeout <= now.tv_sec) { - if(c->status.active) { + if(c->edge) { if(c->status.pinged) { logger(DEBUG_CONNECTIONS, LOG_INFO, "%s (%s) didn't respond to PING in %ld seconds", c->name, c->hostname, (long)now.tv_sec - c->last_ping_time); } else if(c->last_ping_time + pinginterval <= now.tv_sec) { @@ -161,7 +168,7 @@ static void timeout_handler(void *data) { else logger(DEBUG_CONNECTIONS, LOG_WARNING, "Timeout from %s (%s) during authentication", c->name, c->hostname); } - terminate_connection(c, c->status.active); + terminate_connection(c, c->edge); } } @@ -195,11 +202,11 @@ static void periodic_handler(void *data) { /* Count number of active connections */ int nc = 0; for list_each(connection_t, c, connection_list) { - if(c->status.active && !c->status.control) + if(c->edge) 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 @@ -233,7 +240,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. @@ -242,7 +249,7 @@ static void periodic_handler(void *data) { int i = 0; for list_each(connection_t, c, connection_list) { - if(!c->status.active || c->status.control) + if(!c->edge) continue; if(i++ != r) @@ -254,12 +261,12 @@ static void periodic_handler(void *data) { logger(DEBUG_CONNECTIONS, LOG_INFO, "Autodisconnecting from %s", c->name); list_delete(outgoing_list, c->outgoing); c->outgoing = NULL; - terminate_connection(c, c->status.active); + terminate_connection(c, c->edge); break; } } - if(nc >= autoconnect) { + if(nc >= 3) { /* If we have enough active connections, remove any pending outgoing connections. */ @@ -284,7 +291,7 @@ static void periodic_handler(void *data) { void handle_meta_connection_data(connection_t *c) { if (!receive_meta(c)) { - terminate_connection(c, c->status.active); + terminate_connection(c, c->edge); return; } } @@ -304,6 +311,9 @@ static void sighup_handler(void *data) { 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 @@ -335,11 +345,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) @@ -403,7 +416,7 @@ int reload_configuration(void) { struct stat s; if(stat(fname, &s) || s.st_mtime > last_config_check) { logger(DEBUG_CONNECTIONS, LOG_INFO, "Host config file of %s has been changed", c->name); - terminate_connection(c, c->status.active); + terminate_connection(c, c->edge); } free(fname); } @@ -453,7 +466,7 @@ 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; }