X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=20f3aa2b72d76fa6f0ef1f2901b600b881eadea5;hb=f3169b788b67f560f28b08eaddf1c45257cb1634;hp=2d431db360b53127b10cbfc5c025142b6c28bb58;hpb=620ba7b575a4d2a9c8c997a240d178980b39276f;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index 2d431db3..20f3aa2b 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); @@ -367,6 +367,7 @@ int plugin_load (const char *type) else if (!S_ISREG (statbuf.st_mode)) { /* don't follow symlinks */ + WARNING ("stat %s: not a regular file", filename); continue; } @@ -584,22 +585,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 +606,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 +666,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 +678,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) @@ -857,7 +831,7 @@ int plugin_dispatch_notification (const notification_t *notif) void plugin_log (int level, const char *format, ...) { - char msg[512]; + char msg[1024]; va_list ap; void (*callback) (int, const char *); @@ -872,8 +846,8 @@ void plugin_log (int level, const char *format, ...) #endif va_start (ap, format); - vsnprintf (msg, 512, format, ap); - msg[511] = '\0'; + vsnprintf (msg, sizeof (msg), format, ap); + msg[sizeof (msg) - 1] = '\0'; va_end (ap); le = llist_head (list_log); @@ -900,9 +874,9 @@ const data_set_t *plugin_get_ds (const char *name) } /* 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) + const char *name, + enum notification_meta_type_e type, + const void *value) { notification_meta_t *meta; notification_meta_t *tail; @@ -928,8 +902,8 @@ static int plugin_notification_meta_add (notification_t *n, { case NM_TYPE_STRING: { - meta->value_string = strdup ((const char *) value); - if (meta->value_string == NULL) + meta->nm_value.nm_string = strdup ((const char *) value); + if (meta->nm_value.nm_string == NULL) { ERROR ("plugin_notification_meta_add: strdup failed."); sfree (meta); @@ -939,22 +913,22 @@ static int plugin_notification_meta_add (notification_t *n, } case NM_TYPE_SIGNED_INT: { - meta->value_signed_int = *((int64_t *) value); + meta->nm_value.nm_signed_int = *((int64_t *) value); break; } case NM_TYPE_UNSIGNED_INT: { - meta->value_unsigned_int = *((uint64_t *) value); + meta->nm_value.nm_unsigned_int = *((uint64_t *) value); break; } case NM_TYPE_DOUBLE: { - meta->value_double = *((double *) value); + meta->nm_value.nm_double = *((double *) value); break; } case NM_TYPE_BOOLEAN: { - meta->value_boolean = *((bool *) value); + meta->nm_value.nm_boolean = *((bool *) value); break; } default: @@ -1027,19 +1001,19 @@ int plugin_notification_meta_copy (notification_t *dst, { if (meta->type == NM_TYPE_STRING) plugin_notification_meta_add_string (dst, meta->name, - meta->value_string); + meta->nm_value.nm_string); else if (meta->type == NM_TYPE_SIGNED_INT) plugin_notification_meta_add_signed_int (dst, meta->name, - meta->value_signed_int); + meta->nm_value.nm_signed_int); else if (meta->type == NM_TYPE_UNSIGNED_INT) plugin_notification_meta_add_unsigned_int (dst, meta->name, - meta->value_unsigned_int); + meta->nm_value.nm_unsigned_int); else if (meta->type == NM_TYPE_DOUBLE) plugin_notification_meta_add_double (dst, meta->name, - meta->value_double); + meta->nm_value.nm_double); else if (meta->type == NM_TYPE_BOOLEAN) plugin_notification_meta_add_boolean (dst, meta->name, - meta->value_boolean); + meta->nm_value.nm_boolean); } return (0); @@ -1064,7 +1038,8 @@ int plugin_notification_meta_free (notification_t *n) if (this->type == NM_TYPE_STRING) { - sfree (this->value_string); + free ((char *)this->nm_value.nm_string); + this->nm_value.nm_string = NULL; } sfree (this);