X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=2d431db360b53127b10cbfc5c025142b6c28bb58;hb=620ba7b575a4d2a9c8c997a240d178980b39276f;hp=dfab52c3e4fcb68f15eae50e55aa76095fe7d1f9;hpb=6b49eec15d421a74935fb1165c3e9fdb80ca838e;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index dfab52c3..2d431db3 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -21,6 +21,7 @@ **/ #include "collectd.h" +#include "utils_complain.h" #include @@ -441,7 +442,8 @@ int plugin_register_write (const char *name, return (register_callback (&list_write, name, (void *) callback)); } /* int plugin_register_write */ -int plugin_register_flush (const char *name, int (*callback) (const int)) +int plugin_register_flush (const char *name, + int (*callback) (const int timeout, const char *identifier)) { return (register_callback (&list_flush, name, (void *) callback)); } /* int plugin_register_flush */ @@ -694,6 +696,28 @@ void plugin_flush_all (int timeout) } } /* void plugin_flush_all */ +int plugin_flush (const char *plugin, int timeout, const char *identifier) +{ + int (*callback) (int timeout, const char *identifier); + llentry_t *le; + + if (list_flush == NULL) + return (0); + + le = llist_head (list_flush); + while (le != NULL) + { + if ((plugin != NULL) + && (strcmp (plugin, le->key) != 0)) + continue; + + callback = (int (*) (int, const char *)) le->value; + le = le->next; + + (*callback) (timeout, identifier); + } +} /* int plugin_flush */ + void plugin_shutdown_all (void) { int (*callback) (void); @@ -721,6 +745,8 @@ void plugin_shutdown_all (void) int plugin_dispatch_values (value_list_t *vl) { + static c_complain_t no_write_complaint = C_COMPLAIN_INIT; + int (*callback) (const data_set_t *, const value_list_t *); data_set_t *ds; llentry_t *le; @@ -731,12 +757,10 @@ int plugin_dispatch_values (value_list_t *vl) } if (list_write == NULL) - { - ERROR ("plugin_dispatch_values: No write callback has been " - "registered. Please load at least one plugin " - "that provides a write function."); - return (-1); - } + c_complain_once (LOG_WARNING, &no_write_complaint, + "plugin_dispatch_values: No write callback has been " + "registered. Please load at least one output plugin, " + "if you want the collected data to be stored."); if (data_sets == NULL) { @@ -874,3 +898,178 @@ const data_set_t *plugin_get_ds (const char *name) return (ds); } /* data_set_t *plugin_get_ds */ + +static int plugin_notification_meta_add (notification_t *n, + const char *name, + enum notification_meta_type_e type, + const void *value) +{ + notification_meta_t *meta; + notification_meta_t *tail; + + if ((n == NULL) || (name == NULL) || (value == NULL)) + { + ERROR ("plugin_notification_meta_add: A pointer is NULL!"); + return (-1); + } + + meta = (notification_meta_t *) malloc (sizeof (notification_meta_t)); + if (meta == NULL) + { + ERROR ("plugin_notification_meta_add: malloc failed."); + return (-1); + } + memset (meta, 0, sizeof (notification_meta_t)); + + sstrncpy (meta->name, name, sizeof (meta->name)); + meta->type = type; + + switch (type) + { + case NM_TYPE_STRING: + { + meta->value_string = strdup ((const char *) value); + if (meta->value_string == NULL) + { + ERROR ("plugin_notification_meta_add: strdup failed."); + sfree (meta); + return (-1); + } + break; + } + case NM_TYPE_SIGNED_INT: + { + meta->value_signed_int = *((int64_t *) value); + break; + } + case NM_TYPE_UNSIGNED_INT: + { + meta->value_unsigned_int = *((uint64_t *) value); + break; + } + case NM_TYPE_DOUBLE: + { + meta->value_double = *((double *) value); + break; + } + case NM_TYPE_BOOLEAN: + { + meta->value_boolean = *((bool *) value); + break; + } + default: + { + ERROR ("plugin_notification_meta_add: Unknown type: %i", type); + sfree (meta); + return (-1); + } + } /* switch (type) */ + + meta->next = NULL; + tail = n->meta; + while ((tail != NULL) && (tail->next != NULL)) + tail = tail->next; + + if (tail == NULL) + n->meta = meta; + else + tail->next = meta; + + return (0); +} /* int plugin_notification_meta_add */ + +int plugin_notification_meta_add_string (notification_t *n, + const char *name, + const char *value) +{ + return (plugin_notification_meta_add (n, name, NM_TYPE_STRING, value)); +} + +int plugin_notification_meta_add_signed_int (notification_t *n, + const char *name, + int64_t value) +{ + return (plugin_notification_meta_add (n, name, NM_TYPE_SIGNED_INT, &value)); +} + +int plugin_notification_meta_add_unsigned_int (notification_t *n, + const char *name, + uint64_t value) +{ + return (plugin_notification_meta_add (n, name, NM_TYPE_UNSIGNED_INT, &value)); +} + +int plugin_notification_meta_add_double (notification_t *n, + const char *name, + double value) +{ + return (plugin_notification_meta_add (n, name, NM_TYPE_DOUBLE, &value)); +} + +int plugin_notification_meta_add_boolean (notification_t *n, + const char *name, + bool value) +{ + return (plugin_notification_meta_add (n, name, NM_TYPE_BOOLEAN, &value)); +} + +int plugin_notification_meta_copy (notification_t *dst, + const notification_t *src) +{ + notification_meta_t *meta; + + assert (dst != NULL); + assert (src != NULL); + assert (dst != src); + assert ((src->meta == NULL) || (src->meta != dst->meta)); + + for (meta = src->meta; meta != NULL; meta = meta->next) + { + if (meta->type == NM_TYPE_STRING) + plugin_notification_meta_add_string (dst, meta->name, + meta->value_string); + else if (meta->type == NM_TYPE_SIGNED_INT) + plugin_notification_meta_add_signed_int (dst, meta->name, + meta->value_signed_int); + else if (meta->type == NM_TYPE_UNSIGNED_INT) + plugin_notification_meta_add_unsigned_int (dst, meta->name, + meta->value_unsigned_int); + else if (meta->type == NM_TYPE_DOUBLE) + plugin_notification_meta_add_double (dst, meta->name, + meta->value_double); + else if (meta->type == NM_TYPE_BOOLEAN) + plugin_notification_meta_add_boolean (dst, meta->name, + meta->value_boolean); + } + + return (0); +} /* int plugin_notification_meta_copy */ + +int plugin_notification_meta_free (notification_t *n) +{ + notification_meta_t *this; + notification_meta_t *next; + + if (n == NULL) + { + ERROR ("plugin_notification_meta_free: n == NULL!"); + return (-1); + } + + this = n->meta; + n->meta = NULL; + while (this != NULL) + { + next = this->next; + + if (this->type == NM_TYPE_STRING) + { + sfree (this->value_string); + } + sfree (this); + + this = next; + } + + return (0); +} /* int plugin_notification_meta_free */