X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_socket.c;h=3c79ceeabacd401210c4ba3a21c004cb251c3874;hb=6834b882015a9323672e9fce8811aa4283f196f0;hp=ca681e854577919f68a98f5d80e6b83beaf995b7;hpb=9de37fa18e63d71a4676e9d1c9820b09861c949b;p=tinc diff --git a/src/net_socket.c b/src/net_socket.c index ca681e85..3c79ceea 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -285,7 +285,7 @@ int setup_vpn_in_socket(const sockaddr_t *sa) { return nfd; } /* int setup_vpn_in_socket */ -static void retry_outgoing_handler(int fd, short events, void *data) { +static void retry_outgoing_handler(void *data) { setup_outgoing_connection(data); } @@ -295,8 +295,9 @@ void retry_outgoing(outgoing_t *outgoing) { if(outgoing->timeout > maxtimeout) outgoing->timeout = maxtimeout; - timeout_set(&outgoing->ev, retry_outgoing_handler, outgoing); - event_add(&outgoing->ev, &(struct timeval){outgoing->timeout, 0}); + outgoing->ev.handler = retry_outgoing_handler; + outgoing->ev.time = time(NULL) + outgoing->timeout; + event_add(&outgoing->ev); ifdebug(CONNECTIONS) logger(LOG_NOTICE, "Trying to re-establish outgoing connection in %d seconds", @@ -464,45 +465,50 @@ void setup_outgoing_connection(outgoing_t *outgoing) { accept a new tcp connect and create a new connection */ -void handle_new_meta_connection(int sock, short events, void *data) { +void handle_new_meta_connection(void *data) { + listen_socket_t *l = data; connection_t *c; sockaddr_t sa; int fd; socklen_t len = sizeof sa; - fd = accept(sock, &sa.sa, &len); + while(true) { + fd = accept(l->tcp, &sa.sa, &len); - if(fd < 0) { - logger(LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno)); - return; - } + if(fd < 0) { + logger(LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno)); + return; + } - sockaddrunmap(&sa); + sockaddrunmap(&sa); - c = new_connection(); - c->name = xstrdup(""); - c->outcipher = myself->connection->outcipher; - c->outdigest = myself->connection->outdigest; - c->outmaclength = myself->connection->outmaclength; - c->outcompression = myself->connection->outcompression; + c = new_connection(); + c->name = xstrdup(""); + c->outcipher = myself->connection->outcipher; + c->outdigest = myself->connection->outdigest; + c->outmaclength = myself->connection->outmaclength; + c->outcompression = myself->connection->outcompression; - c->address = sa; - c->hostname = sockaddr2hostname(&sa); - c->socket = fd; - c->last_ping_time = time(NULL); + c->address = sa; + c->hostname = sockaddr2hostname(&sa); + c->socket = fd; + c->last_ping_time = time(NULL); - ifdebug(CONNECTIONS) logger(LOG_NOTICE, "Connection from %s", c->hostname); + ifdebug(CONNECTIONS) logger(LOG_NOTICE, "Connection from %s", c->hostname); - configure_tcp(c); + configure_tcp(c); - connection_add(c); + mutex_lock(&mutex); + connection_add(c); - c->allow_request = ID; - send_id(c); + c->allow_request = ID; + send_id(c); - if(!thread_create(&c->thread, handle_meta_connection_data, c)) { - logger(LOG_ERR, "create_thread() failed: %s", strerror(errno)); - abort(); + if(!thread_create(&c->thread, handle_meta_connection_data, c)) { + logger(LOG_ERR, "create_thread() failed: %s", strerror(errno)); + abort(); + } + mutex_unlock(&mutex); } }