X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fconf.c;h=099b77dac1f39778ea8e2902f912bab9118152e5;hb=33f241d97852d7a171f1aaf1bda7f66356ff889e;hp=faff003b260807b258701aa656119eb25d882a3b;hpb=886a6f61a1f4cc48a77b42d10f34f9126377d904;p=tinc diff --git a/src/conf.c b/src/conf.c index faff003b..099b77da 100644 --- a/src/conf.c +++ b/src/conf.c @@ -3,7 +3,7 @@ Copyright (C) 1998 Robert van der Meulen 1998-2005 Ivo Timmermans 2000-2010 Guus Sliepen - 2010 Julien Muchembled + 2010-2011 Julien Muchembled 2000 Cris van Pelt This program is free software; you can redistribute it and/or modify @@ -26,6 +26,7 @@ #include "splay_tree.h" #include "connection.h" #include "conf.h" +#include "list.h" #include "logger.h" #include "netutl.h" /* for str2address */ #include "protocol.h" @@ -188,7 +189,7 @@ bool get_config_address(const config_t *cfg, struct addrinfo **result) { } bool get_config_subnet(const config_t *cfg, subnet_t ** result) { - subnet_t subnet = {0}; + subnet_t subnet = {NULL}; if(!cfg) return false; @@ -342,22 +343,33 @@ void read_config_options(splay_tree_t *config_tree, const char *prefix) { size_t prefix_len = prefix ? strlen(prefix) : 0; for(node = cmdline_conf->tail; node; node = next) { - config_t *cfg = (config_t *)node->data; + config_t *orig_cfg, *cfg = (config_t *)node->data; next = node->prev; - if(!prefix && strchr(cfg->variable, '.')) - continue; - - if(prefix && (strncmp(prefix, cfg->variable, prefix_len) || cfg->variable[prefix_len] != '.')) - continue; - + if(!prefix) { + if(strchr(cfg->variable, '.')) + continue; + node->data = NULL; + list_unlink_node(cmdline_conf, node); + } else { + if(strncmp(prefix, cfg->variable, prefix_len) || + cfg->variable[prefix_len] != '.') + continue; + /* Because host configuration is parsed again when + reconnecting, nodes must not be freed when a prefix + is given. */ + orig_cfg = cfg; + cfg = new_config(); + cfg->variable = xstrdup(orig_cfg->variable + prefix_len + 1); + cfg->value = xstrdup(orig_cfg->value); + cfg->file = NULL; + cfg->line = orig_cfg->line; + } config_add(config_tree, cfg); - node->data = NULL; - list_unlink_node(cmdline_conf, node); } } -bool read_server_config() { +bool read_server_config(void) { char *fname; bool x;