X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fconfigfile.c;h=1a957f67463f138c673cc5dd5f23ebcbabffa8c3;hb=7de4b3692af84751fab5ac46a5da7414346ea50b;hp=ca0cafeb70d8a146365a36100bc9b03f2bbcd8d4;hpb=eb78f4965a6a2cd25c54ffb832f5e42744d968ad;p=collectd.git diff --git a/src/configfile.c b/src/configfile.c index ca0cafeb..1a957f67 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -1,6 +1,6 @@ /** * collectd - src/configfile.c - * Copyright (C) 2005-2008 Florian octo Forster + * Copyright (C) 2005-2009 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -30,6 +30,7 @@ #include "configfile.h" #include "types_list.h" #include "utils_threshold.h" +#include "filter_chain.h" #if HAVE_WORDEXP_H # include @@ -97,7 +98,9 @@ static cf_global_option_t cf_global_options[] = {"Hostname", NULL, NULL}, {"FQDNLookup", NULL, "false"}, {"Interval", NULL, "10"}, - {"ReadThreads", NULL, "5"} + {"ReadThreads", NULL, "5"}, + {"PreCacheChain", NULL, "PreCache"}, + {"PostCacheChain", NULL, "PostCache"} }; static int cf_global_options_num = STATIC_ARRAY_LEN (cf_global_options); @@ -155,7 +158,8 @@ static int cf_dispatch (const char *type, const char *orig_key, for (i = 0; i < cf_cb->keys_num; i++) { - if (strcasecmp (cf_cb->keys[i], key) == 0) + if ((cf_cb->keys[i] != NULL) + && (strcasecmp (cf_cb->keys[i], key) == 0)) { ret = (*cf_cb->callback) (key, value); break; @@ -168,7 +172,7 @@ static int cf_dispatch (const char *type, const char *orig_key, free (key); free (value); - DEBUG ("return (%i)", ret); + DEBUG ("cf_dispatch: return (%i)", ret); return (ret); } /* int cf_dispatch */ @@ -204,13 +208,18 @@ static int dispatch_value_typesdb (const oconfig_item_t *ci) cf_default_typesdb = 0; - if (ci->values_num < 1) + if (ci->values_num < 1) { + ERROR ("configfile: `TypesDB' needs at least one argument."); return (-1); + } for (i = 0; i < ci->values_num; ++i) { - if (OCONFIG_TYPE_STRING != ci->values[i].type) + if (OCONFIG_TYPE_STRING != ci->values[i].type) { + WARNING ("configfile: TypesDB: Skipping %i. argument which " + "is not a string.", i + 1); continue; + } read_types_list (ci->values[i].value.string); } @@ -276,7 +285,7 @@ static int dispatch_value_plugin (const char *plugin, oconfig_item_t *ci) buffer_ptr = buffer + 1; return (cf_dispatch (plugin, ci->key, buffer_ptr)); -} /* int plugin_conf_dispatch */ +} /* int dispatch_value_plugin */ static int dispatch_value (const oconfig_item_t *ci) { @@ -327,7 +336,15 @@ static int dispatch_block_plugin (oconfig_item_t *ci) if (ci->children[i].children == NULL) dispatch_value_plugin (name, ci->children + i); else - {DEBUG ("No nested config blocks allowed for this plugin.");} + { + WARNING ("There is a `%s' block within the " + "configuration for the %s plugin. " + "The plugin either only expects " + "\"simple\" configuration statements " + "or wasn't loaded using `LoadPlugin'." + " Please check your configuration.", + ci->children[i].key, name); + } } return (0); @@ -340,6 +357,8 @@ static int dispatch_block (oconfig_item_t *ci) return (dispatch_block_plugin (ci)); else if (strcasecmp (ci->key, "Threshold") == 0) return (ut_config (ci)); + else if (strcasecmp (ci->key, "Chain") == 0) + return (fc_configure (ci)); return (0); } @@ -367,12 +386,12 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, temp = NULL; /* If (src->children_num == 0) the array size is decreased. If offset - * is _not_ the last element, (offset < (src->children_num - 1)), then + * is _not_ the last element, (offset < (dst->children_num - 1)), then * we need to move the trailing elements before resizing the array. */ - if ((src->children_num == 0) && (offset < (src->children_num - 1))) + if ((src->children_num == 0) && (offset < (dst->children_num - 1))) { - int nmemb = src->children_num - (offset + 1); - memmove (src->children + offset, src->children + offset + 1, + int nmemb = dst->children_num - (offset + 1); + memmove (dst->children + offset, dst->children + offset + 1, sizeof (oconfig_item_t) * nmemb); } @@ -404,7 +423,7 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, sizeof (oconfig_item_t) * nmemb); } - /* Last but not least: If there are new childrem, copy them to the + /* Last but not least: If there are new children, copy them to the * memory reserved for them. */ if (src->children_num > 0) { @@ -480,6 +499,9 @@ static int cf_include_all (oconfig_item_t *root, int depth) /* Now replace the i'th child in `root' with `new'. */ cf_ci_replace_child (root, new, i); + /* ... and go back to the new i'th child. */ + --i; + sfree (new->values); sfree (new); } /* for (i = 0; i < root->children_num; i++) */ @@ -549,7 +571,7 @@ static oconfig_item_t *cf_read_dir (const char *dir, int depth) status = ssnprintf (name, sizeof (name), "%s/%s", dir, de->d_name); - if (status >= sizeof (name)) + if ((status < 0) || ((size_t) status >= sizeof (name))) { ERROR ("configfile: Not including `%s/%s' because its" " name is too long.", @@ -624,7 +646,7 @@ static oconfig_item_t *cf_read_generic (const char *path, int depth) int status; const char *path_ptr; wordexp_t we; - int i; + size_t i; if (depth >= CF_MAX_DEPTH) { @@ -895,3 +917,43 @@ int cf_read (char *filename) return (0); } /* int cf_read */ + +/* Assures the config option is a string, duplicates it and returns the copy in + * "ret_string". If necessary "*ret_string" is freed first. Returns zero upon + * success. */ +int cf_util_get_string (const oconfig_item_t *ci, char **ret_string) /* {{{ */ +{ + char *string; + + if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) + { + ERROR ("cf_util_get_string: The %s plugin requires " + "exactly one string argument.", ci->key); + return (-1); + } + + string = strdup (ci->values[0].value.string); + if (string == NULL) + return (-1); + + if (*ret_string != NULL) + sfree (*ret_string); + *ret_string = string; + + return (0); +} /* }}} int cf_util_get_string */ + +/* Assures that the config option is a string. The string is then converted to + * a port number using `service_name_to_port_number' and returned. Returns the + * port number in the range [1-65535] or less than zero upon failure. */ +int cf_util_get_port_number (const oconfig_item_t *ci) /* {{{ */ +{ + if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) + { + ERROR ("cf_util_get_port_number: The %s plugin requires " + "exactly one string argument.", ci->key); + return (-1); + } + + return (service_name_to_port_number (ci->values[0].value.string)); +} /* }}} int cf_util_get_port_number */