X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_setup.c;h=32946dab14ac021654c312311af9993ac94d8c50;hb=158cbe99f972a1613b7d4d95abfe5fe48e019e67;hp=b344eebc3e78b60a09cdbc967ded70c11d94abcf;hpb=b3b89e46b1b84fa6cf1726fabe9e9c7bb0d3d831;p=meshlink diff --git a/src/net_setup.c b/src/net_setup.c index b344eebc..32946dab 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -1,9 +1,6 @@ /* net_setup.c -- Setup. - Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2014 Guus Sliepen - 2006 Scott Lamb - 2010 Brandon Black + 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,20 +22,15 @@ #include "cipher.h" #include "conf.h" #include "connection.h" -#include "control.h" #include "digest.h" #include "ecdsa.h" #include "graph.h" #include "logger.h" -#include "names.h" #include "net.h" #include "netutl.h" -#include "process.h" #include "protocol.h" #include "route.h" #include "rsa.h" -#include "script.h" -#include "subnet.h" #include "utils.h" #include "xalloc.h" @@ -52,9 +44,6 @@ proxytype_t proxytype; int autoconnect; bool disablebuggypeers; -char *scriptinterpreter; -char *scriptextension; - bool node_read_ecdsa_public_key(node_t *n) { if(ecdsa_active(n->ecdsa)) return true; @@ -192,7 +181,7 @@ static bool read_ecdsa_private_key(void) { if(!fp) { logger(DEBUG_ALWAYS, LOG_ERR, "Error reading ECDSA private key file `%s': %s", fname, strerror(errno)); if(errno == ENOENT) - logger(DEBUG_ALWAYS, LOG_INFO, "Create an ECDSA keypair with `tinc -n %s generate-ecdsa-keys'.", netname ?: "."); + logger(DEBUG_ALWAYS, LOG_INFO, "Create an ECDSA keypair with `tinc generate-ecdsa-keys'."); free(fname); return false; } @@ -310,62 +299,6 @@ void regenerate_key(void) { send_key_changed(); } -/* - Read Subnets from all host config files -*/ -void load_all_subnets(void) { - DIR *dir; - struct dirent *ent; - char *dname; - - xasprintf(&dname, "%s" SLASH "hosts", confbase); - dir = opendir(dname); - if(!dir) { - logger(DEBUG_ALWAYS, LOG_ERR, "Could not open %s: %s", dname, strerror(errno)); - free(dname); - return; - } - - while((ent = readdir(dir))) { - if(!check_id(ent->d_name)) - continue; - - node_t *n = lookup_node(ent->d_name); - #ifdef _DIRENT_HAVE_D_TYPE - //if(ent->d_type != DT_REG) - // continue; - #endif - - splay_tree_t *config_tree; - init_configuration(&config_tree); - read_config_options(config_tree, ent->d_name); - read_host_config(config_tree, ent->d_name); - - if(!n) { - n = new_node(); - n->name = xstrdup(ent->d_name); - node_add(n); - } - - for(config_t *cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) { - subnet_t *s, *s2; - - if(!get_config_subnet(cfg, &s)) - continue; - - if((s2 = lookup_subnet(n, s))) { - s2->expires = -1; - } else { - subnet_add(n, s); - } - } - - exit_configuration(&config_tree); - } - - closedir(dir); -} - void load_all_nodes(void) { DIR *dir; struct dirent *ent; @@ -445,15 +378,6 @@ bool setup_myself_reloadable(void) { char *space; bool choice; - free(scriptinterpreter); - scriptinterpreter = NULL; - get_config_string(lookup_config(config_tree, "ScriptsInterpreter"), &scriptinterpreter); - - - free(scriptextension); - if(!get_config_string(lookup_config(config_tree, "ScriptsExtension"), &scriptextension)) - scriptextension = xstrdup(""); - get_config_string(lookup_config(config_tree, "Proxy"), &proxy); if(proxy) { if((space = strchr(proxy, ' '))) @@ -771,26 +695,11 @@ bool setup_myself(void) { sockaddr2str(&sa, NULL, &myport); } - /* Read in all the subnets specified in the host configuration file */ - - for(config_t *cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) { - subnet_t *subnet; - - if(!get_config_subnet(cfg, &subnet)) - return false; - - subnet_add(myself, subnet); - } - /* Check some options */ if(!setup_myself_reloadable()) return false; - get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets); - get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver); - strictsubnets |= tunnelserver; - if(get_config_int(lookup_config(config_tree, "MaxConnectionBurst"), &max_connection_burst)) { if(max_connection_burst <= 0) { logger(DEBUG_ALWAYS, LOG_ERR, "MaxConnectionBurst cannot be negative!"); @@ -798,20 +707,6 @@ bool setup_myself(void) { } } - if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) { - if(udp_rcvbuf <= 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!"); - return false; - } - } - - if(get_config_int(lookup_config(config_tree, "UDPSndBuf"), &udp_sndbuf)) { - if(udp_sndbuf <= 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "UDPSndBuf cannot be negative!"); - return false; - } - } - int replaywin_int; if(get_config_int(lookup_config(config_tree, "ReplayWindow"), &replaywin_int)) { if(replaywin_int < 0) { @@ -883,76 +778,32 @@ bool setup_myself(void) { graph(); - if(strictsubnets) - load_all_subnets(); - else if(autoconnect) + if(autoconnect) load_all_nodes(); /* Open sockets */ - if(!do_detach && getenv("LISTEN_FDS")) { - sockaddr_t sa; - socklen_t salen; - - listen_sockets = atoi(getenv("LISTEN_FDS")); -#ifdef HAVE_UNSETENV - unsetenv("LISTEN_FDS"); -#endif + listen_sockets = 0; + int cfgs = 0; - if(listen_sockets > MAXSOCKETS) { - logger(DEBUG_ALWAYS, LOG_ERR, "Too many listening sockets"); + for(config_t *cfg = lookup_config(config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) { + cfgs++; + get_config_string(cfg, &address); + if(!add_listen_address(address, true)) return false; - } - - for(int i = 0; i < listen_sockets; i++) { - salen = sizeof sa; - if(getsockname(i + 3, &sa.sa, &salen) < 0) { - logger(DEBUG_ALWAYS, LOG_ERR, "Could not get address of listen fd %d: %s", i + 3, sockstrerror(errno)); - return false; - } - -#ifdef FD_CLOEXEC - fcntl(i + 3, F_SETFD, FD_CLOEXEC); -#endif - - int udp_fd = setup_vpn_in_socket(&sa); - if(udp_fd < 0) - return false; - - io_add(&listen_socket[i].tcp, (io_cb_t)handle_new_meta_connection, &listen_socket[i], i + 3, IO_READ); - io_add(&listen_socket[i].udp, (io_cb_t)handle_incoming_vpn_data, &listen_socket[i], udp_fd, IO_READ); - - if(debug_level >= DEBUG_CONNECTIONS) { - hostname = sockaddr2hostname(&sa); - logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Listening on %s", hostname); - free(hostname); - } - - memcpy(&listen_socket[i].sa, &sa, salen); - } - } else { - listen_sockets = 0; - int cfgs = 0; - - for(config_t *cfg = lookup_config(config_tree, "BindToAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) { - cfgs++; - get_config_string(cfg, &address); - if(!add_listen_address(address, true)) - return false; - } - - for(config_t *cfg = lookup_config(config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) { - cfgs++; - get_config_string(cfg, &address); - if(!add_listen_address(address, false)) - return false; - } + } - if(!cfgs) - if(!add_listen_address(address, NULL)) - return false; + for(config_t *cfg = lookup_config(config_tree, "ListenAddress"); cfg; cfg = lookup_config_next(config_tree, cfg)) { + cfgs++; + get_config_string(cfg, &address); + if(!add_listen_address(address, false)) + return false; } + if(!cfgs) + if(!add_listen_address(address, NULL)) + return false; + if(!listen_sockets) { logger(DEBUG_ALWAYS, LOG_ERR, "Unable to create any listening socket!"); return false; @@ -986,7 +837,6 @@ bool setup_myself(void) { */ bool setup_network(void) { init_connections(); - init_subnets(); init_nodes(); init_edges(); init_requests(); @@ -1009,24 +859,6 @@ bool setup_network(void) { if(!setup_myself()) return false; - if(!init_control()) - return false; - - /* Run tinc-up script to further initialize the tap interface */ - - char *envp[5] = {NULL}; - xasprintf(&envp[0], "NETNAME=%s", netname ? : ""); - xasprintf(&envp[3], "NAME=%s", myself->name); - - execute_script("tinc-up", envp); - - for(int i = 0; i < 4; i++) - free(envp[i]); - - /* Run subnet-up scripts for our own subnets */ - - subnet_update(myself, NULL, true); - return true; } @@ -1037,9 +869,6 @@ void close_network_connections(void) { for(list_node_t *node = connection_list->head, *next; node; node = next) { next = node->next; connection_t *c = node->data; - /* Keep control connections open until the end, so they know when we really terminated */ - if(c->status.control) - c->socket = -1; c->outgoing = NULL; terminate_connection(c, false); } @@ -1048,7 +877,6 @@ void close_network_connections(void) { list_delete_list(outgoing_list); if(myself && myself->connection) { - subnet_update(myself, NULL, false); terminate_connection(myself->connection, false); free_connection(myself->connection); } @@ -1060,24 +888,12 @@ void close_network_connections(void) { close(listen_socket[i].udp.fd); } - char *envp[5] = {NULL}; - xasprintf(&envp[0], "NETNAME=%s", netname ? : ""); - xasprintf(&envp[3], "NAME=%s", myself->name); - exit_requests(); exit_edges(); - exit_subnets(); exit_nodes(); exit_connections(); - execute_script("tinc-down", envp); - if(myport) free(myport); - for(int i = 0; i < 4; i++) - free(envp[i]); - - exit_control(); - return; }