Merge branch 'ff/netlib'
authorFlorian Forster <octo@collectd.org>
Sat, 17 Nov 2012 07:25:01 +0000 (08:25 +0100)
committerFlorian Forster <octo@collectd.org>
Sat, 17 Nov 2012 07:25:01 +0000 (08:25 +0100)
Conflicts:
src/collectdctl.c
src/libcollectdclient/client.c
src/libcollectdclient/collectd/client.h

1  2 
configure.in
src/Makefile.am
src/collectd-nagios.c
src/collectdctl.c
src/libcollectdclient/client.c
src/libcollectdclient/collectd/client.h

diff --combined configure.in
@@@ -1,8 -1,7 +1,8 @@@
  dnl Process this file with autoconf to produce a configure script.
 -AC_INIT(collectd, m4_esyscmd(./version-gen.sh))
 +AC_INIT(collectd, [m4_esyscmd(./version-gen.sh)])
  AC_CONFIG_SRCDIR(src/collectd.c)
  AC_CONFIG_HEADERS(src/config.h)
 +AC_CONFIG_AUX_DIR([libltdl/config])
  
  m4_ifdef([LT_PACKAGE_VERSION],
        # libtool >= 2.2
@@@ -91,7 -90,6 +91,7 @@@ f
  if test "x$ac_system" = "xSolaris"
  then
        AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Define to enforce POSIX thread semantics under Solaris.])
 +      AC_DEFINE(_REENTRANT,               1, [Define to enable reentrancy interfaces.])
  fi
  if test "x$ac_system" = "xAIX"
  then
  # For hddtemp module
  AC_CHECK_HEADERS(linux/major.h libgen.h)
  
 +# For md module (Linux only)
 +if test "x$ac_system" = "xLinux"
 +then
 +      AC_CHECK_HEADERS(linux/raid/md_u.h,
 +                       [have_linux_raid_md_u_h="yes"],
 +                       [have_linux_raid_md_u_h="no"],
 +[
 +#include <sys/ioctl.h>
 +#include <linux/major.h>
 +#include <linux/types.h>
 +])
 +else
 +      have_linux_raid_md_u_h="no"
 +fi
 +
  # For the battery plugin
  AC_CHECK_HEADERS(IOKit/ps/IOPowerSources.h, [], [],
  [
@@@ -404,64 -387,19 +404,64 @@@ AC_CHECK_HEADERS(linux/netdevice.h, []
  #endif
  ])
  
 +# For ethstat module
 +AC_CHECK_HEADERS(linux/sockios.h,
 +    [have_linux_sockios_h="yes"],
 +    [have_linux_sockios_h="no"],
 +    [
 +#if HAVE_SYS_IOCTL_H
 +# include <sys/ioctl.h>
 +#endif
 +#if HAVE_NET_IF_H
 +# include <net/if.h>
 +#endif
 +    ])
 +AC_CHECK_HEADERS(linux/ethtool.h,
 +    [have_linux_ethtool_h="yes"],
 +    [have_linux_ethtool_h="no"],
 +    [
 +#if HAVE_SYS_IOCTL_H
 +# include <sys/ioctl.h>
 +#endif
 +#if HAVE_NET_IF_H
 +# include <net/if.h>
 +#endif
 +#if HAVE_LINUX_SOCKIOS_H
 +# include <linux/sockios.h>
 +#endif
 +    ])
 +
  # For ipvs module
 +have_linux_ip_vs_h="no"
  have_net_ip_vs_h="no"
  have_ip_vs_h="no"
 +ip_vs_h_needs_kernel_cflags="no"
  if test "x$ac_system" = "xLinux"
  then
 -      SAVE_CFLAGS="$CFLAGS"
 -      CFLAGS="$CFLAGS $KERNEL_CFLAGS"
 -
 +      AC_CHECK_HEADERS(linux/ip_vs.h, [have_linux_ip_vs_h="yes"])
        AC_CHECK_HEADERS(net/ip_vs.h, [have_net_ip_vs_h="yes"])
        AC_CHECK_HEADERS(ip_vs.h, [have_ip_vs_h="yes"])
  
 -      CFLAGS="$SAVE_CFLAGS"
 +      if test "x$have_linux_ip_vs_h$have_net_ip_vs_h$have_ip_vs_h" = "xnonono" && test -d "$KERNEL_DIR"
 +      then
 +              SAVE_CFLAGS="$CFLAGS"
 +              CFLAGS="$CFLAGS $KERNEL_CFLAGS"
 +
 +              AC_MSG_NOTICE([Did not find ip_vs.h. Trying again using headers from $KERNEL_DIR.])
 +
 +              AC_CHECK_HEADERS(linux/ip_vs.h, [have_linux_ip_vs_h="yes"])
 +              AC_CHECK_HEADERS(net/ip_vs.h, [have_net_ip_vs_h="yes"])
 +              AC_CHECK_HEADERS(ip_vs.h, [have_ip_vs_h="yes"])
 +
 +              if test "x$have_linux_ip_vs_h" = "xyes" || test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
 +              then
 +                      ip_vs_h_needs_kernel_cflags="yes"
 +              fi
 +
 +              CFLAGS="$SAVE_CFLAGS"
 +      fi
  fi
 +AM_CONDITIONAL(IP_VS_H_NEEDS_KERNEL_CFLAGS, test "x$ip_vs_h_needs_kernel_cflags" = "xyes")
  
  # For quota module
  AC_CHECK_HEADERS(sys/ucred.h, [], [],
@@@ -533,8 -471,6 +533,8 @@@ AC_CHECK_HEADERS(netinet/if_ether.h, []
  #endif
  ])
  
 +AC_CHECK_HEADERS(netinet/ip_compat.h)
 +
  # For the multimeter plugin
  have_termios_h="no"
  AC_CHECK_HEADERS(termios.h, [have_termios_h="yes"])
@@@ -636,27 -572,6 +636,27 @@@ socket_needs_socket="no
  AC_CHECK_FUNCS(socket, [], AC_CHECK_LIB(socket, socket, [socket_needs_socket="yes"], AC_MSG_ERROR(cannot find socket)))
  AM_CONDITIONAL(BUILD_WITH_LIBSOCKET, test "x$socket_needs_socket" = "xyes")
  
 +clock_gettime_needs_rt="no"
 +clock_gettime_needs_posix4="no"
 +have_clock_gettime="no"
 +AC_CHECK_FUNCS(clock_gettime, [have_clock_gettime="yes"])
 +if test "x$have_clock_gettime" = "xno"
 +then
 +      AC_CHECK_LIB(rt, clock_gettime, [clock_gettime_needs_rt="yes"
 +                                       have_clock_gettime="yes"])
 +fi
 +if test "x$have_clock_gettime" = "xno"
 +then
 +      AC_CHECK_LIB(posix4, clock_gettime, [clock_gettime_needs_posix4="yes"
 +                                           have_clock_gettime="yes"])
 +fi
 +if test "x$have_clock_gettime" = "xyes"
 +then
 +      AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Define if the clock_gettime(2) function is available.])
 +else
 +      AC_MSG_WARN(cannot find clock_gettime)
 +fi
 +
  nanosleep_needs_rt="no"
  nanosleep_needs_posix4="no"
  AC_CHECK_FUNCS(nanosleep,
          AC_CHECK_LIB(posix4, nanosleep,
              [nanosleep_needs_posix4="yes"],
              AC_MSG_ERROR(cannot find nanosleep))))
 -AM_CONDITIONAL(BUILD_WITH_LIBRT, test "x$nanosleep_needs_rt" = "xyes")
 -AM_CONDITIONAL(BUILD_WITH_LIBPOSIX4, test "x$nanosleep_needs_posix4" = "xyes")
 +
 +AM_CONDITIONAL(BUILD_WITH_LIBRT, test "x$clock_gettime_needs_rt" = "xyes" || test "x$nanosleep_needs_rt" = "xyes")
 +AM_CONDITIONAL(BUILD_WITH_LIBPOSIX4, test "x$clock_gettime_needs_posix4" = "xyes" || test "x$nanosleep_needs_posix4" = "xyes")
  
  AC_CHECK_FUNCS(sysctl, [have_sysctl="yes"], [have_sysctl="no"])
  AC_CHECK_FUNCS(sysctlbyname, [have_sysctlbyname="yes"], [have_sysctlbyname="no"])
