Allow empty lines in config files.
[tinc] / src / conf.c
index d34a087..e927abd 100644 (file)
@@ -19,7 +19,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id: conf.c,v 1.9.4.68 2003/07/22 20:55:19 guus Exp $
+    $Id: conf.c,v 1.9.4.74 2003/08/08 14:59:27 guus Exp $
 */
 
 #include "system.h"
@@ -37,7 +37,7 @@ int pingtimeout = 0;                  /* seconds before timeout */
 char *confbase = NULL;                 /* directory in which all config files are */
 char *netname = NULL;                  /* name of the vpn network */
 
-static int config_compare(config_t *a, config_t *b)
+static int config_compare(const config_t *a, const config_t *b)
 {
        int result;
 
@@ -99,7 +99,7 @@ void config_add(avl_tree_t *config_tree, config_t *cfg)
        avl_insert(config_tree, cfg);
 }
 
-config_t *lookup_config(avl_tree_t *config_tree, char *variable)
+config_t *lookup_config(const avl_tree_t *config_tree, char *variable)
 {
        config_t cfg, *found;
 
@@ -120,7 +120,7 @@ config_t *lookup_config(avl_tree_t *config_tree, char *variable)
        return found;
 }
 
-config_t *lookup_config_next(avl_tree_t *config_tree, config_t *cfg)
+config_t *lookup_config_next(const avl_tree_t *config_tree, const config_t *cfg)
 {
        avl_node_t *node;
        config_t *found;
@@ -141,7 +141,7 @@ config_t *lookup_config_next(avl_tree_t *config_tree, config_t *cfg)
        return NULL;
 }
 
-bool get_config_bool(config_t *cfg, bool *result)
+bool get_config_bool(const config_t *cfg, bool *result)
 {
        cp();
 
@@ -162,7 +162,7 @@ bool get_config_bool(config_t *cfg, bool *result)
        return false;
 }
 
-bool get_config_int(config_t *cfg, int *result)
+bool get_config_int(const config_t *cfg, int *result)
 {
        cp();
 
@@ -178,7 +178,7 @@ bool get_config_int(config_t *cfg, int *result)
        return false;
 }
 
-bool get_config_string(config_t *cfg, char **result)
+bool get_config_string(const config_t *cfg, char **result)
 {
        cp();
 
@@ -190,7 +190,7 @@ bool get_config_string(config_t *cfg, char **result)
        return true;
 }
 
-bool get_config_address(config_t *cfg, struct addrinfo **result)
+bool get_config_address(const config_t *cfg, struct addrinfo **result)
 {
        struct addrinfo *ai;
 
@@ -212,7 +212,7 @@ bool get_config_address(config_t *cfg, struct addrinfo **result)
        return false;
 }
 
-bool get_config_subnet(config_t *cfg, subnet_t ** result)
+bool get_config_subnet(const config_t *cfg, subnet_t ** result)
 {
        subnet_t *subnet;
 
@@ -326,6 +326,7 @@ int read_config_file(avl_tree_t *config_tree, const char *fname)
        char *buffer, *line;
        char *variable, *value;
        int lineno = 0;
+       int len;
        bool ignore = false;
        config_t *cfg;
        size_t bufsize;
@@ -358,37 +359,44 @@ int read_config_file(avl_tree_t *config_tree, const char *fname)
 
                lineno++;
 
-               variable = strtok(line, "\t =");
+               if(!*line || *line == '#')
+                       continue;
 
-               if(!variable)
-                       continue;                       /* no tokens on this line */
-
-               if(variable[0] == '#')
-                       continue;                       /* comment: ignore */
-
-               if(!strcmp(variable, "-----BEGIN"))
+               if(ignore) {
+                       if(!strncmp(line, "-----END", 8))
+                               ignore = false;
+                       continue;
+               }
+               
+               if(!strncmp(line, "-----BEGIN", 10)) {
                        ignore = true;
+                       continue;
+               }
 
-               if(!ignore) {
-                       value = strtok(NULL, "\t\n\r =");
-
-                       if(!value || value[0] == '#') {
-                               logger(LOG_ERR, _("No value for variable `%s' on line %d while reading config file %s"),
-                                          variable, lineno, fname);
-                               break;
-                       }
+               variable = value = line;
 
-                       cfg = new_config();
-                       cfg->variable = xstrdup(variable);
-                       cfg->value = xstrdup(value);
-                       cfg->file = xstrdup(fname);
-                       cfg->line = lineno;
+               len = strcspn(value, "\t =");
+               value += len;
+               value += strspn(value, "\t ");
+               if(*value == '=') {
+                       value++;
+                       value += strspn(value, "\t ");
+               }
+               variable[len] = '\0';
 
-                       config_add(config_tree, cfg);
+               if(!*value) {
+                       logger(LOG_ERR, _("No value for variable `%s' on line %d while reading config file %s"),
+                                  variable, lineno, fname);
+                       break;
                }
 
-               if(!strcmp(variable, "-----END"))
-                       ignore = false;
+               cfg = new_config();
+               cfg->variable = xstrdup(variable);
+               cfg->value = xstrdup(value);
+               cfg->file = xstrdup(fname);
+               cfg->line = lineno;
+
+               config_add(config_tree, cfg);
        }
 
        free(buffer);
@@ -537,7 +545,11 @@ FILE *ask_and_safe_open(const char *filename, const char *what, bool safe, const
                        fn = xstrdup(filename);
        }
 
-       if(!strchr(fn, '/') || fn[0] != '/') {
+#ifdef HAVE_MINGW
+       if(fn[0] != '\\' && fn[0] != '/' && !strchr(fn, ':')) {
+#else
+       if(fn[0] != '/') {
+#endif
                /* The directory is a relative path or a filename. */
                char *p;