processes plugin: ps_list_match: If a regex is configures, only use that regex.
[collectd.git] / src / plugin.c
index 1aad97c..8844c33 100644 (file)
@@ -21,6 +21,7 @@
  **/
 
 #include "collectd.h"
+#include "utils_complain.h"
 
 #include <ltdl.h>
 
@@ -328,7 +329,8 @@ int plugin_load (const char *type)
 
        /* `cpu' should not match `cpufreq'. To solve this we add `.so' to the
         * type when matching the filename */
-       if (snprintf (typename, BUFSIZE, "%s.so", type) >= BUFSIZE)
+       if (ssnprintf (typename, sizeof (typename),
+                       "%s.so", type) >= sizeof (typename))
        {
                WARNING ("snprintf: truncated: `%s.so'", type);
                return (-1);
@@ -348,7 +350,8 @@ int plugin_load (const char *type)
                if (strncasecmp (de->d_name, typename, typename_len))
                        continue;
 
-               if (snprintf (filename, BUFSIZE, "%s/%s", dir, de->d_name) >= BUFSIZE)
+               if (ssnprintf (filename, sizeof (filename),
+                               "%s/%s", dir, de->d_name) >= sizeof (filename))
                {
                        WARNING ("snprintf: truncated: `%s/%s'", dir, de->d_name);
                        continue;
@@ -439,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 */
@@ -692,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);
@@ -717,20 +743,25 @@ void plugin_shutdown_all (void)
        }
 } /* void plugin_shutdown_all */
 
-int plugin_dispatch_values (const char *name, value_list_t *vl)
+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;
 
-       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.");
+       if ((vl == NULL) || (*vl->type == '\0')) {
+               ERROR ("plugin_dispatch_values: Invalid value list.");
                return (-1);
        }
 
+       if (list_write == NULL)
+               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)
        {
                ERROR ("plugin_dispatch_values: No data sets registered. "
@@ -739,9 +770,9 @@ int plugin_dispatch_values (const char *name, value_list_t *vl)
                return (-1);
        }
 
-       if (c_avl_get (data_sets, name, (void *) &ds) != 0)
+       if (c_avl_get (data_sets, vl->type, (void *) &ds) != 0)
        {
-               INFO ("plugin_dispatch_values: Dataset not found: %s", name);
+               INFO ("plugin_dispatch_values: Dataset not found: %s", vl->type);
                return (-1);
        }
 
@@ -752,7 +783,15 @@ int plugin_dispatch_values (const char *name, value_list_t *vl)
                        (unsigned int) vl->time, vl->interval,
                        vl->host,
                        vl->plugin, vl->plugin_instance,
-                       ds->type, vl->type_instance);
+                       vl->type, vl->type_instance);
+
+#if COLLECT_DEBUG
+       assert (0 == strcmp (ds->type, vl->type));
+#else
+       if (0 != strcmp (ds->type, vl->type))
+               WARNING ("plugin_dispatch_values: (ds->type = %s) != (vl->type = %s)",
+                               ds->type, vl->type);
+#endif
 
 #if COLLECT_DEBUG
        assert (ds->ds_num == vl->values_len);
@@ -770,6 +809,7 @@ int plugin_dispatch_values (const char *name, value_list_t *vl)
        escape_slashes (vl->host, sizeof (vl->host));
        escape_slashes (vl->plugin, sizeof (vl->plugin));
        escape_slashes (vl->plugin_instance, sizeof (vl->plugin_instance));
+       escape_slashes (vl->type, sizeof (vl->type));
        escape_slashes (vl->type_instance, sizeof (vl->type_instance));
 
        /* Update the value cache */