src/filter_chain.c: Fixed typos in error messages
[collectd.git] / src / filter_chain.c
index 4c324a8..7d8369b 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/filter_chain.h
- * Copyright (C) 2008,2009  Florian octo Forster
+ * Copyright (C) 2008-2010  Florian octo Forster
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
  *   Florian octo Forster <octo at verplant.org>
  **/
 
-/*
- * First tell the compiler to stick to the C99 and POSIX standards as close as
- * possible.
- */
-#ifndef __STRICT_ANSI__ /* {{{ */
-# define __STRICT_ANSI__
-#endif
-
-#ifndef _ISOC99_SOURCE
-# define _ISOC99_SOURCE
-#endif
-
-#ifdef _POSIX_C_SOURCE
-# undef _POSIX_C_SOURCE
-#endif
-#define _POSIX_C_SOURCE 200112L
-
-#if 0
-/* Single UNIX needed for strdup. */
-#ifdef _XOPEN_SOURCE
-# undef _XOPEN_SOURCE
-#endif
-#define _XOPEN_SOURCE 500
-#endif
-
-#ifndef _REENTRANT
-# define _REENTRANT
-#endif
-
-#ifndef _THREAD_SAFE
-# define _THREAD_SAFE
-#endif
-
-#ifdef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-/* }}} */
-
 #include "collectd.h"
 #include "configfile.h"
 #include "plugin.h"
+#include "utils_complain.h"
 #include "common.h"
 #include "filter_chain.h"
 
@@ -129,7 +92,7 @@ static void fc_free_matches (fc_match_t *m) /* {{{ */
     (*m->proc.destroy) (&m->user_data);
   else if (m->user_data != NULL)
   {
-    ERROR ("Filter sybsystem: fc_free_matches: There is user data, but no "
+    ERROR ("Filter subsystem: fc_free_matches: There is user data, but no "
         "destroy functions has been specified. "
         "Memory will probably be lost!");
   }
@@ -149,7 +112,7 @@ static void fc_free_targets (fc_target_t *t) /* {{{ */
     (*t->proc.destroy) (&t->user_data);
   else if (t->user_data != NULL)
   {
-    ERROR ("Filter sybsystem: fc_free_targets: There is user data, but no "
+    ERROR ("Filter subsystem: fc_free_targets: There is user data, but no "
         "destroy functions has been specified. "
         "Memory will probably be lost!");
   }
@@ -211,7 +174,7 @@ static char *fc_strdup (const char *orig) /* {{{ */
  *
  * The configuration looks somewhat like this:
  *
- *  <Chain "main">
+ *  <Chain "PreCache">
  *    <Rule>
  *      <Match "regex">
  *        Plugin "^mysql$"
@@ -268,19 +231,21 @@ static int fc_config_add_match (fc_match_t **matches_head, /* {{{ */
 
   sstrncpy (m->name, ptr->name, sizeof (m->name));
   memcpy (&m->proc, &ptr->proc, sizeof (m->proc));
-  assert (m->proc.create != NULL);
   m->user_data = NULL;
   m->next = NULL;
 
-  status = (*m->proc.create) (ci, &m->user_data);
-  if (status != 0)
+  if (m->proc.create != NULL)
   {
-    WARNING ("Filter subsystem: Failed to create a %s match.",
-        m->name);
-    fc_free_matches (m);
-    return (-1);
+    status = (*m->proc.create) (ci, &m->user_data);
+    if (status != 0)
+    {
+      WARNING ("Filter subsystem: Failed to create a %s match.",
+          m->name);
+      fc_free_matches (m);
+      return (-1);
+    }
   }
-  
+
   if (*matches_head != NULL)
   {
     ptr = *matches_head;
@@ -331,7 +296,7 @@ static int fc_config_add_target (fc_target_t **targets_head, /* {{{ */
   t = (fc_target_t *) malloc (sizeof (*t));
   if (t == NULL)
   {
-    ERROR ("fc_config_add_match: malloc failed.");
+    ERROR ("fc_config_add_target: malloc failed.");
     return (-1);
   }
   memset (t, 0, sizeof (*t));
@@ -346,7 +311,7 @@ static int fc_config_add_target (fc_target_t **targets_head, /* {{{ */
     status = (*t->proc.create) (ci, &t->user_data);
     if (status != 0)
     {
-      WARNING ("Filter subsystem: Failed to create a %s match.",
+      WARNING ("Filter subsystem: Failed to create a %s target.",
           t->name);
       fc_free_targets (t);
       return (-1);
@@ -514,21 +479,6 @@ static int fc_config_add_chain (const oconfig_item_t *ci) /* {{{ */
       break;
   } /* for (ci->children) */
 
-  /* Additional sanity checking. */
-  while (status == 0)
-  {
-    if (chain->targets == NULL)
-    {
-      WARNING ("Filter subsystem: Chain %s: No default target has been "
-          "specified. Please make sure that there is a <Target> block within "
-          "the <Chain> block!", chain->name);
-      status = -1;
-      break;
-    }
-
-    break;
-  } /* while (status == 0) */
-
   if (status != 0)
   {
     fc_free_chains (chain);
@@ -743,12 +693,31 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
 
   if ((plugin_list == NULL) || (plugin_list[0] == NULL))
   {
+    static c_complain_t enoent_complaint = C_COMPLAIN_INIT_STATIC;
+
     status = plugin_write (/* plugin = */ NULL, ds, vl);
-    if (status != 0)
+    if (status == ENOENT)
+    {
+      /* in most cases this is a permanent error, so use the complain
+       * mechanism rather than spamming the logs */
+      c_complain (LOG_INFO, &enoent_complaint,
+          "Filter subsystem: Built-in target `write': Dispatching value to "
+          "all write plugins failed with status %i (ENOENT). "
+          "Most likely this means you didn't load any write plugins.",
+          status);
+    }
+    else if (status != 0)
     {
       INFO ("Filter subsystem: Built-in target `write': Dispatching value to "
           "all write plugins failed with status %i.", status);
     }
+    else
+    {
+      assert (status == 0);
+      c_release (LOG_INFO, &enoent_complaint, "Filter subsystem: "
+          "Built-in target `write': Some write plugin is back to normal "
+          "operation. `write' succeeded.");
+    }
   }
   else
   {
@@ -915,6 +884,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */
     /* N. B.: rule->matches may be NULL. */
     for (match = rule->matches; match != NULL; match = match->next)
     {
+      /* FIXME: Pass the meta-data to match targets here (when implemented). */
       status = (*match->proc.match) (ds, vl, /* meta = */ NULL,
           &match->user_data);
       if (status < 0)
@@ -943,6 +913,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */
     {
       /* If we get here, all matches have matched the value. Execute the
        * target. */
+      /* FIXME: Pass the meta-data to match targets here (when implemented). */
       status = (*target->proc.invoke) (ds, vl, /* meta = */ NULL,
           &target->user_data);
       if (status < 0)
@@ -999,6 +970,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */
   {
     /* If we get here, all matches have matched the value. Execute the
      * target. */
+    /* FIXME: Pass the meta-data to match targets here (when implemented). */
     status = (*target->proc.invoke) (ds, vl, /* meta = */ NULL,
         &target->user_data);
     if (status < 0)
@@ -1044,6 +1016,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */
  * matches match. */
 int fc_default_action (const data_set_t *ds, value_list_t *vl) /* {{{ */
 {
+  /* FIXME: Pass the meta-data to match targets here (when implemented). */
   return (fc_bit_write_invoke (ds, vl,
         /* meta = */ NULL, /* user_data = */ NULL));
 } /* }}} int fc_default_action */