X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_socket.c;h=1686c609f65646da62b98c170e7f59c2660c43b9;hb=fbf305c09d91bf34b1504b58d50392df2e6bcfba;hp=9c8ef05ab53c85a911b6343c9b0ed13a26e0bdf6;hpb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;p=tinc diff --git a/src/net_socket.c b/src/net_socket.c index 9c8ef05a..1686c609 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -22,7 +22,7 @@ #include "system.h" -#include "avl_tree.h" +#include "splay_tree.h" #include "conf.h" #include "connection.h" #include "logger.h" @@ -231,7 +231,7 @@ int setup_vpn_in_socket(const sockaddr_t *sa) { } static void retry_outgoing_handler(int fd, short events, void *data) { - do_outgoing_connection(data); + setup_outgoing_connection(data); } void retry_outgoing(outgoing_t *outgoing) { @@ -274,8 +274,9 @@ begin: if(!c->outgoing->cfg) { ifdebug(CONNECTIONS) logger(LOG_ERR, _("Could not set up a meta connection to %s"), c->name); - c->status.remove = true; retry_outgoing(c->outgoing); + c->outgoing = NULL; + connection_del(c); return; } @@ -348,6 +349,16 @@ begin: return; } +void handle_meta_write(struct bufferevent *event, void *data) { + logger(LOG_EMERG, _("handle_meta_write() called")); +} + +void handle_meta_connection_error(struct bufferevent *event, short what, void *data) { + connection_t *c = data; + logger(LOG_EMERG, _("handle_meta_connection_error() called: %d: %s"), what, strerror(errno)); + terminate_connection(c, c->status.active); +} + void setup_outgoing_connection(outgoing_t *outgoing) { connection_t *c; node_t *n; @@ -391,12 +402,14 @@ void setup_outgoing_connection(outgoing_t *outgoing) { do_outgoing_connection(c); - event_set(&c->ev, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); - event_set(&c->outev, c->socket, EV_WRITE | EV_PERSIST, flush_meta, c); - if(event_add(&c->ev, NULL) < 0) { - logger(LOG_EMERG, _("event_add failed: %s"), strerror(errno)); + event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); + event_add(&c->inevent, NULL); + c->buffer = bufferevent_new(c->socket, handle_meta_connection_data, handle_meta_write, handle_meta_connection_error, c); + if(!c->buffer) { + logger(LOG_EMERG, _("bufferevent_new() failed: %s"), strerror(errno)); abort(); } + bufferevent_disable(c->buffer, EV_READ); } /* @@ -434,13 +447,14 @@ void handle_new_meta_connection(int sock, short events, void *data) { ifdebug(CONNECTIONS) logger(LOG_NOTICE, _("Connection from %s"), c->hostname); - event_set(&c->ev, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); - event_set(&c->outev, c->socket, EV_WRITE | EV_PERSIST, flush_meta, c); - if(event_add(&c->ev, NULL) < 0) { - logger(LOG_ERR, _("event_add failed: %s"), strerror(errno)); - connection_del(c); - return; + event_set(&c->inevent, c->socket, EV_READ | EV_PERSIST, handle_meta_connection_data, c); + event_add(&c->inevent, NULL); + c->buffer = bufferevent_new(c->socket, NULL, handle_meta_write, handle_meta_connection_error, c); + if(!c->buffer) { + logger(LOG_EMERG, _("bufferevent_new() failed: %s"), strerror(errno)); + abort(); } + bufferevent_disable(c->buffer, EV_READ); configure_tcp(c);