Drop libevent and use our own event handling again.
[tinc] / src / net_socket.c
index 0f0580e..212649b 100644 (file)
@@ -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
 
@@ -271,7 +271,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);
 }
 
@@ -281,12 +281,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});
+       timeout_add(&outgoing->ev, retry_outgoing_handler, outgoing, &(struct timeval){outgoing->timeout, rand() % 100000});
 
-       logger(DEBUG_CONNECTIONS, LOG_NOTICE,
-                          "Trying to re-establish outgoing connection in %d seconds",
-                          outgoing->timeout);
+       logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Trying to re-establish outgoing connection in %d seconds", outgoing->timeout);
 }
 
 void finish_connecting(connection_t *c) {
@@ -349,9 +346,7 @@ static void do_outgoing_pipe(connection_t *c, char *command) {
 #endif
 }
 
-static void handle_meta_write(int sock, short events, void *data) {
-       connection_t *c = data;
-
+static void handle_meta_write(connection_t *c) {
        ssize_t outlen = send(c->socket, c->outbuf.data + c->outbuf.offset, c->outbuf.len - c->outbuf.offset, 0);
        if(outlen <= 0) {
                if(!errno || errno == EPIPE) {
@@ -368,10 +363,16 @@ static void handle_meta_write(int sock, short events, void *data) {
        }
 
        buffer_read(&c->outbuf, outlen);
-       if(!c->outbuf.len && event_initialized(&c->outevent))
-               event_del(&c->outevent);
+       if(!c->outbuf.len)
+               io_set(&c->io, IO_READ);
 }
 
+static void handle_meta_io(void *data, int flags) {
+       if(flags & IO_WRITE)
+               handle_meta_write(data);
+       else
+               handle_meta_connection_data(data);
+}
 
 bool do_outgoing_connection(outgoing_t *outgoing) {
        char *address, *port, *space;
@@ -487,16 +488,13 @@ begin:
 
        connection_add(c);
 
-       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);
+       io_add(&c->io, handle_meta_io, c, c->socket, IO_READ);
 
        return true;
 }
 
 void setup_outgoing_connection(outgoing_t *outgoing) {
-       if(event_initialized(&outgoing->ev))
-               event_del(&outgoing->ev);
+       timeout_del(&outgoing->ev);
 
        node_t *n = lookup_node(outgoing->name);
 
@@ -523,13 +521,14 @@ 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, int flags) {
+       listen_socket_t *l = data;
        connection_t *c;
        sockaddr_t sa;
        int fd;
        socklen_t len = sizeof sa;
 
-       fd = accept(sock, &sa.sa, &len);
+       fd = accept(l->tcp.fd, &sa.sa, &len);
 
        if(fd < 0) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno));
@@ -552,10 +551,8 @@ void handle_new_meta_connection(int sock, short events, void *data) {
 
        logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Connection from %s", c->hostname);
 
-       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);
-               
+       io_add(&c->io, handle_meta_io, c, c->socket, IO_READ);
+
        configure_tcp(c);
 
        connection_add(c);
@@ -565,12 +562,14 @@ void handle_new_meta_connection(int sock, short events, void *data) {
 }
 
 static void free_outgoing(outgoing_t *outgoing) {
-       if(event_initialized(&outgoing->ev))
-               event_del(&outgoing->ev);
+       timeout_del(&outgoing->ev);
 
        if(outgoing->ai)
                freeaddrinfo(outgoing->ai);
 
+       if(outgoing->config_tree)
+               exit_configuration(&outgoing->config_tree);
+
        if(outgoing->name)
                free(outgoing->name);
 
@@ -578,24 +577,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 +602,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 +611,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 +620,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 +630,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);
 }