network plugin: Allow port arguments to be numeric.
[collectd.git] / src / collectd-nagios.c
index d3369b2..fca9f18 100644 (file)
@@ -1,3 +1,5 @@
+#include "config.h"
+
 #include <stdlib.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/un.h>
 
 /*
- * This weird macro cascade forces the glibc to define `NAN'. I don't know
- * another way to solve this, so more intelligent solutions are welcome. -octo
+ * This is copied directly from collectd.h. Make changes there!
  */
-#ifndef __USE_ISOC99
-# define DISABLE__USE_ISOC99 1
-# define __USE_ISOC99 1
-#endif
-#include <math.h>
-#ifdef DISABLE__USE_ISOC99
-# undef DISABLE__USE_ISOC99
-# undef __USE_ISOC99
-#endif
+#if NAN_STATIC_DEFAULT
+# include <math.h>
+/* #endif NAN_STATIC_DEFAULT*/
+#elif NAN_STATIC_ISOC
+# ifndef __USE_ISOC99
+#  define DISABLE_ISOC99 1
+#  define __USE_ISOC99 1
+# endif /* !defined(__USE_ISOC99) */
+# include <math.h>
+# if DISABLE_ISOC99
+#  undef DISABLE_ISOC99
+#  undef __USE_ISOC99
+# endif /* DISABLE_ISOC99 */
+/* #endif NAN_STATIC_ISOC */
+#elif NAN_ZERO_ZERO
+# include <math.h>
+# ifdef NAN
+#  undef NAN
+# endif
+# define NAN (0.0 / 0.0)
+# ifndef isnan
+#  define isnan(f) ((f) != (f))
+# endif /* !defined(isnan) */
+#endif /* NAN_ZERO_ZERO */
 
 #define RET_OKAY     0
 #define RET_WARNING  1
@@ -44,6 +60,8 @@ extern int optind, opterr, optopt;
 
 static char *socket_file_g = NULL;
 static char *value_string_g = NULL;
+static char *hostname_g = NULL;
+
 static range_t range_critical_g;
 static range_t range_warning_g;
 static int consolitation_g = CON_NONE;
@@ -110,9 +128,9 @@ int match_range (range_t *range, double value)
 {
        int ret = 0;
 
-       if ((range->min != NAN) && (range->min > value))
+       if (!isnan (range->min) && (range->min > value))
                ret = 1;
-       if ((range->max != NAN) && (range->max < value))
+       if (!isnan (range->max) && (range->max < value))
                ret = 1;
 
        return (((ret - range->invert) == 0) ? 0 : 1);
@@ -163,7 +181,7 @@ static int get_values (int *ret_values_num, double **ret_values,
                return (-1);
        }
 
-       fprintf (fh, "GETVAL %s\n", value_string_g);
+       fprintf (fh, "GETVAL %s/%s\n", hostname_g, value_string_g);
        fflush (fh);
 
        if (fgets (buffer, sizeof (buffer), fh) == NULL)
@@ -232,7 +250,7 @@ static int get_values (int *ret_values_num, double **ret_values,
 
 static void usage (const char *name)
 {
-       fprintf (stderr, "Usage: %s <-s socket> <-n value_spec> [options]\n"
+       fprintf (stderr, "Usage: %s <-s socket> <-n value_spec> <-H hostname> [options]\n"
                        "\n"
                        "Valid options are:\n"
                        "  -s <socket>    Path to collectd's UNIX-socket.\n"
@@ -242,6 +260,7 @@ static void usage (const char *name)
                        "                 DSes. By default all DSes are used.\n"
                        "  -g <consol>    Method to use to consolidate several DSes.\n"
                        "                 Valid arguments are `none', `average' and `sum'\n"
+                       "  -H <host>      Hostname to query the values for.\n"
                        "  -c <range>     Critical range\n"
                        "  -w <range>     Warning range\n"
                        "\n"
@@ -265,7 +284,7 @@ int do_check_con_none (int values_num, double *values, char **values_names)
 
        for (i = 0; i < values_num; i++)
        {
-               if (values[i] == NAN)
+               if (isnan (values[i]))
                        num_warning++;
                else if (match_range (&range_critical_g, values[i]) != 0)
                        num_critical++;
@@ -306,7 +325,7 @@ int do_check_con_average (int values_num, double *values, char **values_names)
        total_num = 0;
        for (i = 0; i < values_num; i++)
        {
-               if (values[i] != NAN)
+               if (!isnan (values[i]))
                {
                        total += values[i];
                        total_num++;
@@ -351,7 +370,7 @@ int do_check_con_sum (int values_num, double *values, char **values_names)
        total_num = 0;
        for (i = 0; i < values_num; i++)
        {
-               if (values[i] != NAN)
+               if (!isnan (values[i]))
                {
                        total += values[i];
                        total_num++;
@@ -422,7 +441,7 @@ int main (int argc, char **argv)
        {
                int c;
 
-               c = getopt (argc, argv, "w:c:s:n:g:d:h");
+               c = getopt (argc, argv, "w:c:s:n:H:g:d:h");
                if (c < 0)
                        break;
 
@@ -440,6 +459,9 @@ int main (int argc, char **argv)
                        case 'n':
                                value_string_g = optarg;
                                break;
+                       case 'H':
+                               hostname_g = optarg;
+                               break;
                        case 'g':
                                if (strcasecmp (optarg, "none") == 0)
                                        consolitation_g = CON_NONE;
@@ -478,7 +500,8 @@ int main (int argc, char **argv)
                } /* switch (c) */
        }
 
-       if ((socket_file_g == NULL) || (value_string_g == NULL))
+       if ((socket_file_g == NULL) || (value_string_g == NULL)
+                       || (hostname_g == NULL))
                usage (argv[0]);
 
        return (do_check ());