From 500559839355fc4061afe1d010d9f9479bca450d Mon Sep 17 00:00:00 2001 From: octo Date: Mon, 19 Dec 2005 22:09:12 +0000 Subject: [PATCH] Added to src/configfile.c: `cf_callback_options_mode': Callback for options `cf_get_mode_option': Function to query above options --- src/collectd.c | 8 +++- src/collectd.h | 2 +- src/configfile.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++--------- src/configfile.h | 14 +++++++ 4 files changed, 123 insertions(+), 20 deletions(-) diff --git a/src/collectd.c b/src/collectd.c index 247a185f..0d9a7db8 100644 --- a/src/collectd.c +++ b/src/collectd.c @@ -268,7 +268,7 @@ int main (int argc, char **argv) struct sigaction sigIntAction; struct sigaction sigTermAction; char *configfile = CONFIGFILE; - char *plugindir = PLUGINDIR; + char *plugindir = NULL; char *datadir = PKGLOCALSTATEDIR; #if COLLECT_DAEMON char *pidfile = PIDFILE; @@ -362,6 +362,12 @@ int main (int argc, char **argv) DBG_STARTFILE(logfile, "debug file opened."); + /* FIXME this is the wrong place to call this function, because + * `cf_read' is called below. We'll need an extra callback for this. + * Right now though I'm to tired to do this. G'night. -octo */ + if ((plugindir == NULL) && ((plugindir = cf_get_mode_option ("PluginDir")) == NULL)) + plugindir = PLUGINDIR; + /* * Read the config file. This will load any modules automagically. */ diff --git a/src/collectd.h b/src/collectd.h index f20a337a..a986c0b3 100644 --- a/src/collectd.h +++ b/src/collectd.h @@ -187,7 +187,7 @@ #define MODE_SERVER 0x01 #define MODE_CLIENT 0x02 -#define MODE_LOCAL 0x03 +#define MODE_LOCAL 0x04 extern time_t curtime; extern int operating_mode; diff --git a/src/configfile.c b/src/configfile.c index 14b9dfbc..a0610041 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -20,12 +20,6 @@ * Florian octo Forster **/ -/* - * FIXME: - * - remove all (I mean *ALL*) calls to `fprintf': `stderr' will have been - * closed. - */ - #include "collectd.h" #include "libconfig/libconfig.h" @@ -44,7 +38,7 @@ #ifdef HAVE_LIBRRD extern int operating_mode; #else -static int operating_mode = MODE_LOCAL; +static int operating_mode = MODE_CLIENT; #endif typedef struct cf_callback @@ -58,15 +52,33 @@ typedef struct cf_callback static cf_callback_t *first_callback = NULL; +typedef struct cf_mode_item +{ + char *key; + char *value; + int mode; +} cf_mode_item_t; + +static cf_mode_item_t cf_mode_list[] = +{ + {"Server", NULL, MODE_CLIENT }, + {"Port", NULL, MODE_CLIENT | MODE_SERVER }, + {"PIDFile", NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL}, + {"DataDir", NULL, MODE_SERVER | MODE_LOCAL}, + {"PluginDir", NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL} +}; +static int cf_mode_num = 5; + static int nesting_depth = 0; static char *current_module = NULL; /* cf_register needs this prototype */ -int cf_callback_general (const char *, const char *, const char *, +int cf_callback_dispatch (const char *, const char *, const char *, const char *, lc_flags_t, void *); /* - * Functions to handle register/unregister, search, ... + * Functions to handle register/unregister, search, and other plugin related + * stuff */ cf_callback_t *cf_search (char *type) { @@ -92,7 +104,7 @@ int cf_dispatch (char *type, const char *orig_key, const char *orig_value) if ((cf_cb = cf_search (type)) == NULL) { - fprintf (stderr, "Plugin `%s' did not register a callback.\n", type); + syslog (LOG_WARNING, "Plugin `%s' did not register a callback.\n", type); return (-1); } @@ -116,7 +128,7 @@ int cf_dispatch (char *type, const char *orig_key, const char *orig_value) } if (i >= cf_cb->keys_num) - fprintf (stderr, "Plugin `%s' did not register for value `%s'.\n", type, key); + syslog (LOG_WARNING, "Plugin `%s' did not register for value `%s'.\n", type, key); free (key); free (value); @@ -174,7 +186,7 @@ void cf_register (char *type, * `key', but apparently `lc_register_*' can handle * it.. */ lc_register_callback (buf, SHORTOPT_NONE, - LC_VAR_STRING, cf_callback_general, + LC_VAR_STRING, cf_callback_dispatch, NULL); } else @@ -184,10 +196,29 @@ void cf_register (char *type, } } +/* + * Other query functions + */ +char *cf_get_mode_option (const char *key) +{ + int i; + + for (i = 0; i < cf_mode_num; i++) + { + if ((cf_mode_list[i].mode & operating_mode) == 0) + continue; + + if (strcasecmp (cf_mode_list[i].key, key) == 0) + return (cf_mode_list[i].value); + } + + return (NULL); +} + /* * Functions for the actual parsing */ -int cf_callback_general (const char *shortvar, const char *var, +int cf_callback_dispatch (const char *shortvar, const char *var, const char *arguments, const char *value, lc_flags_t flags, void *extra) { @@ -207,6 +238,47 @@ int cf_callback_general (const char *shortvar, const char *var, return (LC_CBRET_OKAY); } +int cf_callback_options_mode (const char *shortvar, const char *var, + const char *arguments, const char *value, lc_flags_t flags, + void *extra) +{ + cf_mode_item_t *item; + + if (extra == NULL) + { + fprintf (stderr, "No extra..?\n"); + return (LC_CBRET_ERROR); + } + + item = (cf_mode_item_t *) extra; + + if (strcasecmp (item->key, shortvar)) + { + fprintf (stderr, "Wrong extra..\n"); + return (LC_CBRET_ERROR); + } + + if ((operating_mode & item->mode) == 0) + { + fprintf (stderr, "Option `%s' is not valid in this mode!\n", shortvar); + return (LC_CBRET_ERROR); + } + + if (item->value != NULL) + { + free (item->value); + item->value = NULL; + } + + if ((item->value = strdup (value)) == NULL) + { + perror ("strdup"); + return (LC_CBRET_ERROR); + } + + return (LC_CBRET_OKAY); +} + int cf_callback_section_mode (const char *shortvar, const char *var, const char *arguments, const char *value, lc_flags_t flags, void *extra) @@ -334,6 +406,8 @@ int cf_callback_loadmodule (const char *shortvar, const char *var, int cf_read (char *filename) { + int i; + if (filename == NULL) filename = CONFIGFILE; @@ -342,15 +416,24 @@ int cf_read (char *filename) lc_register_callback ("Plugin", SHORTOPT_NONE, LC_VAR_SECTION, cf_callback_section_module, NULL); - /* - * TODO: - * - Add more directives, such as `DefaultMode', `DataDir', `PIDFile', ... - */ - lc_register_callback ("Mode.LoadPlugin", SHORTOPT_NONE, LC_VAR_STRING, cf_callback_loadmodule, NULL); + for (i = 0; i < cf_mode_num; i++) + { + char longvar[256]; + cf_mode_item_t *item; + + item = &cf_mode_list[i]; + + if (snprintf (longvar, 256, "Mode.%s", item->key) >= 256) + continue; + + lc_register_callback (longvar, SHORTOPT_NONE, LC_VAR_STRING, + cf_callback_options_mode, (void *) item); + } + if (lc_process_file ("collectd", filename, LC_CONF_APACHE)) { syslog (LOG_ERR, "lc_process_file (%s): %s", filename, lc_geterrstr ()); diff --git a/src/configfile.h b/src/configfile.h index 0802ba5a..13eb82b7 100644 --- a/src/configfile.h +++ b/src/configfile.h @@ -63,6 +63,20 @@ void cf_register (char *type, /* * DESCRIPTION + * `cf_get_mode_option' returns options from the section(s). + * + * PARAMETERS + * `key' Name of the option to query. + * + * RETURN VALUE + * The pointer returned is part of an internal structure and may not be + * changed. If the option is not found for whatever reason (wrong key, option + * not allowed for currently selected mode, ...) `NULL' is returned. + */ +char *cf_get_mode_option (const char *key); + +/* + * DESCRIPTION * `cf_read' reads the config file `filename' and dispatches the read * information to functions/variables. Most important: Is calls `plugin_load' * to load specific plugins, depending on the current mode of operation. -- 2.11.0