Code

Merge branch 'collectd-4.5' into collectd-4.6
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 11 Apr 2009 07:34:32 +0000 (09:34 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 11 Apr 2009 07:34:32 +0000 (09:34 +0200)
1  2 
configure.in
src/collectd.h
src/exec.c
src/network.c
src/plugin.c

diff --combined configure.in
index 3514572e5b59e21ec50912319d8db7ae3d9d0093,954d967cb536a15481eebaad986049a0ea23962e..2344cdb57e65b8bb09970a873f754a096bfb2ae5
@@@ -70,10 -70,6 +70,10 @@@ the
        CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
  fi
  
 +# Where to install .pc files.
 +pkgconfigdir="${libdir}/pkgconfig"
 +AC_SUBST(pkgconfigdir)
 +
  #
  # Checks for header files.
  #
@@@ -404,7 -400,7 +404,7 @@@ AC_HEADER_TIM
  # Checks for library functions.
  #
  AC_PROG_GCC_TRADITIONAL
 -AC_CHECK_FUNCS(gettimeofday select strdup strtol getaddrinfo getnameinfo strchr memcpy strstr strcmp strncmp strncpy strlen strncasecmp strcasecmp openlog closelog)
 +AC_CHECK_FUNCS(gettimeofday select strdup strtol getaddrinfo getnameinfo strchr memcpy strstr strcmp strncmp strncpy strlen strncasecmp strcasecmp openlog closelog sysconf)
  
  AC_FUNC_STRERROR_R
  
@@@ -480,7 -476,6 +480,7 @@@ nanosleep_needs_rt="no
  AC_CHECK_FUNCS(nanosleep, [], AC_CHECK_LIB(rt, nanosleep, [nanosleep_needs_rt="yes"], AC_MSG_ERROR(cannot find nanosleep)))
  AM_CONDITIONAL(BUILD_WITH_LIBRT, test "x$nanosleep_needs_rt" = "xyes")
  
 +AC_CHECK_FUNCS(sysctl, [have_sysctl="yes"], [have_sysctl="no"])
  AC_CHECK_FUNCS(sysctlbyname, [have_sysctlbyname="yes"], [have_sysctlbyname="no"])
  AC_CHECK_FUNCS(host_statistics, [have_host_statistics="yes"], [have_host_statistics="no"])
  AC_CHECK_FUNCS(processor_info, [have_processor_info="yes"], [have_processor_info="no"])
@@@ -491,7 -486,6 +491,7 @@@ AC_CHECK_FUNCS(getifaddrs, [have_getifa
  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"])
 +AC_CHECK_FUNCS(swapctl, [have_swapctl="yes"], [have_swapctl="no"])
  
  # For load module
  AC_CHECK_FUNCS(getloadavg, [have_getloadavg="yes"], [have_getloadavg="no"])
@@@ -627,13 -621,8 +627,13 @@@ if test "x$fp_layout_type" = "xunknown"
        [[[[
  #include <stdlib.h>
  #include <stdio.h>
 -#include <stdint.h>
  #include <string.h>
 +#if HAVE_STDINT_H
 +# include <stdint.h>
 +#endif
 +#if HAVE_STDBOOL_H
 +# include <stdbool.h>
 +#endif
        ]]]],
        [[[[
        uint64_t i0;
@@@ -671,13 -660,8 +671,13 @@@ if test "x$fp_layout_type" = "xunknown"
        [[[[
  #include <stdlib.h>
  #include <stdio.h>
 -#include <stdint.h>
  #include <string.h>
 +#if HAVE_STDINT_H
 +# include <stdint.h>
 +#endif
 +#if HAVE_STDBOOL_H
 +# include <stdbool.h>
 +#endif
  #define endianflip(A) ((((uint64_t)(A) & 0xff00000000000000LL) >> 56) | \
                         (((uint64_t)(A) & 0x00ff000000000000LL) >> 40) | \
                         (((uint64_t)(A) & 0x0000ff0000000000LL) >> 24) | \
@@@ -723,13 -707,8 +723,13 @@@ if test "x$fp_layout_type" = "xunknown"
        [[[[
  #include <stdlib.h>
  #include <stdio.h>
 -#include <stdint.h>
  #include <string.h>
 +#if HAVE_STDINT_H
 +# include <stdint.h>
 +#endif
 +#if HAVE_STDBOOL_H
 +# include <stdbool.h>
 +#endif
  #define intswap(A)    ((((uint64_t)(A) & 0xffffffff00000000LL) >> 32) | \
                         (((uint64_t)(A) & 0x00000000ffffffffLL) << 32))
        ]]]],
  m4_divert_once([HELP_WITH], [
  collectd additional packages:])
  
 -# AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])
 -librrd_cflags=""
 -librrd_ldflags=""
 -librrd_threadsafe="yes"
 -AC_ARG_WITH(rrdtool, [AS_HELP_STRING([--with-rrdtool@<:@=PREFIX@:>@], [Path to rrdtool.])],
 -[     if test "x$withval" != "xno" && test "x$withval" != "xyes"
 -      then
 -              librrd_cflags="-I$withval/include"
 -              librrd_ldflags="-L$withval/lib"
 -              with_rrdtool="yes"
 -      else
 -              with_rrdtool="$withval"
 -      fi
 -], [with_rrdtool="yes"])
 -if test "x$with_rrdtool" = "xyes"
 -then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_LDFLAGS="$LDFLAGS"
 -
 -      CPPFLAGS="$CPPFLAGS $librrd_cflags"
 -      LDFLAGS="$LDFLAGS $librrd_ldflags"
 -
 -      AC_CHECK_HEADERS(rrd.h,, [with_rrdtool="no (rrd.h not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      LDFLAGS="$SAVE_LDFLAGS"
 -fi
 -if test "x$with_rrdtool" = "xyes"
 -then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_LDFLAGS="$LDFLAGS"
 -
 -      CPPFLAGS="$CPPFLAGS $librrd_cflags"
 -      LDFLAGS="$LDFLAGS $librrd_ldflags"
 -
 -      AC_CHECK_LIB(rrd_th, rrd_update_r,
 -      [with_rrdtool="yes"
 -       librrd_ldflags="$librrd_ldflags -lrrd_th -lm"
 -      ],
 -      [librrd_threadsafe="no"
 -       AC_CHECK_LIB(rrd, rrd_update,
 -       [with_rrdtool="yes"
 -        librrd_ldflags="$librrd_ldflags -lrrd -lm"
 -       ],
 -       [with_rrdtool="no (symbol 'rrd_update' not found)"],
 -       [-lm])
 -      ],
 -      [-lm])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      LDFLAGS="$SAVE_LDFLAGS"
 -fi
 -if test "x$with_rrdtool" = "xyes"
 -then
 -      BUILD_WITH_LIBRRD_CFLAGS="$librrd_cflags"
 -      BUILD_WITH_LIBRRD_LDFLAGS="$librrd_ldflags"
 -      AC_SUBST(BUILD_WITH_LIBRRD_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBRRD_LDFLAGS)
 -fi
 -if test "x$librrd_threadsafe" = "xyes"
 -then
 -      AC_DEFINE(HAVE_THREADSAFE_LIBRRD, 1, [Define to 1 if you have the threadsafe rrd library (-lrrd_th).])
 -fi
 -
 -AC_ARG_WITH(libpthread, [AS_HELP_STRING([--with-libpthread=@<:@=PREFIX@:>@], [Path to libpthread.])],
 -[     if test "x$withval" != "xno" \
 -              && test "x$withval" != "xyes"
 -      then
 -              LDFLAGS="$LDFLAGS -L$withval/lib"
 -              CPPFLAGS="$CPPFLAGS -I$withval/include"
 -              with_libpthread="yes"
 -      else
 -              if test "x$withval" = "xno"
 -              then
 -                      with_libpthread="no (disabled)"
 -              fi
 -      fi
 -], [with_libpthread="yes"])
 -if test "x$with_libpthread" = "xyes"
 -then
 -      AC_CHECK_LIB(pthread, pthread_create, [with_libpthread="yes"], [with_libpthread="no (libpthread not found)"], [])
 -fi
 -if test "x$with_libpthread" = "xyes"
 -then
 -      AC_CHECK_HEADERS(pthread.h,, [with_libpthread="no (pthread.h not found)"])
 -fi
 -if test "x$with_libpthread" = "xyes"
 -then
 -      collect_pthread=1
 -else
 -      collect_pthread=0
 -fi
 -AC_DEFINE_UNQUOTED(HAVE_LIBPTHREAD, [$collect_pthread],
 -      [Wether or not to use pthread (POSIX threads) library])
 -AM_CONDITIONAL(BUILD_WITH_LIBPTHREAD, test "x$with_libpthread" = "xyes")
 -
  if test "x$ac_system" = "xSolaris"
  then
        with_kstat="yes"
  AM_CONDITIONAL(BUILD_WITH_LIBKSTAT, test "x$with_kstat" = "xyes")
  AM_CONDITIONAL(BUILD_WITH_LIBDEVINFO, test "x$with_devinfo" = "xyes")
  
 -### BEGIN of check for libcurl ###
 +with_libiokit="no"
 +AC_CHECK_LIB(IOKit, IOServiceGetMatchingServices,
 +[
 +      with_libiokit="yes"
 +], 
 +[
 +      with_libiokit="no"
 +])
 +AM_CONDITIONAL(BUILD_WITH_LIBIOKIT, test "x$with_libiokit" = "xyes")
 +
 +with_libkvm="no"
 +AC_CHECK_LIB(kvm, kvm_getprocs, [with_kvm_getprocs="yes"], [with_kvm_getprocs="no"])
 +if test "x$with_kvm_getprocs" = "xyes"
 +then
 +      AC_DEFINE(HAVE_LIBKVM_GETPROCS, 1,
 +                [Define to 1 if you have the 'kvm' library with the 'kvm_getprocs' symbol (-lkvm)])
 +      with_libkvm="yes"
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETPROCS, test "x$with_kvm_getprocs" = "xyes")
 +
 +AC_CHECK_LIB(kvm, kvm_getswapinfo, [with_kvm_getswapinfo="yes"], [with_kvm_getswapinfo="no"])
 +if test "x$with_kvm_getswapinfo" = "xyes"
 +then
 +      AC_DEFINE(HAVE_LIBKVM_GETSWAPINFO, 1,
 +                [Define to 1 if you have the 'kvm' library with the 'kvm_getswapinfo' symbol (-lkvm)])
 +      with_libkvm="yes"
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETSWAPINFO, test "x$with_kvm_getswapinfo" = "xyes")
 +
 +AC_CHECK_LIB(kvm, kvm_nlist, [with_kvm_nlist="yes"], [with_kvm_nlist="no"])
 +if test "x$with_kvm_nlist" = "xyes"
 +then
 +      AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
 +                [Define to 1 if you have the 'kvm' library with the 'kvm_nlist' symbol (-lkvm)])
 +      with_libkvm="yes"
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBKVM_NLIST, test "x$with_kvm_nlist" = "xyes")
 +
 +AC_CHECK_LIB(kvm, kvm_openfiles, [with_kvm_openfiles="yes"], [with_kvm_openfiles="no"])
 +if test "x$with_kvm_openfiles" = "xyes"
 +then
 +      AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
 +                [Define to 1 if you have the 'kvm' library with the 'kvm_openfiles' symbol (-lkvm)])
 +      with_libkvm="yes"
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBKVM_OPENFILES, test "x$with_kvm_openfiles" = "xyes")
 +
 +# --with-libcurl {{{
  with_curl_config="curl-config"
  with_curl_cflags=""
  with_curl_libs=""
        AC_SUBST(BUILD_WITH_LIBCURL_LIBS)
  fi
  AM_CONDITIONAL(BUILD_WITH_LIBCURL, test "x$with_libcurl" = "xyes")
 -### END of check for libcurl ###
 -
 -with_libiokit="no"
 -AC_CHECK_LIB(IOKit, IOServiceGetMatchingServices,
 -[
 -      with_libiokit="yes"
 -], 
 -[
 -      with_libiokit="no"
 -])
 -AM_CONDITIONAL(BUILD_WITH_LIBIOKIT, test "x$with_libiokit" = "xyes")
 +# }}}
  
 -with_libstatgrab_cflags=""
 -with_libstatgrab_ldflags=""
 -AC_ARG_WITH(libstatgrab, [AS_HELP_STRING([--with-libstatgrab@<:@=PREFIX@:>@], [Path to libstatgrab.])],
 +# --with-libdbi {{{
 +with_libdbi_cppflags=""
 +with_libdbi_ldflags=""
 +AC_ARG_WITH(libdbi, [AS_HELP_STRING([--with-libdbi@<:@=PREFIX@:>@], [Path to libdbi.])],
  [
 -      if test "x$withval" != "xno" \
 -              && test "x$withval" != "xyes"
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
        then
 -              with_libstatgrab_cflags="-I$withval/include"
 -              with_libstatgrab_ldflags="-L$withval/lib"
 -              with_libstatgrab="yes"
 +              with_libdbi_cppflags="-I$withval/include"
 +              with_libdbi_ldflags="-L$withval/lib"
 +              with_libdbi="yes"
        else
 -              with_libstatgrab="$withval"
 +              with_libdbi="$withval"
        fi
  ],
  [
 -      if test "x$ac_system" = "xunknown"
 -      then
 -              with_libstatgrab="yes"
 -      else
 -              with_libstatgrab="no"
 -      fi
 +      with_libdbi="yes"
  ])
 -with_libstatgrab_pkg_config="yes"
 -if test "x$with_libstatgrab" = "xyes" \
 -  && test "x$PKG_CONFIG" != "x"
 +if test "x$with_libdbi" = "xyes"
  then
 -  AC_MSG_CHECKING([pkg-config for libstatgrab])
 -  temp_result="found"
 -  $PKG_CONFIG --exists libstatgrab 2>/dev/null
 -  if test "$?" != "0"
 -  then
 -    with_libstatgrab_pkg_config="no"
 -    temp_result="not found"
 -  fi
 -  AC_MSG_RESULT([$temp_result])
 -else
 -  AC_MSG_NOTICE([pkg-config not available, trying to guess flags for the statgrab library.])
 -  with_libstatgrab_pkg_config="no"
 -  with_libstatgrab_ldflags="$with_libstatgrab_ldflags -lstatgrab"
 -fi
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libdbi_cppflags"
  
 -if test "x$with_libstatgrab" = "xyes" \
 -  && test "x$with_libstatgrab_pkg_config" = "xyes" \
 -  && test "x$with_libstatgrab_cflags" = "x"
 -then
 -  AC_MSG_CHECKING([for libstatgrab CFLAGS])
 -  temp_result="`$PKG_CONFIG --cflags libstatgrab`"
 -  if test "$?" = "0"
 -  then
 -    with_libstatgrab_cflags="$temp_result"
 -  else
 -    with_libstatgrab="no ($PKG_CONFIG --cflags libstatgrab failed)"
 -    temp_result="$PKG_CONFIG --cflags libstatgrab failed"
 -  fi
 -  AC_MSG_RESULT([$temp_result])
 -fi
 +      AC_CHECK_HEADERS(dbi/dbi.h, [with_libdbi="yes"], [with_libdbi="no (dbi/dbi.h not found)"])
  
 -if test "x$with_libstatgrab" = "xyes" \
 -  && test "x$with_libstatgrab_pkg_config" = "xyes" \
 -  && test "x$with_libstatgrab_ldflags" = "x"
 -then
 -  AC_MSG_CHECKING([for libstatgrab LDFLAGS])
 -  temp_result="`$PKG_CONFIG --libs libstatgrab`"
 -  if test "$?" = "0"
 -  then
 -    with_libstatgrab_ldflags="$temp_result"
 -  else
 -    with_libstatgrab="no ($PKG_CONFIG --libs libstatgrab failed)"
 -    temp_result="$PKG_CONFIG --libs libstatgrab failed"
 -  fi
 -  AC_MSG_RESULT([$temp_result])
 +      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -
 -if test "x$with_libstatgrab" = "xyes"
 +if test "x$with_libdbi" = "xyes"
  then
 -  SAVE_CPPFLAGS="$CPPFLAGS"
 -  CPPFLAGS="$CPPFLAGS $with_libstatgrab_cflags"
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libdbi_cppflags"
 +      LDFLAGS="$LDFLAGS $with_libdbi_ldflags"
  
 -  AC_CHECK_HEADERS(statgrab.h,
 -                 [with_libstatgrab="yes"],
 -                 [with_libstatgrab="no (statgrab.h not found)"])
 +      AC_CHECK_LIB(dbi, dbi_initialize, [with_libdbi="yes"], [with_libdbi="no (Symbol 'dbi_initialize' not found)"])
  
 -  CPPFLAGS="$SAVE_CPPFLAGS"
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
 -
 -if test "x$with_libstatgrab" = "xyes"
 +if test "x$with_libdbi" = "xyes"
  then
 -  SAVE_CFLAGS="$CFLAGS"
 -  SAVE_LDFLAGS="$LDFLAGS"
 -
 -  CFLAGS="$CFLAGS $with_libstatgrab_cflags"
 -  LDFLAGS="$LDFLAGS $with_libstatgrab_ldflags"
 -
 -  AC_CHECK_LIB(statgrab, sg_init,
 -             [with_libstatgrab="yes"],
 -             [with_libstatgrab="no (symbol sg_init not found)"])
 -
 -  CFLAGS="$SAVE_CFLAGS"
 -  LDFLAGS="$SAVE_LDFLAGS"
 +      BUILD_WITH_LIBDBI_CPPFLAGS="$with_libdbi_cppflags"
 +      BUILD_WITH_LIBDBI_LDFLAGS="$with_libdbi_ldflags"
 +      BUILD_WITH_LIBDBI_LIBS="-ldbi"
 +      AC_SUBST(BUILD_WITH_LIBDBI_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBDBI_LDFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBDBI_LIBS)
  fi
 +AM_CONDITIONAL(BUILD_WITH_LIBDBI, test "x$with_libdbi" = "xyes")
 +# }}}
  
 -AM_CONDITIONAL(BUILD_WITH_LIBSTATGRAB, test "x$with_libstatgrab" = "xyes")
 -if test "x$with_libstatgrab" = "xyes"
 +# --with-libesmtp {{{
 +AC_ARG_WITH(libesmtp, [AS_HELP_STRING([--with-libesmtp@<:@=PREFIX@:>@], [Path to libesmtp.])],
 +[
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      then
 +              LDFLAGS="$LDFLAGS -L$withval/lib"
 +              CPPFLAGS="$CPPFLAGS -I$withval/include -D_THREAD_SAFE"
 +              with_libesmtp="yes"
 +      else
 +              with_libesmtp="$withval"
 +      fi
 +],
 +[
 +      with_libesmtp="yes"
 +])
 +if test "x$with_libesmtp" = "xyes"
  then
 -  AC_DEFINE(HAVE_LIBSTATGRAB, 1, [Define to 1 if you have the 'statgrab' library (-lstatgrab)])
 -  BUILD_WITH_LIBSTATGRAB_CFLAGS="$with_libstatgrab_cflags"
 -  BUILD_WITH_LIBSTATGRAB_LDFLAGS="$with_libstatgrab_ldflags"
 -  AC_SUBST(BUILD_WITH_LIBSTATGRAB_CFLAGS)
 -  AC_SUBST(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
 +      AC_CHECK_LIB(esmtp, smtp_create_session,
 +      [
 +              AC_DEFINE(HAVE_LIBESMTP, 1, [Define to 1 if you have the esmtp library (-lesmtp).])
 +      ], [with_libesmtp="no (libesmtp not found)"])
  fi
 -
 -with_libkvm="no"
 -AC_CHECK_LIB(kvm, kvm_getprocs, [with_kvm_getprocs="yes"], [with_kvm_getprocs="no"])
 -if test "x$with_kvm_getprocs" = "xyes"
 +if test "x$with_libesmtp" = "xyes"
  then
 -      AC_DEFINE(HAVE_LIBKVM_GETPROCS, 1,
 -                [Define to 1 if you have the 'kvm' library with the 'kvm_getprocs' symbol (-lkvm)])
 -      with_libkvm="yes"
 -fi
 -AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETPROCS, test "x$with_kvm_getprocs" = "xyes")
 -
 -AC_CHECK_LIB(kvm, kvm_getswapinfo, [with_kvm_getswapinfo="yes"], [with_kvm_getswapinfo="no"])
 -if test "x$with_kvm_getswapinfo" = "xyes"
 -then
 -      AC_DEFINE(HAVE_LIBKVM_GETSWAPINFO, 1,
 -                [Define to 1 if you have the 'kvm' library with the 'kvm_getswapinfo' symbol (-lkvm)])
 -      with_libkvm="yes"
 -fi
 -AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETSWAPINFO, test "x$with_kvm_getswapinfo" = "xyes")
 -
 -AC_CHECK_LIB(kvm, kvm_nlist, [with_kvm_nlist="yes"], [with_kvm_nlist="no"])
 -if test "x$with_kvm_nlist" = "xyes"
 -then
 -      AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
 -                [Define to 1 if you have the 'kvm' library with the 'kvm_nlist' symbol (-lkvm)])
 -      with_libkvm="yes"
 +      AC_CHECK_HEADERS(libesmtp.h,
 +      [
 +              AC_DEFINE(HAVE_LIBESMTP_H, 1, [Define to 1 if you have the <libesmtp.h> header file.])
 +      ], [with_libesmtp="no (libesmtp.h not found)"])
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBKVM_NLIST, test "x$with_kvm_nlist" = "xyes")
 -
 -AC_CHECK_LIB(kvm, kvm_openfiles, [with_kvm_openfiles="yes"], [with_kvm_openfiles="no"])
 -if test "x$with_kvm_openfiles" = "xyes"
 +if test "x$with_libesmtp" = "xyes"
  then
 -      AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
 -                [Define to 1 if you have the 'kvm' library with the 'kvm_openfiles' symbol (-lkvm)])
 -      with_libkvm="yes"
 +      collect_libesmtp=1
 +else
 +      collect_libesmtp=0
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBKVM_OPENFILES, test "x$with_kvm_openfiles" = "xyes")
 +AC_DEFINE_UNQUOTED(COLLECT_LIBESMTP, [$collect_libesmtp],
 +      [Wether or not to use the esmtp library])
 +AM_CONDITIONAL(BUILD_WITH_LIBESMTP, test "x$with_libesmtp" = "xyes")
 +# }}}
  
 -with_sensors_cflags=""
 -with_sensors_ldflags=""
 -AC_ARG_WITH(lm-sensors, [AS_HELP_STRING([--with-lm-sensors@<:@=PREFIX@:>@], [Path to lm_sensors.])],
 +# --with-libiptc {{{
 +with_own_libiptc="no"
 +AC_ARG_WITH(libiptc, [AS_HELP_STRING([--with-libiptc@<:@=PREFIX@:>@], [Path to libiptc.])],
  [
 -      if test "x$withval" = "xno"
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
        then
 -              with_lm_sensors="no"
 +              LDFLAGS="$LDFLAGS -L$withval/lib"
 +              CPPFLAGS="$CPPFLAGS -I$withval/include"
 +              with_libiptc="yes"
        else
 -              with_lm_sensors="yes"
 -              if test "x$withval" != "xyes"
 -              then
 -                      with_sensors_cflags="-I$withval/include"
 -                      with_sensors_ldflags="-L$withval/lib"
 -                      with_lm_sensors="yes"
 -              fi
 +              with_libiptc="$withval"
        fi
  ],
  [
        if test "x$ac_system" = "xLinux"
        then
 -              with_lm_sensors="yes"
 +              with_libiptc="yes"
        else
 -              with_lm_sensors="no (Linux only library)"
 +              with_libiptc="no (Linux only)"
        fi
  ])
 -if test "x$with_lm_sensors" = "xyes"
 +if test "x$with_libiptc" = "xyes"
  then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
 -
 -#     AC_CHECK_HEADERS(sensors/sensors.h,
 -#     [
 -#             AC_DEFINE(HAVE_SENSORS_SENSORS_H, 1, [Define to 1 if you have the <sensors/sensors.h> header file.])
 -#     ],
 -#     [with_lm_sensors="no (sensors/sensors.h not found)"])
 -      AC_CHECK_HEADERS(sensors/sensors.h, [], [with_lm_sensors="no (sensors/sensors.h not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 +      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"
 +      ])
  fi
 -if test "x$with_lm_sensors" = "xyes"
 +if test "x$with_libiptc" = "xyes" -a "x$with_own_libiptc" != "xyes"
  then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      SAVE_LDFLAGS="$LDFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
 -      LDFLAGS="$LDFLAGS $with_sensors_ldflags"
 +      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"
 +      ])
 +fi
 +if test "x$with_libiptc" = "xyes"
 +then
 +      SAVE_CFLAGS=$CFLAGS
 +      CFLAGS="$CFLAGS $KERNEL_CFLAGS"
  
 -      AC_CHECK_LIB(sensors, sensors_init,
 +      AC_CHECK_HEADERS(linux/netfilter_ipv4/ip_tables.h linux/netfilter_ipv6/ip6_tables.h, [],
        [
 -              AC_DEFINE(HAVE_LIBSENSORS, 1, [Define to 1 if you have the sensors library (-lsensors).])
 +              with_libiptc="no (Linux iptables headers not found - check KERNEL_DIR)"
 +              with_own_libiptc="no"
        ],
 -      [with_lm_sensors="no (libsensors not found)"])
 +      [
 +#include "$srcdir/src/libiptc/ipt_kernel_headers.h"
 +      ])
  
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -      LDFLAGS="$SAVE_LDFLAGS"
 +      CFLAGS=$SAVE_CFLAGS
  fi
 -if test "x$with_lm_sensors" = "xyes"
 +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_own_libiptc" = "xyes"
  then
 -      BUILD_WITH_LIBSENSORS_CFLAGS="$with_sensors_cflags"
 -      BUILD_WITH_LIBSENSORS_LDFLAGS="$with_sensors_ldflags"
 -      AC_SUBST(BUILD_WITH_LIBSENSORS_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBSENSORS_LDFLAGS)
 +      AC_DEFINE(OWN_LIBIPTC, 1, [Define to 1 if we use the shipped iptc library.])
  fi
 -AM_CONDITIONAL(BUILD_WITH_LM_SENSORS, test "x$with_lm_sensors" = "xyes")
 +# }}}
  
 +# --with-libmysql {{{
  with_mysql_config="mysql_config"
  with_mysql_cflags=""
  with_mysql_libs=""
        AC_SUBST(BUILD_WITH_LIBMYSQL_LIBS)
  fi
  AM_CONDITIONAL(BUILD_WITH_LIBMYSQL, test "x$with_libmysql" = "xyes")
 +# }}}
  
 -with_own_liboconfig="no"
 -liboconfig_LDFLAGS="$LDFLAGS"
 -liboconfig_CPPFLAGS="$CPPFLAGS"
 -AC_ARG_WITH(liboconfig, [AS_HELP_STRING([--with-liboconfig@<:@=PREFIX@:>@], [Path to liboconfig.])],
 +# --with-libnetlink {{{
 +with_libnetlink_cflags=""
 +with_libnetlink_libs="-lnetlink"
 +AC_ARG_WITH(libnetlink, [AS_HELP_STRING([--with-libnetlink@<:@=PREFIX@:>@], [Path to libnetlink.])],
  [
 -      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 -      then
 -              if test -d "$withval/lib"
 -              then
 -                      liboconfig_LDFLAGS="$LDFLAGS -L$withval/lib"
 -              fi
 -              if test -d "$withval/include"
 -              then
 -                      liboconfig_CPPFLAGS="$CPPFLAGS -I$withval/include"
 -              fi
 -      fi
 -      if test "x$withval" = "xno"
 -      then
 -              AC_MSG_ERROR("liboconfig is required")
 -      fi
 + echo "libnetlink: withval = $withval"
 + if test "x$withval" = "xyes"
 + then
 +       with_libnetlink="yes"
 + else if test "x$withval" = "xno"
 + then
 +       with_libnetlink="no"
 + else
 +       if test -d "$withval/include"
 +       then
 +               with_libnetlink_cflags="-I$withval/include"
 +               with_libnetlink_libs="-L$withval/lib -lnetlink"
 +               with_libnetlink="yes"
 +       else
 +               AC_MSG_ERROR("no such directory: $withval/include")
 +       fi
 + fi; fi
  ],
  [
 -      with_liboconfig="yes"
 + if test "x$ac_system" = "xLinux"
 + then
 +       with_libnetlink="yes"
 + else
 +       with_libnetlink="no (Linux only library)"
 + fi
  ])
 +if test "x$with_libnetlink" = "xyes"
 +then
 +      SAVE_CFLAGS=$CFLAGS
 +      CFLAGS="$CFLAGS $with_libnetlink_cflags"
  
 -save_LDFLAGS="$LDFLAGS"
 -save_CPPFLAGS="$CPPFLAGS"
 -LDFLAGS="$liboconfig_LDFLAGS"
 -CPPFLAGS="$liboconfig_CPPFLAGS"
 -AC_CHECK_LIB(oconfig, oconfig_parse_fh,
 -[
 -      with_liboconfig="yes"
 -      with_own_liboconfig="no"
 -],
 -[
 -      with_liboconfig="yes"
 -      with_own_liboconfig="yes"
 -      LDFLAGS="$save_LDFLAGS"
 -      CPPFLAGS="$save_CPPFLAGS"
 -])
 +      with_libnetlink="no (libnetlink.h not found)"
  
 -AM_CONDITIONAL(BUILD_WITH_OWN_LIBOCONFIG, test "x$with_own_liboconfig" = "xyes")
 -if test "x$with_own_liboconfig" = "xyes"
 +      AC_CHECK_HEADERS(libnetlink.h iproute/libnetlink.h linux/libnetlink.h,
 +      [
 +       with_libnetlink="yes"
 +       break
 +      ], [],
 +[#include <stdio.h>
 +#include <sys/types.h>
 +#include <asm/types.h>
 +#include <sys/socket.h>
 +#include <linux/netlink.h>
 +#include <linux/rtnetlink.h>])
 +      AC_CHECK_HEADERS(linux/gen_stats.h linux/pkt_sched.h, [], [],
 +[#include <stdio.h>
 +#include <sys/types.h>
 +#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(
 +[#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_STATS;
 +      return (retval);
 +}],
 +      [AC_DEFINE([HAVE_TCA_STATS], 1, [True if the enum-member TCA_STATS exists])]
 +      []);
 +
 +      CFLAGS="$SAVE_CFLAGS"
 +fi
 +if test "x$with_libnetlink" = "xyes"
  then
 -      with_liboconfig="yes (shipped version)"
 +      AC_CHECK_LIB(netlink, rtnl_open,
 +                   [with_libnetlink="yes"],
 +                   [with_libnetlink="no (symbol 'rtnl_open' not found)"],
 +                   [$with_libnetlink_libs])
 +fi
 +if test "x$with_libnetlink" = "xyes"
 +then
 +      BUILD_WITH_LIBNETLINK_CFLAGS="$with_libnetlink_cflags"
 +      BUILD_WITH_LIBNETLINK_LIBS="$with_libnetlink_libs"
 +      AC_SUBST(BUILD_WITH_LIBNETLINK_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBNETLINK_LIBS)
  fi
 +AM_CONDITIONAL(BUILD_WITH_LIBNETLINK, test "x$with_libnetlink" = "xyes")
 +# }}}
  
 -#with_liboping="yes"
 -with_own_liboping="no"
 -liboping_LDFLAGS="$LDFLAGS"
 -liboping_CPPFLAGS="$CPPFLAGS"
 -AC_ARG_WITH(liboping, [AS_HELP_STRING([--with-liboping@<:@=PREFIX@:>@], [Path to liboping.])],
 +# --with-libnetsnmp {{{
 +with_snmp_config="net-snmp-config"
 +with_snmp_cflags=""
 +with_snmp_libs=""
 +AC_ARG_WITH(libnetsnmp, [AS_HELP_STRING([--with-libnetsnmp@<:@=PREFIX@:>@], [Path to the Net-SNMPD library.])],
  [
 -      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      if test "x$withval" = "xno"
        then
 -              if test -d "$withval/lib"
 +              with_libnetsnmp="no"
 +      else if test "x$withval" = "xyes"
 +      then
 +              with_libnetsnmp="yes"
 +      else
 +              if test -x "$withval"
 +              then
 +                      with_snmp_config="$withval"
 +                      with_libnetsnmp="yes"
 +              else
 +                      with_snmp_config="$withval/bin/net-snmp-config"
 +                      with_libnetsnmp="yes"
 +              fi
 +      fi; fi
 +],
 +[with_libnetsnmp="yes"])
 +if test "x$with_libnetsnmp" = "xyes"
 +then
 +      with_snmp_cflags=`$with_snmp_config --cflags 2>/dev/null`
 +      snmp_config_status=$?
 +
 +      if test $snmp_config_status -ne 0
 +      then
 +              with_libnetsnmp="no ($with_snmp_config failed)"
 +      else
 +              SAVE_CPPFLAGS="$CPPFLAGS"
 +              CPPFLAGS="$CPPFLAGS $with_snmp_cflags"
 +              
 +              AC_CHECK_HEADERS(net-snmp/net-snmp-config.h, [], [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"])
 +
 +              CPPFLAGS="$SAVE_CPPFLAGS"
 +      fi
 +fi
 +if test "x$with_libnetsnmp" = "xyes"
 +then
 +      with_snmp_libs=`$with_snmp_config --libs 2>/dev/null`
 +      snmp_config_status=$?
 +
 +      if test $snmp_config_status -ne 0
 +      then
 +              with_libnetsnmp="no ($with_snmp_config failed)"
 +      else
 +              AC_CHECK_LIB(netsnmp, init_snmp,
 +              [with_libnetsnmp="yes"],
 +              [with_libnetsnmp="no (libnetsnmp not found)"],
 +              [$with_snmp_libs])
 +      fi
 +fi
 +if test "x$with_libnetsnmp" = "xyes"
 +then
 +      BUILD_WITH_LIBSNMP_CFLAGS="$with_snmp_cflags"
 +      BUILD_WITH_LIBSNMP_LIBS="$with_snmp_libs"
 +      AC_SUBST(BUILD_WITH_LIBSNMP_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBSNMP_LIBS)
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBNETSNMP, test "x$with_libnetsnmp" = "xyes")
 +# }}}
 +
 +# --with-liboconfig {{{
 +with_own_liboconfig="no"
 +liboconfig_LDFLAGS="$LDFLAGS"
 +liboconfig_CPPFLAGS="$CPPFLAGS"
 +AC_ARG_WITH(liboconfig, [AS_HELP_STRING([--with-liboconfig@<:@=PREFIX@:>@], [Path to liboconfig.])],
 +[
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      then
 +              if test -d "$withval/lib"
 +              then
 +                      liboconfig_LDFLAGS="$LDFLAGS -L$withval/lib"
 +              fi
 +              if test -d "$withval/include"
 +              then
 +                      liboconfig_CPPFLAGS="$CPPFLAGS -I$withval/include"
 +              fi
 +      fi
 +      if test "x$withval" = "xno"
 +      then
 +              AC_MSG_ERROR("liboconfig is required")
 +      fi
 +],
 +[
 +      with_liboconfig="yes"
 +])
 +
 +save_LDFLAGS="$LDFLAGS"
 +save_CPPFLAGS="$CPPFLAGS"
 +LDFLAGS="$liboconfig_LDFLAGS"
 +CPPFLAGS="$liboconfig_CPPFLAGS"
 +AC_CHECK_LIB(oconfig, oconfig_parse_fh,
 +[
 +      with_liboconfig="yes"
 +      with_own_liboconfig="no"
 +],
 +[
 +      with_liboconfig="yes"
 +      with_own_liboconfig="yes"
 +      LDFLAGS="$save_LDFLAGS"
 +      CPPFLAGS="$save_CPPFLAGS"
 +])
 +
 +AM_CONDITIONAL(BUILD_WITH_OWN_LIBOCONFIG, test "x$with_own_liboconfig" = "xyes")
 +if test "x$with_own_liboconfig" = "xyes"
 +then
 +      with_liboconfig="yes (shipped version)"
 +fi
 +# }}}
 +
 +# --with-liboping {{{
 +with_own_liboping="no"
 +liboping_LDFLAGS="$LDFLAGS"
 +liboping_CPPFLAGS="$CPPFLAGS"
 +AC_ARG_WITH(liboping, [AS_HELP_STRING([--with-liboping@<:@=PREFIX@:>@], [Path to liboping.])],
 +[
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      then
 +              if test -d "$withval/lib"
                then
                        liboping_LDFLAGS="$LDFLAGS -L$withval/lib"
                fi
  fi
  AM_CONDITIONAL(BUILD_WITH_LIBOPING, test "x$with_liboping" = "xyes")
  AM_CONDITIONAL(BUILD_WITH_OWN_LIBOPING, test "x$with_own_liboping" = "xyes")
 +# }}}
 +
 +# --with-oracle {{{
 +with_oracle_cppflags=""
 +with_oracle_libs=""
 +AC_ARG_WITH(oracle, [AS_HELP_STRING([--with-oracle@<:@=ORACLE_HOME@:>@], [Path to Oracle.])],
 +[
 +      if test "x$withval" = "xyes"
 +      then
 +              if test "x$ORACLE_HOME" = "x"
 +              then
 +                      AC_MSG_WARN([Use of the Oracle library has been forced, but the environment variable ORACLE_HOME is not set.])
 +              fi
 +              with_oracle="yes"
 +      else if test "x$withval" = "xno"
 +      then
 +              with_oracle="no"
 +      else
 +              with_oracle="yes"
 +              ORACLE_HOME="$withval"
 +      fi; fi
 +],
 +[
 +      if test "x$ORACLE_HOME" = "x"
 +      then
 +              with_oracle="no (ORACLE_HOME is not set)"
 +      else
 +              with_oracle="yes"
 +      fi
 +])
 +if test "x$ORACLE_HOME" != "x"
 +then
 +      with_oracle_cppflags="-I$ORACLE_HOME/rdbms/public"
  
 +      if test -e "$ORACLE_HOME/lib/ldflags"
 +      then
 +              with_oracle_libs=`cat "$ORACLE_HOME/lib/ldflags"`
 +      fi
 +      #with_oracle_libs="-L$ORACLE_HOME/lib $with_oracle_libs -lclntsh"
 +      with_oracle_libs="-L$ORACLE_HOME/lib -lclntsh"
 +fi
 +if test "x$with_oracle" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
 +
 +      AC_CHECK_HEADERS(oci.h, [with_oracle="yes"], [with_oracle="no (oci.h not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_oracle" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
 +      LDFLAGS="$LDFLAGS $with_oracle_libs"
 +
 +      AC_CHECK_FUNC(OCIEnvCreate, [with_oracle="yes"], [with_oracle="no (Symbol 'OCIEnvCreate' not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
 +fi
 +if test "x$with_oracle" = "xyes"
 +then
 +      BUILD_WITH_ORACLE_CFLAGS="$with_oracle_cppflags"
 +      BUILD_WITH_ORACLE_LIBS="$with_oracle_libs"
 +      AC_SUBST(BUILD_WITH_ORACLE_CFLAGS)
 +      AC_SUBST(BUILD_WITH_ORACLE_LIBS)
 +fi
 +# }}}
 +
 +# --with-libowcapi {{{
  with_libowcapi_cppflags=""
  with_libowcapi_libs="-lowcapi"
  AC_ARG_WITH(libowcapi, [AS_HELP_STRING([--with-libowcapi@<:@=PREFIX@:>@], [Path to libowcapi.])],
@@@ -1721,9 -1567,8 +1721,9 @@@ the
        AC_SUBST(BUILD_WITH_LIBOWCAPI_CPPFLAGS)
        AC_SUBST(BUILD_WITH_LIBOWCAPI_LIBS)
  fi
 +# }}}
  
 -
 +# --with-libpcap {{{
  AC_ARG_WITH(libpcap, [AS_HELP_STRING([--with-libpcap@<:@=PREFIX@:>@], [Path to libpcap.])],
  [
        if test "x$withval" != "xno" && test "x$withval" != "xyes"
  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")
 +# }}}
  
 -AC_ARG_WITH(libesmtp, [AS_HELP_STRING([--with-libesmtp@<:@=PREFIX@:>@], [Path to libesmtp.])],
 -[
 -      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 -      then
 -              LDFLAGS="$LDFLAGS -L$withval/lib"
 -              CPPFLAGS="$CPPFLAGS -I$withval/include -D_THREAD_SAFE"
 -              with_libesmtp="yes"
 -      else
 -              with_libesmtp="$withval"
 -      fi
 -],
 -[
 -      with_libesmtp="yes"
 -])
 -if test "x$with_libesmtp" = "xyes"
 -then
 -      AC_CHECK_LIB(esmtp, smtp_create_session,
 -      [
 -              AC_DEFINE(HAVE_LIBESMTP, 1, [Define to 1 if you have the esmtp library (-lesmtp).])
 -      ], [with_libesmtp="no (libesmtp not found)"])
 -fi
 -if test "x$with_libesmtp" = "xyes"
 -then
 -      AC_CHECK_HEADERS(libesmtp.h,
 -      [
 -              AC_DEFINE(HAVE_LIBESMTP_H, 1, [Define to 1 if you have the <libesmtp.h> header file.])
 -      ], [with_libesmtp="no (libesmtp.h not found)"])
 -fi
 -if test "x$with_libesmtp" = "xyes"
 -then
 -      collect_libesmtp=1
 -else
 -      collect_libesmtp=0
 -fi
 -AC_DEFINE_UNQUOTED(COLLECT_LIBESMTP, [$collect_libesmtp],
 -      [Wether or not to use the esmtp library])
 -AM_CONDITIONAL(BUILD_WITH_LIBESMTP, test "x$with_libesmtp" = "xyes")
 -
 +# --with-libperl {{{
  perl_interpreter="perl"
  AC_ARG_WITH(libperl, [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
  [
@@@ -1802,8 -1683,9 +1802,9 @@@ if test "x$with_libperl" = "xyes" 
  then
    SAVE_CFLAGS=$CFLAGS
    SAVE_LDFLAGS=$LDFLAGS
-   PERL_CFLAGS=`$perl_interpreter -MExtUtils::Embed -e ccopts`
-   PERL_LDFLAGS=`$perl_interpreter -MExtUtils::Embed -e ldopts`
+ dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string)
+   PERL_CFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ccopts`
+   PERL_LDFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ldopts`
    CFLAGS="$CFLAGS $PERL_CFLAGS"
    LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
  
        LDFLAGS=$SAVE_LDFLAGS
  fi
  
 -with_own_libiptc="no"
 -AC_ARG_WITH(libiptc, [AS_HELP_STRING([--with-libiptc@<:@=PREFIX@:>@], [Path to libiptc.])],
 -[
 -      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 -      then
 -              LDFLAGS="$LDFLAGS -L$withval/lib"
 -              CPPFLAGS="$CPPFLAGS -I$withval/include"
 -              with_libiptc="yes"
 -      else
 -              with_libiptc="$withval"
 -      fi
 -],
 -[
 -      if test "x$ac_system" = "xLinux"
 -      then
 -              with_libiptc="yes"
 -      else
 -              with_libiptc="no (Linux only)"
 -      fi
 -])
 -if test "x$with_libiptc" = "xyes"
 -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"
 -      ])
 -fi
 -if test "x$with_libiptc" = "xyes" -a "x$with_own_libiptc" != "xyes"
 -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"
 -      ])
 -fi
 -if test "x$with_libiptc" = "xyes"
 +c_cv_have_broken_perl_load_module="no"
 +if test "x$with_libperl" = "xyes"
  then
        SAVE_CFLAGS=$CFLAGS
 -      CFLAGS="$CFLAGS $KERNEL_CFLAGS"
 +      SAVE_LDFLAGS=$LDFLAGS
 +      # trigger an error if Perl_load_module*() uses __attribute__nonnull__(3)
 +      # (see issues #41 and #42)
 +      CFLAGS="$CFLAGS $PERL_CFLAGS -Wall -Werror"
 +      LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
  
 -      AC_CHECK_HEADERS(linux/netfilter_ipv4/ip_tables.h linux/netfilter_ipv6/ip6_tables.h, [],
 -      [
 -              with_libiptc="no (Linux iptables headers not found - check KERNEL_DIR)"
 -              with_own_libiptc="no"
 -      ],
 -      [
 -#include "$srcdir/src/libiptc/ipt_kernel_headers.h"
 -      ])
 +      AC_CACHE_CHECK([for broken Perl_load_module()],
 +              [c_cv_have_broken_perl_load_module],
 +              AC_LINK_IFELSE(
 +                      AC_LANG_PROGRAM(
 +                      [[
 +#define PERL_NO_GET_CONTEXT
 +#include <EXTERN.h>
 +#include <perl.h>
 +#include <XSUB.h>
 +                      ]],
 +                      [[
 +                       dTHX;
 +                       load_module (PERL_LOADMOD_NOIMPORT,
 +                           newSVpv ("Collectd::Plugin::FooBar", 24),
 +                           Nullsv);
 +                      ]]),
 +                      [c_cv_have_broken_perl_load_module="no"],
 +                      [c_cv_have_broken_perl_load_module="yes"]
 +              )
 +      )
  
        CFLAGS=$SAVE_CFLAGS
 +      LDFLAGS=$SAVE_LDFLAGS
  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_own_libiptc" = "xyes"
 +AM_CONDITIONAL(HAVE_BROKEN_PERL_LOAD_MODULE,
 +              test "x$c_cv_have_broken_perl_load_module" = "xyes")
 +
 +if test "x$with_libperl" = "xyes"
  then
 -      AC_DEFINE(OWN_LIBIPTC, 1, [Define to 1 if we use the shipped iptc library.])
 +      SAVE_CFLAGS=$CFLAGS
 +      SAVE_LDFLAGS=$LDFLAGS
 +      CFLAGS="$CFLAGS $PERL_CFLAGS"
 +      LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
 +
 +      AC_CHECK_MEMBER(
 +              [struct mgvtbl.svt_local],
 +              [have_struct_mgvtbl_svt_local="yes"],
 +              [have_struct_mgvtbl_svt_local="no"],
 +              [
 +#include <EXTERN.h>
 +#include <perl.h>
 +#include <XSUB.h>
 +              ])
 +
 +      if test "x$have_struct_mgvtbl_svt_local" = "xyes"
 +      then
 +              AC_DEFINE(HAVE_PERL_STRUCT_MGVTBL_SVT_LOCAL, 1,
 +                                [Define if Perl's struct mgvtbl has member svt_local.])
 +      fi
 +
 +      CFLAGS=$SAVE_CFLAGS
 +      LDFLAGS=$SAVE_LDFLAGS
  fi
 +# }}}
  
 -with_snmp_config="net-snmp-config"
 -with_snmp_cflags=""
 -with_snmp_libs=""
 -AC_ARG_WITH(libnetsnmp, [AS_HELP_STRING([--with-libnetsnmp@<:@=PREFIX@:>@], [Path to the Net-SNMPD library.])],
 +# --with-libpq {{{
 +with_pg_config="pg_config"
 +with_libpq_includedir=""
 +with_libpq_libdir=""
 +with_libpq_cppflags=""
 +with_libpq_ldflags=""
 +AC_ARG_WITH(libpq, [AS_HELP_STRING([--with-libpq@<:@=PREFIX@:>@],
 +      [Path to libpq.])],
  [
        if test "x$withval" = "xno"
        then
 -              with_libnetsnmp="no"
 +              with_libpq="no"
        else if test "x$withval" = "xyes"
        then
 -              with_libnetsnmp="yes"
 +              with_libpq="yes"
        else
 -              if test -x "$withval"
 +              if test -f "$withval" && test -x "$withval";
                then
 -                      with_snmp_config="$withval"
 -                      with_libnetsnmp="yes"
 -              else
 -                      with_snmp_config="$withval/bin/net-snmp-config"
 -                      with_libnetsnmp="yes"
 -              fi
 +                      with_pg_config="$withval"
 +              else if test -x "$withval/bin/pg_config"
 +              then
 +                      with_pg_config="$withval/bin/pg_config"
 +              fi; fi
 +              with_libpq="yes"
        fi; fi
  ],
 -[with_libnetsnmp="yes"])
 -if test "x$with_libnetsnmp" = "xyes"
 +[
 +      with_libpq="yes"
 +])
 +if test "x$with_libpq" = "xyes"
  then
 -      with_snmp_cflags=`$with_snmp_config --cflags 2>/dev/null`
 -      snmp_config_status=$?
 +      with_libpq_includedir=`$with_pg_config --includedir 2> /dev/null`
 +      pg_config_status=$?
  
 -      if test $snmp_config_status -ne 0
 +      if test $pg_config_status -eq 0
        then
 -              with_libnetsnmp="no ($with_snmp_config failed)"
 +              if test -n "$with_libpq_includedir"; then
 +                      for dir in $with_libpq_includedir; do
 +                              with_libpq_cppflags="$with_libpq_cppflags -I$dir"
 +                      done
 +              fi
        else
 -              SAVE_CPPFLAGS="$CPPFLAGS"
 -              CPPFLAGS="$CPPFLAGS $with_snmp_cflags"
 -              
 -              AC_CHECK_HEADERS(net-snmp/net-snmp-config.h, [], [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"])
 -
 -              CPPFLAGS="$SAVE_CPPFLAGS"
 +              AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
        fi
 +
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libpq_cppflags"
 +
 +      AC_CHECK_HEADERS(libpq-fe.h, [],
 +              [with_libpq="no (libpq-fe.h not found)"], [])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -if test "x$with_libnetsnmp" = "xyes"
 +if test "x$with_libpq" = "xyes"
  then
 -      with_snmp_libs=`$with_snmp_config --libs 2>/dev/null`
 -      snmp_config_status=$?
 +      with_libpq_libdir=`$with_pg_config --libdir 2> /dev/null`
 +      pg_config_status=$?
  
 -      if test $snmp_config_status -ne 0
 +      if test $pg_config_status -eq 0
        then
 -              with_libnetsnmp="no ($with_snmp_config failed)"
 +              if test -n "$with_libpq_libdir"; then
 +                      for dir in $with_libpq_libdir; do
 +                              with_libpq_ldflags="$with_libpq_ldflags -L$dir"
 +                      done
 +              fi
        else
 -              AC_CHECK_LIB(netsnmp, init_snmp,
 -              [with_libnetsnmp="yes"],
 -              [with_libnetsnmp="no (libnetsnmp not found)"],
 -              [$with_snmp_libs])
 +              AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
        fi
 +
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      LDFLAGS="$LDFLAGS $with_libpq_ldflags"
 +
 +      AC_CHECK_LIB(pq, PQconnectdb,
 +              [with_libpq="yes"],
 +              [with_libpq="no (symbol 'PQconnectdb' not found)"])
 +
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
 -if test "x$with_libnetsnmp" = "xyes"
 +if test "x$with_libpq" = "xyes"
  then
 -      BUILD_WITH_LIBSNMP_CFLAGS="$with_snmp_cflags"
 -      BUILD_WITH_LIBSNMP_LIBS="$with_snmp_libs"
 -      AC_SUBST(BUILD_WITH_LIBSNMP_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBSNMP_LIBS)
 +      BUILD_WITH_LIBPQ_CPPFLAGS="$with_libpq_cppflags"
 +      BUILD_WITH_LIBPQ_LDFLAGS="$with_libpq_ldflags"
 +      AC_SUBST(BUILD_WITH_LIBPQ_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBPQ_LDFLAGS)
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBNETSNMP, test "x$with_libnetsnmp" = "xyes")
 -
 -PKG_CHECK_MODULES([LIBNOTIFY], [libnotify],
 -              [with_libnotify="yes"],
 -              [with_libnotify="no ($LIBNOTIFY_PKG_ERRORS)"])
 +AM_CONDITIONAL(BUILD_WITH_LIBPQ, test "x$with_libpq" = "xyes")
 +# }}}
  
 -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.])],
 -[
 -      if test "x$withval" = "xno"
 -      then
 -              with_libupsclient="no"
 -      else if test "x$withval" = "xyes"
 +# --with-libpthread {{{
 +AC_ARG_WITH(libpthread, [AS_HELP_STRING([--with-libpthread=@<:@=PREFIX@:>@], [Path to libpthread.])],
 +[     if test "x$withval" != "xno" \
 +              && test "x$withval" != "xyes"
        then
 -              with_libupsclient="use_pkgconfig"
 +              LDFLAGS="$LDFLAGS -L$withval/lib"
 +              CPPFLAGS="$CPPFLAGS -I$withval/include"
 +              with_libpthread="yes"
        else
 -              if test -x "$withval"
 -              then
 -                      with_libupsclient_config="$withval"
 -                      with_libupsclient="use_libupsclient_config"
 -              else if test -x "$withval/bin/libupsclient-config"
 +              if test "x$withval" = "xno"
                then
 -                      with_libupsclient_config="$withval/bin/net-snmp-config"
 -                      with_libupsclient="use_libupsclient_config"
 -              else
 -                      AC_MSG_NOTICE([Not checking for libupsclient: Manually configured])
 -                      with_libupsclient_cflags="-I$withval/include"
 -                      with_libupsclient_libs="-L$withval/lib -lupsclient"
 -                      with_libupsclient="yes"
 -              fi; fi
 -      fi; fi
 -],
 -[with_libupsclient="use_pkgconfig"])
 -
 -# configure using libupsclient-config
 -if test "x$with_libupsclient" = "xuse_libupsclient_config"
 -then
 -      AC_MSG_NOTICE([Checking for libupsclient using $with_libupsclient_config])
 -      with_libupsclient_cflags="`$with_libupsclient_config --cflags`"
 -      if test $? -ne 0
 -      then
 -              with_libupsclient="no ($with_libupsclient_config failed)"
 -      fi
 -      with_libupsclient_libs="`$with_libupsclient_config --libs`"
 -      if test $? -ne 0
 -      then
 -              with_libupsclient="no ($with_libupsclient_config failed)"
 +                      with_libpthread="no (disabled)"
 +              fi
        fi
 -fi
 -if test "x$with_libupsclient" = "xuse_libupsclient_config"
 +], [with_libpthread="yes"])
 +if test "x$with_libpthread" = "xyes"
  then
 -      with_libupsclient="yes"
 +      AC_CHECK_LIB(pthread, pthread_create, [with_libpthread="yes"], [with_libpthread="no (libpthread not found)"], [])
  fi
  
 -# configure using pkg-config
 -if test "x$with_libupsclient" = "xuse_pkgconfig"
 +if test "x$with_libpthread" = "xyes"
  then
 -      if test "x$PKG_CONFIG" = "x"
 -      then
 -              with_libupsclient="no (Don't have pkg-config)"
 -      fi
 +      AC_CHECK_HEADERS(pthread.h,, [with_libpthread="no (pthread.h not found)"])
  fi
 -if test "x$with_libupsclient" = "xuse_pkgconfig"
 +if test "x$with_libpthread" = "xyes"
  then
 -      AC_MSG_NOTICE([Checking for libupsclient using $PKG_CONFIG])
 -      $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
 -      if test $? -ne 0
 -      then
 -              with_libupsclient="no (pkg-config doesn't know library)"
 -      fi
 +      collect_pthread=1
 +else
 +      collect_pthread=0
  fi
 -if test "x$with_libupsclient" = "xuse_pkgconfig"
 -then
 -      with_libupsclient_cflags="`$PKG_CONFIG --cflags 'libupsclient'`"
 -      if test $? -ne 0
 -      then
 -              with_libupsclient="no ($PKG_CONFIG failed)"
 -      fi
 -      with_libupsclient_libs="`$PKG_CONFIG --libs 'libupsclient'`"
 -      if test $? -ne 0
 +AC_DEFINE_UNQUOTED(HAVE_LIBPTHREAD, [$collect_pthread],
 +      [Wether or not to use pthread (POSIX threads) library])
 +AM_CONDITIONAL(BUILD_WITH_LIBPTHREAD, test "x$with_libpthread" = "xyes")
 +# }}}
 +
 +# --with-librrd {{{
 +# AC_ARG_WITH (package, help-string, [action-if-given], [action-if-not-given])
 +librrd_cflags=""
 +librrd_ldflags=""
 +librrd_threadsafe="yes"
 +librrd_rrdc_update="no"
 +AC_ARG_WITH(librrd, [AS_HELP_STRING([--with-librrd@<:@=PREFIX@:>@], [Path to rrdtool.])],
 +[     if test "x$withval" != "xno" && test "x$withval" != "xyes"
        then
 -              with_libupsclient="no ($PKG_CONFIG failed)"
 +              librrd_cflags="-I$withval/include"
 +              librrd_ldflags="-L$withval/lib"
 +              with_librrd="yes"
 +      else
 +              with_librrd="$withval"
        fi
 -fi
 -if test "x$with_libupsclient" = "xuse_pkgconfig"
 -then
 -      with_libupsclient="yes"
 -fi
 -
 -# with_libupsclient_cflags and with_libupsclient_libs are set up now, let's do
 -# the actual checks.
 -if test "x$with_libupsclient" = "xyes"
 -then
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 -
 -      AC_CHECK_HEADERS(upsclient.h, [], [with_libupsclient="no (upsclient.h not found)"])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -fi
 -if test "x$with_libupsclient" = "xyes"
 +], [with_librrd="yes"])
 +if test "x$with_librrd" = "xyes"
  then
        SAVE_CPPFLAGS="$CPPFLAGS"
        SAVE_LDFLAGS="$LDFLAGS"
  
 -      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 -      LDFLAGS="$LDFLAGS $with_libupsclient_libs"
 +      CPPFLAGS="$CPPFLAGS $librrd_cflags"
 +      LDFLAGS="$LDFLAGS $librrd_ldflags"
  
 -      AC_CHECK_LIB(upsclient, upscli_connect,
 -                   [with_libupsclient="yes"],
 -                   [with_libupsclient="no (symbol upscli_connect not found)"])
 +      AC_CHECK_HEADERS(rrd.h,, [with_librrd="no (rrd.h not found)"])
  
        CPPFLAGS="$SAVE_CPPFLAGS"
        LDFLAGS="$SAVE_LDFLAGS"
  fi
 -if test "x$with_libupsclient" = "xyes"
 +if test "x$with_librrd" = "xyes"
  then
        SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 +      SAVE_LDFLAGS="$LDFLAGS"
  
 -      AC_CHECK_TYPES([UPSCONN_t, UPSCONN], [], [],
 -[#include <stdlib.h>
 -#include <stdio.h>
 -#include <upsclient.h>])
 +      CPPFLAGS="$CPPFLAGS $librrd_cflags"
 +      LDFLAGS="$LDFLAGS $librrd_ldflags"
  
 -      CPPFLAGS="$SAVE_CPPFLAGS"
 -fi
 -if test "x$with_libupsclient" = "xyes"
 +      AC_CHECK_LIB(rrd_th, rrd_update_r,
 +      [with_librrd="yes"
 +       librrd_ldflags="$librrd_ldflags -lrrd_th -lm"
 +      ],
 +      [librrd_threadsafe="no"
 +       AC_CHECK_LIB(rrd, rrd_update,
 +       [with_librrd="yes"
 +        librrd_ldflags="$librrd_ldflags -lrrd -lm"
 +       ],
 +       [with_librrd="no (symbol 'rrd_update' not found)"],
 +       [-lm])
 +      ],
 +      [-lm])
 +
 +      if test "x$librrd_threadsafe" = "xyes"
 +      then
 +              AC_CHECK_LIB(rrd_th, rrdc_update, [librrd_rrdc_update="yes"], [librrd_rrdc_update="no"])
 +      else
 +              AC_CHECK_LIB(rrd, rrdc_update, [librrd_rrdc_update="yes"], [librrd_rrdc_update="no"])
 +      fi
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
 +fi
 +if test "x$with_librrd" = "xyes"
  then
 -      BUILD_WITH_LIBUPSCLIENT_CFLAGS="$with_libupsclient_cflags"
 -      BUILD_WITH_LIBUPSCLIENT_LIBS="$with_libupsclient_libs"
 -      AC_SUBST(BUILD_WITH_LIBUPSCLIENT_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBUPSCLIENT_LIBS)
 +      BUILD_WITH_LIBRRD_CFLAGS="$librrd_cflags"
 +      BUILD_WITH_LIBRRD_LDFLAGS="$librrd_ldflags"
 +      AC_SUBST(BUILD_WITH_LIBRRD_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBRRD_LDFLAGS)
  fi
 +if test "x$librrd_threadsafe" = "xyes"
 +then
 +      AC_DEFINE(HAVE_THREADSAFE_LIBRRD, 1, [Define to 1 if you have the threadsafe rrd library (-lrrd_th).])
 +fi
 +# }}}
  
 -### BEGIN of check for libxmms ###
 -with_xmms_config="xmms-config"
 -with_xmms_cflags=""
 -with_xmms_libs=""
 -AC_ARG_WITH(libxmms, [AS_HELP_STRING([--with-libxmms@<:@=PREFIX@:>@], [Path to libxmms.])],
 +# --with-libsensors {{{
 +with_sensors_cflags=""
 +with_sensors_ldflags=""
 +AC_ARG_WITH(libsensors, [AS_HELP_STRING([--with-libsensors@<:@=PREFIX@:>@], [Path to lm_sensors.])],
  [
 -      if test "x$withval" != "xno" \
 -              && test "x$withval" != "xyes"
 -      then
 -              if test -f "$withval" && test -x "$withval";
 -              then
 -                      with_xmms_config="$withval"
 -              else if test -x "$withval/bin/xmms-config"
 -              then
 -                      with_xmms_config="$withval/bin/xmms-config"
 -              fi; fi
 -              with_libxmms="yes"
 -      else if test "x$withval" = "xno"
 +      if test "x$withval" = "xno"
        then
 -              with_libxmms="no"
 +              with_libsensors="no"
        else
 -              with_libxmms="yes"
 -      fi; fi
 +              with_libsensors="yes"
 +              if test "x$withval" != "xyes"
 +              then
 +                      with_sensors_cflags="-I$withval/include"
 +                      with_sensors_ldflags="-L$withval/lib"
 +                      with_libsensors="yes"
 +              fi
 +      fi
  ],
  [
 -      with_libxmms="yes"
 -])
 -if test "x$with_libxmms" = "xyes"
 -then
 -      with_xmms_cflags=`$with_xmms_config --cflags 2>/dev/null`
 -      xmms_config_status=$?
 -
 -      if test $xmms_config_status -ne 0
 +      if test "x$ac_system" = "xLinux"
        then
 -              with_libxmms="no"
 +              with_libsensors="yes"
 +      else
 +              with_libsensors="no (Linux only library)"
        fi
 -fi
 -if test "x$with_libxmms" = "xyes"
 +])
 +if test "x$with_libsensors" = "xyes"
  then
 -      with_xmms_libs=`$with_xmms_config --libs 2>/dev/null`
 -      xmms_config_status=$?
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
  
 -      if test $xmms_config_status -ne 0
 -      then
 -              with_libxmms="no"
 -      fi
 +#     AC_CHECK_HEADERS(sensors/sensors.h,
 +#     [
 +#             AC_DEFINE(HAVE_SENSORS_SENSORS_H, 1, [Define to 1 if you have the <sensors/sensors.h> header file.])
 +#     ],
 +#     [with_libsensors="no (sensors/sensors.h not found)"])
 +      AC_CHECK_HEADERS(sensors/sensors.h, [], [with_libsensors="no (sensors/sensors.h not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -if test "x$with_libxmms" = "xyes"
 +if test "x$with_libsensors" = "xyes"
  then
 -      AC_CHECK_LIB(xmms, xmms_remote_get_info,
 -      [
 -              BUILD_WITH_LIBXMMS_CFLAGS="$with_xmms_cflags"
 -              BUILD_WITH_LIBXMMS_LIBS="$with_xmms_libs"
 -              AC_SUBST(BUILD_WITH_LIBXMMS_CFLAGS)
 -              AC_SUBST(BUILD_WITH_LIBXMMS_LIBS)
 -      ],
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
 +      LDFLAGS="$LDFLAGS $with_sensors_ldflags"
 +
 +      AC_CHECK_LIB(sensors, sensors_init,
        [
 -              with_libxmms="no"
 +              AC_DEFINE(HAVE_LIBSENSORS, 1, [Define to 1 if you have the sensors library (-lsensors).])
        ],
 -      [$with_xmms_libs])
 +      [with_libsensors="no (libsensors not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
 -with_libxmms_numeric=0
 -if test "x$with_libxmms" = "xyes"
 +if test "x$with_libsensors" = "xyes"
  then
 -      with_libxmms_numeric=1
 +      BUILD_WITH_LIBSENSORS_CFLAGS="$with_sensors_cflags"
 +      BUILD_WITH_LIBSENSORS_LDFLAGS="$with_sensors_ldflags"
 +      AC_SUBST(BUILD_WITH_LIBSENSORS_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBSENSORS_LDFLAGS)
  fi
 -AC_DEFINE_UNQUOTED(HAVE_LIBXMMS, [$with_libxmms_numeric], [Define to 1 if you have the 'xmms' library (-lxmms).])
 -AM_CONDITIONAL(BUILD_WITH_LIBXMMS, test "x$with_libxmms" = "xyes")
 -### END of check for libxmms ###
 +AM_CONDITIONAL(BUILD_WITH_LM_SENSORS, test "x$with_libsensors" = "xyes")
 +# }}}
  
 -with_libnetlink_cflags=""
 -with_libnetlink_libs="-lnetlink"
 -AC_ARG_WITH(libnetlink, [AS_HELP_STRING([--with-libnetlink@<:@=PREFIX@:>@], [Path to libnetlink.])],
 -[
 - echo "libnetlink: withval = $withval"
 - if test "x$withval" = "xyes"
 - then
 -       with_libnetlink="yes"
 - else if test "x$withval" = "xno"
 - then
 -       with_libnetlink="no"
 - else
 -       if test -d "$withval/include"
 -       then
 -               with_libnetlink_cflags="-I$withval/include"
 -               with_libnetlink_libs="-L$withval/lib -lnetlink"
 -               with_libnetlink="yes"
 -       else
 -               AC_MSG_ERROR("no such directory: $withval/include")
 -       fi
 - fi; fi
 -],
 +# --with-libstatgrab {{{
 +with_libstatgrab_cflags=""
 +with_libstatgrab_ldflags=""
 +AC_ARG_WITH(libstatgrab, [AS_HELP_STRING([--with-libstatgrab@<:@=PREFIX@:>@], [Path to libstatgrab.])],
  [
 - if test "x$ac_system" = "xLinux"
 + if test "x$withval" != "xno" \
 +   && test "x$withval" != "xyes"
   then
 -       with_libnetlink="yes"
 +   with_libstatgrab_cflags="-I$withval/include"
 +   with_libstatgrab_ldflags="-L$withval/lib -lstatgrab"
 +   with_libstatgrab="yes"
 +   with_libstatgrab_pkg_config="no"
   else
 -       with_libnetlink="no (Linux only library)"
 +   with_libstatgrab="$withval"
 +   with_libstatgrab_pkg_config="yes"
   fi
 + ],
 +[
 + with_libstatgrab="yes"
 + with_libstatgrab_pkg_config="yes"
  ])
 -if test "x$with_libnetlink" = "xyes"
 -then
 -      SAVE_CFLAGS=$CFLAGS
 -      CFLAGS="$CFLAGS $with_libnetlink_cflags"
 -
 -      with_libnetlink="no (libnetlink.h not found)"
  
 -      AC_CHECK_HEADERS(libnetlink.h iproute/libnetlink.h linux/libnetlink.h,
 -      [
 -       with_libnetlink="yes"
 -       break
 -      ], [],
 -[#include <stdio.h>
 -#include <sys/types.h>
 -#include <asm/types.h>
 -#include <sys/socket.h>
 -#include <linux/netlink.h>
 -#include <linux/rtnetlink.h>])
 -      AC_CHECK_HEADERS(linux/gen_stats.h linux/pkt_sched.h, [], [],
 -[#include <stdio.h>
 -#include <sys/types.h>
 -#include <asm/types.h>
 -#include <sys/socket.h>])
 +if test "x$with_libstatgrab" = "xyes" \
 +  && test "x$with_libstatgrab_pkg_config" = "xyes"
 +then
 +  if test "x$PKG_CONFIG" != "x"
 +  then
 +    AC_MSG_CHECKING([pkg-config for libstatgrab])
 +    temp_result="found"
 +    $PKG_CONFIG --exists libstatgrab 2>/dev/null
 +    if test "$?" != "0"
 +    then
 +      with_libstatgrab_pkg_config="no"
 +      with_libstatgrab="no ($PKG_CONFIG doesn't know libstatgrab)"
 +      temp_result="not found"
 +    fi
 +    AC_MSG_RESULT([$temp_result])
 +  else
 +    AC_MSG_NOTICE([pkg-config not available, trying to guess flags for the statgrab library.])
 +    with_libstatgrab_pkg_config="no"
 +    with_libstatgrab_ldflags="$with_libstatgrab_ldflags -lstatgrab"
 +  fi
 +fi
  
 -      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>
 +if test "x$with_libstatgrab" = "xyes" \
 +  && test "x$with_libstatgrab_pkg_config" = "xyes" \
 +  && test "x$with_libstatgrab_cflags" = "x"
 +then
 +  AC_MSG_CHECKING([for libstatgrab CFLAGS])
 +  temp_result="`$PKG_CONFIG --cflags libstatgrab`"
 +  if test "$?" = "0"
 +  then
 +    with_libstatgrab_cflags="$temp_result"
 +  else
 +    with_libstatgrab="no ($PKG_CONFIG --cflags libstatgrab failed)"
 +    temp_result="$PKG_CONFIG --cflags libstatgrab failed"
 +  fi
 +  AC_MSG_RESULT([$temp_result])
 +fi
  
 -int main (void)
 -{
 -      int retval = TCA_STATS2;
 -      return (retval);
 -}],
 -      [AC_DEFINE([HAVE_TCA_STATS2], 1, [True if the enum-member TCA_STATS2 exists])]
 -      []);
 +if test "x$with_libstatgrab" = "xyes" \
 +  && test "x$with_libstatgrab_pkg_config" = "xyes" \
 +  && test "x$with_libstatgrab_ldflags" = "x"
 +then
 +  AC_MSG_CHECKING([for libstatgrab LDFLAGS])
 +  temp_result="`$PKG_CONFIG --libs libstatgrab`"
 +  if test "$?" = "0"
 +  then
 +    with_libstatgrab_ldflags="$temp_result"
 +  else
 +    with_libstatgrab="no ($PKG_CONFIG --libs libstatgrab failed)"
 +    temp_result="$PKG_CONFIG --libs libstatgrab failed"
 +  fi
 +  AC_MSG_RESULT([$temp_result])
 +fi
  
 -      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>
 +if test "x$with_libstatgrab" = "xyes"
 +then
 +  SAVE_CPPFLAGS="$CPPFLAGS"
 +  CPPFLAGS="$CPPFLAGS $with_libstatgrab_cflags"
  
 -int main (void)
 -{
 -      int retval = TCA_STATS;
 -      return (retval);
 -}],
 -      [AC_DEFINE([HAVE_TCA_STATS], 1, [True if the enum-member TCA_STATS exists])]
 -      []);
 +  AC_CHECK_HEADERS(statgrab.h,
 +                 [with_libstatgrab="yes"],
 +                 [with_libstatgrab="no (statgrab.h not found)"])
  
 -      CFLAGS="$SAVE_CFLAGS"
 +  CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -if test "x$with_libnetlink" = "xyes"
 +
 +if test "x$with_libstatgrab" = "xyes"
  then
 -      AC_CHECK_LIB(netlink, rtnl_open,
 -                   [with_libnetlink="yes"],
 -                   [with_libnetlink="no (symbol 'rtnl_open' not found)"],
 -                   [$with_libnetlink_libs])
 +  SAVE_CFLAGS="$CFLAGS"
 +  SAVE_LDFLAGS="$LDFLAGS"
 +
 +  CFLAGS="$CFLAGS $with_libstatgrab_cflags"
 +  LDFLAGS="$LDFLAGS $with_libstatgrab_ldflags"
 +
 +  AC_CHECK_LIB(statgrab, sg_init,
 +             [with_libstatgrab="yes"],
 +             [with_libstatgrab="no (symbol sg_init not found)"])
 +
 +  CFLAGS="$SAVE_CFLAGS"
 +  LDFLAGS="$SAVE_LDFLAGS"
  fi
 -if test "x$with_libnetlink" = "xyes"
 +
 +AM_CONDITIONAL(BUILD_WITH_LIBSTATGRAB, test "x$with_libstatgrab" = "xyes")
 +if test "x$with_libstatgrab" = "xyes"
  then
 -      BUILD_WITH_LIBNETLINK_CFLAGS="$with_libnetlink_cflags"
 -      BUILD_WITH_LIBNETLINK_LIBS="$with_libnetlink_libs"
 -      AC_SUBST(BUILD_WITH_LIBNETLINK_CFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBNETLINK_LIBS)
 +  AC_DEFINE(HAVE_LIBSTATGRAB, 1, [Define to 1 if you have the 'statgrab' library (-lstatgrab)])
 +  BUILD_WITH_LIBSTATGRAB_CFLAGS="$with_libstatgrab_cflags"
 +  BUILD_WITH_LIBSTATGRAB_LDFLAGS="$with_libstatgrab_ldflags"
 +  AC_SUBST(BUILD_WITH_LIBSTATGRAB_CFLAGS)
 +  AC_SUBST(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBNETLINK, test "x$with_libnetlink" = "xyes")
 +# }}}
  
 -with_libopenipmipthread="yes"
 -with_libopenipmipthread_cflags=""
 -with_libopenipmipthread_libs=""
 +# --with-libupsclient {{{
 +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.])],
 +[
 +      if test "x$withval" = "xno"
 +      then
 +              with_libupsclient="no"
 +      else if test "x$withval" = "xyes"
 +      then
 +              with_libupsclient="use_pkgconfig"
 +      else
 +              if test -x "$withval"
 +              then
 +                      with_libupsclient_config="$withval"
 +                      with_libupsclient="use_libupsclient_config"
 +              else if test -x "$withval/bin/libupsclient-config"
 +              then
 +                      with_libupsclient_config="$withval/bin/net-snmp-config"
 +                      with_libupsclient="use_libupsclient_config"
 +              else
 +                      AC_MSG_NOTICE([Not checking for libupsclient: Manually configured])
 +                      with_libupsclient_cflags="-I$withval/include"
 +                      with_libupsclient_libs="-L$withval/lib -lupsclient"
 +                      with_libupsclient="yes"
 +              fi; fi
 +      fi; fi
 +],
 +[with_libupsclient="use_pkgconfig"])
  
 -AC_MSG_CHECKING([for pkg-config])
 -temp_result="no"
 -if test "x$PKG_CONFIG" = "x"
 +# configure using libupsclient-config
 +if test "x$with_libupsclient" = "xuse_libupsclient_config"
  then
 -      with_libopenipmipthread="no"
 -      temp_result="no"
 -else
 -      temp_result="$PKG_CONFIG"
 +      AC_MSG_NOTICE([Checking for libupsclient using $with_libupsclient_config])
 +      with_libupsclient_cflags="`$with_libupsclient_config --cflags`"
 +      if test $? -ne 0
 +      then
 +              with_libupsclient="no ($with_libupsclient_config failed)"
 +      fi
 +      with_libupsclient_libs="`$with_libupsclient_config --libs`"
 +      if test $? -ne 0
 +      then
 +              with_libupsclient="no ($with_libupsclient_config failed)"
 +      fi
 +fi
 +if test "x$with_libupsclient" = "xuse_libupsclient_config"
 +then
 +      with_libupsclient="yes"
  fi
 -AC_MSG_RESULT([$temp_result])
  
 -if test "x$with_libopenipmipthread" = "xyes"
 +# configure using pkg-config
 +if test "x$with_libupsclient" = "xuse_pkgconfig"
  then
 -      AC_MSG_CHECKING([for libOpenIPMIpthread])
 -      $PKG_CONFIG --exists OpenIPMIpthread 2>/dev/null
 -      if test "$?" != "0"
 +      if test "x$PKG_CONFIG" = "x"
        then
 -              with_libopenipmipthread="no ($PKG_CONFIG doesn't know OpenIPMIpthread)"
 +              with_libupsclient="no (Don't have pkg-config)"
        fi
 -      AC_MSG_RESULT([$with_libopenipmipthread])
  fi
 -
 -if test "x$with_libopenipmipthread" = "xyes"
 +if test "x$with_libupsclient" = "xuse_pkgconfig"
  then
 -      AC_MSG_CHECKING([for libOpenIPMIpthread CFLAGS])
 -      temp_result="`$PKG_CONFIG --cflags OpenIPMIpthread`"
 -      if test "$?" = "0"
 +      AC_MSG_NOTICE([Checking for libupsclient using $PKG_CONFIG])
 +      $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
 +      if test $? -ne 0
        then
 -              with_libopenipmipthread_cflags="$temp_result"
 -      else
 -              with_libopenipmipthread="no ($PKG_CONFIG --cflags OpenIPMIpthread failed)"
 -              temp_result="$PKG_CONFIG --cflags OpenIPMIpthread failed"
 +              with_libupsclient="no (pkg-config doesn't know library)"
        fi
 -      AC_MSG_RESULT([$temp_result])
  fi
 -
 -if test "x$with_libopenipmipthread" = "xyes"
 +if test "x$with_libupsclient" = "xuse_pkgconfig"
  then
 -      AC_MSG_CHECKING([for libOpenIPMIpthread LDFLAGS])
 -      temp_result="`$PKG_CONFIG --libs OpenIPMIpthread`"
 -      if test "$?" = "0"
 +      with_libupsclient_cflags="`$PKG_CONFIG --cflags 'libupsclient'`"
 +      if test $? -ne 0
        then
 -              with_libopenipmipthread_ldflags="$temp_result"
 -      else
 -              with_libopenipmipthread="no ($PKG_CONFIG --libs OpenIPMIpthread failed)"
 -              temp_result="$PKG_CONFIG --libs OpenIPMIpthread failed"
 +              with_libupsclient="no ($PKG_CONFIG failed)"
        fi
 -      AC_MSG_RESULT([$temp_result])
 +      with_libupsclient_libs="`$PKG_CONFIG --libs 'libupsclient'`"
 +      if test $? -ne 0
 +      then
 +              with_libupsclient="no ($PKG_CONFIG failed)"
 +      fi
 +fi
 +if test "x$with_libupsclient" = "xuse_pkgconfig"
 +then
 +      with_libupsclient="yes"
 +fi
 +
 +# with_libupsclient_cflags and with_libupsclient_libs are set up now, let's do
 +# the actual checks.
 +if test "x$with_libupsclient" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 +
 +      AC_CHECK_HEADERS(upsclient.h, [], [with_libupsclient="no (upsclient.h not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -
 -if test "x$with_libopenipmipthread" = "xyes"
 +if test "x$with_libupsclient" = "xyes"
  then
        SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libopenipmipthread_cflags"
 +      SAVE_LDFLAGS="$LDFLAGS"
  
 -      AC_CHECK_HEADERS(OpenIPMI/ipmi_smi.h,
 -                       [with_libopenipmipthread="yes"],
 -                       [with_libopenipmipthread="no (OpenIPMI/ipmi_smi.h not found)"],
 -[#include <OpenIPMI/ipmiif.h>
 -#include <OpenIPMI/ipmi_err.h>
 -#include <OpenIPMI/ipmi_posix.h>
 -#include <OpenIPMI/ipmi_conn.h>
 -])
 +      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 +      LDFLAGS="$LDFLAGS $with_libupsclient_libs"
 +
 +      AC_CHECK_LIB(upsclient, upscli_connect,
 +                   [with_libupsclient="yes"],
 +                   [with_libupsclient="no (symbol upscli_connect not found)"])
  
        CPPFLAGS="$SAVE_CPPFLAGS"
 +      LDFLAGS="$SAVE_LDFLAGS"
  fi
 +if test "x$with_libupsclient" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
  
 -if test "x$with_libopenipmipthread" = "xyes"
 +      AC_CHECK_TYPES([UPSCONN_t, UPSCONN], [], [],
 +[#include <stdlib.h>
 +#include <stdio.h>
 +#include <upsclient.h>])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_libupsclient" = "xyes"
  then
 -      BUILD_WITH_OPENIPMI_CFLAGS="$with_libopenipmipthread_cflags"
 -      BUILD_WITH_OPENIPMI_LIBS="$with_libopenipmipthread_ldflags"
 -      AC_SUBST(BUILD_WITH_OPENIPMI_CFLAGS)
 -      AC_SUBST(BUILD_WITH_OPENIPMI_LIBS)
 +      BUILD_WITH_LIBUPSCLIENT_CFLAGS="$with_libupsclient_cflags"
 +      BUILD_WITH_LIBUPSCLIENT_LIBS="$with_libupsclient_libs"
 +      AC_SUBST(BUILD_WITH_LIBUPSCLIENT_CFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBUPSCLIENT_LIBS)
  fi
 +# }}}
  
 -dnl Check for libpq.
 -with_pg_config="pg_config"
 -with_libpq_includedir=""
 -with_libpq_libdir=""
 -with_libpq_cppflags=""
 -with_libpq_ldflags=""
 -AC_ARG_WITH(libpq, [AS_HELP_STRING([--with-libpq@<:@=PREFIX@:>@],
 -      [Path to libpq.])],
 +# --with-libxmms {{{
 +with_xmms_config="xmms-config"
 +with_xmms_cflags=""
 +with_xmms_libs=""
 +AC_ARG_WITH(libxmms, [AS_HELP_STRING([--with-libxmms@<:@=PREFIX@:>@], [Path to libxmms.])],
  [
 -      if test "x$withval" = "xno"
 -      then
 -              with_libpq="no"
 -      else if test "x$withval" = "xyes"
 +      if test "x$withval" != "xno" \
 +              && test "x$withval" != "xyes"
        then
 -              with_libpq="yes"
 -      else
                if test -f "$withval" && test -x "$withval";
                then
 -                      with_pg_config="$withval"
 -              else if test -x "$withval/bin/pg_config"
 +                      with_xmms_config="$withval"
 +              else if test -x "$withval/bin/xmms-config"
                then
 -                      with_pg_config="$withval/bin/pg_config"
 +                      with_xmms_config="$withval/bin/xmms-config"
                fi; fi
 -              with_libpq="yes"
 +              with_libxmms="yes"
 +      else if test "x$withval" = "xno"
 +      then
 +              with_libxmms="no"
 +      else
 +              with_libxmms="yes"
        fi; fi
  ],
  [
 -      with_libpq="yes"
 +      with_libxmms="yes"
  ])
 -if test "x$with_libpq" = "xyes"
 +if test "x$with_libxmms" = "xyes"
  then
 -      with_libpq_includedir=`$with_pg_config --includedir 2> /dev/null`
 -      pg_config_status=$?
 +      with_xmms_cflags=`$with_xmms_config --cflags 2>/dev/null`
 +      xmms_config_status=$?
  
 -      if test $pg_config_status -eq 0
 +      if test $xmms_config_status -ne 0
        then
 -              if test -n "$with_libpq_includedir"; then
 -                      for dir in $with_libpq_includedir; do
 -                              with_libpq_cppflags="$with_libpq_cppflags -I$dir"
 -                      done
 -              fi
 -      else
 -              AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
 +              with_libxmms="no"
        fi
 -
 -      SAVE_CPPFLAGS="$CPPFLAGS"
 -      CPPFLAGS="$CPPFLAGS $with_libpq_cppflags"
 -
 -      AC_CHECK_HEADERS(libpq-fe.h, [],
 -              [with_libpq="no (libpq-fe.h not found)"], [])
 -
 -      CPPFLAGS="$SAVE_CPPFLAGS"
  fi
 -if test "x$with_libpq" = "xyes"
 +if test "x$with_libxmms" = "xyes"
  then
 -      with_libpq_libdir=`$with_pg_config --libdir 2> /dev/null`
 -      pg_config_status=$?
 +      with_xmms_libs=`$with_xmms_config --libs 2>/dev/null`
 +      xmms_config_status=$?
  
 -      if test $pg_config_status -eq 0
 +      if test $xmms_config_status -ne 0
        then
 -              if test -n "$with_libpq_libdir"; then
 -                      for dir in $with_libpq_libdir; do
 -                              with_libpq_ldflags="$with_libpq_ldflags -L$dir"
 -                      done
 -              fi
 -      else
 -              AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
 +              with_libxmms="no"
        fi
 -
 -      SAVE_LDFLAGS="$LDFLAGS"
 -      LDFLAGS="$LDFLAGS $with_libpq_ldflags"
 -
 -      AC_CHECK_LIB(pq, PQconnectdb,
 -              [with_libpq="yes"],
 -              [with_libpq="no (symbol 'PQconnectdb' not found)"])
 -
 -      LDFLAGS="$SAVE_LDFLAGS"
  fi
 -if test "x$with_libpq" = "xyes"
 +if test "x$with_libxmms" = "xyes"
  then
 -      BUILD_WITH_LIBPQ_CPPFLAGS="$with_libpq_cppflags"
 -      BUILD_WITH_LIBPQ_LDFLAGS="$with_libpq_ldflags"
 -      AC_SUBST(BUILD_WITH_LIBPQ_CPPFLAGS)
 -      AC_SUBST(BUILD_WITH_LIBPQ_LDFLAGS)
 +      AC_CHECK_LIB(xmms, xmms_remote_get_info,
 +      [
 +              BUILD_WITH_LIBXMMS_CFLAGS="$with_xmms_cflags"
 +              BUILD_WITH_LIBXMMS_LIBS="$with_xmms_libs"
 +              AC_SUBST(BUILD_WITH_LIBXMMS_CFLAGS)
 +              AC_SUBST(BUILD_WITH_LIBXMMS_LIBS)
 +      ],
 +      [
 +              with_libxmms="no"
 +      ],
 +      [$with_xmms_libs])
  fi
 -AM_CONDITIONAL(BUILD_WITH_LIBPQ, test "x$with_libpq" = "xyes")
 +with_libxmms_numeric=0
 +if test "x$with_libxmms" = "xyes"
 +then
 +      with_libxmms_numeric=1
 +fi
 +AC_DEFINE_UNQUOTED(HAVE_LIBXMMS, [$with_libxmms_numeric], [Define to 1 if you have the 'xmms' library (-lxmms).])
 +AM_CONDITIONAL(BUILD_WITH_LIBXMMS, test "x$with_libxmms" = "xyes")
 +# }}}
  
 -dnl Check for libvirt and libxml2 libraries.
 +# pkg-config --exists 'libxml-2.0'; pkg-config --exists libvirt {{{
  with_libxml2="no (pkg-config isn't available)"
  with_libxml2_cflags=""
  with_libxml2_ldflags=""
@@@ -2641,92 -2481,8 +2642,92 @@@ if test "x$with_libvirt" = "xyes"; the
        AC_SUBST(BUILD_WITH_LIBVIRT_CFLAGS)
        AC_SUBST(BUILD_WITH_LIBVIRT_LIBS)
  fi
 +# }}}
 +
 +# $PKG_CONFIG --exists OpenIPMIpthread {{{
 +with_libopenipmipthread="yes"
 +with_libopenipmipthread_cflags=""
 +with_libopenipmipthread_libs=""
 +
 +AC_MSG_CHECKING([for pkg-config])
 +temp_result="no"
 +if test "x$PKG_CONFIG" = "x"
 +then
 +      with_libopenipmipthread="no"
 +      temp_result="no"
 +else
 +      temp_result="$PKG_CONFIG"
 +fi
 +AC_MSG_RESULT([$temp_result])
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      AC_MSG_CHECKING([for libOpenIPMIpthread])
 +      $PKG_CONFIG --exists OpenIPMIpthread 2>/dev/null
 +      if test "$?" != "0"
 +      then
 +              with_libopenipmipthread="no ($PKG_CONFIG doesn't know OpenIPMIpthread)"
 +      fi
 +      AC_MSG_RESULT([$with_libopenipmipthread])
 +fi
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      AC_MSG_CHECKING([for libOpenIPMIpthread CFLAGS])
 +      temp_result="`$PKG_CONFIG --cflags OpenIPMIpthread`"
 +      if test "$?" = "0"
 +      then
 +              with_libopenipmipthread_cflags="$temp_result"
 +      else
 +              with_libopenipmipthread="no ($PKG_CONFIG --cflags OpenIPMIpthread failed)"
 +              temp_result="$PKG_CONFIG --cflags OpenIPMIpthread failed"
 +      fi
 +      AC_MSG_RESULT([$temp_result])
 +fi
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      AC_MSG_CHECKING([for libOpenIPMIpthread LDFLAGS])
 +      temp_result="`$PKG_CONFIG --libs OpenIPMIpthread`"
 +      if test "$?" = "0"
 +      then
 +              with_libopenipmipthread_ldflags="$temp_result"
 +      else
 +              with_libopenipmipthread="no ($PKG_CONFIG --libs OpenIPMIpthread failed)"
 +              temp_result="$PKG_CONFIG --libs OpenIPMIpthread failed"
 +      fi
 +      AC_MSG_RESULT([$temp_result])
 +fi
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$CPPFLAGS $with_libopenipmipthread_cflags"
 +
 +      AC_CHECK_HEADERS(OpenIPMI/ipmi_smi.h,
 +                       [with_libopenipmipthread="yes"],
 +                       [with_libopenipmipthread="no (OpenIPMI/ipmi_smi.h not found)"],
 +[#include <OpenIPMI/ipmiif.h>
 +#include <OpenIPMI/ipmi_err.h>
 +#include <OpenIPMI/ipmi_posix.h>
 +#include <OpenIPMI/ipmi_conn.h>
 +])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      BUILD_WITH_OPENIPMI_CFLAGS="$with_libopenipmipthread_cflags"
 +      BUILD_WITH_OPENIPMI_LIBS="$with_libopenipmipthread_ldflags"
 +      AC_SUBST(BUILD_WITH_OPENIPMI_CFLAGS)
 +      AC_SUBST(BUILD_WITH_OPENIPMI_LIBS)
 +fi
 +# }}}
  
 -dnl End of check for libvirt and libxml2 libraries.
 +PKG_CHECK_MODULES([LIBNOTIFY], [libnotify],
 +              [with_libnotify="yes"],
 +              [with_libnotify="no ($LIBNOTIFY_PKG_ERRORS)"])
  
  # Check for enabled/disabled features
  #
@@@ -2840,7 -2596,6 +2841,7 @@@ AC_COLLECTD([getifaddrs],[enable],  [fe
  dependency_error="no"
  plugin_ascent="no"
  plugin_battery="no"
 +plugin_bind="no"
  plugin_cpu="no"
  plugin_cpufreq="no"
  plugin_df="no"
  if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"
  then
        plugin_ascent="yes"
 +      plugin_bind="yes"
  fi
  
  if test "x$with_libopenipmipthread" = "xyes"
@@@ -2949,11 -2703,6 +2950,11 @@@ if test "x$have_processor_info" = "xyes
  then
        plugin_cpu="yes"
  fi
 +if test "x$have_sysctl" = "xyes"
 +then
 +      plugin_cpu="yes"
 +      plugin_swap="yes"
 +fi
  if test "x$have_sysctlbyname" = "xyes"
  then
        plugin_cpu="yes"
        plugin_swap="yes"
  fi
  
 +if test "x$have_swapctl" = "xyes"
 +then
 +      plugin_swap="yes"
 +fi
 +
  if test "x$with_kvm_openfiles$with_kvm_nlist" = "xyesyes"
  then
        plugin_tcpconns="yes"
@@@ -3035,6 -2779,8 +3036,6 @@@ the
        plugin_users="yes"
  fi
  
 -# FIXME: sysctl for swap plugin
 -
  m4_divert_once([HELP_ENABLE], [
  collectd plugins:])
  
@@@ -3043,12 -2789,10 +3044,12 @@@ AC_PLUGIN([apcups],      [yes]
  AC_PLUGIN([apple_sensors], [$with_libiokit],   [Apple's hardware sensors])
  AC_PLUGIN([ascent],      [$plugin_ascent],     [AscentEmu player statistics])
  AC_PLUGIN([battery],     [$plugin_battery],    [Battery statistics])
 -AC_PLUGIN([cpu],         [$plugin_cpu],        [CPU usage statistics])
 +AC_PLUGIN([bind],        [$plugin_bind],       [ISC Bind nameserver statistics])
  AC_PLUGIN([cpufreq],     [$plugin_cpufreq],    [CPU frequency statistics])
 +AC_PLUGIN([cpu],         [$plugin_cpu],        [CPU usage statistics])
  AC_PLUGIN([csv],         [yes],                [CSV output plugin])
 -AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
 +AC_PLUGIN([curl],        [$with_libcurl],      [CURL generic web statistics])
 +AC_PLUGIN([dbi],         [$with_libdbi],       [General database statistics])
  AC_PLUGIN([df],          [$plugin_df],         [Filesystem usage statistics])
  AC_PLUGIN([disk],        [$plugin_disk],       [Disk usage statistics])
  AC_PLUGIN([dns],         [$with_libpcap],      [DNS traffic analysis])
@@@ -3058,16 -2802,13 +3059,16 @@@ AC_PLUGIN([exec],        [yes]
  AC_PLUGIN([filecount],   [yes],                [Count files in directories])
  AC_PLUGIN([hddtemp],     [yes],                [Query hddtempd])
  AC_PLUGIN([interface],   [$plugin_interface],  [Interface traffic statistics])
 -AC_PLUGIN([iptables],    [$with_libiptc],      [IPTables rule counters])
  AC_PLUGIN([ipmi],        [$plugin_ipmi],       [IPMI sensor statistics])
 +AC_PLUGIN([iptables],    [$with_libiptc],      [IPTables rule counters])
  AC_PLUGIN([ipvs],        [$plugin_ipvs],       [IPVS connection statistics])
  AC_PLUGIN([irq],         [$plugin_irq],        [IRQ statistics])
  AC_PLUGIN([libvirt],     [$plugin_libvirt],    [Virtual machine statistics])
  AC_PLUGIN([load],        [$plugin_load],       [System load])
  AC_PLUGIN([logfile],     [yes],                [File logging plugin])
 +AC_PLUGIN([match_regex], [yes],                [The regex match])
 +AC_PLUGIN([match_timediff], [yes],             [The timediff match])
 +AC_PLUGIN([match_value], [yes],                [The value match])
  AC_PLUGIN([mbmon],       [yes],                [Query mbmond])
  AC_PLUGIN([memcached],   [yes],                [memcached statistics])
  AC_PLUGIN([memory],      [$plugin_memory],     [Memory usage])
@@@ -3077,30 -2818,23 +3078,30 @@@ AC_PLUGIN([netlink],     [$with_libnetl
  AC_PLUGIN([network],     [yes],                [Network communication plugin])
  AC_PLUGIN([nfs],         [$plugin_nfs],        [NFS statistics])
  AC_PLUGIN([nginx],       [$with_libcurl],      [nginx statistics])
 +AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
  AC_PLUGIN([notify_email], [$with_libesmtp],    [Email notifier])
  AC_PLUGIN([ntpd],        [yes],                [NTPd statistics])
  AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
  AC_PLUGIN([onewire],     [$with_libowcapi],    [OneWire sensor statistics])
 +AC_PLUGIN([openvpn],     [yes],                [OpenVPN client statistics])
 +AC_PLUGIN([oracle],      [$with_oracle],       [Oracle plugin])
  AC_PLUGIN([perl],        [$plugin_perl],       [Embed a Perl interpreter])
  AC_PLUGIN([ping],        [$with_liboping],     [Network latency statistics])
  AC_PLUGIN([postgresql],  [$with_libpq],        [PostgreSQL database statistics])
  AC_PLUGIN([powerdns],    [yes],                [PowerDNS statistics])
  AC_PLUGIN([processes],   [$plugin_processes],  [Process statistics])
 -AC_PLUGIN([rrdtool],     [$with_rrdtool],      [RRDTool output plugin])
 -AC_PLUGIN([sensors],     [$with_lm_sensors],   [lm_sensors statistics])
 +AC_PLUGIN([rrdcached],   [$librrd_rrdc_update], [RRDTool output plugin])
 +AC_PLUGIN([rrdtool],     [$with_librrd],       [RRDTool output plugin])
 +AC_PLUGIN([sensors],     [$with_libsensors],   [lm_sensors statistics])
  AC_PLUGIN([serial],      [$plugin_serial],     [serial port traffic])
  AC_PLUGIN([snmp],        [$with_libnetsnmp],   [SNMP querying plugin])
  AC_PLUGIN([swap],        [$plugin_swap],       [Swap usage statistics])
  AC_PLUGIN([syslog],      [$have_syslog],       [Syslog logging plugin])
  AC_PLUGIN([tail],        [yes],                [Parsing of logfiles])
  AC_PLUGIN([tape],        [$plugin_tape],       [Tape drive statistics])
 +AC_PLUGIN([target_notification], [yes],        [The notification target])
 +AC_PLUGIN([target_replace], [yes],             [The replace target])
 +AC_PLUGIN([target_set],  [yes],                [The set target])
  AC_PLUGIN([tcpconns],    [$plugin_tcpconns],   [TCP connection statistics])
  AC_PLUGIN([teamspeak2],  [yes],                [TeamSpeak2 server statistics])
  AC_PLUGIN([thermal],     [$plugin_thermal],    [Linux ACPI thermal zone statistics])
  AC_SUBST(PERL_BINDINGS)
  AC_SUBST(PERL_BINDINGS_OPTIONS)
  
 -AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/libiptc/Makefile src/liboconfig/Makefile src/liboping/Makefile bindings/Makefile)
 +dnl libcollectdclient
 +LCC_VERSION_MAJOR=`echo $PACKAGE_VERSION | cut -d'.' -f1`
 +LCC_VERSION_MINOR=`echo $PACKAGE_VERSION | cut -d'.' -f2`
 +LCC_VERSION_PATCH=`echo $PACKAGE_VERSION | cut -d'.' -f3`
 +
 +LCC_VERSION_EXTRA=`echo $PACKAGE_VERSION | cut -d'.' -f4-`
 +
 +LCC_VERSION_STRING="$LCC_VERSION_MAJOR.$LCC_VERSION_MINOR.$LCC_VERSION_PATCH"
  
 -if test "x$with_rrdtool" = "xyes" \
 +AC_SUBST(LCC_VERSION_MAJOR)
 +AC_SUBST(LCC_VERSION_MINOR)
 +AC_SUBST(LCC_VERSION_PATCH)
 +AC_SUBST(LCC_VERSION_EXTRA)
 +AC_SUBST(LCC_VERSION_STRING)
 +
 +AC_CONFIG_FILES(src/libcollectdclient/lcc_features.h)
 +
 +AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/libiptc/Makefile src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile src/liboping/Makefile bindings/Makefile)
 +
 +if test "x$with_librrd" = "xyes" \
        && test "x$librrd_threadsafe" != "xyes"
  then
 -      with_rrdtool="yes (warning: librrd is not thread-safe)"
 +      with_librrd="yes (warning: librrd is not thread-safe)"
  fi
  
  if test "x$with_liboping" = "xyes" \
@@@ -3203,7 -2920,6 +3204,7 @@@ cat <<EOF
  Configuration:
    Libraries:
      libcurl . . . . . . . $with_libcurl
 +    libdbi  . . . . . . . $with_libdbi
      libesmtp  . . . . . . $with_libesmtp
      libiokit  . . . . . . $with_libiokit
      libiptc . . . . . . . $with_libiptc
      liboping  . . . . . . $with_liboping
      libpcap . . . . . . . $with_libpcap
      libperl . . . . . . . $with_libperl
 -    libpthread  . . . . . $with_libpthread
      libpq . . . . . . . . $with_libpq
 -    librrd  . . . . . . . $with_rrdtool
 -    libsensors  . . . . . $with_lm_sensors
 +    libpthread  . . . . . $with_libpthread
 +    librrd  . . . . . . . $with_librrd
 +    libsensors  . . . . . $with_libsensors
      libstatgrab . . . . . $with_libstatgrab
      libupsclient  . . . . $with_libupsclient
      libvirt . . . . . . . $with_libvirt
      libxml2 . . . . . . . $with_libxml2
      libxmms . . . . . . . $with_libxmms
 +    oracle  . . . . . . . $with_oracle
  
    Features:
      daemon mode . . . . . $enable_daemon
      apple_sensors . . . . $enable_apple_sensors
      ascent  . . . . . . . $enable_ascent
      battery . . . . . . . $enable_battery
 +    bind  . . . . . . . . $enable_bind
      cpu . . . . . . . . . $enable_cpu
      cpufreq . . . . . . . $enable_cpufreq
      csv . . . . . . . . . $enable_csv
 +    curl  . . . . . . . . $enable_curl
 +    dbi . . . . . . . . . $enable_dbi
      df  . . . . . . . . . $enable_df
      disk  . . . . . . . . $enable_disk
      dns . . . . . . . . . $enable_dns
      filecount . . . . . . $enable_filecount
      hddtemp . . . . . . . $enable_hddtemp
      interface . . . . . . $enable_interface
 -    iptables  . . . . . . $enable_iptables
      ipmi  . . . . . . . . $enable_ipmi
 +    iptables  . . . . . . $enable_iptables
      ipvs  . . . . . . . . $enable_ipvs
      irq . . . . . . . . . $enable_irq
      libvirt . . . . . . . $enable_libvirt
      load  . . . . . . . . $enable_load
      logfile . . . . . . . $enable_logfile
 +    match_regex . . . . . $enable_match_regex
 +    match_timediff  . . . $enable_match_timediff
 +    match_value . . . . . $enable_match_value
      mbmon . . . . . . . . $enable_mbmon
      memcached . . . . . . $enable_memcached
      memory  . . . . . . . $enable_memory
      ntpd  . . . . . . . . $enable_ntpd
      nut . . . . . . . . . $enable_nut
      onewire . . . . . . . $enable_onewire
 +    openvpn . . . . . . . $enable_openvpn
 +    oracle  . . . . . . . $enable_oracle
      perl  . . . . . . . . $enable_perl
      ping  . . . . . . . . $enable_ping
      postgresql  . . . . . $enable_postgresql
      powerdns  . . . . . . $enable_powerdns
      processes . . . . . . $enable_processes
 +    rrdcached . . . . . . $enable_rrdcached
      rrdtool . . . . . . . $enable_rrdtool
      sensors . . . . . . . $enable_sensors
      serial  . . . . . . . $enable_serial
      syslog  . . . . . . . $enable_syslog
      tail  . . . . . . . . $enable_tail
      tape  . . . . . . . . $enable_tape
 +    target_notification . $enable_target_notification
 +    target_replace  . . . $enable_target_replace
 +    target_set  . . . . . $enable_target_set
      tcpconns  . . . . . . $enable_tcpconns
      teamspeak2  . . . . . $enable_teamspeak2
      thermal . . . . . . . $enable_thermal
@@@ -3316,5 -3019,3 +3317,5 @@@ EO
  if test "x$dependency_error" = "xyes"; then
        AC_MSG_ERROR("Some plugins are missing dependencies - see above summary for details")
  fi
 +
 +# vim: set fdm=marker :
diff --combined src/collectd.h
index 277a610fe75a62e3c20bf90fd1df509d6afd1514,24e5add3c4ceeb807668851c88900c9e002505b2..18052ba3980130caa048b3b5768de5915c0f9f93
  #  define BYTE_ORDER _BYTE_ORDER
  # elif defined(__BYTE_ORDER)
  #  define BYTE_ORDER __BYTE_ORDER
+ # elif defined(__DARWIN_BYTE_ORDER)
+ #  define BYTE_ORDER __DARWIN_BYTE_ORDER
  # endif
  #endif
  #ifndef BIG_ENDIAN
  #  define BIG_ENDIAN _BIG_ENDIAN
  # elif defined(__BIG_ENDIAN)
  #  define BIG_ENDIAN __BIG_ENDIAN
+ # elif defined(__DARWIN_BIG_ENDIAN)
+ #  define BIG_ENDIAN __DARWIN_BIG_ENDIAN
  # endif
  #endif
  #ifndef LITTLE_ENDIAN
  #  define LITTLE_ENDIAN _LITTLE_ENDIAN
  # elif defined(__LITTLE_ENDIAN)
  #  define LITTLE_ENDIAN __LITTLE_ENDIAN
+ # elif defined(__DARWIN_LITTLE_ENDIAN)
+ #  define LITTLE_ENDIAN __DARWIN_LITTLE_ENDIAN
  # endif
  #endif
  #ifndef BYTE_ORDER
  #endif
  
  #if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
 +# undef strcpy
 +# undef strcat
 +# undef strtok
  # pragma GCC poison strcpy strcat strtok
  #endif
  
   */
  #ifndef DONT_POISON_SPRINTF_YET
  # if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
 +#  undef sprintf
  #  pragma GCC poison sprintf
  # endif
  #endif
diff --combined src/exec.c
index 973cd52b713c21277a7d27233fa000effccc79c0,afce839a058c5d528488e5e00bfcb04e2d4158f7..c2d42ee0bbcc19f4268ab568ea45971ba70b92df
@@@ -78,7 -78,7 +78,7 @@@ static pthread_mutex_t pl_lock = PTHREA
  /*
   * Functions
   */
 -static void sigchld_handler (int signal) /* {{{ */
 +static void sigchld_handler (int __attribute__((unused)) signal) /* {{{ */
  {
    pid_t pid;
    int status;
@@@ -585,7 -585,17 +585,17 @@@ static void *exec_read_one (void *arg) 
          if (errno == EAGAIN || errno == EINTR)  continue;
          break;
        }
-       else if (len == 0) break;  /* We've reached EOF */
+       else if (len == 0)
+       {
+       /* We've reached EOF */
+       NOTICE ("exec plugin: Program `%s' has closed STDERR.",
+           pl->exec);
+       close (fd_err);
+       FD_CLR (fd_err, &fdset);
+       highest_fd = fd;
+       fd_err = -1;
+       continue;
+       }
  
        pbuffer_err[len] = '\0';
  
      copy = fdset;
    }
  
+   DEBUG ("exec plugin: exec_read_one: Waiting for `%s' to exit.", pl->exec);
    if (waitpid (pl->pid, &status, 0) > 0)
      pl->status = status;
  
    pthread_mutex_unlock (&pl_lock);
  
    close (fd);
-   close (fd_err);
+   if (fd_err >= 0)
+     close (fd_err);
  
    pthread_exit ((void *) 0);
    return (NULL);
@@@ -712,8 -724,7 +724,8 @@@ static void *exec_notification_one (voi
    DEBUG ("exec plugin: Child %i exited with status %i.",
        pid, status);
  
 -  plugin_notification_meta_free (n);
 +  plugin_notification_meta_free (n->meta);
 +  n->meta = NULL;
    sfree (arg);
    pthread_exit ((void *) 0);
    return (NULL);
diff --combined src/network.c
index 66f04380388fc3ad20d56d3f95333567e55bebfe,c996b078615581d3f9d0a38553938e41daea9ef4..902f270e5336b09d3e59d611cafb2c07443ea0f7
@@@ -498,7 -498,7 +498,7 @@@ static int parse_part_values (void **re
  
        exp_size = 3 * sizeof (uint16_t)
                + pkg_numval * (sizeof (uint8_t) + sizeof (value_t));
 -      if (buffer_len < exp_size)
 +      if ((buffer_len < 0) || ((size_t) buffer_len < exp_size))
        {
                WARNING ("network plugin: parse_part_values: "
                                "Packet too short: "
@@@ -562,7 -562,7 +562,7 @@@ static int parse_part_number (void **re
        uint16_t pkg_length;
        uint16_t pkg_type;
  
 -      if (buffer_len < exp_size)
 +      if ((buffer_len < 0) || ((size_t) buffer_len < exp_size))
        {
                WARNING ("network plugin: parse_part_number: "
                                "Packet too short: "
@@@ -602,7 -602,7 +602,7 @@@ static int parse_part_string (void **re
        uint16_t pkg_length;
        uint16_t pkg_type;
  
 -      if (buffer_len < header_size)
 +      if ((buffer_len < 0) || ((size_t) buffer_len < header_size))
        {
                WARNING ("network plugin: parse_part_string: "
                                "Packet too short: "
        /* Check that the package data fits into the output buffer.
         * The previous if-statement ensures that:
         * `pkg_length > header_size' */
 -      if ((pkg_length - header_size) > output_len)
 +      if ((output_len < 0)
 +                      || ((size_t) output_len < ((size_t) pkg_length - header_size)))
        {
                WARNING ("network plugin: parse_part_string: "
                                "Output buffer too small.");
@@@ -870,11 -869,12 +870,12 @@@ static void free_sockent (sockent_t *se
   */
  static int network_set_ttl (const sockent_t *se, const struct addrinfo *ai)
  {
+       DEBUG ("network plugin: network_set_ttl: network_config_ttl = %i;",
+                       network_config_ttl);
        if ((network_config_ttl < 1) || (network_config_ttl > 255))
                return (-1);
  
-       DEBUG ("ttl = %i", network_config_ttl);
        if (ai->ai_family == AF_INET)
        {
                struct sockaddr_in *addr = (struct sockaddr_in *) ai->ai_addr;
@@@ -1241,7 -1241,7 +1242,7 @@@ static int network_add_sending_socket (
        return (0);
  } /* int network_get_listen_socket */
  
 -static void *dispatch_thread (void *arg)
 +static void *dispatch_thread (void __attribute__((unused)) *arg)
  {
    while (42)
    {
@@@ -1280,9 -1280,6 +1281,9 @@@ static int network_receive (void
        int i;
        int status;
  
 +      receive_list_entry_t *private_list_head;
 +      receive_list_entry_t *private_list_tail;
 +
        if (listen_sockets_num == 0)
                network_add_listen_socket (NULL, NULL);
  
                return (-1);
        }
  
 +      private_list_head = NULL;
 +      private_list_tail = NULL;
 +
        while (listen_loop == 0)
        {
                status = poll (listen_sockets, listen_sockets_num, -1);
                                ERROR ("network plugin: malloc failed.");
                                return (-1);
                        }
 -                      memset (ent, '\0', sizeof (receive_list_entry_t));
 +                      memset (ent, 0, sizeof (receive_list_entry_t));
 +                      ent->next = NULL;
  
                        /* Hopefully this be optimized out by the compiler. It
                         * might help prevent stupid bugs in the future though.
                        memcpy (ent->data, buffer, buffer_len);
                        ent->data_len = buffer_len;
  
 -                      pthread_mutex_lock (&receive_list_lock);
 -                      if (receive_list_head == NULL)
 -                      {
 -                              receive_list_head = ent;
 -                              receive_list_tail = ent;
 -                      }
 +                      if (private_list_head == NULL)
 +                              private_list_head = ent;
                        else
 +                              private_list_tail->next = ent;
 +                      private_list_tail = ent;
 +
 +                      /* Do not block here. Blocking here has led to
 +                       * insufficient performance in the past. */
 +                      if (pthread_mutex_trylock (&receive_list_lock) == 0)
                        {
 -                              receive_list_tail->next = ent;
 -                              receive_list_tail = ent;
 +                              if (receive_list_head == NULL)
 +                                      receive_list_head = private_list_head;
 +                              else
 +                                      receive_list_tail->next = private_list_head;
 +                              receive_list_tail = private_list_tail;
 +
 +                              private_list_head = NULL;
 +                              private_list_tail = NULL;
 +
 +                              pthread_cond_signal (&receive_list_cond);
 +                              pthread_mutex_unlock (&receive_list_lock);
                        }
 -                      pthread_cond_signal (&receive_list_cond);
 -                      pthread_mutex_unlock (&receive_list_lock);
                } /* for (listen_sockets) */
        } /* while (listen_loop == 0) */
  
 +      /* Make sure everything is dispatched before exiting. */
 +      if (private_list_head != NULL)
 +      {
 +              pthread_mutex_lock (&receive_list_lock);
 +
 +              if (receive_list_head == NULL)
 +                      receive_list_head = private_list_head;
 +              else
 +                      receive_list_tail->next = private_list_head;
 +              receive_list_tail = private_list_tail;
 +
 +              private_list_head = NULL;
 +              private_list_tail = NULL;
 +
 +              pthread_cond_signal (&receive_list_cond);
 +              pthread_mutex_unlock (&receive_list_lock);
 +      }
 +
        return (0);
  }
  
 -static void *receive_thread (void *arg)
 +static void *receive_thread (void __attribute__((unused)) *arg)
  {
        return (network_receive () ? (void *) 1 : (void *) 0);
  } /* void *receive_thread */
@@@ -1809,8 -1775,7 +1810,8 @@@ static int network_init (void
   * just send the buffer if `flush'  is called - if the requested value was in
   * there, good. If not, well, then there is nothing to flush.. -octo
   */
 -static int network_flush (int timeout, const char *identifier)
 +static int network_flush (int timeout,
 +              const char __attribute__((unused)) *identifier)
  {
        pthread_mutex_lock (&send_buffer_lock);
  
diff --combined src/plugin.c
index 367c0d125d10e508d6fca078135c3c823014fce1,20f3aa2b72d76fa6f0ef1f2901b600b881eadea5..74565c35821d11cdcd2c026e88ad5dc3a65d5ac5
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/plugin.c
 - * Copyright (C) 2005-2008  Florian octo Forster
 + * Copyright (C) 2005-2009  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
@@@ -36,7 -36,6 +36,7 @@@
  #include "utils_llist.h"
  #include "utils_cache.h"
  #include "utils_threshold.h"
 +#include "filter_chain.h"
  
  /*
   * Private structures
@@@ -61,9 -60,6 +61,9 @@@ static llist_t *list_shutdown
  static llist_t *list_log;
  static llist_t *list_notification;
  
 +static fc_chain_t *pre_cache_chain = NULL;
 +static fc_chain_t *post_cache_chain = NULL;
 +
  static c_avl_tree_t *data_sets;
  
  static char *plugindir = NULL;
@@@ -171,7 -167,7 +171,7 @@@ static int plugin_load_file (char *file
        return (0);
  }
  
 -static void *plugin_read_thread (void *args)
 +static void *plugin_read_thread (void __attribute__((unused)) *args)
  {
        llentry_t   *le;
        read_func_t *rf;
@@@ -278,9 -274,6 +278,9 @@@ static void stop_threads (void
  {
        int i;
  
 +      if (read_threads == NULL)
 +              return;
 +
        pthread_mutex_lock (&read_lock);
        read_loop = 0;
        DEBUG ("plugin: stop_threads: Signalling `read_cond'");
@@@ -328,7 -321,6 +328,7 @@@ int plugin_load (const char *type
        int   ret;
        struct stat    statbuf;
        struct dirent *de;
 +      int status;
  
        DEBUG ("type = %s", type);
  
  
        /* `cpu' should not match `cpufreq'. To solve this we add `.so' to the
         * type when matching the filename */
 -      if (ssnprintf (typename, sizeof (typename),
 -                      "%s.so", type) >= sizeof (typename))
 +      status = ssnprintf (typename, sizeof (typename), "%s.so", type);
 +      if ((status < 0) || ((size_t) status >= sizeof (typename)))
        {
                WARNING ("snprintf: truncated: `%s.so'", type);
                return (-1);
                if (strncasecmp (de->d_name, typename, typename_len))
                        continue;
  
 -              if (ssnprintf (filename, sizeof (filename),
 -                              "%s/%s", dir, de->d_name) >= sizeof (filename))
 +              status = ssnprintf (filename, sizeof (filename),
 +                              "%s/%s", dir, de->d_name);
 +              if ((status < 0) || ((size_t) status >= sizeof (filename)))
                {
                        WARNING ("snprintf: truncated: `%s/%s'", dir, de->d_name);
                        continue;
                else if (!S_ISREG (statbuf.st_mode))
                {
                        /* don't follow symlinks */
+                       WARNING ("stat %s: not a regular file", filename);
                        continue;
                }
  
@@@ -589,7 -581,6 +590,7 @@@ int plugin_unregister_notification (con
  
  void plugin_init_all (void)
  {
 +      const char *chain_name;
        int (*callback) (void);
        llentry_t *le;
        int status;
        /* Init the value cache */
        uc_init ();
  
 +      chain_name = global_option_get ("PreCacheChain");
 +      pre_cache_chain = fc_chain_get_by_name (chain_name);
 +
 +      chain_name = global_option_get ("PostCacheChain");
 +      post_cache_chain = fc_chain_get_by_name (chain_name);
 +
 +
        if ((list_init == NULL) && (list_read == NULL))
                return;
  
                int num;
                rt = global_option_get ("ReadThreads");
                num = atoi (rt);
 -              start_threads ((num > 0) ? num : 5);
 +              if (num != -1)
 +                      start_threads ((num > 0) ? num : 5);
        }
  } /* void plugin_init_all */
  
@@@ -683,104 -666,6 +684,104 @@@ void plugin_read_all (void
        pthread_mutex_unlock (&read_lock);
  } /* void plugin_read_all */
  
 +/* Read function called when the `-T' command line argument is given. */
 +int plugin_read_all_once (void)
 +{
 +      llentry_t   *le;
 +      read_func_t *rf;
 +      int status;
 +      int return_status = 0;
 +
 +      if (list_read == NULL)
 +      {
 +              NOTICE ("No read-functions are registered.");
 +              return (0);
 +      }
 +
 +      for (le = llist_head (list_read);
 +           le != NULL;
 +           le = le->next)
 +      {
 +              rf = (read_func_t *) le->value;
 +              status = rf->callback ();
 +              if (status != 0)
 +              {
 +                      NOTICE ("read-function of plugin `%s' failed.",
 +                              le->key);
 +                      return_status = -1;
 +              }
 +      }
 +
 +      return (return_status);
 +} /* int plugin_read_all_once */
 +
 +int plugin_write (const char *plugin, /* {{{ */
 +              const data_set_t *ds, const value_list_t *vl)
 +{
 +  int (*callback) (const data_set_t *ds, const value_list_t *vl);
 +  llentry_t *le;
 +  int status;
 +
 +  if (vl == NULL)
 +    return (EINVAL);
 +
 +  if (list_write == NULL)
 +    return (ENOENT);
 +
 +  if (ds == NULL)
 +  {
 +    ds = plugin_get_ds (vl->type);
 +    if (ds == NULL)
 +    {
 +      ERROR ("plugin_write: Unable to lookup type `%s'.", vl->type);
 +      return (ENOENT);
 +    }
 +  }
 +
 +  if (plugin == NULL)
 +  {
 +    int success = 0;
 +    int failure = 0;
 +
 +    le = llist_head (list_write);
 +    while (le != NULL)
 +    {
 +      callback = le->value;
 +      status = (*callback) (ds, vl);
 +      if (status != 0)
 +        failure++;
 +      else
 +        success++;
 +
 +      le = le->next;
 +    }
 +
 +    if ((success == 0) && (failure != 0))
 +      status = -1;
 +    else
 +      status = 0;
 +  }
 +  else /* plugin != NULL */
 +  {
 +    le = llist_head (list_write);
 +    while (le != NULL)
 +    {
 +      if (strcasecmp (plugin, le->key) == 0)
 +        break;
 +
 +      le = le->next;
 +    }
 +
 +    if (le == NULL)
 +      return (ENOENT);
 +
 +    callback = le->value;
 +    status = (*callback) (ds, vl);
 +  }
 +
 +  return (status);
 +} /* }}} int plugin_write */
 +
  int plugin_flush (const char *plugin, int timeout, const char *identifier)
  {
    int (*callback) (int timeout, const char *identifier);
@@@ -834,17 -719,13 +835,17 @@@ void plugin_shutdown_all (void
  
  int plugin_dispatch_values (value_list_t *vl)
  {
 -      static c_complain_t no_write_complaint = C_COMPLAIN_INIT;
 +      int status;
 +      static c_complain_t no_write_complaint = C_COMPLAIN_INIT_STATIC;
 +
 +      value_t *saved_values;
 +      int      saved_values_len;
  
 -      int (*callback) (const data_set_t *, const value_list_t *);
        data_set_t *ds;
 -      llentry_t *le;
  
 -      if ((vl == NULL) || (*vl->type == '\0')) {
 +      if ((vl == NULL) || (vl->type[0] == 0)
 +                      || (vl->values == NULL) || (vl->values_len < 1))
 +      {
                ERROR ("plugin_dispatch_values: Invalid value list.");
                return (-1);
        }
                return (-1);
        }
  
 +      if (vl->time == 0)
 +              vl->time = time (NULL);
 +
        DEBUG ("plugin_dispatch_values: time = %u; interval = %i; "
                        "host = %s; "
                        "plugin = %s; plugin_instance = %s; "
        escape_slashes (vl->type, sizeof (vl->type));
        escape_slashes (vl->type_instance, sizeof (vl->type_instance));
  
 +      /* Copy the values. This way, we can assure `targets' that they get
 +       * dynamically allocated values, which they can free and replace if
 +       * they like. */
 +      if ((pre_cache_chain != NULL) || (post_cache_chain != NULL))
 +      {
 +              saved_values     = vl->values;
 +              saved_values_len = vl->values_len;
 +
 +              vl->values = (value_t *) calloc (vl->values_len,
 +                              sizeof (*vl->values));
 +              if (vl->values == NULL)
 +              {
 +                      ERROR ("plugin_dispatch_values: calloc failed.");
 +                      vl->values = saved_values;
 +                      return (-1);
 +              }
 +              memcpy (vl->values, saved_values,
 +                              vl->values_len * sizeof (*vl->values));
 +      }
 +      else /* if ((pre == NULL) && (post == NULL)) */
 +      {
 +              saved_values     = NULL;
 +              saved_values_len = 0;
 +      }
 +
 +      if (pre_cache_chain != NULL)
 +      {
 +              status = fc_process_chain (ds, vl, pre_cache_chain);
 +              if (status < 0)
 +              {
 +                      WARNING ("plugin_dispatch_values: Running the "
 +                                      "pre-cache chain failed with "
 +                                      "status %i (%#x).",
 +                                      status, status);
 +              }
 +              else if (status == FC_TARGET_STOP)
 +              {
 +                      /* Restore the state of the value_list so that plugins
 +                       * don't get confused.. */
 +                      if (saved_values != NULL)
 +                      {
 +                              free (vl->values);
 +                              vl->values     = saved_values;
 +                              vl->values_len = saved_values_len;
 +                      }
 +                      return (0);
 +              }
 +      }
 +
        /* Update the value cache */
        uc_update (ds, vl);
 -      ut_check_threshold (ds, vl);
  
 -      le = llist_head (list_write);
 -      while (le != NULL)
 +      if (post_cache_chain != NULL)
        {
 -              callback = (int (*) (const data_set_t *, const value_list_t *)) le->value;
 -              (*callback) (ds, vl);
 +              status = fc_process_chain (ds, vl, post_cache_chain);
 +              if (status < 0)
 +              {
 +                      WARNING ("plugin_dispatch_values: Running the "
 +                                      "post-cache chain failed with "
 +                                      "status %i (%#x).",
 +                                      status, status);
 +              }
 +      }
 +      else
 +              fc_default_action (ds, vl);
  
 -              le = le->next;
 +      /* Restore the state of the value_list so that plugins don't get
 +       * confused.. */
 +      if (saved_values != NULL)
 +      {
 +              free (vl->values);
 +              vl->values     = saved_values;
 +              vl->values_len = saved_values_len;
        }
  
        return (0);
@@@ -1203,7 -1019,7 +1204,7 @@@ int plugin_notification_meta_copy (noti
    return (0);
  } /* int plugin_notification_meta_copy */
  
 -int plugin_notification_meta_free (notification_t *n)
 +int plugin_notification_meta_free (notification_meta_t *n)
  {
    notification_meta_t *this;
    notification_meta_t *next;
      return (-1);
    }
  
 -  this = n->meta;
 -  n->meta = NULL;
 +  this = n;
    while (this != NULL)
    {
      next = this->next;