@@@ -678,77 -592,9 +678,77 @@@ AC_CHECK_FUNCS(thread_info, [have_threa
  AC_CHECK_FUNCS(statfs, [have_statfs="yes"], [have_statfs="no"])
  AC_CHECK_FUNCS(statvfs, [have_statvfs="yes"], [have_statvfs="no"])
  AC_CHECK_FUNCS(getifaddrs, [have_getifaddrs="yes"], [have_getifaddrs="no"])
 +AC_CHECK_FUNCS(getloadavg, [have_getloadavg="yes"], [have_getloadavg="no"])
  AC_CHECK_FUNCS(syslog, [have_syslog="yes"], [have_syslog="no"])
  AC_CHECK_FUNCS(getutent, [have_getutent="yes"], [have_getutent="no"])
  AC_CHECK_FUNCS(getutxent, [have_getutxent="yes"], [have_getutxent="no"])
 +
 +# Check for strptime {{{
 +if test "x$GCC" = "xyes"
 +then
 +      SAVE_CFLAGS="$CFLAGS"
 +      CFLAGS="$CFLAGS -Wall -Wextra -Werror"
 +fi
 +
 +AC_CHECK_FUNCS(strptime, [have_strptime="yes"], [have_strptime="no"])
 +if test "x$have_strptime" = "xyes"
 +then
 +      AC_CACHE_CHECK([whether strptime is exported by default],
 +                     [c_cv_have_strptime_default],
 +                     AC_COMPILE_IFELSE(
 +AC_LANG_PROGRAM(
 +[[
 +AC_INCLUDES_DEFAULT
 +#include <time.h>
 +]],
 +[[
 + struct tm stm;
 + (void) strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
 +]]),
 +                     [c_cv_have_strptime_default="yes"],
 +                     [c_cv_have_strptime_default="no"]))
 +fi
 +if test "x$have_strptime" = "xyes" && test "x$c_cv_have_strptime_default" = "xno"
 +then
 +      AC_CACHE_CHECK([whether strptime needs standards mode],
 +                     [c_cv_have_strptime_standards],
 +                     AC_COMPILE_IFELSE(
 +AC_LANG_PROGRAM(
 +[[
 +#ifndef _ISOC99_SOURCE
 +# define _ISOC99_SOURCE 1
 +#endif
 +#ifndef _POSIX_C_SOURCE
 +# define _POSIX_C_SOURCE 200112L
 +#endif
 +#ifndef _XOPEN_SOURCE
 +# define _XOPEN_SOURCE 500
 +#endif
 +AC_INCLUDES_DEFAULT
 +#include <time.h>
 +]],
 +[[
 + struct tm stm;
 + (void) strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
 +]]),
 +                     [c_cv_have_strptime_standards="yes"],
 +                     [c_cv_have_strptime_standards="no"]))
 +
 +      if test "x$c_cv_have_strptime_standards" = "xyes"
 +      then
 +              AC_DEFINE([STRPTIME_NEEDS_STANDARDS], 1, [Set to true if strptime is only exported in X/Open mode (GNU libc).])
 +      else
 +              have_strptime="no"
 +      fi
 +fi
 +
 +if test "x$GCC" = "xyes"
 +then
 +      CFLAGS="$SAVE_CFLAGS"
 +fi
 +
 +# }}} Check for strptime
 +
  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],
@@@ -800,6 -646,9 +800,6 @@@ if test "x$have_swapctl" = "xyes"; the
          fi
  fi
  
 -# For load module
 -AC_CHECK_FUNCS(getloadavg, [have_getloadavg="yes"], [have_getloadavg="no"])
 -
  # Check for NAN
  AC_ARG_WITH(nan-emulation, [AS_HELP_STRING([--with-nan-emulation], [use emulated NAN. For crosscompiling only.])],
  [
@@@ -820,7 -669,7 +820,7 @@@ if test "x$nan_type" = "xnone"; the
        [[
  #include <stdlib.h>
  #include <math.h>
 -static float foo = NAN;
 +static double foo = NAN;
        ]],
        [[
         if (isnan (foo))
@@@ -846,7 -695,7 +846,7 @@@ if test "x$nan_type" = "xnone"; the
  #include <stdlib.h>
  #define __USE_ISOC99 1
  #include <math.h>
 -static float foo = NAN;
 +static double foo = NAN;
        ]],
        [[
         if (isnan (foo))
@@@ -880,7 -729,7 +880,7 @@@ if test "x$nan_type" = "xnone"; the
  #ifndef isnan
  # define isnan(f) ((f) != (f))
  #endif
 -static float foo = NAN;
 +static double foo = NAN;
        ]],
        [[
         if (isnan (foo))
@@@ -1228,7 -1077,6 +1228,7 @@@ AC_CHECK_MEMBERS([struct kinfo_proc.ki_
                have_struct_kinfo_proc_freebsd="no"
        ],
        [
 +AC_INCLUDES_DEFAULT
  #include <kvm.h>
  #include <sys/param.h>
  #include <sys/sysctl.h>
@@@ -1245,7 -1093,6 +1245,7 @@@ AC_CHECK_MEMBERS([struct kinfo_proc.kp_
                have_struct_kinfo_proc_openbsd="no"
        ],
        [
 +AC_INCLUDES_DEFAULT
  #include <sys/param.h>
  #include <sys/sysctl.h>
  #include <kvm.h>
@@@ -1306,7 -1153,6 +1306,7 @@@ AC_CHECK_MEMBERS([kstat_io_t.nwritten, 
  #
  # Checks for libraries begin here
  #
 +
  with_libresolv="yes"
  AC_CHECK_LIB(resolv, res_search,
  [
@@@ -1428,7 -1274,6 +1428,7 @@@ AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETSWA
  AC_CHECK_LIB(kvm, kvm_nlist, [with_kvm_nlist="yes"], [with_kvm_nlist="no"])
  if test "x$with_kvm_nlist" = "xyes"
  then
 +      AC_CHECK_HEADERS(bsd/nlist.h nlist.h)
        AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
                  [Define to 1 if you have the 'kvm' library with the 'kvm_nlist' symbol (-lkvm)])
        with_libkvm="yes"
@@@ -1475,7 -1320,7 +1475,7 @@@ the
        fi
        AC_CHECK_HEADERS(credis.h,
        [with_libcredis="yes"],
 -      [with_libcredis="no ('credis.h' not found)"])
 +      [with_libcredis="no (credis.h not found)"])
  fi
  if test "x$with_libcredis" = "xyes"
  then
@@@ -1832,123 -1677,113 +1832,123 @@@ AM_CONDITIONAL(BUILD_WITH_LIBGCRYPT, te
  # }}}
  
  # --with-libiptc {{{
 -with_own_libiptc="no"
  AC_ARG_WITH(libiptc, [AS_HELP_STRING([--with-libiptc@<:@=PREFIX@:>@], [Path to libiptc.])],
  [
        if test "x$withval" = "xshipped"
        then
 -              with_own_libiptc="yes"
 -              with_libiptc="yes"
 -      else if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +              with_libiptc="own"
 +      else if test "x$withval" = "xyes"
        then
 -              LIBIPTC_CPPFLAGS="$LIBIPTC_CPPFLAGS -I$withval/include"
 -              LIBIPTC_LDFLAGS="$LIBIPTC_LDFLAGS -L$withval/lib"
 -              with_libiptc="yes"
 +              with_libiptc="pkgconfig"
 +      else if test "x$withval" = "xno"
 +      then
 +              with_libiptc="no"
        else
 -              with_libiptc="$withval"
 -      fi; fi
 +              with_libiptc="yes"
 +              with_libiptc_cflags="-I$withval/include"
 +              with_libiptc_libs="-L$withval/lib"
 +      fi; fi; fi
  ],
  [
        if test "x$ac_system" = "xLinux"
        then
 -              with_libiptc="yes"
 +              with_libiptc="pkgconfig"
        else
                with_libiptc="no (Linux only)"
        fi
  ])
 -SAVE_CPPFLAGS="$CPPFLAGS"
 -SAVE_LDFLAGS="$LDFLAGS"
 -CPPFLAGS="$CPPFLAGS $LIBIPTC_CPPFLAGS"
 -LDFLAGS="$LDFLAGS $LIBIPTC_LDFLAGS"
 -# check whether the header file for libiptc is available.
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xno"
 +
 +if test "x$with_libiptc" = "xpkgconfig" && test "x$PKG_CONFIG" = "x"
  then
 -      AC_CHECK_HEADERS(libiptc/libiptc.h,
 -      [
 -              AC_DEFINE(HAVE_LIBIPTC_LIBIPTC_H, 1, [Define to 1 if you have the <libiptc/libiptc.h> header file.])
 -      ],
 -      [
 -              with_libiptc="yes"
 -              with_own_libiptc="yes"
 -      ])
 +      with_libiptc="no (Don't have pkg-config)"
  fi
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xno"
 +
 +if test "x$with_libiptc" = "xpkgconfig"
  then
 -      AC_CHECK_HEADERS(libiptc/libip6tc.h,
 -      [
 -              AC_DEFINE(HAVE_LIBIPTC_LIBIP6TC_H, 1, [Define to 1 if you have the <libiptc/libip6tc.h> header file.])
 -      ],
 -      [
 -              with_libiptc="yes"
 -              with_own_libiptc="yes"
 -      ])
 +      $PKG_CONFIG --exists 'libiptc' 2>/dev/null
 +      if test $? -ne 0
 +      then
 +              with_libiptc="no (pkg-config doesn't know libiptc)"
 +      fi
 +fi
 +if test "x$with_libiptc" = "xpkgconfig"
 +then
 +      with_libiptc_cflags="`$PKG_CONFIG --cflags 'libiptc'`"
 +      if test $? -ne 0
 +      then
 +              with_libiptc="no ($PKG_CONFIG failed)"
 +      fi
 +      with_libiptc_libs="`$PKG_CONFIG --libs 'libiptc'`"
 +      if test $? -ne 0
 +      then
 +              with_libiptc="no ($PKG_CONFIG failed)"
 +      fi
 +fi
 +
 +SAVE_CPPFLAGS="$CPPFLAGS"
 +CPPFLAGS="$CPPFLAGS $with_libiptc_cflags"
 +
 +# check whether the header file for libiptc is available.
 +if test "x$with_libiptc" = "xpkgconfig"
 +then
 +      AC_CHECK_HEADERS(libiptc/libiptc.h libiptc/libip6tc.h, ,
 +                      [with_libiptc="no (header file missing)"])
  fi
  # If the header file is available, check for the required type declaractions.
  # They may be missing in old versions of libiptc. In that case, they will be
  # declared in the iptables plugin.
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xno"
 +if test "x$with_libiptc" = "xpkgconfig"
  then
 -      AC_CHECK_TYPES([iptc_handle_t, ip6tc_handle_t], [], [],
 -      [
 -#if OWN_LIBIPTC
 -# include "$srcdir/src/owniptc/libiptc.h"
 -# include "$srcdir/src/owniptc/libip6tc.h"
 -#else
 -# include <libiptc/libiptc.h>
 -# include <libiptc/libip6tc.h>
 -#endif
 -      ])
 +      AC_CHECK_TYPES([iptc_handle_t, ip6tc_handle_t], [], [])
  fi
  # Check for the iptc_init symbol in the library.
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xno"
 +# This could be in iptc or ip4tc
 +if test "x$with_libiptc" = "xpkgconfig"
  then
 -      AC_CHECK_LIB(iptc, iptc_init,
 -      [
 -              AC_DEFINE(HAVE_LIBIPTC, 1, [Define to 1 if you have the iptc library (-liptc).])
 -      ],
 -      [
 -              with_libiptc="yes"
 -              with_own_libiptc="yes"
 -      ])
 +      SAVE_LIBS="$LIBS"
 +      AC_SEARCH_LIBS(iptc_init, [iptc ip4tc],
 +                      [with_libiptc="pkgconfig"],
 +                      [with_libiptc="no"],
 +                      [$with_libiptc_libs])
 +      LIBS="$SAVE_LIBS"
 +fi
 +if test "x$with_libiptc" = "xpkgconfig"
 +then
 +      with_libiptc="yes"
 +fi
 +
 +CPPFLAGS="$SAVE_CPPFLAGS"
 +
 +if test "x$with_libiptc" = "xown"
 +then
 +      with_libiptc_cflags=""
 +      with_libiptc_libs=""
  fi
 -# The system wide version failed for some reason. Check if we have the required
 -# headers to build the shipped version.
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xyes"
 +if test "x$with_libiptc" = "xown"
  then
        AC_CHECK_HEADERS(linux/netfilter_ipv4/ip_tables.h linux/netfilter_ipv6/ip6_tables.h linux/netfilter/x_tables.h, [],
        [
                with_libiptc="no (Linux iptables headers not found)"
 -              with_own_libiptc="no"
        ],
        [
  #include "$srcdir/src/owniptc/ipt_kernel_headers.h"
        ])
  fi
 +AM_CONDITIONAL(BUILD_WITH_OWN_LIBIPTC, test "x$with_libiptc" = "xown")
 +if test "x$with_libiptc" = "xown"
 +then
 +      AC_DEFINE(OWN_LIBIPTC, 1, [Define to 1 if we use the shipped iptc library.])
 +      with_libiptc="yes"
 +fi
 +
  AM_CONDITIONAL(BUILD_WITH_LIBIPTC, test "x$with_libiptc" = "xyes")
 -AM_CONDITIONAL(BUILD_WITH_OWN_LIBIPTC, test "x$with_own_libiptc" = "xyes")
  if test "x$with_libiptc" = "xyes"
  then
 -      BUILD_WITH_LIBIPTC_CPPFLAGS="$LIBIPTC_CPPFLAGS"
 -      BUILD_WITH_LIBIPTC_LDFLAGS="$LIBIPTC_LDFLAGS"
 +      BUILD_WITH_LIBIPTC_CPPFLAGS="$with_libiptc_cflags"
 +      BUILD_WITH_LIBIPTC_LDFLAGS="$with_libiptc_libs"
        AC_SUBST(BUILD_WITH_LIBIPTC_CPPFLAGS)
        AC_SUBST(BUILD_WITH_LIBIPTC_LDFLAGS)
  fi
 -if test "x$with_own_libiptc" = "xyes"
 -then
 -      AC_DEFINE(OWN_LIBIPTC, 1, [Define to 1 if we use the shipped iptc library.])
 -fi
 -CPPFLAGS="$SAVE_CPPFLAGS"
 -LDFLAGS="$SAVE_LDFLAGS"
  # }}}
  
  # --with-java {{{
  fi
  if test "x$with_libmodbus" = "xuse_pkgconfig"
  then
 -      AC_MSG_NOTICE([Checking for modbus using $PKG_CONFIG])
 -      $PKG_CONFIG --exists 'modbus' 2>/dev/null
 +      AC_MSG_NOTICE([Checking for libmodbus using $PKG_CONFIG])
 +      $PKG_CONFIG --exists 'libmodbus' 2>/dev/null
        if test $? -ne 0
        then
 -              with_libmodbus="no (pkg-config doesn't know library)"
 +              with_libmodbus="no (pkg-config doesn't know libmodbus)"
        fi
  fi
  if test "x$with_libmodbus" = "xuse_pkgconfig"
  then
 -      with_libmodbus_cflags="`$PKG_CONFIG --cflags 'modbus'`"
 +      with_libmodbus_cflags="`$PKG_CONFIG --cflags 'libmodbus'`"
        if test $? -ne 0
        then
                with_libmodbus="no ($PKG_CONFIG failed)"
        fi
 -      with_libmodbus_libs="`$PKG_CONFIG --libs 'modbus'`"
 +      with_libmodbus_libs="`$PKG_CONFIG --libs 'libmodbus'`"
        if test $? -ne 0
        then
                with_libmodbus="no ($PKG_CONFIG failed)"
@@@ -2247,9 -2082,9 +2247,9 @@@ the
        CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags"
        LDFLAGS="$LDFLAGS $with_libmodbus_libs"
  
 -      AC_CHECK_LIB(modbus, modbus_init_tcp,
 +      AC_CHECK_LIB(modbus, modbus_connect,
                     [with_libmodbus="yes"],
 -                   [with_libmodbus="no (symbol modbus_init_tcp not found)"])
 +                   [with_libmodbus="no (symbol modbus_connect not found)"])
  
        CPPFLAGS="$SAVE_CPPFLAGS"
        LDFLAGS="$SAVE_LDFLAGS"
  fi
  # }}}
  
 +# --with-libmongoc {{{
 +AC_ARG_WITH(libmongoc, [AS_HELP_STRING([--with-libmongoc@<:@=PREFIX@:>@], [Path to libmongoc.])],
 +[
 + if test "x$withval" = "xyes"
 + then
 +       with_libmongoc="yes"
 + else if test "x$withval" = "xno"
 + then
 +       with_libmongoc="no"
 + else
 +       with_libmongoc="yes"
 +       LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS -I$withval/include"
 +       LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS -L$withval/lib"
 + fi; fi
 +],
 +[with_libmongoc="yes"])
 +
 +SAVE_CPPFLAGS="$CPPFLAGS"
 +SAVE_LDFLAGS="$LDFLAGS"
 +
 +CPPFLAGS="$CPPFLAGS $LIBMONGOC_CPPFLAGS"
 +LDFLAGS="$LDFLAGS $LIBMONGOC_LDFLAGS"
 +
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      if test "x$LIBMONGOC_CPPFLAGS" != "x"
 +      then
 +              AC_MSG_NOTICE([libmongoc CPPFLAGS: $LIBMONGOC_CPPFLAGS])
 +      fi
 +      AC_CHECK_HEADERS(mongo.h,
 +      [with_libmongoc="yes"],
 +      [with_libmongoc="no ('mongo.h' not found)"],
 +[#if HAVE_STDINT_H
 +# define MONGO_HAVE_STDINT 1
 +#else
 +# define MONGO_USE_LONG_LONG_INT 1
 +#endif
 +])
 +fi
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      if test "x$LIBMONGOC_LDFLAGS" != "x"
 +      then
 +              AC_MSG_NOTICE([libmongoc LDFLAGS: $LIBMONGOC_LDFLAGS])
 +      fi
 +      AC_CHECK_LIB(mongoc, mongo_run_command,
 +      [with_libmongoc="yes"],
 +      [with_libmongoc="no (symbol 'mongo_run_command' not found)"])
 +fi
 +
 +CPPFLAGS="$SAVE_CPPFLAGS"
 +LDFLAGS="$SAVE_LDFLAGS"
 +
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      BUILD_WITH_LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS"
 +      BUILD_WITH_LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS"
 +      AC_SUBST(BUILD_WITH_LIBMONGOC_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBMONGOC_LDFLAGS)
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBMONGOC, test "x$with_libmongoc" = "xyes")
 +# }}}
 +
  # --with-libmysql {{{
  with_mysql_config="mysql_config"
  with_mysql_cflags=""
@@@ -2383,7 -2155,7 +2383,7 @@@ the
  fi
  if test "x$with_libmysql" = "xyes"
  then
 -      with_mysql_libs=`$with_mysql_config --libs 2>/dev/null`
 +      with_mysql_libs=`$with_mysql_config --libs_r 2>/dev/null`
        mysql_config_status=$?
  
        if test $mysql_config_status -ne 0
  #include <asm/types.h>
  #include <sys/socket.h>])
  
 -      AC_COMPILE_IFELSE(
 -[#include <stdio.h>
 -#include <sys/types.h>
 -#include <asm/types.h>
 -#include <sys/socket.h>
 -#include <linux/netlink.h>
 -#include <linux/rtnetlink.h>
 -
 -int main (void)
 -{
 -      int retval = TCA_STATS2;
 -      return (retval);
 -}],
 -      [AC_DEFINE([HAVE_TCA_STATS2], 1, [True if the enum-member TCA_STATS2 exists])]
 -      []);
 +        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
 +                           [
 +                            #include <stdio.h>
 +                            #include <sys/types.h>
 +                            #include <asm/types.h>
 +                            #include <sys/socket.h>
 +                            #include <linux/netlink.h>
 +                            #include <linux/rtnetlink.h>
 +                            ], [
 +                                int retval = TCA_STATS2;
 +                                return (retval);
 +                                ]
 +                            )],
 +                            [AC_DEFINE([HAVE_TCA_STATS2], [1], [True if the enum-member TCA_STATS2 exists])])
  
        AC_COMPILE_IFELSE(
  [#include <stdio.h>
  fi
  if test "x$with_libnetlink" = "xyes"
  then
 +      SAVE_CFLAGS="$CFLAGS"
 +      CFLAGS="$CFLAGS $with_libnetlink_cflags"
 +
 +      AC_CACHE_CHECK(
 +              [if function 'rtnl_dump_filter' expects five arguments],
 +              [c_cv_rtnl_dump_filter_five_args],
 +              AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
 +                              [
 +AC_INCLUDES_DEFAULT
 +#include <asm/types.h>
 +#include <sys/socket.h>
 +#if HAVE_LIBNETLINK_H
 +# include <libnetlink.h>
 +#elif HAVE_IPROUTE_LIBNETLINK_H
 +# include <iproute/libnetlink.h>
 +#elif HAVE_LINUX_LIBNETLINK_H
 +# include <linux/libnetlink.h>
 +#endif
 +                              ],
 +                              [
 +if (rtnl_dump_filter(NULL, NULL, NULL, NULL, NULL))
 +      return 1;
 +return 0;
 +                              ]
 +                      )],
 +                      [c_cv_rtnl_dump_filter_five_args="yes"],
 +                      [c_cv_rtnl_dump_filter_five_args="no"]
 +              )
 +      )
 +
 +      AC_CACHE_CHECK(
 +              [if function 'rtnl_dump_filter' expects three arguments],
 +              [c_cv_rtnl_dump_filter_three_args],
 +              AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
 +                              [
 +AC_INCLUDES_DEFAULT
 +#include <asm/types.h>
 +#include <sys/socket.h>
 +#if HAVE_LIBNETLINK_H
 +# include <libnetlink.h>
 +#elif HAVE_IPROUTE_LIBNETLINK_H
 +# include <iproute/libnetlink.h>
 +#elif HAVE_LINUX_LIBNETLINK_H
 +# include <linux/libnetlink.h>
 +#endif
 +                              ],
 +                              [
 +if (rtnl_dump_filter(NULL, NULL, NULL))
 +      return 1;
 +return 0;
 +                              ]
 +                      )],
 +                      [c_cv_rtnl_dump_filter_three_args="yes"],
 +                      [c_cv_rtnl_dump_filter_three_args="no"]
 +              )
 +      )
 +
 +      CFLAGS="$SAVE_CFLAGS"
 +
 +      if test "x$c_cv_rtnl_dump_filter_five_args" = "xyes"
 +      then
 +              AC_DEFINE(RTNL_DUMP_FILTER_FIVE_ARGS, 1,
 +                              [Define to 1 if function 'rtnl_dump_filter' expects five arguments.])
 +      fi
 +      if test "x$c_cv_rtnl_dump_filter_three_args" = "xyes"
 +      then
 +              AC_DEFINE(RTNL_DUMP_FILTER_THREE_ARGS, 1,
 +                              [Define to 1 if function 'rtnl_dump_filter' expects three arguments.])
 +      fi
 +
        BUILD_WITH_LIBNETLINK_CFLAGS="$with_libnetlink_cflags"
        BUILD_WITH_LIBNETLINK_LIBS="$with_libnetlink_libs"
        AC_SUBST(BUILD_WITH_LIBNETLINK_CFLAGS)
@@@ -2804,7 -2507,7 +2804,7 @@@ the
        fi
        AC_CHECK_HEADERS(oping.h,
        [with_liboping="yes"],
 -      [with_liboping="no ('oping.h' not found)"])
 +      [with_liboping="no (oping.h not found)"])
  fi
  if test "x$with_liboping" = "xyes"
  then
  fi
  if test "x$with_libpcap" = "xyes"
  then
 -      AC_CHECK_HEADERS(pcap.h,
 -      [
 -              AC_DEFINE(HAVE_PCAP_H, 1, [Define to 1 if you have the <pcap.h> header file.])
 -      ], [with_libpcap="no (pcap.h not found)"])
 +      AC_CHECK_HEADERS(pcap.h,,
 +                       [with_libpcap="no (pcap.h not found)"])
  fi
  if test "x$with_libpcap" = "xyes"
  then
 -      collect_libpcap=1
 -else
 -      collect_libpcap=0
 +      AC_CHECK_HEADERS(pcap-bpf.h,,
 +                       [with_libpcap="no (pcap-bpf.h not found)"])
  fi
 -AC_DEFINE_UNQUOTED(COLLECT_LIBPCAP, [$collect_libpcap],
 -      [Wether or not to use the pcap library])
  AM_CONDITIONAL(BUILD_WITH_LIBPCAP, test "x$with_libpcap" = "xyes")
  # }}}
  
  perl_interpreter="perl"
  AC_ARG_WITH(libperl, [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
  [
 -      if test -x "$withval"
 +      if test -f "$withval" && test -x "$withval"
        then
                perl_interpreter="$withval"
                with_libperl="yes"
@@@ -3428,39 -3136,26 +3428,39 @@@ AC_ARG_WITH(librabbitmq, [AS_HELP_STRIN
  [
        with_librabbitmq="yes"
  ])
 +SAVE_CPPFLAGS="$CPPFLAGS"
 +SAVE_LDFLAGS="$LDFLAGS"
 +CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
 +LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
  if test "x$with_librabbitmq" = "xyes"
  then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
 -
        AC_CHECK_HEADERS(amqp.h, [with_librabbitmq="yes"], [with_librabbitmq="no (amqp.h not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
  if test "x$with_librabbitmq" = "xyes"
  then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_LDFLAGS="$LDFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
 -      LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
 -
 +      # librabbitmq up to version 0.9.1 provides "library_errno", later
 +      # versions use "library_error". The library does not provide a version
 +      # macro :( Use "AC_CHECK_MEMBERS" (plural) for automatic defines.
 +      AC_CHECK_MEMBERS([amqp_rpc_reply_t.library_errno],,,
 +                       [
 +#if HAVE_STDLIB_H
 +# include <stdlib.h>
 +#endif
 +#if HAVE_STDIO_H
 +# include <stdio.h>
 +#endif
 +#if HAVE_STDINT_H
 +# include <stdint.h>
 +#endif
 +#if HAVE_INTTYPES_H
 +# include <inttypes.h>
 +#endif
 +#include <amqp.h>
 +                         ])
 +fi
 +if test "x$with_librabbitmq" = "xyes"
 +then
        AC_CHECK_LIB(rabbitmq, amqp_basic_publish, [with_librabbitmq="yes"], [with_librabbitmq="no (Symbol 'amqp_basic_publish' not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      LDFLAGS="$SAVE_LDFLAGS"
  fi
  if test "x$with_librabbitmq" = "xyes"
  then
        AC_SUBST(BUILD_WITH_LIBRABBITMQ_LIBS)
        AC_DEFINE(HAVE_LIBRABBITMQ, 1, [Define if librabbitmq is present and usable.])
  fi
 +CPPFLAGS="$SAVE_CPPFLAGS"
 +LDFLAGS="$SAVE_LDFLAGS"
  AM_CONDITIONAL(BUILD_WITH_LIBRABBITMQ, test "x$with_librabbitmq" = "xyes")
  # }}}
  
@@@ -3508,7 -3201,7 +3508,7 @@@ the
        fi
        AC_CHECK_HEADERS(routeros_api.h,
        [with_librouteros="yes"],
 -      [with_librouteros="no ('routeros_api.h' not found)"])
 +      [with_librouteros="no (routeros_api.h not found)"])
  fi
  if test "x$with_librouteros" = "xyes"
  then
@@@ -3707,7 -3400,7 +3707,7 @@@ the
      if test "$?" != "0"
      then
        with_libstatgrab_pkg_config="no"
 -      with_libstatgrab="no ($PKG_CONFIG doesn't know libstatgrab)"
 +      with_libstatgrab="no (pkg-config doesn't know libstatgrab)"
        temp_result="not found"
      fi
      AC_MSG_RESULT([$temp_result])
@@@ -3866,7 -3559,7 +3866,7 @@@ AM_CONDITIONAL(BUILD_WITH_LIBTOKYOTYRAN
  with_libupsclient_config=""
  with_libupsclient_cflags=""
  with_libupsclient_libs=""
 -AC_ARG_WITH(libupsclient, [AS_HELP_STRING([--with-libupsclient@<:@=PREFIX@:>@], [Path to the Net-SNMPD library.])],
 +AC_ARG_WITH(libupsclient, [AS_HELP_STRING([--with-libupsclient@<:@=PREFIX@:>@], [Path to the upsclient library.])],
  [
        if test "x$withval" = "xno"
        then
@@@ -3927,7 -3620,7 +3927,7 @@@ the
        $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
        if test $? -ne 0
        then
 -              with_libupsclient="no (pkg-config doesn't know library)"
 +              with_libupsclient="no (pkg-config doesn't know libupsclient)"
        fi
  fi
  if test "x$with_libupsclient" = "xuse_pkgconfig"
@@@ -4088,7 -3781,6 +4088,7 @@@ the
        CPPFLAGS="$CPPFLAGS $with_libyajl_cppflags"
  
        AC_CHECK_HEADERS(yajl/yajl_parse.h, [with_libyajl="yes"], [with_libyajl="no (yajl/yajl_parse.h not found)"])
 +      AC_CHECK_HEADERS(yajl/yajl_version.h)
  
        CPPFLAGS="$SAVE_CPPFLAGS"
  fi
@@@ -4133,7 -3825,7 +4133,7 @@@ AC_ARG_WITH(libvarnish, [AS_HELP_STRING
        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_libs="-L$withval/lib -lvarnishapi"
                with_libvarnish="yes"
        fi; fi; fi
  ],
@@@ -4153,7 -3845,7 +4153,7 @@@ the
        $PKG_CONFIG --exists 'varnishapi' 2>/dev/null
        if test $? -ne 0
        then
 -              with_libvarnish="no (pkg-config doesn't know library)"
 +              with_libvarnish="no (pkg-config doesn't know varnishapi)"
        fi
  fi
  if test "x$with_libvarnish" = "xuse_pkgconfig"
@@@ -4192,9 -3884,10 +4192,9 @@@ the
        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])
 +    AC_CHECK_HEADERS(varnish/vsc.h,
 +        [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
 +        [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])])
  
        CPPFLAGS="$SAVE_CPPFLAGS"
        #LDFLAGS="$SAVE_LDFLAGS"
@@@ -4222,7 -3915,7 +4222,7 @@@ the
        then
                with_libxml2="yes"
        else
 -              with_libxml2="no (pkg-config doesn't know library)"
 +              with_libxml2="no (pkg-config doesn't know libxml-2.0)"
        fi
  
        pkg-config --exists libvirt 2>/dev/null
        then
                with_libvirt="yes"
        else
 -              with_libvirt="no (pkg-config doesn't know library)"
 +              with_libvirt="no (pkg-config doesn't know libvirt)"
        fi
  fi
  if test "x$with_libxml2" = "xyes"
@@@ -4347,7 -4040,7 +4347,7 @@@ the
        $PKG_CONFIG --exists OpenIPMIpthread 2>/dev/null
        if test "$?" != "0"
        then
 -              with_libopenipmipthread="no ($PKG_CONFIG doesn't know OpenIPMIpthread)"
 +              with_libopenipmipthread="no (pkg-config doesn't know OpenIPMIpthread)"
        fi
        AC_MSG_RESULT([$with_libopenipmipthread])
  fi
  
  PKG_CHECK_MODULES([LIBNOTIFY], [libnotify],
                [with_libnotify="yes"],
 -              [with_libnotify="no ($LIBNOTIFY_PKG_ERRORS)"])
 +              [if test "x$LIBNOTIFY_PKG_ERRORS" = "x"; then
 +                       with_libnotify="no"
 +               else
 +                       with_libnotify="no ($LIBNOTIFY_PKG_ERRORS)"
 +               fi])
  
  # Check for enabled/disabled features
  #
@@@ -4552,8 -4241,6 +4552,8 @@@ plugin_curl_xml="no
  plugin_df="no"
  plugin_disk="no"
  plugin_entropy="no"
 +plugin_ethstat="no"
 +plugin_fscache="no"
  plugin_interface="no"
  plugin_ipmi="no"
  plugin_ipvs="no"
@@@ -4563,7 -4250,7 +4563,7 @@@ plugin_load="no
  plugin_memory="no"
  plugin_multimeter="no"
  plugin_nfs="no"
 -plugin_fscache="no"
 +plugin_numa="no"
  plugin_perl="no"
  plugin_processes="no"
  plugin_protocols="no"
        plugin_cpufreq="yes"
        plugin_disk="yes"
        plugin_entropy="yes"
 +      plugin_fscache="yes"
        plugin_interface="yes"
        plugin_irq="yes"
        plugin_load="yes"
        plugin_memory="yes"
        plugin_nfs="yes"
 -      plugin_fscache="yes"
 +      plugin_numa="yes"
        plugin_processes="yes"
        plugin_protocols="yes"
        plugin_serial="yes"
        plugin_vserver="yes"
        plugin_wireless="yes"
  
 -      if test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
 +      if test "x$have_linux_ip_vs_h" = "xyes" || test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
        then
                plugin_ipvs="yes"
        fi
  fi
  
  # AIX
 +
 +if test "x$ac_system" = "xAIX"
 +then
 +        plugin_tcpconns="yes"
 +fi
 +
  if test "x$with_perfstat" = "xyes"
  then
        plugin_cpu="yes"
 +      plugin_contextswitch="yes"
        plugin_disk="yes"
        plugin_memory="yes"
        plugin_swap="yes"
        plugin_interface="yes"
        plugin_load="yes"
 +      plugin_uptime="yes"
  fi
  
  if test "x$with_procinfo" = "xyes"
  # Solaris
  if test "x$with_kstat" = "xyes"
  then
 +      plugin_nfs="yes"
        plugin_uptime="yes"
        plugin_zfs_arc="yes"
  fi
@@@ -4667,6 -4344,11 +4667,6 @@@ the
        plugin_tape="yes"
  fi
  
 -if test "x$have_sys_swap_h$with_kstat$ac_system" = "xyesyesSolaris"
 -then
 -      plugin_swap="yes"
 -fi
 -
  # libstatgrab
  if test "x$with_libstatgrab" = "xyes"
  then
  if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"
  then
        plugin_ascent="yes"
 -      plugin_bind="yes"
 +      if test "x$have_strptime" = "xyes"
 +      then
 +              plugin_bind="yes"
 +      fi
  fi
  
  if test "x$with_libopenipmipthread" = "xyes"
@@@ -4711,11 -4390,8 +4711,11 @@@ if test "x$have_sysctl" = "xyes
  then
        plugin_cpu="yes"
        plugin_memory="yes"
 -      plugin_swap="yes"
        plugin_uptime="yes"
 +      if test "x$ac_system" = "xDarwin"
 +      then
 +              plugin_swap="yes"
 +      fi
  fi
  if test "x$have_sysctlbyname" = "xyes"
  then
        fi
  fi
  
 +if test "x$have_linux_sockios_h$have_linux_ethtool_h" = "xyesyes"
 +then
 +      plugin_ethstat="yes"
 +fi
 +
  if test "x$have_getifaddrs" = "xyes"
  then
        plugin_interface="yes"
@@@ -4812,7 -4483,7 +4812,7 @@@ the
        plugin_swap="yes"
  fi
  
 -if test "x$have_swapctl" = "xyes"
 +if test "x$have_swapctl" = "xyes" && test "x$c_cv_have_swapctl_two_args" = "xyes"
  then
        plugin_swap="yes"
  fi
@@@ -4852,7 -4523,6 +4852,7 @@@ AC_ARG_ENABLE([all-plugins]
  
  m4_divert_once([HELP_ENABLE], [])
  
 +AC_PLUGIN([aggregation], [yes],                [Aggregation plugin])
  AC_PLUGIN([amqp],        [$with_librabbitmq],  [AMQP output plugin])
  AC_PLUGIN([apache],      [$with_libcurl],      [Apache httpd statistics])
  AC_PLUGIN([apcups],      [yes],                [Statistics of UPSes by APC])
@@@ -4874,7 -4544,6 +4874,7 @@@ AC_PLUGIN([disk],        [$plugin_disk]
  AC_PLUGIN([dns],         [$with_libpcap],      [DNS traffic analysis])
  AC_PLUGIN([email],       [yes],                [EMail statistics])
  AC_PLUGIN([entropy],     [$plugin_entropy],    [Entropy statistics])
 +AC_PLUGIN([ethstat],     [$plugin_ethstat],    [Stats from NIC driver])
  AC_PLUGIN([exec],        [yes],                [Execution of external programs])
  AC_PLUGIN([filecount],   [yes],                [Count files in directories])
  AC_PLUGIN([fscache],     [$plugin_fscache],    [fscache statistics])
@@@ -4897,7 -4566,6 +4897,7 @@@ AC_PLUGIN([match_regex], [yes]
  AC_PLUGIN([match_timediff], [yes],             [The timediff match])
  AC_PLUGIN([match_value], [yes],                [The value match])
  AC_PLUGIN([mbmon],       [yes],                [Query mbmond])
 +AC_PLUGIN([md],          [$have_linux_raid_md_u_h], [md (Linux software RAID) devices])
  AC_PLUGIN([memcachec],   [$with_libmemcached], [memcachec statistics])
  AC_PLUGIN([memcached],   [yes],                [memcached statistics])
  AC_PLUGIN([memory],      [$plugin_memory],     [Memory usage])
@@@ -4912,7 -4580,6 +4912,7 @@@ AC_PLUGIN([nginx],       [$with_libcurl
  AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
  AC_PLUGIN([notify_email], [$with_libesmtp],    [Email notifier])
  AC_PLUGIN([ntpd],        [yes],                [NTPd statistics])
 +AC_PLUGIN([numa],        [$plugin_numa],       [NUMA virtual memory statistics])
  AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
  AC_PLUGIN([olsrd],       [yes],                [olsrd statistics])
  AC_PLUGIN([onewire],     [$with_libowcapi],    [OneWire sensor statistics])
@@@ -4948,7 -4615,6 +4948,7 @@@ AC_PLUGIN([tcpconns],    [$plugin_tcpco
  AC_PLUGIN([teamspeak2],  [yes],                [TeamSpeak2 server statistics])
  AC_PLUGIN([ted],         [$plugin_ted],        [Read The Energy Detective values])
  AC_PLUGIN([thermal],     [$plugin_thermal],    [Linux ACPI thermal zone statistics])
 +AC_PLUGIN([threshold],   [yes],                [Threshold checking plugin])
  AC_PLUGIN([tokyotyrant], [$with_libtokyotyrant],  [TokyoTyrant database statistics])
  AC_PLUGIN([unixsock],    [yes],                [Unixsock communication plugin])
  AC_PLUGIN([uptime],      [$plugin_uptime],     [Uptime statistics])
@@@ -4958,10 -4624,8 +4958,10 @@@ AC_PLUGIN([varnish],     [$with_libvarn
  AC_PLUGIN([vmem],        [$plugin_vmem],       [Virtual memory statistics])
  AC_PLUGIN([vserver],     [$plugin_vserver],    [Linux VServer statistics])
  AC_PLUGIN([wireless],    [$plugin_wireless],   [Wireless statistics])
 +AC_PLUGIN([write_graphite], [yes],             [Graphite / Carbon output plugin])
  AC_PLUGIN([write_http],  [$with_libcurl],      [HTTP output plugin])
  AC_PLUGIN([write_redis], [$with_libcredis],    [Redis output plugin])
 +AC_PLUGIN([write_mongodb], [$with_libmongoc],  [MongoDB output plugin])
  AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
  AC_PLUGIN([zfs_arc],     [$plugin_zfs_arc],    [ZFS ARC statistics])
  
@@@ -5047,16 -4711,11 +5047,16 @@@ AC_SUBST(LOAD_PLUGIN_CSV
  
  dnl ip_vs.h
  if test "x$ac_system" = "xLinux" \
 -      && test "x$have_net_ip_vs_h$have_ip_vs_h" = "xnono"
 +      && test "x$have_linux_ip_vs_h$have_net_ip_vs_h$have_ip_vs_h" = "xnonono"
  then
        enable_ipvs="$enable_ipvs (ip_vs.h not found)"
  fi
  
 +if test "x$ip_vs_h_needs_kernel_cflags" = "xyes"
 +then
 +      enable_ipvs="$enable_ipvs (needs $KERNEL_CFLAGS)"
 +fi
 +
  dnl Perl bindings
  AC_ARG_WITH(perl-bindings, [AS_HELP_STRING([--with-perl-bindings@<:@=OPTIONS@:>@], [Options passed to "perl Makefile.PL".])],
  [
@@@ -5102,9 -4761,9 +5102,9 @@@ AC_SUBST(LCC_VERSION_PATCH
  AC_SUBST(LCC_VERSION_EXTRA)
  AC_SUBST(LCC_VERSION_STRING)
  
- AC_CONFIG_FILES(src/libcollectdclient/lcc_features.h)
+ AC_CONFIG_FILES(src/libcollectdclient/collectd/lcc_features.h)
  
 -AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/owniptc/Makefile src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile bindings/Makefile bindings/java/Makefile)
 +AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile bindings/Makefile bindings/java/Makefile)
  
  if test "x$with_librrd" = "xyes" \
        && test "x$librrd_threadsafe" != "xyes"
@@@ -5112,6 -4771,11 +5112,6 @@@ the
        with_librrd="yes (warning: librrd is not thread-safe)"
  fi
  
 -if test "x$with_libiptc" = "xyes" && test "x$with_own_libiptc" = "xyes"
 -then
 -      with_libiptc="yes (shipped version)"
 -fi
 -
  if test "x$with_libperl" = "xyes"
  then
        with_libperl="yes (version `$perl_interpreter -MConfig -e 'print $Config{version};'`)"
@@@ -5185,7 -4849,6 +5185,7 @@@ Configuration
      perl  . . . . . . . . $with_perl_bindings
  
    Modules:
 +    aggregation . . . . . $enable_aggregation
      amqp    . . . . . . . $enable_amqp
      apache  . . . . . . . $enable_apache
      apcups  . . . . . . . $enable_apcups
      dns . . . . . . . . . $enable_dns
      email . . . . . . . . $enable_email
      entropy . . . . . . . $enable_entropy
 +    ethstat . . . . . . . $enable_ethstat
      exec  . . . . . . . . $enable_exec
      filecount . . . . . . $enable_filecount
      fscache . . . . . . . $enable_fscache
      match_timediff  . . . $enable_match_timediff
      match_value . . . . . $enable_match_value
      mbmon . . . . . . . . $enable_mbmon
 +    md  . . . . . . . . . $enable_md
      memcachec . . . . . . $enable_memcachec
      memcached . . . . . . $enable_memcached
      memory  . . . . . . . $enable_memory
      notify_desktop  . . . $enable_notify_desktop
      notify_email  . . . . $enable_notify_email
      ntpd  . . . . . . . . $enable_ntpd
 +    numa  . . . . . . . . $enable_numa
      nut . . . . . . . . . $enable_nut
      olsrd . . . . . . . . $enable_olsrd
      onewire . . . . . . . $enable_onewire
      teamspeak2  . . . . . $enable_teamspeak2
      ted . . . . . . . . . $enable_ted
      thermal . . . . . . . $enable_thermal
 +    threshold . . . . . . $enable_threshold
      tokyotyrant . . . . . $enable_tokyotyrant
      unixsock  . . . . . . $enable_unixsock
      uptime  . . . . . . . $enable_uptime
      vmem  . . . . . . . . $enable_vmem
      vserver . . . . . . . $enable_vserver
      wireless  . . . . . . $enable_wireless
 +    write_graphite  . . . $enable_write_graphite
      write_http  . . . . . $enable_write_http
      write_redis . . . . . $enable_write_redis
 +    write_mongodb . . . . $enable_write_mongodb
      xmms  . . . . . . . . $enable_xmms
      zfs_arc . . . . . . . $enable_zfs_arc
  
diff --combined src/Makefile.am
@@@ -1,4 -1,7 +1,4 @@@
  SUBDIRS = libcollectdclient
 -if BUILD_WITH_OWN_LIBIPTC
 -SUBDIRS += owniptc
 -endif
  if BUILD_WITH_OWN_LIBOCONFIG
  SUBDIRS += liboconfig
  endif
@@@ -18,7 -21,7 +18,7 @@@ AM_CPPFLAGS += -DPLUGINDIR='"${pkglibdi
  AM_CPPFLAGS += -DPKGDATADIR='"${pkgdatadir}"'
  
  sbin_PROGRAMS = collectd collectdmon
- bin_PROGRAMS = collectd-nagios collectdctl
+ bin_PROGRAMS = collectd-nagios collectdctl collectd-tg
  
  collectd_SOURCES = collectd.c collectd.h \
                   common.c common.h \
                   utils_match.c utils_match.h \
                   utils_subst.c utils_subst.h \
                   utils_tail.c utils_tail.h \
 -                 utils_threshold.c utils_threshold.h \
 +                 utils_time.c utils_time.h \
                   types_list.c types_list.h
  
  collectd_CPPFLAGS =  $(AM_CPPFLAGS) $(LTDLINCL)
  collectd_CFLAGS = $(AM_CFLAGS)
  collectd_LDFLAGS = -export-dynamic
 -collectd_LDADD =
 +collectd_LDADD = -lm
  collectd_DEPENDENCIES =
  
  # Link to these libraries..
@@@ -70,6 -73,7 +70,6 @@@ collectd_LDADD += -ldevinf
  endif
  if BUILD_AIX
  collectd_LDFLAGS += -Wl,-bexpall,-brtllib
 -collectd_LDADD += -lm
  endif
  
  # The daemon needs to call sg_init, so we need to link it against libstatgrab,
@@@ -81,7 -85,7 +81,7 @@@ endi
  
  if BUILD_WITH_OWN_LIBOCONFIG
  collectd_LDADD += $(LIBLTDL) liboconfig/liboconfig.la
 -collectd_DEPENDENCIES += $(LIBLTDL) liboconfig/liboconfig.la
 +collectd_DEPENDENCIES += liboconfig/liboconfig.la
  else
  collectd_LDADD += -loconfig
  endif
@@@ -113,27 -117,28 +113,39 @@@ endi
  collectdctl_LDADD += libcollectdclient/libcollectdclient.la
  collectdctl_DEPENDENCIES = libcollectdclient/libcollectdclient.la
  
+ collectd_tg_SOURCES = collectd-tg.c \
+                     utils_heap.c utils_heap.h
+ collectd_tg_LDADD =
+ if BUILD_WITH_LIBSOCKET
+ collectd_tg_LDADD += -lsocket
+ endif
+ if BUILD_AIX
+ collectd_tg_LDADD += -lm
+ endif
+ collectd_tg_LDADD += libcollectdclient/libcollectdclient.la
+ collectd_tg_DEPENDENCIES = libcollectdclient/libcollectdclient.la
  
  pkglib_LTLIBRARIES = 
  
  BUILT_SOURCES = 
  CLEANFILES = 
  
 +if BUILD_PLUGIN_AGGREGATION
 +pkglib_LTLIBRARIES += aggregation.la
 +aggregation_la_SOURCES = aggregation.c \
 +                         utils_vl_lookup.c utils_vl_lookup.h
 +aggregation_la_LDFLAGS = -module -avoid-version
 +aggregation_la_LIBADD =
 +collectd_LDADD += "-dlopen" aggregation.la
 +collectd_DEPENDENCIES += aggregation.la
 +endif
 +
  if BUILD_PLUGIN_AMQP
  pkglib_LTLIBRARIES += amqp.la
  amqp_la_SOURCES = amqp.c \
                  utils_cmd_putval.c utils_cmd_putval.h \
 +                utils_format_graphite.c utils_format_graphite.h \
                  utils_format_json.c utils_format_json.h
  amqp_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
  amqp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
@@@ -223,10 -228,6 +235,10 @@@ if BUILD_PLUGIN_CONTEXTSWITC
  pkglib_LTLIBRARIES += contextswitch.la
  contextswitch_la_SOURCES = contextswitch.c
  contextswitch_la_LDFLAGS = -module -avoid-version
 +contextswitch_la_LIBADD =
 +if BUILD_WITH_PERFSTAT
 +contextswitch_la_LIBADD += -lperfstat
 +endif
  collectd_LDADD += "-dlopen" contextswitch.la
  collectd_DEPENDENCIES += contextswitch.la
  endif
@@@ -392,14 -393,6 +404,14 @@@ collectd_LDADD += "-dlopen" exec.l
  collectd_DEPENDENCIES += exec.la
  endif
  
 +if BUILD_PLUGIN_ETHSTAT
 +pkglib_LTLIBRARIES += ethstat.la
 +ethstat_la_SOURCES = ethstat.c
 +ethstat_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" ethstat.la
 +collectd_DEPENDENCIES += ethstat.la
 +endif
 +
  if BUILD_PLUGIN_FILECOUNT
  pkglib_LTLIBRARIES += filecount.la
  filecount_la_SOURCES = filecount.c
@@@ -459,7 -452,12 +471,7 @@@ pkglib_LTLIBRARIES += iptables.l
  iptables_la_SOURCES = iptables.c
  iptables_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBIPTC_CPPFLAGS)
  iptables_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBIPTC_LDFLAGS)
 -if BUILD_WITH_OWN_LIBIPTC
 -iptables_la_LIBADD  = owniptc/libiptc.la
 -iptables_la_DEPENDENCIES = owniptc/libiptc.la
 -else
  iptables_la_LIBADD = -liptc
 -endif
  collectd_LDADD += "-dlopen" iptables.la
  collectd_DEPENDENCIES += iptables.la
  endif
@@@ -477,9 -475,7 +489,9 @@@ endi
  if BUILD_PLUGIN_IPVS
  pkglib_LTLIBRARIES += ipvs.la
  ipvs_la_SOURCES = ipvs.c
 +if IP_VS_H_NEEDS_KERNEL_CFLAGS
  ipvs_la_CFLAGS = $(AM_CFLAGS) $(KERNEL_CFLAGS)
 +endif
  ipvs_la_LDFLAGS = -module -avoid-version
  collectd_LDADD += "-dlopen" ipvs.la
  collectd_DEPENDENCIES += ipvs.la
@@@ -609,14 -605,6 +621,14 @@@ collectd_LDADD += "-dlopen" mbmon.l
  collectd_DEPENDENCIES += mbmon.la
  endif
  
 +if BUILD_PLUGIN_MD
 +pkglib_LTLIBRARIES += md.la
 +md_la_SOURCES = md.c
 +md_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" md.la
 +collectd_DEPENDENCIES += md.la
 +endif
 +
  if BUILD_PLUGIN_MEMCACHEC
  pkglib_LTLIBRARIES += memcachec.la
  memcachec_la_SOURCES = memcachec.c
@@@ -794,14 -782,6 +806,14 @@@ collectd_LDADD += "-dlopen" ntpd.l
  collectd_DEPENDENCIES += ntpd.la
  endif
  
 +if BUILD_PLUGIN_NUMA
 +pkglib_LTLIBRARIES += numa.la
 +numa_la_SOURCES = numa.c
 +numa_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" numa.la
 +collectd_DEPENDENCIES += numa.la
 +endif
 +
  if BUILD_PLUGIN_NUT
  pkglib_LTLIBRARIES += nut.la
  nut_la_SOURCES = nut.c
@@@ -1162,14 -1142,6 +1174,14 @@@ collectd_LDADD += "-dlopen" thermal.l
  collectd_DEPENDENCIES += thermal.la
  endif
  
 +if BUILD_PLUGIN_THRESHOLD
 +pkglib_LTLIBRARIES += threshold.la
 +threshold_la_SOURCES = threshold.c
 +threshold_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" threshold.la
 +collectd_DEPENDENCIES += threshold.la
 +endif
 +
  if BUILD_PLUGIN_TOKYOTYRANT
  pkglib_LTLIBRARIES += tokyotyrant.la
  tokyotyrant_la_SOURCES = tokyotyrant.c
@@@ -1188,6 -1160,7 +1200,6 @@@ pkglib_LTLIBRARIES += unixsock.l
  unixsock_la_SOURCES = unixsock.c \
                      utils_cmd_flush.h utils_cmd_flush.c \
                      utils_cmd_getval.h utils_cmd_getval.c \
 -                    utils_cmd_getthreshold.h utils_cmd_getthreshold.c \
                      utils_cmd_listval.h utils_cmd_listval.c \
                      utils_cmd_putval.h utils_cmd_putval.c \
                      utils_cmd_putnotif.h utils_cmd_putnotif.c
@@@ -1206,9 -1179,6 +1218,9 @@@ uptime_la_LIBADD 
  if BUILD_WITH_LIBKSTAT
  uptime_la_LIBADD += -lkstat
  endif
 +if BUILD_WITH_PERFSTAT
 +uptime_la_LIBADD += -lperfstat
 +endif
  collectd_LDADD += "-dlopen" uptime.la
  collectd_DEPENDENCIES += uptime.la
  endif
@@@ -1271,16 -1241,6 +1283,16 @@@ collectd_LDADD += "-dlopen" wireless.l
  collectd_DEPENDENCIES += wireless.la
  endif
  
 +if BUILD_PLUGIN_WRITE_GRAPHITE
 +pkglib_LTLIBRARIES += write_graphite.la
 +write_graphite_la_SOURCES = write_graphite.c \
 +                        utils_format_graphite.c utils_format_graphite.h \
 +                        utils_format_json.c utils_format_json.h
 +write_graphite_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" write_graphite.la
 +collectd_DEPENDENCIES += write_graphite.la
 +endif
 +
  if BUILD_PLUGIN_WRITE_HTTP
  pkglib_LTLIBRARIES += write_http.la
  write_http_la_SOURCES = write_http.c \
@@@ -1296,16 -1256,6 +1308,16 @@@ endi
  collectd_DEPENDENCIES += write_http.la
  endif
  
 +if BUILD_PLUGIN_WRITE_MONGODB
 +pkglib_LTLIBRARIES += write_mongodb.la
 +write_mongodb_la_SOURCES = write_mongodb.c
 +write_mongodb_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMONGOC_CPPFLAGS)
 +write_mongodb_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBMONGOC_LDFLAGS)
 +write_mongodb_la_LIBADD = -lmongoc
 +collectd_LDADD += "-dlopen" write_mongodb.la
 +collectd_DEPENDENCIES += write_mongodb.la
 +endif
 +
  if BUILD_PLUGIN_WRITE_REDIS
  pkglib_LTLIBRARIES += write_redis.la
  write_redis_la_SOURCES = write_redis.c
@@@ -1336,8 -1286,6 +1348,8 @@@ collectd_LDADD += "-dlopen" zfs_arc.l
  collectd_DEPENDENCIES += zfs_arc.la
  endif
  
 +BUILT_SOURCES += $(dist_man_MANS)
 +
  dist_man_MANS = collectd.1 \
                collectd.conf.5 \
                collectd-email.5 \
                collectd-perl.5 \
                collectd-python.5 \
                collectd-snmp.5 \
 +              collectd-threshold.5 \
                collectd-unixsock.5 \
                types.db.5
  
@@@ -1368,7 -1315,6 +1380,7 @@@ EXTRA_DIST +=   collectd.conf.pod 
                collectd-python.pod \
                collectd.pod \
                collectd-snmp.pod \
 +              collectd-threshold.pod \
                collectd-unixsock.pod \
                postgresql_default.conf \
                types.db.pod
        fi
  
  pinba.pb-c.c pinba.pb-c.h: pinba.proto
 -      protoc-c --c_out $(builddir) pinba.proto
 +      protoc-c --c_out . pinba.proto
  
  install-exec-hook:
        $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
        $(INSTALL) -m 0644 $(srcdir)/types.db $(DESTDIR)$(pkgdatadir)/types.db;
        $(INSTALL) -m 0644 $(srcdir)/postgresql_default.conf \
                $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
 +
 +uninstall-hook:
 +      rm -f $(DESTDIR)$(pkgdatadir)/types.db;
 +      rm -f $(DESTDIR)$(sysconfdir)/collectd.conf
 +      rm -f $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
 +
 +if BUILD_FEATURE_DEBUG
 +bin_PROGRAMS += utils_vl_lookup_test
 +utils_vl_lookup_test_SOURCES = utils_vl_lookup_test.c \
 +                               utils_vl_lookup.h utils_vl_lookup.c \
 +                               utils_avltree.c utils_avltree.h \
 +                               common.h
 +
 +utils_vl_lookup_test_CPPFLAGS =  $(AM_CPPFLAGS) $(LTDLINCL) -DBUILD_TEST=1
 +utils_vl_lookup_test_CFLAGS = $(AM_CFLAGS)
 +utils_vl_lookup_test_LDFLAGS = -export-dynamic
 +utils_vl_lookup_test_LDADD =
 +endif
diff --combined src/collectd-nagios.c
  # include "config.h"
  #endif
  
 -#ifndef _ISOC99_SOURCE
 -# define _ISOC99_SOURCE
 -#endif
 -
 -#ifndef _POSIX_C_SOURCE
 -# define _POSIX_C_SOURCE 200112L
 -#endif
 -
 -#ifndef _XOPEN_SOURCE
 -# define _XOPEN_SOURCE 600
 -#endif
 -
  #if !defined(__GNUC__) || !__GNUC__
  # define __attribute__(x) /**/
  #endif
  #include <string.h>
  #include <strings.h>
  #include <assert.h>
 -#include <math.h>
 +
 +#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) */
 +# ifndef isfinite
 +#  define isfinite(f) (((f) - (f)) == 0.0)
 +# endif
 +# ifndef isinf
 +#  define isinf(f) (!isfinite(f) && !isnan(f))
 +# endif
 +#endif /* NAN_ZERO_ZERO */
  
- #include "libcollectdclient/client.h"
+ #include "libcollectdclient/collectd/client.h"
  
  #define RET_OKAY     0
  #define RET_WARNING  1
@@@ -269,67 -251,6 +269,67 @@@ static void usage (const char *name
        exit (1);
  } /* void usage */
  
 +static int do_listval (lcc_connection_t *connection)
 +{
 +      lcc_identifier_t *ret_ident = NULL;
 +      size_t ret_ident_num = 0;
 +
 +      char *hostname = NULL;
 +
 +      int status;
 +      size_t i;
 +
 +      status = lcc_listval (connection, &ret_ident, &ret_ident_num);
 +      if (status != 0) {
 +              printf ("UNKNOWN: %s\n", lcc_strerror (connection));
 +              if (ret_ident != NULL)
 +                      free (ret_ident);
 +              return (RET_UNKNOWN);
 +      }
 +
 +      status = lcc_sort_identifiers (connection, ret_ident, ret_ident_num);
 +      if (status != 0) {
 +              printf ("UNKNOWN: %s\n", lcc_strerror (connection));
 +              if (ret_ident != NULL)
 +                      free (ret_ident);
 +              return (RET_UNKNOWN);
 +      }
 +
 +      for (i = 0; i < ret_ident_num; ++i) {
 +              char id[1024];
 +
 +              if ((hostname_g != NULL) && (strcasecmp (hostname_g, ret_ident[i].host)))
 +                      continue;
 +
 +              if ((hostname == NULL) || strcasecmp (hostname, ret_ident[i].host))
 +              {
 +                      if (hostname != NULL)
 +                              free (hostname);
 +                      hostname = strdup (ret_ident[i].host);
 +                      printf ("Host: %s\n", hostname);
 +              }
 +
 +              /* empty hostname; not to be printed again */
 +              ret_ident[i].host[0] = '\0';
 +
 +              status = lcc_identifier_to_string (connection,
 +                              id, sizeof (id), ret_ident + i);
 +              if (status != 0) {
 +                      printf ("ERROR: listval: Failed to convert returned "
 +                                      "identifier to a string: %s\n",
 +                                      lcc_strerror (connection));
 +                      continue;
 +              }
 +
 +              /* skip over the (empty) hostname and following '/' */
 +              printf ("\t%s\n", id + 1);
 +      }
 +
 +      if (ret_ident != NULL)
 +              free (ret_ident);
 +      return (RET_OKAY);
 +} /* int do_listval */
 +
  static int do_check_con_none (size_t values_num,
                double *values, char **values_names)
  {
@@@ -569,20 -490,34 +569,20 @@@ static int do_check_con_percentage (siz
        return (status_code);
  } /* int do_check_con_percentage */
  
 -static int do_check (void)
 +static int do_check (lcc_connection_t *connection)
  {
 -      lcc_connection_t *connection;
        gauge_t *values;
        char   **values_names;
        size_t   values_num;
 -      char address[1024];
        char ident_str[1024];
        lcc_identifier_t ident;
        size_t i;
        int status;
  
 -      snprintf (address, sizeof (address), "unix:%s", socket_file_g);
 -      address[sizeof (address) - 1] = 0;
 -
        snprintf (ident_str, sizeof (ident_str), "%s/%s",
                        hostname_g, value_string_g);
        ident_str[sizeof (ident_str) - 1] = 0;
  
 -      connection = NULL;
 -      status = lcc_connect (address, &connection);
 -      if (status != 0)
 -      {
 -              printf ("ERROR: Connecting to daemon at %s failed.\n",
 -                              socket_file_g);
 -              return (RET_CRITICAL);
 -      }
 -
        memset (&ident, 0, sizeof (ident));
        status = lcc_string_to_identifier (connection, &ident, ident_str);
        if (status != 0)
  
  int main (int argc, char **argv)
  {
 +      char address[1024];
 +      lcc_connection_t *connection;
 +
 +      int status;
 +
        range_critical_g.min = NAN;
        range_critical_g.max = NAN;
        range_critical_g.invert = 0;
        }
  
        if ((socket_file_g == NULL) || (value_string_g == NULL)
 -                      || (hostname_g == NULL))
 +                      || ((hostname_g == NULL) && (strcasecmp (value_string_g, "LIST"))))
        {
                fprintf (stderr, "Missing required arguments.\n");
                usage (argv[0]);
        }
  
 -      return (do_check ());
 +      snprintf (address, sizeof (address), "unix:%s", socket_file_g);
 +      address[sizeof (address) - 1] = 0;
 +
 +      connection = NULL;
 +      status = lcc_connect (address, &connection);
 +      if (status != 0)
 +      {
 +              printf ("ERROR: Connecting to daemon at %s failed.\n",
 +                              socket_file_g);
 +              return (RET_CRITICAL);
 +      }
 +
 +      if (0 == strcasecmp (value_string_g, "LIST"))
 +              return (do_listval (connection));
 +
 +      return (do_check (connection));
  } /* int main */
diff --combined src/collectdctl.c
  # include "config.h"
  #endif
  
 -#ifndef _ISOC99_SOURCE
 -# define _ISOC99_SOURCE
 -#endif
 -
 -#ifndef _POSIX_C_SOURCE
 -# define _POSIX_C_SOURCE 200112L
 -#endif
 -
 -#ifndef _XOPEN_SOURCE
 -# define _XOPEN_SOURCE 600
 -#endif
 -
  #include <stdlib.h>
  #include <unistd.h>
  #include <stdio.h>
  
  #include <assert.h>
  #include <errno.h>
 -#include <math.h>
  
 -#include "libcollectdclient/collectd/client.h"
 +#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) */
 +# ifndef isfinite
 +#  define isfinite(f) (((f) - (f)) == 0.0)
 +# endif
 +# ifndef isinf
 +#  define isinf(f) (!isfinite(f) && !isnan(f))
 +# endif
 +#endif /* NAN_ZERO_ZERO */
  
- #include "libcollectdclient/client.h"
++#include "libcollectdclient/collectd/client.h"
  
  #define DEFAULT_SOCK LOCALSTATEDIR"/run/"PACKAGE_NAME"-unixsock"
  
@@@ -485,7 -468,7 +485,7 @@@ static int putval (lcc_connection_t *c
        while (value != 0) {
          char *dot, *endptr;
  
 -        tmp = strchr (argv[i], (int)':');
 +        tmp = strchr (value, (int)':');
  
          if (tmp != NULL) {
            *tmp = '\0';
@@@ -27,7 -27,7 +27,7 @@@
  # define __attribute__(x) /**/
  #endif
  
- #include "lcc_features.h"
+ #include "collectd/lcc_features.h"
  
  #include <stdlib.h>
  #include <stdio.h>
@@@ -41,7 -41,7 +41,7 @@@
  #include <math.h>
  #include <netdb.h>
  
- #include "client.h"
+ #include "collectd/client.h"
  
  /* NI_MAXHOST has been obsoleted by RFC 3493 which is a reason for SunOS 5.11
   * to no longer define it. We'll use the old, RFC 2553 value here. */
@@@ -164,14 -164,27 +164,14 @@@ static int lcc_set_errno (lcc_connectio
    return (0);
  } /* }}} int lcc_set_errno */
  
 -/* lcc_strdup: Since `strdup' is an XSI extension, we provide our own version
 - * here. */
 -__attribute__((malloc, nonnull (1)))
 -static char *lcc_strdup (const char *str) /* {{{ */
 -{
 -  size_t strsize;
 -  char *ret;
 -
 -  strsize = strlen (str) + 1;
 -  ret = (char *) malloc (strsize);
 -  if (ret != NULL)
 -    memcpy (ret, str, strsize);
 -  return (ret);
 -} /* }}} char *lcc_strdup */
 -
 -__attribute__((nonnull (1, 2)))
  static char *lcc_strescape (char *dest, const char *src, size_t dest_size) /* {{{ */
  {
    size_t dest_pos;
    size_t src_pos;
  
 +  if ((dest == NULL) || (src == NULL))
 +    return (NULL);
 +
    dest_pos = 0;
    src_pos = 0;
  
@@@ -228,53 -241,6 +228,6 @@@ static void lcc_chomp (char *str) /* {{
    }
  } /* }}} void lcc_chomp */
  
- static int lcc_identifier_cmp (const void *a, const void *b)
- {
-   const lcc_identifier_t *ident_a, *ident_b;
-   int status;
-   ident_a = a;
-   ident_b = b;
-   status = strcasecmp (ident_a->host, ident_b->host);
-   if (status != 0)
-     return (status);
-   status = strcmp (ident_a->plugin, ident_b->plugin);
-   if (status != 0)
-     return (status);
-   if ((*ident_a->plugin_instance != '\0') || (*ident_b->plugin_instance != '\0'))
-   {
-     if (*ident_a->plugin_instance == '\0')
-       return (-1);
-     else if (*ident_b->plugin_instance == '\0')
-       return (1);
-     status = strcmp (ident_a->plugin_instance, ident_b->plugin_instance);
-     if (status != 0)
-       return (status);
-   }
-   status = strcmp (ident_a->type, ident_b->type);
-   if (status != 0)
-     return (status);
-   if ((*ident_a->type_instance != '\0') || (*ident_b->type_instance != '\0'))
-   {
-     if (*ident_a->type_instance == '\0')
-       return (-1);
-     else if (*ident_b->type_instance == '\0')
-       return (1);
-     status = strcmp (ident_a->type_instance, ident_b->type_instance);
-     if (status != 0)
-       return (status);
-   }
-   return (0);
- } /* }}} int lcc_identifier_cmp */
  static void lcc_response_free (lcc_response_t *res) /* {{{ */
  {
    size_t i;
@@@ -372,7 -338,7 +325,7 @@@ static int lcc_receive (lcc_connection_
      lcc_chomp (buffer);
      LCC_DEBUG ("receive: <-- %s\n", buffer);
  
 -    res.lines[i] = lcc_strdup (buffer);
 +    res.lines[i] = strdup (buffer);
      if (res.lines[i] == NULL)
      {
        lcc_set_errno (c, ENOMEM);
@@@ -767,7 -733,7 +720,7 @@@ int lcc_getval (lcc_connection_t *c, lc
  
      if (values_names != NULL)
      {
 -      values_names[i] = lcc_strdup (key);
 +      values_names[i] = strdup (key);
        if (values_names[i] == NULL)
          BAIL_OUT (ENOMEM);
      }
    if (ret_values_names != NULL)
      *ret_values_names = values_names;
  
 +  lcc_response_free (&res);
 +
    return (0);
  } /* }}} int lcc_getval */
  
@@@ -1049,7 -1013,7 +1002,7 @@@ int lcc_string_to_identifier (lcc_conne
    char *type;
    char *type_instance;
  
 -  string_copy = lcc_strdup (string);
 +  string_copy = strdup (string);
    if (string_copy == NULL)
    {
      lcc_set_errno (c, ENOMEM);
    return (0);
  } /* }}} int lcc_string_to_identifier */
  
-   qsort (idents, idents_num, sizeof (*idents), lcc_identifier_cmp);
+ int lcc_identifier_compare (const lcc_identifier_t *i0, /* {{{ */
+     const lcc_identifier_t *i1)
+ {
+   int status;
+   if ((i0 == NULL) && (i1 == NULL))
+     return (0);
+   else if (i0 == NULL)
+     return (-1);
+   else if (i1 == NULL)
+     return (1);
+ #define CMP_FIELD(f) do {         \
+   status = strcmp (i0->f, i1->f); \
+   if (status != 0)                \
+     return (status);              \
+ } while (0);
+     CMP_FIELD (host);
+     CMP_FIELD (plugin);
+     CMP_FIELD (plugin_instance);
+     CMP_FIELD (type);
+     CMP_FIELD (type_instance);
+ #undef CMP_FIELD
+     return (0);
+ } /* }}} int lcc_identifier_compare */
 +int lcc_sort_identifiers (lcc_connection_t *c, /* {{{ */
 +    lcc_identifier_t *idents, size_t idents_num)
 +{
 +  if (idents == NULL)
 +  {
 +    lcc_set_errno (c, EINVAL);
 +    return (-1);
 +  }
 +
++  qsort (idents, idents_num, sizeof (*idents),
++      (void *) lcc_identifier_compare);
 +  return (0);
 +} /* }}} int lcc_sort_identifiers */
 +
  /* vim: set sw=2 sts=2 et fdm=marker : */
index 0000000,1494c8d..b2354ff
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,128 +1,130 @@@
+ /**
+  * libcollectdclient - src/libcollectdclient/client.h
+  * Copyright (C) 2008  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
+  * Free Software Foundation; only version 2 of the License is applicable.
+  *
+  * This program is distributed in the hope that it will be useful, but
+  * WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License along
+  * with this program; if not, write to the Free Software Foundation, Inc.,
+  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+  *
+  * Authors:
+  *   Florian octo Forster <octo at verplant.org>
+  **/
+ #ifndef LIBCOLLECTD_COLLECTDCLIENT_H
+ #define LIBCOLLECTD_COLLECTDCLIENT_H 1
+ #include "lcc_features.h"
+ /*
+  * Includes (for data types)
+  */
+ #if HAVE_STDINT_H
+ # include <stdint.h>
+ #endif
+ #include <inttypes.h>
+ #include <time.h>
+ /*
+  * Defines
+  */
+ #define LCC_NAME_LEN 64
+ #define LCC_DEFAULT_PORT "25826"
+ /*
+  * Types
+  */
+ #define LCC_TYPE_COUNTER 0
+ #define LCC_TYPE_GAUGE   1
+ #define LCC_TYPE_DERIVE   2
+ #define LCC_TYPE_ABSOLUTE   3
+ LCC_BEGIN_DECLS
+ typedef uint64_t counter_t;
+ typedef double gauge_t;
+ typedef uint64_t derive_t;
+ typedef uint64_t absolute_t;
+ union value_u
+ {
+   counter_t counter;
+   gauge_t   gauge;
+   derive_t  derive;
+   absolute_t absolute;
+ };
+ typedef union value_u value_t;
+ struct lcc_identifier_s
+ {
+   char host[LCC_NAME_LEN];
+   char plugin[LCC_NAME_LEN];
+   char plugin_instance[LCC_NAME_LEN];
+   char type[LCC_NAME_LEN];
+   char type_instance[LCC_NAME_LEN];
+ };
+ typedef struct lcc_identifier_s lcc_identifier_t;
+ #define LCC_IDENTIFIER_INIT { "localhost", "", "", "", "" }
+ struct lcc_value_list_s
+ {
+   value_t *values;
+   int     *values_types;
+   size_t   values_len;
+   time_t   time;
+   int      interval;
+   lcc_identifier_t identifier;
+ };
+ typedef struct lcc_value_list_s lcc_value_list_t;
+ #define LCC_VALUE_LIST_INIT { NULL, NULL, 0, 0, 0, LCC_IDENTIFIER_INIT }
+ struct lcc_connection_s;
+ typedef struct lcc_connection_s lcc_connection_t;
+ /*
+  * Functions
+  */
+ int lcc_connect (const char *address, lcc_connection_t **ret_con);
+ int lcc_disconnect (lcc_connection_t *c);
+ #define LCC_DESTROY(c) do { lcc_disconnect (c); (c) = NULL; } while (0)
+ int lcc_getval (lcc_connection_t *c, lcc_identifier_t *ident,
+     size_t *ret_values_num, gauge_t **ret_values, char ***ret_values_names);
+ int lcc_putval (lcc_connection_t *c, const lcc_value_list_t *vl);
+ int lcc_flush (lcc_connection_t *c, const char *plugin,
+     lcc_identifier_t *ident, int timeout);
+ int lcc_listval (lcc_connection_t *c,
+     lcc_identifier_t **ret_ident, size_t *ret_ident_num);
+ /* TODO: putnotif */
+ const char *lcc_strerror (lcc_connection_t *c);
+ int lcc_identifier_to_string (lcc_connection_t *c,
+     char *string, size_t string_size, const lcc_identifier_t *ident);
+ int lcc_string_to_identifier (lcc_connection_t *c,
+     lcc_identifier_t *ident, const char *string);
+ /* Compares the identifiers "i0" and "i1" and returns less than zero or greater
+  * than zero if "i0" is smaller than or greater than "i1", respectively. If
+  * "i0" and "i1" are identical, zero is returned. */
+ int lcc_identifier_compare (const lcc_identifier_t *i0,
+     const lcc_identifier_t *i1);
++int lcc_sort_identifiers (lcc_connection_t *c,
++    lcc_identifier_t *idents, size_t idents_num);
+ LCC_END_DECLS
+ /* vim: set sw=2 sts=2 et : */
+ #endif /* LIBCOLLECTD_COLLECTDCLIENT_H */