X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fconfigfile.c;h=7e06baa2c83b7eaeb78005fd545105119848d64e;hb=96e0f2341bace029acefe0a88bab96ae326c0ff5;hp=1a9e28a624fed56c302cdec73c30bc563ef89597;hpb=76910471b1d2b1d5f43d49286bf1f9a03a060f1c;p=collectd.git diff --git a/src/configfile.c b/src/configfile.c index 1a9e28a6..7e06baa2 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -98,7 +98,7 @@ static cf_value_map_t cf_value_map[] = {"PluginDir", dispatch_value_plugindir}, {"LoadPlugin", dispatch_loadplugin} }; -static int cf_value_map_num = STATIC_ARRAY_LEN (cf_value_map); +static int cf_value_map_num = STATIC_ARRAY_SIZE (cf_value_map); static cf_global_option_t cf_global_options[] = { @@ -108,11 +108,12 @@ static cf_global_option_t cf_global_options[] = {"FQDNLookup", NULL, "true"}, {"Interval", NULL, NULL}, {"ReadThreads", NULL, "5"}, + {"WriteThreads", NULL, "5"}, {"Timeout", NULL, "2"}, {"PreCacheChain", NULL, "PreCache"}, {"PostCacheChain", NULL, "PostCache"} }; -static int cf_global_options_num = STATIC_ARRAY_LEN (cf_global_options); +static int cf_global_options_num = STATIC_ARRAY_SIZE (cf_global_options); static int cf_default_typesdb = 1; @@ -475,6 +476,12 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, /* Resize the memory containing the children to be big enough to hold * all children. */ + if (dst->children_num + src->children_num - 1 == 0) + { + dst->children_num = 0; + return (0); + } + temp = (oconfig_item_t *) realloc (dst->children, sizeof (oconfig_item_t) * (dst->children_num + src->children_num - 1)); @@ -555,32 +562,42 @@ static int cf_include_all (oconfig_item_t *root, int depth) oconfig_item_t *new; oconfig_item_t *old; - /* Ignore all blocks, including `Include' blocks. */ - if (root->children[i].children_num != 0) - continue; + char *pattern = NULL; + + int j; if (strcasecmp (root->children[i].key, "Include") != 0) continue; old = root->children + i; - if ((old->values_num < 1) || (old->values_num > 2) - || (old->values[0].type != OCONFIG_TYPE_STRING) - || ((old->values_num == 2) - && (old->values[1].type != OCONFIG_TYPE_STRING))) + if ((old->values_num != 1) + || (old->values[0].type != OCONFIG_TYPE_STRING)) { - ERROR ("configfile: `Include' needs exactly one or two string argument."); + ERROR ("configfile: `Include' needs exactly one string argument."); continue; } - new = cf_read_generic (old->values[0].value.string, - (old->values_num == 2) ? old->values[1].value.string : NULL, - depth + 1); + for (j = 0; j < old->children_num; ++j) + { + oconfig_item_t *child = old->children + j; + + if (strcasecmp (child->key, "Filter") == 0) + cf_util_get_string (child, &pattern); + else + ERROR ("configfile: Option `%s' not allowed in block.", + child->key); + } + + new = cf_read_generic (old->values[0].value.string, pattern, depth + 1); + sfree (pattern); + if (new == NULL) - continue; + return (-1); /* Now replace the i'th child in `root' with `new'. */ - cf_ci_replace_child (root, new, i); + if (cf_ci_replace_child (root, new, i) < 0) + return (-1); /* ... and go back to the new i'th child. */ --i; @@ -596,6 +613,7 @@ static oconfig_item_t *cf_read_file (const char *file, const char *pattern, int depth) { oconfig_item_t *root; + int status; assert (depth < CF_MAX_DEPTH); @@ -605,6 +623,9 @@ static oconfig_item_t *cf_read_file (const char *file, char *filename = basename (tmp); if ((filename != NULL) && (fnmatch (pattern, filename, 0) != 0)) { + DEBUG ("configfile: Not including `%s' because it " + "does not match pattern `%s'.", + filename, pattern); free (tmp); return (NULL); } @@ -624,7 +645,12 @@ static oconfig_item_t *cf_read_file (const char *file, 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 */ @@ -817,12 +843,6 @@ static oconfig_item_t *cf_read_generic (const char *path, wordfree (&we); - if (root->children == NULL) - { - oconfig_free (root); - return (NULL); - } - return (root); } /* oconfig_item_t *cf_read_generic */ /* #endif HAVE_WORDEXP_H */ @@ -1034,6 +1054,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++) {