X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet.c;h=1b5bb16693f1e700da422451b1f47017afe2ad5a;hb=40731d030fef793c6b6405efd9b3e64c26c00045;hp=469f10fce94ae69827d640ec23365268a152e882;hpb=fb0cfccf7dc2240b576011edcf74fd5b058916cb;p=tinc diff --git a/src/net.c b/src/net.c index 469f10fc..1b5bb166 100644 --- a/src/net.c +++ b/src/net.c @@ -100,31 +100,6 @@ static void purge(void) { } } -/* - put all file descriptors into events - While we're at it, purge stuf that needs to be removed. -*/ -static int build_fdset(void) { - splay_node_t *node, *next; - connection_t *c; - int i, max = 0; - - cp(); - - for(node = connection_tree->head; node; node = next) { - next = node->next; - c = node->data; - - if(c->status.remove) { - connection_del(c); - if(!connection_tree->head) - purge(); - } - } - - return 0; -} - /* Terminate a connection: - Close the socket @@ -135,13 +110,9 @@ static int build_fdset(void) { void terminate_connection(connection_t *c, bool report) { cp(); - if(c->status.remove) - return; - ifdebug(CONNECTIONS) logger(LOG_NOTICE, _("Closing connection with %s (%s)"), c->name, c->hostname); - c->status.remove = true; c->status.active = false; if(c->node) @@ -150,8 +121,6 @@ void terminate_connection(connection_t *c, bool report) { if(c->socket) closesocket(c->socket); - event_del(&c->ev); - if(c->edge) { if(report && !tunnelserver) send_del_edge(broadcast, c->edge); @@ -177,16 +146,10 @@ void terminate_connection(connection_t *c, bool report) { /* Check if this was our outgoing connection */ - if(c->outgoing) { + if(c->outgoing) retry_outgoing(c->outgoing); - c->outgoing = NULL; - } - free(c->outbuf); - c->outbuf = NULL; - c->outbuflen = 0; - c->outbufsize = 0; - c->outbufstart = 0; + connection_del(c); } /* @@ -213,26 +176,22 @@ static void timeout_handler(int fd, short events, void *event) { if(c->status.pinged) { ifdebug(CONNECTIONS) logger(LOG_INFO, _("%s (%s) didn't respond to PING in %ld seconds"), c->name, c->hostname, now - c->last_ping_time); - c->status.timeout = true; terminate_connection(c, true); + continue; } else if(c->last_ping_time + pinginterval < now) { send_ping(c); } } else { - if(c->status.remove) { - logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."), - c->name, c->hostname, c->status.value); - connection_del(c); - continue; - } - ifdebug(CONNECTIONS) logger(LOG_WARNING, _("Timeout from %s (%s) during authentication"), - c->name, c->hostname); if(c->status.connecting) { + ifdebug(CONNECTIONS) + logger(LOG_WARNING, _("Timeout while connecting to %s (%s)"), c->name, c->hostname); c->status.connecting = false; closesocket(c->socket); do_outgoing_connection(c); } else { + ifdebug(CONNECTIONS) logger(LOG_WARNING, _("Timeout from %s (%s) during authentication"), c->name, c->hostname); terminate_connection(c, false); + continue; } } } @@ -246,10 +205,9 @@ void handle_meta_connection_data(int fd, short events, void *data) { int result; socklen_t len = sizeof(result); - if (c->status.remove) - return; - if(c->status.connecting) { + c->status.connecting = false; + getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len); if(!result) @@ -258,7 +216,6 @@ void handle_meta_connection_data(int fd, short events, void *data) { ifdebug(CONNECTIONS) logger(LOG_DEBUG, _("Error while connecting to %s (%s): %s"), c->name, c->hostname, strerror(result)); - c->status.connecting = false; closesocket(c->socket); do_outgoing_connection(c); return; @@ -383,8 +340,6 @@ static void sigalrm_handler(int signal, short events, void *data) { this is where it all happens... */ int main_loop(void) { - struct timeval tv; - int r; struct event timeout_event; struct event sighup_event; struct event sigint_event;