#include "utils_llist.h"
#include "utils_cache.h"
#include "utils_threshold.h"
+#include "filter_chain.h"
/*
* Private structures
static llist_t *list_init;
static llist_t *list_read;
static llist_t *list_write;
+static llist_t *list_filter;
static llist_t *list_flush;
static llist_t *list_shutdown;
static llist_t *list_log;
{
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);
return (register_callback (&list_write, name, (void *) callback));
} /* int plugin_register_write */
+int plugin_register_filter (const char *name,
+ int (*callback) (const data_set_t *ds, value_list_t *vl))
+{
+ return (register_callback (&list_filter, name, (void *) callback));
+} /* int plugin_register_filter */
+
int plugin_register_flush (const char *name,
int (*callback) (const int timeout, const char *identifier))
{
return (plugin_unregister (list_write, name));
}
+int plugin_unregister_filter (const char *name)
+{
+ return (plugin_unregister (list_filter, name));
+}
+
int plugin_unregister_flush (const char *name)
{
return (plugin_unregister (list_flush, name));
pthread_mutex_unlock (&read_lock);
} /* void plugin_read_all */
-void plugin_flush_all (int timeout)
+int plugin_write (const char *plugin, /* {{{ */
+ const data_set_t *ds, const value_list_t *vl)
{
- int (*callback) (int timeout, const char *identifier);
- llentry_t *le;
+ int (*callback) (const data_set_t *ds, const value_list_t *vl);
+ llentry_t *le;
+ int status;
- if (list_flush == NULL)
- return;
+ if (vl == NULL)
+ return (EINVAL);
- le = llist_head (list_flush);
- while (le != NULL)
- {
- callback = (int (*) (int, const char *)) le->value;
- le = le->next;
+ if (list_write == NULL)
+ return (ENOENT);
- (*callback) (timeout, NULL);
- }
-} /* void plugin_flush_all */
+ 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_write);
+ 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_write);
+ 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)
{
while (le != NULL)
{
if ((plugin != NULL)
- && (strcmp (plugin, le->key) != 0))
+ && (strcmp (plugin, le->key) != 0))
{
le = le->next;
continue;
int plugin_dispatch_values (value_list_t *vl)
{
- static c_complain_t no_write_complaint = C_COMPLAIN_INIT;
+ static c_complain_t no_write_complaint = C_COMPLAIN_INIT_STATIC;
- int (*callback) (const data_set_t *, const value_list_t *);
data_set_t *ds;
- llentry_t *le;
if ((vl == NULL) || (*vl->type == '\0')) {
ERROR ("plugin_dispatch_values: Invalid value list.");
/* Update the value cache */
uc_update (ds, vl);
- ut_check_threshold (ds, vl);
-
- le = llist_head (list_write);
- while (le != NULL)
- {
- callback = (int (*) (const data_set_t *, const value_list_t *)) le->value;
- (*callback) (ds, vl);
- le = le->next;
- }
+ fc_process (ds, vl);
return (0);
} /* int plugin_dispatch_values */
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)
{
- free ((char *)this->value_string);
- this->value_string = NULL;
+ free ((char *)this->nm_value.nm_string);
+ this->nm_value.nm_string = NULL;
}
sfree (this);