Code

Merge branch 'collectd-4.5'
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 2 Dec 2008 22:31:32 +0000 (23:31 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 2 Dec 2008 22:31:32 +0000 (23:31 +0100)
1  2 
src/plugin.c
src/plugin.h

diff --combined src/plugin.c
index 465e2899ace67a57f0b50d91532e2a7f224682dd,a887327760269e22e6b16d6bfb738ea4259b9f27..4ad7366cd0c5d9ff8244fb64866211f6d9ef27bd
@@@ -36,7 -36,6 +36,7 @@@
  #include "utils_llist.h"
  #include "utils_cache.h"
  #include "utils_threshold.h"
 +#include "filter_chain.h"
  
  /*
   * Private structures
@@@ -56,7 -55,6 +56,7 @@@ typedef struct read_func_s read_func_t
  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;
@@@ -444,12 -442,6 +444,12 @@@ int plugin_register_write (const char *
        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))
  {
@@@ -550,11 -542,6 +550,11 @@@ int plugin_unregister_write (const cha
        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));
@@@ -678,73 -665,6 +678,73 @@@ void plugin_read_all (void
        pthread_mutex_unlock (&read_lock);
  } /* void plugin_read_all */
  
 +int plugin_write (const char *plugin, /* {{{ */
 +              const data_set_t *ds, const value_list_t *vl)
 +{
 +  int (*callback) (const data_set_t *ds, const value_list_t *vl);
 +  llentry_t *le;
 +  int status;
 +
 +  if (vl == NULL)
 +    return (EINVAL);
 +
 +  if (list_write == NULL)
 +    return (ENOENT);
 +
 +  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)
  {
    int (*callback) (int timeout, const char *identifier);
@@@ -798,9 -718,11 +798,9 @@@ void plugin_shutdown_all (void
  
  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 */
@@@ -971,8 -901,8 +971,8 @@@ static int plugin_notification_meta_ad
    {
      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:
@@@ -1070,19 -1000,19 +1070,19 @@@ int plugin_notification_meta_copy (noti
    {
      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);
@@@ -1107,8 -1037,8 +1107,8 @@@ int plugin_notification_meta_free (noti
  
      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);
  
diff --combined src/plugin.h
index 91a61b2ecb2516de31f5f329114ed4b9c2ef05f7,dc3bbb0809fb3da3cabcd73dca44060799ab470e..a6f89a0ec37697ef11c61ffdc03312494aa06e22
  #define NOTIF_WARNING 2
  #define NOTIF_OKAY    4
  
 +#define FILTER_NOWRITE 1
 +#define FILTER_NOTHRESHOLD_CHECK 2
 +/* FILTER_IGNORE has to equal the bitwise or of all other filter flags */
 +#define FILTER_IGNORE (FILTER_NOWRITE | FILTER_NOTHRESHOLD_CHECK)
 +
  /*
   * Public data types
   */
@@@ -119,12 -114,12 +119,12 @@@ typedef struct notification_meta_
        enum notification_meta_type_e type;
        union
        {
-               const char *value_string;
-               int64_t value_signed_int;
-               uint64_t value_unsigned_int;
-               double value_double;
-               bool value_boolean;
-       };
+               const char *nm_string;
+               int64_t nm_signed_int;
+               uint64_t nm_unsigned_int;
+               double nm_double;
+               bool nm_boolean;
+       } nm_value;
        struct notification_meta_s *next;
  } notification_meta_t;
  
@@@ -183,36 -178,6 +183,36 @@@ void plugin_init_all (void)
  void plugin_read_all (void);
  void plugin_shutdown_all (void);
  
 +/*
 + * NAME
 + *  plugin_write
 + *
 + * DESCRIPTION
 + *  Calls the write function of the given plugin with the provided data set and
 + *  value list. It differs from `plugin_dispatch_value' in that it does not
 + *  update the cache, does no do threshold checking, call the chain subsystem
 + *  and so on. It looks up the requested plugin and invokes the function, end
 + *  of story.
 + *
 + * ARGUMENTS
 + *  plugin     Name of the plugin. If NULL, the value is sent to all registered
 + *             write functions.
 + *  ds         Pointer to the data_set_t structure. If NULL, the data set is
 + *             looked up according to the `type' member in the `vl' argument.
 + *  vl         The actual value to be processes. Must not be NULL.
 + *
 + * RETURN VALUE
 + *  Returns zero upon success or non-zero if an error occurred. If `plugin' is
 + *  NULL and more than one plugin is called, an error is only returned if *all*
 + *  plugins fail.
 + *
 + * NOTES
 + *  This is the function used by the `write' built-in target. May be used by
 + *  other target plugins.
 + */
 +int plugin_write (const char *plugin,
 +    const data_set_t *ds, const value_list_t *vl);
 +
  int plugin_flush (const char *plugin, int timeout, const char *identifier);
  
  /*
@@@ -231,8 -196,6 +231,8 @@@ int plugin_register_read (const char *n
                int (*callback) (void));
  int plugin_register_write (const char *name,
                int (*callback) (const data_set_t *ds, const value_list_t *vl));
 +int plugin_register_filter (const char *name,
 +              int (*callback) (const data_set_t *ds, value_list_t *vl));
  int plugin_register_flush (const char *name,
                int (*callback) (const int timeout, const char *identifier));
  int plugin_register_shutdown (char *name,
@@@ -248,7 -211,6 +248,7 @@@ int plugin_unregister_complex_config (c
  int plugin_unregister_init (const char *name);
  int plugin_unregister_read (const char *name);
  int plugin_unregister_write (const char *name);
 +int plugin_unregister_filter (const char *name);
  int plugin_unregister_flush (const char *name);
  int plugin_unregister_shutdown (const char *name);
  int plugin_unregister_data_set (const char *name);