From: Florian Forster Date: Fri, 21 Nov 2008 21:06:23 +0000 (+0100) Subject: src/plugin.[ch]: Implement `plugin_write', a function to pass values to specific... X-Git-Tag: collectd-4.6.0~156^2~9 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=9ac03988a7a3ad7fcae1e16cb97be422ed9d36a2;p=collectd.git src/plugin.[ch]: Implement `plugin_write', a function to pass values to specific write plugins. This function does none of the magic `plugin_dispatch_value' does. It simiply takes a value and passes it to the requested plugin. This function is intended to be used with the upcoming `filter chain' code, which will allow to pass values to specific plugins only. --- diff --git a/src/plugin.c b/src/plugin.c index 4d503f7c..b0043362 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -677,6 +677,73 @@ void plugin_read_all (void) pthread_mutex_unlock (&read_lock); } /* void plugin_read_all */ +int plugin_write (const char *plugin, /* {{{ */ + const data_set_t *ds, const value_list_t *vl) +{ + int (*callback) (const data_set_t *ds, const value_list_t *vl); + llentry_t *le; + int status; + + if (vl == NULL) + return (EINVAL); + + if (list_write == NULL) + return (ENOENT); + + if (ds == NULL) + { + ds = plugin_get_ds (vl->type); + if (ds == NULL) + { + ERROR ("plugin_write: Unable to lookup type `%s'.", vl->type); + return (ENOENT); + } + } + + if (plugin == NULL) + { + int success = 0; + int failure = 0; + + le = llist_head (list_flush); + while (le != NULL) + { + callback = le->value; + status = (*callback) (ds, vl); + if (status != 0) + failure++; + else + success++; + + le = le->next; + } + + if ((success == 0) && (failure != 0)) + status = -1; + else + status = 0; + } + else /* plugin != NULL */ + { + le = llist_head (list_flush); + while (le != NULL) + { + if (strcasecmp (plugin, le->key) == 0) + break; + + le = le->next; + } + + if (le == NULL) + return (ENOENT); + + callback = le->value; + status = (*callback) (ds, vl); + } + + return (status); +} /* }}} int plugin_write */ + int plugin_flush (const char *plugin, int timeout, const char *identifier) { int (*callback) (int timeout, const char *identifier); diff --git a/src/plugin.h b/src/plugin.h index b90811cf..91a61b2e 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -183,6 +183,36 @@ void plugin_init_all (void); void plugin_read_all (void); void plugin_shutdown_all (void); +/* + * NAME + * plugin_write + * + * DESCRIPTION + * Calls the write function of the given plugin with the provided data set and + * value list. It differs from `plugin_dispatch_value' in that it does not + * update the cache, does no do threshold checking, call the chain subsystem + * and so on. It looks up the requested plugin and invokes the function, end + * of story. + * + * ARGUMENTS + * plugin Name of the plugin. If NULL, the value is sent to all registered + * write functions. + * ds Pointer to the data_set_t structure. If NULL, the data set is + * looked up according to the `type' member in the `vl' argument. + * vl The actual value to be processes. Must not be NULL. + * + * RETURN VALUE + * Returns zero upon success or non-zero if an error occurred. If `plugin' is + * NULL and more than one plugin is called, an error is only returned if *all* + * plugins fail. + * + * NOTES + * This is the function used by the `write' built-in target. May be used by + * other target plugins. + */ +int plugin_write (const char *plugin, + const data_set_t *ds, const value_list_t *vl); + int plugin_flush (const char *plugin, int timeout, const char *identifier); /*