X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet.c;h=87deb97b60d669bf19897a54b6dbd275de644f72;hb=158cbe99f972a1613b7d4d95abfe5fe48e019e67;hp=286f15763e2f6cbd4e7bf632f91c550106d718f7;hpb=57991e264202ad83e2c1b663777b358bf5573652;p=meshlink diff --git a/src/net.c b/src/net.c index 286f1576..87deb97b 100644 --- a/src/net.c +++ b/src/net.c @@ -1,9 +1,6 @@ /* net.c -- most of the network code - Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen - 2006 Scott Lamb - 2011 Loïc Grenié + Copyright (C) 2014 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,15 +22,12 @@ #include "utils.h" #include "conf.h" #include "connection.h" -#include "device.h" #include "graph.h" #include "logger.h" #include "meta.h" -#include "names.h" #include "net.h" #include "netutl.h" #include "protocol.h" -#include "subnet.h" #include "xalloc.h" int contradicting_add_edge = 0; @@ -43,26 +37,23 @@ time_t last_config_check = 0; static timeout_t pingtimer; static timeout_t periodictimer; -/* Purge edges and subnets of unreachable nodes. Use carefully. */ +//TODO: move this to a better place +char *confbase; +/* Purge edges of unreachable nodes. Use carefully. */ + +// TODO: remove void purge(void) { logger(DEBUG_PROTOCOL, LOG_DEBUG, "Purging unreachable nodes"); - /* Remove all edges and subnets owned by unreachable nodes. */ + /* Remove all edges owned by unreachable nodes. */ for splay_each(node_t, n, node_tree) { if(!n->status.reachable) { logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Purging node %s (%s)", n->name, n->hostname); - for splay_each(subnet_t, s, n->subnet_tree) { - send_del_subnet(everyone, s); - if(!strictsubnets) - subnet_del(n, s); - } - for splay_each(edge_t, e, n->edge_tree) { - if(!tunnelserver) - send_del_edge(everyone, e); + send_del_edge(everyone, e); edge_del(e); } } @@ -75,10 +66,6 @@ void purge(void) { for splay_each(edge_t, e, edge_weight_tree) if(e->to == n) return; - - if(!autoconnect && (!strictsubnets || !n->subnet_tree->head)) - /* in strictsubnets mode do not delete nodes with subnets */ - node_del(n); } } } @@ -99,7 +86,7 @@ void terminate_connection(connection_t *c, bool report) { c->node->connection = NULL; if(c->edge) { - if(report && !tunnelserver) + if(report) send_del_edge(everyone, c->edge); edge_del(c->edge); @@ -115,8 +102,7 @@ void terminate_connection(connection_t *c, bool report) { edge_t *e; e = lookup_edge(c->node, myself); if(e) { - if(!tunnelserver) - send_del_edge(everyone, e); + send_del_edge(everyone, e); edge_del(e); } } @@ -129,6 +115,12 @@ void terminate_connection(connection_t *c, bool report) { if(outgoing) do_outgoing_connection(outgoing); + +#ifndef HAVE_MINGW + /* Clean up dead proxy processes */ + + while(waitpid(-1, NULL, WNOHANG) > 0); +#endif } /* @@ -141,9 +133,6 @@ void terminate_connection(connection_t *c, bool report) { */ static void timeout_handler(void *data) { for list_each(connection_t, c, connection_list) { - if(c->status.control) - continue; - if(c->last_ping_time + pingtimeout <= now.tv_sec) { if(c->status.active) { if(c->status.pinged) { @@ -194,7 +183,7 @@ static void periodic_handler(void *data) { /* Count number of active connections */ int nc = 0; for list_each(connection_t, c, connection_list) { - if(c->status.active && !c->status.control) + if(c->status.active) nc++; } @@ -241,7 +230,7 @@ static void periodic_handler(void *data) { int i = 0; for list_each(connection_t, c, connection_list) { - if(!c->status.active || c->status.control) + if(!c->status.active) continue; if(i++ != r) @@ -288,25 +277,6 @@ void handle_meta_connection_data(connection_t *c) { } } -#ifndef HAVE_MINGW -static void sigterm_handler(void *data) { - logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum)); - event_exit(); -} - -static void sighup_handler(void *data) { - logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum)); - reopenlogger(); - if(reload_configuration()) - exit(1); -} - -static void sigalrm_handler(void *data) { - logger(DEBUG_ALWAYS, LOG_NOTICE, "Got %s signal", strsignal(((signal_t *)data)->signum)); - retry(); -} -#endif - int reload_configuration(void) { char *fname = NULL; @@ -320,8 +290,6 @@ int reload_configuration(void) { return EINVAL; } - read_config_options(config_tree, NULL); - xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, myself->name); read_config_file(config_tree, fname); free(fname); @@ -330,64 +298,6 @@ int reload_configuration(void) { setup_myself_reloadable(); - /* If StrictSubnet is set, expire deleted Subnets and read new ones in */ - - if(strictsubnets) { - for splay_each(subnet_t, subnet, subnet_tree) - subnet->expires = 1; - - load_all_subnets(); - - for splay_each(subnet_t, subnet, subnet_tree) { - if(subnet->expires == 1) { - send_del_subnet(everyone, subnet); - if(subnet->owner->status.reachable) - subnet_update(subnet->owner, subnet, false); - subnet_del(subnet->owner, subnet); - } else if(subnet->expires == -1) { - subnet->expires = 0; - } else { - send_add_subnet(everyone, subnet); - if(subnet->owner->status.reachable) - subnet_update(subnet->owner, subnet, true); - } - } - } else { /* Only read our own subnets back in */ - for splay_each(subnet_t, subnet, myself->subnet_tree) - if(!subnet->expires) - subnet->expires = 1; - - config_t *cfg = lookup_config(config_tree, "Subnet"); - - while(cfg) { - subnet_t *subnet, *s2; - - if(!get_config_subnet(cfg, &subnet)) - continue; - - if((s2 = lookup_subnet(myself, subnet))) { - if(s2->expires == 1) - s2->expires = 0; - - free_subnet(subnet); - } else { - subnet_add(myself, subnet); - send_add_subnet(everyone, subnet); - subnet_update(myself, subnet, true); - } - - cfg = lookup_config_next(config_tree, cfg); - } - - for splay_each(subnet_t, subnet, myself->subnet_tree) { - if(subnet->expires == 1) { - send_del_subnet(everyone, subnet); - subnet_update(myself, subnet, false); - subnet_del(myself, subnet); - } - } - } - /* Try to make outgoing connections */ try_outgoing_connections(); @@ -395,9 +305,6 @@ int reload_configuration(void) { /* Close connections to hosts that have a changed or deleted host config file */ for list_each(connection_t, c, connection_list) { - if(c->status.control) - continue; - xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, c->name); struct stat s; if(stat(fname, &s) || s.st_mtime > last_config_check) { @@ -437,33 +344,11 @@ int main_loop(void) { timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000}); timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){pingtimeout, rand() % 100000}); -#ifndef HAVE_MINGW - signal_t sighup = {0}; - signal_t sigterm = {0}; - signal_t sigquit = {0}; - signal_t sigint = {0}; - signal_t sigalrm = {0}; - - signal_add(&sighup, sighup_handler, &sighup, SIGHUP); - signal_add(&sigterm, sigterm_handler, &sigterm, SIGTERM); - signal_add(&sigquit, sigterm_handler, &sigquit, SIGQUIT); - signal_add(&sigint, sigterm_handler, &sigint, SIGINT); - signal_add(&sigalrm, sigalrm_handler, &sigalrm, SIGALRM); -#endif - if(!event_loop()) { logger(DEBUG_ALWAYS, LOG_ERR, "Error while waiting for input: %s", strerror(errno)); return 1; } -#ifndef HAVE_MINGW - signal_del(&sighup); - signal_del(&sigterm); - signal_del(&sigquit); - signal_del(&sigint); - signal_del(&sigalrm); -#endif - timeout_del(&periodictimer); timeout_del(&pingtimer);