{
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);
else if (!S_ISREG (statbuf.st_mode))
{
/* don't follow symlinks */
+ WARNING ("stat %s: not a regular file", filename);
continue;
}
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)
{
"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)
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);
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)
void plugin_log (int level, const char *format, ...)
{
- char msg[512];
+ char msg[1024];
va_list ap;
void (*callback) (int, const char *);
#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);
} /* 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;
{
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);
}
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:
{
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);
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);