Merge branch 'collectd-4.10'
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 9 Jul 2010 10:05:32 +0000 (12:05 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 9 Jul 2010 10:05:32 +0000 (12:05 +0200)
1  2 
configure.in
src/df.c
src/swap.c

diff --combined configure.in
@@@ -104,13 -104,9 +104,13 @@@ AC_ARG_ENABLE(standards
  if test "x$enable_standards" = "xyes"
  then
        AC_DEFINE(_ISOC99_SOURCE,        1, [Define to enforce ISO C99 compliance.])
 -      AC_DEFINE(_POSIX_C_SOURCE, 200112L, [Define to enforce POSIX.1-2001 compliance.])
 -      AC_DEFINE(_XOPEN_SOURCE,       600, [Define to enforce X/Open 6 (XSI) compliance.])
 +      AC_DEFINE(_POSIX_C_SOURCE, 200809L, [Define to enforce POSIX.1-2008 compliance.])
 +      AC_DEFINE(_XOPEN_SOURCE,       700, [Define to enforce X/Open 7 (XSI) compliance.])
        AC_DEFINE(_REENTRANT,            1, [Define to enable reentrancy interfaces.])
 +      if test "x$GCC" = "xyes"
 +      then
 +              CFLAGS="$CFLAGS -std=c99"
 +      fi
  fi
  AM_CONDITIONAL(BUILD_FEATURE_STANDARDS, test "x$enable_standards" = "xyes")
  
@@@ -592,55 -588,6 +592,55 @@@ AC_CHECK_FUNCS(syslog, [have_syslog="ye
  AC_CHECK_FUNCS(getutent, [have_getutent="yes"], [have_getutent="no"])
  AC_CHECK_FUNCS(getutxent, [have_getutxent="yes"], [have_getutxent="no"])
  AC_CHECK_FUNCS(swapctl, [have_swapctl="yes"], [have_swapctl="no"])
 +if test "x$have_swapctl" = "xyes"; then
 +        AC_CACHE_CHECK([whether swapctl takes two arguments],
 +                [c_cv_have_swapctl_two_args],
 +                AC_COMPILE_IFELSE(
 +                        AC_LANG_PROGRAM([[AC_INCLUDES_DEFAULT
 +#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
 +#  undef _FILE_OFFSET_BITS
 +#  undef _LARGEFILE64_SOURCE
 +#endif
 +#include <sys/stat.h>
 +#include <sys/swap.h>]],
 +                                [[
 +                                int num = swapctl(0, NULL);
 +                                ]]
 +                        ),
 +                        [c_cv_have_swapctl_two_args="yes"],
 +                        [c_cv_have_swapctl_two_args="no"]
 +                )
 +        )
 +        AC_CACHE_CHECK([whether swapctl takes three arguments],
 +                [c_cv_have_swapctl_three_args],
 +                AC_COMPILE_IFELSE(
 +                        AC_LANG_PROGRAM([[AC_INCLUDES_DEFAULT
 +#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
 +#  undef _FILE_OFFSET_BITS
 +#  undef _LARGEFILE64_SOURCE
 +#endif
 +#include <sys/stat.h>
 +#include <sys/swap.h>]],
 +                                [[
 +                                int num = swapctl(0, NULL,0);
 +                                ]]
 +                        ),
 +                        [c_cv_have_swapctl_three_args="yes"],
 +                        [c_cv_have_swapctl_three_args="no"]
 +                )
 +        )
 +fi
 +# Check for different versions of `swapctl' here..
 +if test "x$have_swapctl" = "xyes"; then
 +        if test "x$c_cv_have_swapctl_two_args" = "xyes"; then
 +                AC_DEFINE(HAVE_SWAPCTL_TWO_ARGS, 1,
 +                          [Define if the function swapctl exists and takes two arguments.])
 +        fi
 +        if test "x$c_cv_have_swapctl_three_args" = "xyes"; then
 +                AC_DEFINE(HAVE_SWAPCTL_THREE_ARGS, 1,
 +                          [Define if the function swapctl exists and takes three arguments.])
 +        fi
 +fi
  
  # For load module
  AC_CHECK_FUNCS(getloadavg, [have_getloadavg="yes"], [have_getloadavg="no"])
  AM_CONDITIONAL(BUILD_WITH_LIBYAJL, test "x$with_libyajl" = "xyes")
  # }}}
  
 +# --with-libvarnish {{{
 +with_libvarnish_cppflags=""
 +with_libvarnish_cflags=""
 +with_libvarnish_libs=""
 +AC_ARG_WITH(libvarnish, [AS_HELP_STRING([--with-libvarnish@<:@=PREFIX@:>@], [Path to libvarnish.])],
 +[
 +      if test "x$withval" = "xno"
 +      then
 +              with_libvarnish="no"
 +      else if test "x$withval" = "xyes"
 +      then
 +              with_libvarnish="use_pkgconfig"
 +      else if test -d "$with_libvarnish/lib"
 +      then
 +              AC_MSG_NOTICE([Not checking for libvarnish: Manually configured])
 +              with_libvarnish_cflags="-I$withval/include"
 +              with_libvarnish_libs="-L$withval/lib -lvarnish -lvarnishcompat -lvarnishapi"
 +              with_libvarnish="yes"
 +      fi; fi; fi
 +],
 +[with_libvarnish="use_pkgconfig"])
 +
 +# configure using pkg-config
 +if test "x$with_libvarnish" = "xuse_pkgconfig"
 +then
 +      if test "x$PKG_CONFIG" = "x"
 +      then
 +              with_libvarnish="no (Don't have pkg-config)"
 +      fi
 +fi
 +if test "x$with_libvarnish" = "xuse_pkgconfig"
 +then
 +      AC_MSG_NOTICE([Checking for varnishapi using $PKG_CONFIG])
 +      $PKG_CONFIG --exists 'varnishapi' 2>/dev/null
 +      if test $? -ne 0
 +      then
 +              with_libvarnish="no (pkg-config doesn't know library)"
 +      fi
 +fi
 +if test "x$with_libvarnish" = "xuse_pkgconfig"
 +then
 +      with_libvarnish_cflags="`$PKG_CONFIG --cflags 'varnishapi'`"
 +      if test $? -ne 0
 +      then
 +              with_libvarnish="no ($PKG_CONFIG failed)"
 +      fi
 +      with_libvarnish_libs="`$PKG_CONFIG --libs 'varnishapi'`"
 +      if test $? -ne 0
 +      then
 +              with_libvarnish="no ($PKG_CONFIG failed)"
 +      fi
 +fi
 +if test "x$with_libvarnish" = "xuse_pkgconfig"
 +then
 +      with_libvarnish="yes"
 +fi
 +
 +# with_libvarnish_cflags and with_libvarnish_libs are set up now, let's do
 +# the actual checks.
 +if test "x$with_libvarnish" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
 +      AC_CHECK_HEADERS(varnish/varnishapi.h, [], [with_libvarnish="no (varnish/varnishapi.h not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_libvarnish" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      #SAVE_LDFLAGS="$LDFLAGS"
 +
 +      CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
 +      #LDFLAGS="$LDFLAGS $with_libvarnish_libs"
 +
 +      AC_CHECK_LIB(varnishapi, VSL_OpenStats,
 +                   [with_libvarnish="yes"],
 +                   [with_libvarnish="no (symbol VSL_OpenStats not found)"],
 +                   [$with_libvarnish_libs])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +      #LDFLAGS="$SAVE_LDFLAGS"
 +fi
 +if test "x$with_libvarnish" = "xyes"
 +then
 +      BUILD_WITH_LIBVARNISH_CFLAGS="$with_libvarnish_cflags"
 +      BUILD_WITH_LIBVARNISH_LIBS="$with_libvarnish_libs"
 +      AC_SUBST(BUILD_WITH_LIBVARNISH_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBVARNISH_LIBS)
 +fi
 +# }}}
 +
  # pkg-config --exists 'libxml-2.0'; pkg-config --exists libvirt {{{
  with_libxml2="no (pkg-config isn't available)"
  with_libxml2_cflags=""
@@@ -4175,7 -4030,7 +4175,7 @@@ the
        plugin_vserver="yes"
        plugin_wireless="yes"
  
-       if test "x$have_net_ip_vs_h" = "xyes" -o "x$have_ip_vs_h" = "xyes"
+       if test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
        then
                plugin_ipvs="yes"
        fi
@@@ -4487,7 -4342,6 +4487,7 @@@ AC_PLUGIN([target_notification], [yes]
  AC_PLUGIN([target_replace], [yes],             [The replace target])
  AC_PLUGIN([target_scale],[yes],                [The scale target])
  AC_PLUGIN([target_set],  [yes],                [The set target])
 +AC_PLUGIN([target_v5upgrade], [yes],           [The v5upgrade target])
  AC_PLUGIN([tcpconns],    [$plugin_tcpconns],   [TCP connection statistics])
  AC_PLUGIN([teamspeak2],  [yes],                [TeamSpeak2 server statistics])
  AC_PLUGIN([ted],         [$plugin_ted],        [Read The Energy Detective values])
@@@ -4497,7 -4351,6 +4497,7 @@@ AC_PLUGIN([unixsock],    [yes]
  AC_PLUGIN([uptime],      [$plugin_uptime],     [Uptime statistics])
  AC_PLUGIN([users],       [$plugin_users],      [User statistics])
  AC_PLUGIN([uuid],        [yes],                [UUID as hostname plugin])
 +AC_PLUGIN([varnish],     [$with_libvarnish],   [Varnish cache statistics])
  AC_PLUGIN([vmem],        [$plugin_vmem],       [Virtual memory statistics])
  AC_PLUGIN([vserver],     [$plugin_vserver],    [Linux VServer statistics])
  AC_PLUGIN([wireless],    [$plugin_wireless],   [Wireless statistics])
@@@ -4647,7 -4500,7 +4647,7 @@@ the
        with_librrd="yes (warning: librrd is not thread-safe)"
  fi
  
- if test "x$with_libiptc" = "xyes" -a "x$with_own_libiptc" = "xyes"
+ if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xyes"
  then
        with_libiptc="yes (shipped version)"
  fi
@@@ -4705,7 -4558,6 +4705,7 @@@ Configuration
      libstatgrab . . . . . $with_libstatgrab
      libtokyotyrant  . . . $with_libtokyotyrant
      libupsclient  . . . . $with_libupsclient
 +    libvarnish  . . . . . $with_libvarnish
      libvirt . . . . . . . $with_libvirt
      libxml2 . . . . . . . $with_libxml2
      libxmms . . . . . . . $with_libxmms
      target_replace  . . . $enable_target_replace
      target_scale  . . . . $enable_target_scale
      target_set  . . . . . $enable_target_set
 +    target_v5upgrade  . . $enable_target_v5upgrade
      tcpconns  . . . . . . $enable_tcpconns
      teamspeak2  . . . . . $enable_teamspeak2
      ted . . . . . . . . . $enable_ted
      uptime  . . . . . . . $enable_uptime
      users . . . . . . . . $enable_users
      uuid  . . . . . . . . $enable_uuid
 +    varnish . . . . . . . $enable_varnish
      vmem  . . . . . . . . $enable_vmem
      vserver . . . . . . . $enable_vserver
      wireless  . . . . . . $enable_wireless
diff --combined src/df.c
+++ b/src/df.c
@@@ -61,6 -61,7 +61,6 @@@ static ignorelist_t *il_mountpoint = NU
  static ignorelist_t *il_fstype = NULL;
  
  static _Bool by_device = false;
 -static _Bool report_reserved = false;
  static _Bool report_inodes = false;
  
  static int df_init (void)
@@@ -120,6 -121,15 +120,6 @@@ static int df_config (const char *key, 
  
                return (0);
        }
 -      else if (strcasecmp (key, "ReportReserved") == 0)
 -      {
 -              if (IS_TRUE (value))
 -                      report_reserved = true;
 -              else
 -                      report_reserved = false;
 -
 -              return (0);
 -      }
        else if (strcasecmp (key, "ReportInodes") == 0)
        {
                if (IS_TRUE (value))
        return (-1);
  }
  
 -static void df_submit_two (char *df_name,
 -              const char *type,
 -              gauge_t df_used,
 -              gauge_t df_free)
 -{
 -      value_t values[2];
 -      value_list_t vl = VALUE_LIST_INIT;
 -
 -      values[0].gauge = df_used;
 -      values[1].gauge = df_free;
 -
 -      vl.values = values;
 -      vl.values_len = 2;
 -      sstrncpy (vl.host, hostname_g, sizeof (vl.host));
 -      sstrncpy (vl.plugin, "df", sizeof (vl.plugin));
 -      sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance));
 -      sstrncpy (vl.type, type, sizeof (vl.type));
 -      sstrncpy (vl.type_instance, df_name, sizeof (vl.type_instance));
 -
 -      plugin_dispatch_values (&vl);
 -} /* void df_submit_two */
 -
  __attribute__ ((nonnull(2)))
  static void df_submit_one (char *plugin_instance,
                const char *type, const char *type_instance,
@@@ -172,15 -204,15 +172,18 @@@ static int df_read (void
  
        mnt_list = NULL;
        if (cu_mount_getlist (&mnt_list) == NULL)
+       {
+               ERROR ("df plugin: cu_mount_getlist failed.");
                return (-1);
+       }
  
        for (mnt_ptr = mnt_list; mnt_ptr != NULL; mnt_ptr = mnt_ptr->next)
        {
                unsigned long long blocksize;
                char disk_name[256];
 +              uint64_t blk_free;
 +              uint64_t blk_reserved;
 +              uint64_t blk_used;
  
                if (ignorelist_match (il_device,
                                        (mnt_ptr->spec_device != NULL)
  
                blocksize = BLOCKSIZE(statbuf);
  
 -              if (report_reserved)
 -              {
 -                      uint64_t blk_free;
 -                      uint64_t blk_reserved;
 -                      uint64_t blk_used;
 -
 -                      /* Sanity-check for the values in the struct */
 -                      if (statbuf.f_bfree < statbuf.f_bavail)
 -                              statbuf.f_bfree = statbuf.f_bavail;
 -                      if (statbuf.f_blocks < statbuf.f_bfree)
 -                              statbuf.f_blocks = statbuf.f_bfree;
 -
 -                      blk_free = (uint64_t) statbuf.f_bavail;
 -                      blk_reserved = (uint64_t) (statbuf.f_bfree - statbuf.f_bavail);
 -                      blk_used = (uint64_t) (statbuf.f_blocks - statbuf.f_bfree);
 -                      
 -                      df_submit_one (disk_name, "df_complex", "free",
 -                                      (gauge_t) (blk_free * blocksize));
 -                      df_submit_one (disk_name, "df_complex", "reserved",
 -                                      (gauge_t) (blk_reserved * blocksize));
 -                      df_submit_one (disk_name, "df_complex", "used",
 -                                      (gauge_t) (blk_used * blocksize));
 -              }
 -              else /* compatibility code */
 -              {
 -                      gauge_t df_free;
 -                      gauge_t df_used;
 -
 -                      df_free = statbuf.f_bfree * blocksize;
 -                      df_used = (statbuf.f_blocks - statbuf.f_bfree) * blocksize;
 -
 -                      df_submit_two (disk_name, "df", df_used, df_free);
 -              }
 +              /* Sanity-check for the values in the struct */
 +              if (statbuf.f_bfree < statbuf.f_bavail)
 +                      statbuf.f_bfree = statbuf.f_bavail;
 +              if (statbuf.f_blocks < statbuf.f_bfree)
 +                      statbuf.f_blocks = statbuf.f_bfree;
 +
 +              blk_free     = (uint64_t) statbuf.f_bavail;
 +              blk_reserved = (uint64_t) (statbuf.f_bfree - statbuf.f_bavail);
 +              blk_used     = (uint64_t) (statbuf.f_blocks - statbuf.f_bfree);
 +
 +              df_submit_one (disk_name, "df_complex", "free",
 +                              (gauge_t) (blk_free * blocksize));
 +              df_submit_one (disk_name, "df_complex", "reserved",
 +                              (gauge_t) (blk_reserved * blocksize));
 +              df_submit_one (disk_name, "df_complex", "used",
 +                              (gauge_t) (blk_used * blocksize));
  
                /* inode handling */
                if (report_inodes)
diff --combined src/swap.c
@@@ -76,8 -76,8 +76,8 @@@ static derive_t pagesize
  static kstat_t *ksp;
  /* #endif HAVE_LIBKSTAT */
  
 -#elif HAVE_SWAPCTL
 -/* No global variables */
 +#elif HAVE_SWAPCTL && HAVE_SWAPCTL_TWO_ARGS
 +static derive_t pagesize;
  /* #endif HAVE_SWAPCTL */
  
  #elif defined(VM_SWAPUSAGE)
@@@ -115,9 -115,8 +115,9 @@@ static int swap_init (void
                ksp = NULL;
  /* #endif HAVE_LIBKSTAT */
  
 -#elif HAVE_SWAPCTL
 -      /* No init stuff */
 +#elif HAVE_SWAPCTL && HAVE_SWAPCTL_TWO_ARGS
 +      /* getpagesize(3C) tells me this does not fail.. */
 +      pagesize = (derive_t) getpagesize ();
  /* #endif HAVE_SWAPCTL */
  
  #elif defined(VM_SWAPUSAGE)
@@@ -211,25 -210,18 +211,18 @@@ static int swap_read (void
                return (-1);
        }
  
-       while (fgets (buffer, 1024, fh) != NULL)
+       while (fgets (buffer, sizeof (buffer), fh) != NULL)
        {
-               derive_t *val = NULL;
-               if (strncasecmp (buffer, "SwapTotal:", 10) == 0)
-                       val = &swap_total;
-               else if (strncasecmp (buffer, "SwapFree:", 9) == 0)
-                       val = &swap_free;
-               else if (strncasecmp (buffer, "SwapCached:", 11) == 0)
-                       val = &swap_cached;
-               else
-                       continue;
-               numfields = strsplit (buffer, fields, 8);
+               numfields = strsplit (buffer, fields, STATIC_ARRAY_SIZE (fields));
                if (numfields < 2)
                        continue;
  
-               *val = (derive_t) atoll (fields[1]) * 1024LL;
+               if (strcasecmp (fields[0], "SwapTotal:") == 0)
+                       strtoderive (fields[1], &swap_total);
+               else if (strcasecmp (fields[0], "SwapFree:") == 0)
+                       strtoderive (fields[1], &swap_free);
+               else if (strcasecmp (fields[0], "SwapCached:") == 0)
+                       strtoderive (fields[1], &swap_cached);
        }
  
        if (fclose (fh))
                        old_kernel = 1;
        }
  
-       while (fgets (buffer, 1024, fh) != NULL)
+       while (fgets (buffer, sizeof (buffer), fh) != NULL)
        {
                numfields = strsplit (buffer, fields, STATIC_ARRAY_SIZE (fields));
  
                                sstrerror (errno, errbuf, sizeof (errbuf)));
        }
  
-       swap_submit ("used", swap_used, DS_TYPE_GAUGE);
-       swap_submit ("free", swap_free, DS_TYPE_GAUGE);
-       swap_submit ("cached", swap_cached, DS_TYPE_GAUGE);
-       swap_submit ("in", swap_in, DS_TYPE_DERIVE);
+       swap_submit ("used",   1024 * swap_used,   DS_TYPE_GAUGE);
+       swap_submit ("free",   1024 * swap_free,   DS_TYPE_GAUGE);
+       swap_submit ("cached", 1024 * swap_cached, DS_TYPE_GAUGE);
+       swap_submit ("in",  swap_in,  DS_TYPE_DERIVE);
        swap_submit ("out", swap_out, DS_TYPE_DERIVE);
  /* #endif KERNEL_LINUX */
  
  /* #endif HAVE_LIBKSTAT */
  
  #elif HAVE_SWAPCTL
 + #if HAVE_SWAPCTL_TWO_ARGS
 +        swaptbl_t *s;
 +        char strtab[255];
 +        int swap_num;
 +        int status;
 +        int i;
 +
 +        derive_t avail = 0;
 +        derive_t total = 0;
 +
 +        swap_num = swapctl (SC_GETNSWP, NULL);
 +        if (swap_num < 0)
 +        {
 +                ERROR ("swap plugin: swapctl (SC_GETNSWP) failed with status %i.",
 +                                swap_num);
 +                return (-1);
 +        }
 +        else if (swap_num == 0)
 +                return (0);
 +
 +        s = (swaptbl_t *) smalloc (swap_num * sizeof (swapent_t) + sizeof (struct swaptable));
 +        if (s == NULL)
 +        {
 +                ERROR ("swap plugin: smalloc failed.");
 +                return (-1);
 +        }
 +        /* Initialize string pointers. We have them share the same buffer as we don't care
 +       * about the device's name, only its size. This saves memory and alloc/free ops */
 +        for (i = 0; i < (swap_num + 1); i++) {
 +                s->swt_ent[i].ste_path = strtab;
 +        }
 +        s->swt_n = swap_num + 1;
 +        status = swapctl (SC_LIST, s);
 +        if (status != swap_num)
 +        {
 +                ERROR ("swap plugin: swapctl (SC_LIST) failed with status %i.",
 +                                status);
 +                sfree (s);
 +                return (-1);
 +        }
 +
 +        for (i = 0; i < swap_num; i++)
 +        {
 +                if ((s->swt_ent[i].ste_flags & ST_INDEL) != 0)
 +                        continue;
 +
 +                avail += ((derive_t) s->swt_ent[i].ste_free)
 +                         * pagesize;
 +                total += ((derive_t) s->swt_ent[i].ste_pages)
 +                         * pagesize;
 +        }
 +
 +        if (total < avail)
 +        {
 +                ERROR ("swap plugin: Total swap space (%"PRIi64") "
 +                                "is less than free swap space (%"PRIi64").",
 +                                total, avail);
 +                sfree (s);
 +                return (-1);
 +        }
 +
 +        swap_submit ("used", total - avail, DS_TYPE_GAUGE);
 +        swap_submit ("free", avail, DS_TYPE_GAUGE);
 +
 +        sfree (s);
 + /* #endif HAVE_SWAPCTL_TWO_ARGS */
 + #elif HAVE_SWAPCTL_THREE_ARGS
 +
        struct swapent *swap_entries;
        int swap_num;
        int status;
        derive_t used  = 0;
        derive_t total = 0;
  
 -      /*
 -       * XXX: This is the syntax for the *BSD `swapctl', which has the
 -       * following prototype:
 -       *   swapctl (int cmd, void *arg, int misc);
 -       *
 -       * HP-UX and Solaris (and possibly other UNIXes) provide `swapctl',
 -       * too, but with the following prototype:
 -       *   swapctl (int cmd, void *arg);
 -       *
 -       * Solaris is usually handled in the KSTAT case above. For other UNIXes
 -       * a separate case for the other version of `swapctl' may be necessary.
 -       */
        swap_num = swapctl (SWAP_NSWAP, NULL, 0);
        if (swap_num < 0)
        {
        swap_submit ("free", total - used, DS_TYPE_GAUGE);
  
        sfree (swap_entries);
 + #endif /* HAVE_SWAPCTL_THREE_ARGS */
  /* #endif HAVE_SWAPCTL */
  
  #elif defined(VM_SWAPUSAGE)