X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Fconfigfile.c;h=a31fb64d17781854d015236155c6a833eae8c186;hb=e1bfa71aca1f37c2f293dc9adb44065c6e7a9ad9;hp=34c23cdfad3b24c408269ae60f834aa90e18f8f4;hpb=6600bd1351bf81e0831e7ad95ee37a7b28cbdf94;p=collectd.git diff --git a/src/daemon/configfile.c b/src/daemon/configfile.c index 34c23cdf..a31fb64d 100644 --- a/src/daemon/configfile.c +++ b/src/daemon/configfile.c @@ -80,6 +80,7 @@ typedef struct cf_global_option_s { const char *key; char *value; + _Bool from_cli; /* value set from CLI */ const char *def; } cf_global_option_t; @@ -108,21 +109,21 @@ static int cf_value_map_num = STATIC_ARRAY_SIZE (cf_value_map); static cf_global_option_t cf_global_options[] = { - {"BaseDir", NULL, PKGLOCALSTATEDIR}, - {"PIDFile", NULL, PIDFILE}, - {"Hostname", NULL, NULL}, - {"FQDNLookup", NULL, "true"}, - {"Interval", NULL, NULL}, - {"ReadThreads", NULL, "5"}, - {"WriteThreads", NULL, "5"}, - {"WriteQueueLimitHigh", NULL, NULL}, - {"WriteQueueLimitLow", NULL, NULL}, - {"Timeout", NULL, "2"}, - {"AutoLoadPlugin", NULL, "false"}, - {"CollectInternalStats", NULL, "false"}, - {"PreCacheChain", NULL, "PreCache"}, - {"PostCacheChain", NULL, "PostCache"}, - {"MaxReadInterval", NULL, "86400"} + {"BaseDir", NULL, 0, PKGLOCALSTATEDIR}, + {"PIDFile", NULL, 0, PIDFILE}, + {"Hostname", NULL, 0, NULL}, + {"FQDNLookup", NULL, 0, "true"}, + {"Interval", NULL, 0, NULL}, + {"ReadThreads", NULL, 0, "5"}, + {"WriteThreads", NULL, 0, "5"}, + {"WriteQueueLimitHigh", NULL, 0, NULL}, + {"WriteQueueLimitLow", NULL, 0, NULL}, + {"Timeout", NULL, 0, "2"}, + {"AutoLoadPlugin", NULL, 0, "false"}, + {"CollectInternalStats", NULL, 0, "false"}, + {"PreCacheChain", NULL, 0, "PreCache"}, + {"PostCacheChain", NULL, 0, "PostCache"}, + {"MaxReadInterval", NULL, 0, "86400"} }; static int cf_global_options_num = STATIC_ARRAY_SIZE (cf_global_options); @@ -154,7 +155,7 @@ static int cf_dispatch (const char *type, const char *orig_key, char *key; char *value; int ret; - int i; + int i = 0; if (orig_key == NULL) return (EINVAL); @@ -210,19 +211,19 @@ static int dispatch_global_option (const oconfig_item_t *ci) if (ci->values_num != 1) return (-1); if (ci->values[0].type == OCONFIG_TYPE_STRING) - return (global_option_set (ci->key, ci->values[0].value.string)); + return (global_option_set (ci->key, ci->values[0].value.string, 0)); else if (ci->values[0].type == OCONFIG_TYPE_NUMBER) { char tmp[128]; ssnprintf (tmp, sizeof (tmp), "%lf", ci->values[0].value.number); - return (global_option_set (ci->key, tmp)); + return (global_option_set (ci->key, tmp, 0)); } else if (ci->values[0].type == OCONFIG_TYPE_BOOLEAN) { if (ci->values[0].value.boolean) - return (global_option_set (ci->key, "true")); + return (global_option_set (ci->key, "true", 0)); else - return (global_option_set (ci->key, "false")); + return (global_option_set (ci->key, "false", 0)); } return (-1); @@ -230,8 +231,6 @@ static int dispatch_global_option (const oconfig_item_t *ci) static int dispatch_value_typesdb (oconfig_item_t *ci) { - int i = 0; - assert (strcasecmp (ci->key, "TypesDB") == 0); cf_default_typesdb = 0; @@ -241,7 +240,7 @@ static int dispatch_value_typesdb (oconfig_item_t *ci) return (-1); } - for (i = 0; i < ci->values_num; ++i) + for (int i = 0; i < ci->values_num; ++i) { if (OCONFIG_TYPE_STRING != ci->values[i].type) { WARNING ("configfile: TypesDB: Skipping %i. argument which " @@ -269,10 +268,9 @@ static int dispatch_value_plugindir (oconfig_item_t *ci) static int dispatch_loadplugin (oconfig_item_t *ci) { - int i; const char *name; unsigned int flags = 0; - plugin_ctx_t ctx; + plugin_ctx_t ctx = { 0 }; plugin_ctx_t old_ctx; int ret_val; @@ -288,12 +286,11 @@ static int dispatch_loadplugin (oconfig_item_t *ci) name = "virt"; /* default to the global interval set before loading this plugin */ - memset (&ctx, 0, sizeof (ctx)); ctx.interval = cf_get_default_interval (); ctx.flush_interval = 0; ctx.flush_timeout = 0; - for (i = 0; i < ci->children_num; ++i) + for (int i = 0; i < ci->children_num; ++i) { oconfig_item_t *child = ci->children + i; @@ -325,12 +322,11 @@ static int dispatch_value_plugin (const char *plugin, oconfig_item_t *ci) char buffer[4096]; char *buffer_ptr; int buffer_free; - int i; buffer_ptr = buffer; buffer_free = sizeof (buffer); - for (i = 0; i < ci->values_num; i++) + for (int i = 0; i < ci->values_num; i++) { int status = -1; @@ -359,16 +355,15 @@ static int dispatch_value_plugin (const char *plugin, oconfig_item_t *ci) static int dispatch_value (oconfig_item_t *ci) { int ret = 0; - int i; - for (i = 0; i < cf_value_map_num; i++) + for (int i = 0; i < cf_value_map_num; i++) if (strcasecmp (cf_value_map[i].key, ci->key) == 0) { ret = cf_value_map[i].func (ci); break; } - for (i = 0; i < cf_global_options_num; i++) + for (int i = 0; i < cf_global_options_num; i++) if (strcasecmp (cf_global_options[i].key, ci->key) == 0) { ret = dispatch_global_option (ci); @@ -380,11 +375,8 @@ static int dispatch_value (oconfig_item_t *ci) static int dispatch_block_plugin (oconfig_item_t *ci) { - int i; const char *name; - cf_complex_callback_t *cb; - if (strcasecmp (ci->key, "Plugin") != 0) return (-1); if (ci->values_num < 1) @@ -405,12 +397,11 @@ static int dispatch_block_plugin (oconfig_item_t *ci) if (IS_TRUE (global_option_get ("AutoLoadPlugin"))) { - plugin_ctx_t ctx; + plugin_ctx_t ctx = { 0 }; plugin_ctx_t old_ctx; int status; /* default to the global interval set before loading this plugin */ - memset (&ctx, 0, sizeof (ctx)); ctx.interval = cf_get_default_interval (); old_ctx = plugin_set_ctx (ctx); @@ -427,7 +418,7 @@ static int dispatch_block_plugin (oconfig_item_t *ci) } /* Check for a complex callback first */ - for (cb = complex_callback_head; cb != NULL; cb = cb->next) + for (cf_complex_callback_t *cb = complex_callback_head; cb != NULL; cb = cb->next) { if (strcasecmp (name, cb->type) == 0) { @@ -442,7 +433,7 @@ static int dispatch_block_plugin (oconfig_item_t *ci) } /* Hm, no complex plugin found. Dispatch the values one by one */ - for (i = 0; i < ci->children_num; i++) + for (int i = 0; i < ci->children_num; i++) { if (ci->children[i].children == NULL) dispatch_value_plugin (name, ci->children + i); @@ -478,7 +469,6 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, int offset) { oconfig_item_t *temp; - int i; assert (offset >= 0); assert (dst->children_num > offset); @@ -486,7 +476,7 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src, /* Free the memory used by the replaced child. Usually that's the * `Include "blah"' statement. */ temp = dst->children + offset; - for (i = 0; i < temp->values_num; i++) + for (int i = 0; i < temp->values_num; i++) { if (temp->values[i].type == OCONFIG_TYPE_STRING) { @@ -587,17 +577,13 @@ static oconfig_item_t *cf_read_generic (const char *path, static int cf_include_all (oconfig_item_t *root, int depth) { - int i; - - for (i = 0; i < root->children_num; i++) + for (int i = 0; i < root->children_num; i++) { oconfig_item_t *new; oconfig_item_t *old; char *pattern = NULL; - int j; - if (strcasecmp (root->children[i].key, "Include") != 0) continue; @@ -610,7 +596,7 @@ static int cf_include_all (oconfig_item_t *root, int depth) continue; } - for (j = 0; j < old->children_num; ++j) + for (int j = 0; j < old->children_num; ++j) { oconfig_item_t *child = old->children + j; @@ -704,7 +690,6 @@ static oconfig_item_t *cf_read_dir (const char *dir, char **filenames = NULL; int filenames_num = 0; int status; - int i; assert (depth < CF_MAX_DEPTH); @@ -741,7 +726,7 @@ static oconfig_item_t *cf_read_dir (const char *dir, " name is too long.", dir, de->d_name); closedir (dh); - for (i = 0; i < filenames_num; ++i) + for (int i = 0; i < filenames_num; ++i) free (filenames[i]); free (filenames); free (root); @@ -754,7 +739,7 @@ static oconfig_item_t *cf_read_dir (const char *dir, if (tmp == NULL) { ERROR ("configfile: realloc failed."); closedir (dh); - for (i = 0; i < filenames_num - 1; ++i) + for (int i = 0; i < filenames_num - 1; ++i) free (filenames[i]); free (filenames); free (root); @@ -774,7 +759,7 @@ static oconfig_item_t *cf_read_dir (const char *dir, qsort ((void *) filenames, filenames_num, sizeof (*filenames), cf_compare_string); - for (i = 0; i < filenames_num; ++i) + for (int i = 0; i < filenames_num; ++i) { oconfig_item_t *temp; char *name = filenames[i]; @@ -807,7 +792,7 @@ static oconfig_item_t *cf_read_dir (const char *dir, * * There are two versions of this function: If `wordexp' exists shell wildcards * will be expanded and the function will include all matches found. If - * `wordexp' (or, more precisely, it's header file) is not available the + * `wordexp' (or, more precisely, its header file) is not available the * simpler function is used which does not do any such expansion. */ #if HAVE_WORDEXP_H @@ -818,7 +803,6 @@ static oconfig_item_t *cf_read_generic (const char *path, int status; const char *path_ptr; wordexp_t we; - size_t i; if (depth >= CF_MAX_DEPTH) { @@ -846,7 +830,7 @@ static oconfig_item_t *cf_read_generic (const char *path, qsort ((void *) we.we_wordv, we.we_wordc, sizeof (*we.we_wordv), cf_compare_string); - for (i = 0; i < we.we_wordc; i++) + for (size_t i = 0; i < we.we_wordc; i++) { oconfig_item_t *temp; struct stat statbuf; @@ -927,10 +911,9 @@ static oconfig_item_t *cf_read_generic (const char *path, /* * Public functions */ -int global_option_set (const char *option, const char *value) +int global_option_set (const char *option, const char *value, _Bool from_cli) { int i; - DEBUG ("option = %s; value = %s;", option, value); for (i = 0; i < cf_global_options_num; i++) @@ -938,12 +921,16 @@ int global_option_set (const char *option, const char *value) break; if (i >= cf_global_options_num) + { + ERROR ("configfile: Cannot set unknown global option `%s'.", option); return (-1); + } - if (strcasecmp (option, "PIDFile") == 0 && pidfile_from_cli == 1) + if (cf_global_options[i].from_cli && (! from_cli)) { - DEBUG ("Configfile: Ignoring `PIDFILE' option because " - "command-line option `-P' take precedence."); + DEBUG ("configfile: Ignoring %s `%s' option because " + "it was overriden by a command-line option.", + option, value); return (0); } @@ -954,19 +941,23 @@ int global_option_set (const char *option, const char *value) else cf_global_options[i].value = NULL; + cf_global_options[i].from_cli = from_cli; + return (0); } const char *global_option_get (const char *option) { int i; - for (i = 0; i < cf_global_options_num; i++) if (strcasecmp (cf_global_options[i].key, option) == 0) break; if (i >= cf_global_options_num) + { + ERROR ("configfile: Cannot get unknown global option `%s'.", option); return (NULL); + } return ((cf_global_options[i].value != NULL) ? cf_global_options[i].value @@ -1018,9 +1009,7 @@ cdtime_t cf_get_default_interval (void) void cf_unregister (const char *type) { - cf_callback_t *this, *prev; - - for (prev = NULL, this = first_callback; + for (cf_callback_t *prev = NULL, *this = first_callback; this != NULL; prev = this, this = this->next) if (strcasecmp (this->type, type) == 0) @@ -1037,9 +1026,7 @@ void cf_unregister (const char *type) void cf_unregister_complex (const char *type) { - cf_complex_callback_t *this, *prev; - - for (prev = NULL, this = complex_callback_head; + for (cf_complex_callback_t *prev = NULL, *this = complex_callback_head; this != NULL; prev = this, this = this->next) if (strcasecmp (this->type, type) == 0) @@ -1116,7 +1103,6 @@ int cf_register_complex (const char *type, int (*callback) (oconfig_item_t *)) int cf_read (const char *filename) { oconfig_item_t *conf; - int i; int ret = 0; conf = cf_read_generic (filename, /* pattern = */ NULL, /* depth = */ 0); @@ -1132,7 +1118,7 @@ int cf_read (const char *filename) return (-1); } - for (i = 0; i < conf->children_num; i++) + for (int i = 0; i < conf->children_num; i++) { if (conf->children[i].children == NULL) {