From 667b1bac77b134cf32c98d5dc25619e8c3303f52 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Fri, 22 Oct 2010 13:06:06 +0200 Subject: [PATCH] Remove duplicate command-line option parsing. Also fix parsing of command-line host configuration options for the local node. --- src/conf.c | 44 ++++++++++++++++++++++++++++++++++++-------- src/conf.h | 2 ++ src/connection.c | 26 -------------------------- src/connection.h | 1 - src/net_setup.c | 1 + 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/conf.c b/src/conf.c index dc5d2dc2..da58a455 100644 --- a/src/conf.c +++ b/src/conf.c @@ -23,6 +23,7 @@ #include "system.h" #include "avl_tree.h" +#include "connection.h" #include "conf.h" #include "logger.h" #include "netutl.h" /* for str2address */ @@ -335,20 +336,32 @@ bool read_config_file(avl_tree_t *config_tree, const char *fname) { return result; } -bool read_server_config() { +void read_config_options(avl_tree_t *config_tree, const char *prefix) { list_node_t *node, *next; - char *fname; - bool x; + size_t prefix_len = strlen(prefix); for(node = cmdline_conf->tail; node; node = next) { config_t *cfg = (config_t *)node->data; next = node->prev; - if (!strchr(cfg->variable, '.')) { - config_add(config_tree, cfg); - node->data = NULL; - list_unlink_node(cmdline_conf, node); - } + + if(!prefix && strchr(cfg->variable, '.')) + continue; + + if(prefix && (strncmp(prefix, cfg->variable, prefix_len) || cfg->variable[prefix_len] != '.')) + continue; + + config_add(config_tree, cfg); + node->data = NULL; + list_unlink_node(cmdline_conf, node); } +} + +bool read_server_config() { + list_node_t *node, *next; + char *fname; + bool x; + + read_config_options(config_tree, NULL); xasprintf(&fname, "%s/tinc.conf", confbase); x = read_config_file(config_tree, fname); @@ -362,6 +375,21 @@ bool read_server_config() { return x; } +bool read_connection_config(connection_t *c) { + list_node_t *node, *next; + size_t name_len = strlen(c->name); + char *fname; + bool x; + + read_config_options(c->config_tree, c->name); + + xasprintf(&fname, "%s/hosts/%s", confbase, c->name); + x = read_config_file(c->config_tree, fname); + free(fname); + + return x; +} + FILE *ask_and_open(const char *filename, const char *what) { FILE *r; char *directory; diff --git a/src/conf.h b/src/conf.h index a7e42d3c..3eae4ad7 100644 --- a/src/conf.h +++ b/src/conf.h @@ -58,7 +58,9 @@ extern bool get_config_subnet(const config_t *, struct subnet_t **); extern config_t *parse_config_line(char *, const char *, int); extern bool read_config_file(avl_tree_t *, const char *); +extern void read_config_options(avl_tree_t *, const char *); extern bool read_server_config(void); +extern bool read_connection_config(struct connection_t *); extern FILE *ask_and_open(const char *, const char *); extern bool is_safe_path(const char *); extern bool disable_old_keys(FILE *); diff --git a/src/connection.c b/src/connection.c index 36c0fdbc..ac946abe 100644 --- a/src/connection.c +++ b/src/connection.c @@ -127,29 +127,3 @@ void dump_connections(void) { logger(LOG_DEBUG, "End of connections."); } - -bool read_connection_config(connection_t *c) { - list_node_t *node, *next; - size_t name_len = strlen(c->name); - char *fname; - bool x; - - for(node = cmdline_conf->tail; node; node = next) { - config_t *cfg = (config_t *)node->data; - next = node->prev; - if (!strncmp(c->name, cfg->variable, name_len) && cfg->variable[name_len] == '.') { - config_t *new_cfg = new_config(); - new_cfg->variable = xstrdup(cfg->variable + name_len + 1); - new_cfg->value = xstrdup(cfg->value); - new_cfg->file = NULL; - new_cfg->line = cfg->line; - config_add(c->config_tree, new_cfg); - } - } - - xasprintf(&fname, "%s/hosts/%s", confbase, c->name); - x = read_config_file(c->config_tree, fname); - free(fname); - - return x; -} diff --git a/src/connection.h b/src/connection.h index 5aac4a66..05e8b4ba 100644 --- a/src/connection.h +++ b/src/connection.h @@ -111,6 +111,5 @@ extern void free_connection(connection_t *); extern void connection_add(connection_t *); extern void connection_del(connection_t *); extern void dump_connections(void); -extern bool read_connection_config(connection_t *); #endif /* __TINC_CONNECTION_H__ */ diff --git a/src/net_setup.c b/src/net_setup.c index 9f0fd888..f4e56378 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -300,6 +300,7 @@ bool setup_myself(void) { myself->name = name; myself->connection->name = xstrdup(name); xasprintf(&fname, "%s/hosts/%s", confbase, name); + read_config_options(config_tree, name); read_config_file(config_tree, fname); free(fname); -- 2.20.1