Code

src/configfile.c: Let errors in included files propagate up to cf_read().
authorFlorian Forster <octo@collectd.org>
Thu, 30 May 2013 06:58:06 +0000 (08:58 +0200)
committerFlorian Forster <octo@collectd.org>
Thu, 30 May 2013 06:58:06 +0000 (08:58 +0200)
cf_read_generic() returned NULL in two cases: Unable to read file and
file was empty. Since we wanted to allow empty includes, the "include
file with errors" case was not handled properly.

Github: #323

src/configfile.c

index 5920c53129628c3691af816843aff70af8f55e5c..be777c52a02cbb0074c405fa7909ab0a3968c3b9 100644 (file)
@@ -564,7 +564,7 @@ static int cf_include_all (oconfig_item_t *root, int depth)
 
                new = cf_read_generic (old->values[0].value.string, depth + 1);
                if (new == NULL)
-                       continue;
+                       return (-1);
 
                /* Now replace the i'th child in `root' with `new'. */
                cf_ci_replace_child (root, new, i);
@@ -582,6 +582,7 @@ static int cf_include_all (oconfig_item_t *root, int depth)
 static oconfig_item_t *cf_read_file (const char *file, int depth)
 {
        oconfig_item_t *root;
+       int status;
 
        assert (depth < CF_MAX_DEPTH);
 
@@ -592,7 +593,12 @@ static oconfig_item_t *cf_read_file (const char *file, int depth)
                return (NULL);
        }
 
-       cf_include_all (root, depth);
+       status = cf_include_all (root, depth);
+       if (status != 0)
+       {
+               oconfig_free (root);
+               return (NULL);
+       }
 
        return (root);
 } /* oconfig_item_t *cf_read_file */
@@ -783,12 +789,6 @@ static oconfig_item_t *cf_read_generic (const char *path, int depth)
 
        wordfree (&we);
 
-       if (root->children == NULL)
-       {
-               oconfig_free (root);
-               return (NULL);
-       }
-
        return (root);
 } /* oconfig_item_t *cf_read_generic */
 /* #endif HAVE_WORDEXP_H */
@@ -999,6 +999,12 @@ int cf_read (char *filename)
                ERROR ("Unable to read config file %s.", filename);
                return (-1);
        }
+       else if (conf->children_num == 0)
+       {
+               ERROR ("Configuration file %s is empty.", filename);
+               oconfig_free (conf);
+               return (-1);
+       }
 
        for (i = 0; i < conf->children_num; i++)
        {