X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fconf.c;h=5f8fdb1e6b5bef4c6bdfa21afe9dac8649a178aa;hb=5686ad80b545afa3de9ed2f4176a5346e289aaa8;hp=1b8213c4709aa76d891842420eb874c0db5a2f0b;hpb=5f729f76f5a63114df582fc29f4189140c1e5ead;p=tinc diff --git a/src/conf.c b/src/conf.c index 1b8213c4..5f8fdb1e 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 @@ -339,21 +339,32 @@ bool read_config_file(avl_tree_t *config_tree, const char *fname) { void read_config_options(avl_tree_t *config_tree, const char *prefix) { list_node_t *node, *next; - size_t prefix_len = strlen(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); } }