X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fconnection.c;h=83227cff88e99d5f5ba85a408cf1bafe041f5b6e;hp=453a25ee99aaa0db65c4a2b85e8948e4b54027e5;hb=3ef15f2554d1819d6c7d2573dac6039f2e76b638;hpb=4f9dad0972ac0f665a1b6050b059bd52f93e6221 diff --git a/src/connection.c b/src/connection.c index 453a25ee..83227cff 100644 --- a/src/connection.c +++ b/src/connection.c @@ -17,13 +17,15 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: connection.c,v 1.1.2.11 2001/06/05 16:09:55 guus Exp $ + $Id: connection.c,v 1.1.2.25 2001/11/16 12:02:17 zarq Exp $ */ #include "config.h" #include #include +#include +#include #include #include @@ -38,181 +40,107 @@ #include "xalloc.h" #include "system.h" -/* Root of the connection list */ - -avl_tree_t *connection_tree; -avl_tree_t *id_tree; - -/* Pointer to connection describing myself */ - -connection_t *myself = NULL; - -/* Initialization and callbacks */ +avl_tree_t *connection_tree; /* Meta connections */ int connection_compare(connection_t *a, connection_t *b) { - ipv4_t result; - - result = a->address - b->address; - if(result) - return result; - else - return a->port - b->port; -} - -int id_compare(connection_t *a, connection_t *b) -{ - return strcmp(a->name, b->name); + return a->socket - b->socket; } void init_connections(void) { - connection_tree = avl_alloc_tree((avl_compare_t)connection_compare, (avl_action_t)free_connection); - id_tree = avl_alloc_tree((avl_compare_t)id_compare, NULL); -} - -/* Creation and deletion of connection elements */ - -connection_t *new_connection(void) -{ - connection_t *p = (connection_t *)xmalloc_and_zero(sizeof(*p)); cp - p->subnet_tree = avl_alloc_tree((avl_compare_t)subnet_compare, NULL); - p->queue = list_alloc((list_action_t)free); + connection_tree = avl_alloc_tree((avl_compare_t)connection_compare, NULL); cp - return p; } -void free_connection(connection_t *p) +void exit_connections(void) { cp - if(p->queue) - list_delete_list(p->queue); - if(p->name) - free(p->name); - if(p->hostname) - free(p->hostname); - if(p->rsa_key) - RSA_free(p->rsa_key); - if(p->cipher_pktkey) - free(p->cipher_pktkey); - if(p->buffer) - free(p->buffer); - if(p->config) - clear_config(&p->config); - free(p); + avl_delete_tree(connection_tree); cp } -/* - remove all marked connections -*/ -void prune_connection_tree(void) +connection_t *new_connection(void) { - avl_node_t *node, *next; - connection_t *cl; + connection_t *c; cp - for(node = connection_tree->head; node; node = next) - { - next = node->next; - cl = (connection_t *)node->data; - if(cl->status.remove) - connection_del(cl); - } -cp -} + c = (connection_t *)xmalloc_and_zero(sizeof(connection_t)); -/* - free all elements of connection -*/ -void destroy_connection_tree(void) -{ -cp - avl_delete_tree(id_tree); - avl_delete_tree(connection_tree); + if(!c) + return NULL; + + gettimeofday(&c->start, NULL); cp + return c; } -/* Linked list management */ - -void connection_add(connection_t *cl) +void free_connection(connection_t *c) { cp - avl_insert(connection_tree, cl); + if(c->hostname) + free(c->hostname); + if(c->inkey) + free(c->inkey); + if(c->outkey) + free(c->outkey); + if(c->mychallenge) + free(c->mychallenge); + if(c->hischallenge) + free(c->hischallenge); + free(c); cp } -void id_add(connection_t *cl) +void connection_add(connection_t *c) { cp - avl_insert(id_tree, cl); + avl_insert(connection_tree, c); cp } -void connection_del(connection_t *cl) +void connection_del(connection_t *c) { cp - avl_delete(id_tree, cl); - avl_delete(connection_tree, cl); + avl_delete(connection_tree, c); cp } -/* Lookup functions */ - -connection_t *lookup_connection(ipv4_t address, short unsigned int port) +connection_t *lookup_connection(struct addrinfo *address) { - connection_t cl; + connection_t c; cp - cl.address = address; - cl.port = port; + c.address = address; - return avl_search(connection_tree, &cl); + return avl_search(connection_tree, &c); } -connection_t *lookup_id(char *name) -{ - connection_t cl, *p; -cp - cl.name = name; - p = avl_search(id_tree, &cl); - if(p && p->status.active) - return p; - else - return NULL; -} - -/* Debugging */ - -void dump_connection_list(void) +void dump_connections(void) { avl_node_t *node; - connection_t *cl; + connection_t *c; cp - syslog(LOG_DEBUG, _("Connection list:")); - - syslog(LOG_DEBUG, _(" %s at %s port %hd options %ld sockets %d, %d status %04x"), - myself->name, myself->hostname, myself->port, myself->options, - myself->socket, myself->meta_socket, myself->status); + syslog(LOG_DEBUG, _("Connections:")); for(node = connection_tree->head; node; node = node->next) { - cl = (connection_t *)node->data; - syslog(LOG_DEBUG, _(" %s at %s port %hd options %ld sockets %d, %d status %04x"), - cl->name, cl->hostname, cl->port, cl->options, - cl->socket, cl->meta_socket, cl->status); + c = (connection_t *)node->data; + syslog(LOG_DEBUG, _(" %s at %s port %hd options %ld socket %d status %04x"), + c->name, c->hostname, c->port, c->options, + c->socket, c->status); } - syslog(LOG_DEBUG, _("End of connection list.")); + syslog(LOG_DEBUG, _("End of connections.")); cp } -int read_host_config(connection_t *cl) +int read_connection_config(connection_t *c) { char *fname; int x; cp - asprintf(&fname, "%s/hosts/%s", confbase, cl->name); - x = read_config_file(&cl->config, fname); + asprintf(&fname, "%s/hosts/%s", confbase, c->name); + x = read_config_file(c->config_tree, fname); free(fname); cp return x;