Remove duplicate command-line option parsing.
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 22 Oct 2010 11:06:06 +0000 (13:06 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 22 Oct 2010 11:06:06 +0000 (13:06 +0200)
Also fix parsing of command-line host configuration options for the local node.

src/conf.c
src/conf.h
src/connection.c
src/connection.h
src/net_setup.c

index dc5d2dc..da58a45 100644 (file)
@@ -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;
index a7e42d3..3eae4ad 100644 (file)
@@ -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 *);
index 36c0fdb..ac946ab 100644 (file)
@@ -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;
-}
index 5aac4a6..05e8b4b 100644 (file)
@@ -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__ */
index 9f0fd88..f4e5637 100644 (file)
@@ -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);