From ce976717ea9756aa985699547fdbf132b694748d Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 19 May 2007 12:07:30 +0000 Subject: [PATCH] We can safely delete a connection_t in terminate_connection() now. --- src/connection.h | 2 +- src/net.c | 56 ++++++++------------------------------------- src/net_socket.c | 1 - src/process.c | 2 -- src/protocol_misc.c | 8 ++----- src/tincd.c | 2 +- 6 files changed, 14 insertions(+), 57 deletions(-) diff --git a/src/connection.h b/src/connection.h index 9906f0d7..6537e519 100644 --- a/src/connection.h +++ b/src/connection.h @@ -40,7 +40,7 @@ typedef union connection_status_t { int active:1; /* 1 if active.. */ int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */ int termreq:1; /* the termination of this connection was requested */ - int remove:1; /* Set to 1 if you want this connection removed */ + int remove_unused:1; /* Set to 1 if you want this connection removed */ int timeout:1; /* 1 if gotten timeout */ int encryptout:1; /* 1 if we can encrypt outgoing traffic */ int decryptin:1; /* 1 if we have to decrypt incoming traffic */ diff --git a/src/net.c b/src/net.c index 469f10fc..d78770e1 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) @@ -175,18 +146,20 @@ void terminate_connection(connection_t *c, bool report) { } } + free(c->outbuf); + c->outbuf = NULL; + c->outbuflen = 0; + c->outbufsize = 0; + c->outbufstart = 0; + /* Check if this was our outgoing connection */ if(c->outgoing) { retry_outgoing(c->outgoing); c->outgoing = NULL; + } else { + connection_del(c); } - - free(c->outbuf); - c->outbuf = NULL; - c->outbuflen = 0; - c->outbufsize = 0; - c->outbufstart = 0; } /* @@ -215,16 +188,11 @@ static void timeout_handler(int fd, short events, void *event) { 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) { @@ -233,6 +201,7 @@ static void timeout_handler(int fd, short events, void *event) { do_outgoing_connection(c); } else { terminate_connection(c, false); + continue; } } } @@ -246,9 +215,6 @@ 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) { getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len); @@ -383,8 +349,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; diff --git a/src/net_socket.c b/src/net_socket.c index ec774f6a..3fea33e1 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -274,7 +274,6 @@ 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); return; } diff --git a/src/process.c b/src/process.c index dcc6cb33..1b5f00db 100644 --- a/src/process.c +++ b/src/process.c @@ -45,8 +45,6 @@ extern bool use_logfile; sigset_t emptysigset; -static int saved_debug_level = -1; - static void memory_full(int size) { logger(LOG_ERR, _("Memory exhausted (couldn't allocate %d bytes), exitting."), size); cp_trace(); diff --git a/src/protocol_misc.c b/src/protocol_misc.c index ca1dc315..1e0bc50d 100644 --- a/src/protocol_misc.c +++ b/src/protocol_misc.c @@ -90,9 +90,7 @@ bool error_h(connection_t *c) ifdebug(ERROR) logger(LOG_NOTICE, _("Error message from %s (%s): %d: %s"), c->name, c->hostname, err, errorstring); - terminate_connection(c, c->status.active); - - return true; + return false; } bool send_termreq(connection_t *c) @@ -106,9 +104,7 @@ bool termreq_h(connection_t *c) { cp(); - terminate_connection(c, c->status.active); - - return true; + return false; } bool send_ping(connection_t *c) diff --git a/src/tincd.c b/src/tincd.c index bde1b9bc..9730e211 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -466,7 +466,7 @@ int main(int argc, char **argv) if(!read_server_config()) return 1; - if(event_init() < 0) { + if(!event_init()) { logger(LOG_ERR, _("Error initializing libevent!")); return 1; } -- 2.39.5