X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=2b5a34da22138324e1df1ee40d5cd4ef9c016931;hb=150924b271e21387ad1929e2373cc6e0772dc351;hp=784024c11ed5c11a78aca799a69507b39c7f782c;hpb=5478abf4a700844d115b0d9b75b51c4f509a49d2;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index 784024c1..2b5a34da 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -149,14 +149,14 @@ static int plugin_load_file (char *file) { const char *error = lt_dlerror (); - ERROR ("lt_dlopen failed: %s", error); - fprintf (stderr, "lt_dlopen failed: %s\n", error); + ERROR ("lt_dlopen (%s) failed: %s", file, error); + fprintf (stderr, "lt_dlopen (%s) failed: %s\n", file, error); return (1); } if ((reg_handle = (void (*) (void)) lt_dlsym (dlh, "module_register")) == NULL) { - WARNING ("Couldn't find symbol ``module_register'' in ``%s'': %s\n", + WARNING ("Couldn't find symbol `module_register' in `%s': %s\n", file, lt_dlerror ()); lt_dlclose (dlh); return (-1); @@ -584,22 +584,15 @@ void plugin_init_all (void) llentry_t *le; int status; - /* Start read-threads */ - if (list_read != NULL) - { - const char *rt; - int num; - rt = global_option_get ("ReadThreads"); - num = atoi (rt); - start_threads ((num > 0) ? num : 5); - } - /* Init the value cache */ uc_init (); - if (list_init == NULL) + if ((list_init == NULL) && (list_read == NULL)) return; + /* Calling all init callbacks before checking if read callbacks + * are available allows the init callbacks to register the read + * callback. */ le = llist_head (list_init); while (le != NULL) { @@ -612,12 +605,25 @@ void plugin_init_all (void) "failed with status %i. " "Plugin will be unloaded.", le->key, status); + /* Plugins that register read callbacks from the init + * callback should take care of appropriate error + * handling themselves. */ /* FIXME: Unload _all_ functions */ plugin_unregister_read (le->key); } le = le->next; } + + /* Start read-threads */ + if (list_read != NULL) + { + const char *rt; + int num; + rt = global_option_get ("ReadThreads"); + num = atoi (rt); + start_threads ((num > 0) ? num : 5); + } } /* void plugin_init_all */ void plugin_read_all (void) @@ -659,43 +665,6 @@ void plugin_read_all (void) pthread_mutex_unlock (&read_lock); } /* void plugin_read_all */ -int plugin_flush_one (int timeout, const char *name) -{ - int (*callback) (int); - llentry_t *le; - int status; - - if (list_flush == NULL) - return (-1); - - le = llist_search (list_flush, name); - if (le == NULL) - return (-1); - callback = (int (*) (int)) le->value; - - status = (*callback) (timeout); - - return (status); -} /* int plugin_flush_ont */ - -void plugin_flush_all (int timeout) -{ - int (*callback) (int); - llentry_t *le; - - if (list_flush == NULL) - return; - - le = llist_head (list_flush); - while (le != NULL) - { - callback = (int (*) (int)) le->value; - le = le->next; - - (*callback) (timeout); - } -} /* void plugin_flush_all */ - int plugin_flush (const char *plugin, int timeout, const char *identifier) { int (*callback) (int timeout, const char *identifier); @@ -708,14 +677,18 @@ int plugin_flush (const char *plugin, int timeout, const char *identifier) while (le != NULL) { if ((plugin != NULL) - && (strcmp (plugin, le->key) != 0)) + && (strcmp (plugin, le->key) != 0)) + { + le = le->next; continue; + } callback = (int (*) (int, const char *)) le->value; - le = le->next; - (*callback) (timeout, identifier); + + le = le->next; } + return (0); } /* int plugin_flush */ void plugin_shutdown_all (void) @@ -899,10 +872,10 @@ const data_set_t *plugin_get_ds (const char *name) return (ds); } /* data_set_t *plugin_get_ds */ -int plugin_notification_meta_add (notification_t *n, - const char *name, - enum notification_meta_type_e type, - const void *value) +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; @@ -923,7 +896,6 @@ int plugin_notification_meta_add (notification_t *n, sstrncpy (meta->name, name, sizeof (meta->name)); meta->type = type; - meta->next = NULL; switch (type) { @@ -966,6 +938,7 @@ int plugin_notification_meta_add (notification_t *n, } } /* switch (type) */ + meta->next = NULL; tail = n->meta; while ((tail != NULL) && (tail->next != NULL)) tail = tail->next; @@ -978,11 +951,84 @@ int plugin_notification_meta_add (notification_t *n, 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) @@ -991,7 +1037,8 @@ int plugin_notification_meta_free (notification_t *n) if (this->type == NM_TYPE_STRING) { - sfree (this->value_string); + free ((char *)this->value_string); + this->value_string = NULL; } sfree (this);