X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_socket.c;h=ce1e3aa3e65ed1091fe1400c0937b846a586a045;hb=3c1b7047332f4b5e9d5ae7109e696b33712a5fb2;hp=0f0580ecef97195137981fc7fd635803ac1d3ea7;hpb=ce059e36fdb3d3049c278e8b2f36b03c93778996;p=tinc diff --git a/src/net_socket.c b/src/net_socket.c index 0f0580ec..ce1e3aa3 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -22,9 +22,9 @@ #include "system.h" -#include "splay_tree.h" #include "conf.h" #include "connection.h" +#include "list.h" #include "logger.h" #include "meta.h" #include "net.h" @@ -63,7 +63,7 @@ static void configure_tcp(connection_t *c) { unsigned long arg = 1; if(ioctlsocket(c->socket, FIONBIO, &arg) != 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "ioctlsocket for %s: %d", c->hostname, sockstrerror(sockerrno)); + logger(DEBUG_ALWAYS, LOG_ERR, "ioctlsocket for %s: %s", c->hostname, sockstrerror(sockerrno)); } #endif @@ -282,7 +282,7 @@ void retry_outgoing(outgoing_t *outgoing) { outgoing->timeout = maxtimeout; timeout_set(&outgoing->ev, retry_outgoing_handler, outgoing); - event_add(&outgoing->ev, &(struct timeval){outgoing->timeout, 0}); + event_add(&outgoing->ev, &(struct timeval){outgoing->timeout, rand() % 100000}); logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Trying to re-establish outgoing connection in %d seconds", @@ -555,7 +555,7 @@ void handle_new_meta_connection(int sock, short events, void *data) { event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); event_set(&c->outevent, c->socket, EV_WRITE | EV_PERSIST, handle_meta_write, c); event_add(&c->inevent, NULL); - + configure_tcp(c); connection_add(c); @@ -571,6 +571,9 @@ static void free_outgoing(outgoing_t *outgoing) { if(outgoing->ai) freeaddrinfo(outgoing->ai); + if(outgoing->config_tree) + exit_configuration(&outgoing->config_tree); + if(outgoing->name) free(outgoing->name); @@ -578,24 +581,19 @@ static void free_outgoing(outgoing_t *outgoing) { } void try_outgoing_connections(void) { - static config_t *cfg = NULL; - char *name; - outgoing_t *outgoing; - /* If there is no outgoing list yet, create one. Otherwise, mark all outgoings as deleted. */ if(!outgoing_list) { outgoing_list = list_alloc((list_action_t)free_outgoing); } else { - for(list_node_t *i = outgoing_list->head; i; i = i->next) { - outgoing = i->data; + for list_each(outgoing_t, outgoing, outgoing_list) outgoing->timeout = -1; - } } /* Make sure there is one outgoing_t in the list for each ConnectTo. */ - for(cfg = lookup_config(config_tree, "ConnectTo"); cfg; cfg = lookup_config_next(config_tree, cfg)) { + for(config_t *cfg = lookup_config(config_tree, "ConnectTo"); cfg; cfg = lookup_config_next(config_tree, cfg)) { + char *name; get_config_string(cfg, &name); if(!check_id(name)) { @@ -608,8 +606,7 @@ void try_outgoing_connections(void) { bool found = false; - for(list_node_t *i = outgoing_list->head; i; i = i->next) { - outgoing = i->data; + for list_each(outgoing_t, outgoing, outgoing_list) { if(!strcmp(outgoing->name, name)) { found = true; outgoing->timeout = 0; @@ -618,7 +615,7 @@ void try_outgoing_connections(void) { } if(!found) { - outgoing = xmalloc_and_zero(sizeof *outgoing); + outgoing_t *outgoing = xmalloc_and_zero(sizeof *outgoing); outgoing->name = name; list_insert_tail(outgoing_list, outgoing); setup_outgoing_connection(outgoing); @@ -627,9 +624,7 @@ void try_outgoing_connections(void) { /* Terminate any connections whose outgoing_t is to be deleted. */ - for(splay_node_t *n = connection_tree->head, *next; n; n = next) { - next = n->next; - connection_t *c = n->data; + for list_each(connection_t, c, connection_list) { if(c->outgoing && c->outgoing->timeout == -1) { c->outgoing = NULL; logger(DEBUG_CONNECTIONS, LOG_INFO, "No more outgoing connection to %s", c->name); @@ -639,10 +634,7 @@ void try_outgoing_connections(void) { /* Delete outgoing_ts for which there is no ConnectTo. */ - for(list_node_t *i = outgoing_list->head, *next; i; i = next) { - next = i->next; - outgoing = i->data; + for list_each(outgoing_t, outgoing, outgoing_list) if(outgoing->timeout == -1) - list_delete_node(outgoing_list, i); - } + list_delete_node(outgoing_list, node); }