Merge branch 'collectd-4.4' into collectd-4.5
authorFlorian Forster <octo@noris.net>
Fri, 10 Oct 2008 07:01:54 +0000 (09:01 +0200)
committerFlorian Forster <octo@noris.net>
Fri, 10 Oct 2008 07:01:54 +0000 (09:01 +0200)
1  2 
README
configure.in
src/configfile.c
src/netlink.c
src/network.c
src/utils_cache.c

diff --combined README
--- 1/README
--- 2/README
+++ b/README
@@@ -62,9 -62,6 +62,9 @@@ Feature
        Values gathered by a custom program or script.
        See collectd-exec(5).
  
 +    - filecount
 +      Count the number of files in directories.
 +
      - hddtemp
        Harddisk temperatures using hddtempd.
  
        Network UPS tools: UPS current, voltage, power, charge, utilisation,
        temperature, etc. See upsd(8).
  
 +    - onewire (EXPERIMENTAL!)
 +      Read onewire sensors using the owcapu library of the owfs project.
 +      Please read in collectd.conf(5) why this plugin is experimental.
 +
      - perl
        The perl plugin implements a Perl-interpreter into collectd. You can
        write your own plugins in Perl and return arbitrary values using this
        Network latency: Time to reach the default gateway or another given
        host.
  
 +    - postgresql
 +      PostgreSQL database statistics: active server connections, transaction
 +      numbers, block IO, table row manipulations.
 +
      - processes
        Process counts: Number of running, sleeping, zombie, ... processes.
  
  
    * Notifications can be handled by the following plugins:
  
 +    - notify_desktop
 +      Send a desktop notification to a notification daemon, as defined in
 +      the Desktop Notification Specification. To actually display the
 +      notifications, notification-daemon is required.
 +      See http://www.galago-project.org/specs/notification/.
 +
 +    - notify_email
 +      Send an E-mail with the notification message to the configured
 +      recipients.
 +
      - exec
        Execute a program or script to handle the notification.
        See collectd-exec(5).
@@@ -336,16 -315,9 +336,16 @@@ Prerequisite
      used and should be found in various implementations for hopefully all
      platforms.
  
 +  * CoreFoundation.framework and IOKit.framework (optional)
 +    For compiling on Darwin in general and the `apple_sensors' plugin in
 +    particular.
 +
    * libcurl (optional)
      If you want to use the `apache', `ascent', or `nginx' plugin.
  
 +  * libesmtp (optional)
 +    For the `notify_email' plugin.
 +
    * libhal (optional)
      If present, the uuid plugin will check for UUID from HAL.
  
    * libnetsnmp (optional)
      For the `snmp' plugin.
  
 +  * libnotify (optional)
 +    For the `notify_desktop' plugin.
 +
    * liboping (optional, if not found a version shipped with this distribution
      can be used)
      Used by the `ping' plugin to send and receive ICMP packets.
  
 +  * libowcapi (optional)
 +    Used by the `onewire' plugin to read values from onewire sensors (or the
 +    owserver(1) daemon).
 +
    * libpcap (optional)
      Used to capture packets by the `dns' plugin.
  
      Obviously used by the `perl' plugin. The library has to be compiled with
      ithread support (introduced in Perl 5.6.0).
  
 +  * libpq (optional)
 +    The PostgreSQL C client library used by the `postgresql' plugin.
 +
    * librrd (optional; headers and library; rrdtool 1.0 and 1.2 both work fine)
      If built without `librrd' the resulting binary will be `client only', i.e.
      will send its values via multicast and not create any RRD files itself.
      Alternatively you can chose to write CSV-files (Comma Separated Values)
      instead.
  
 +  * librt, libsocket, libkstat, libdevinfo (optional)
 +    Various standard Solaris libraries which provide system functions.
 +
    * libsensors (optional)
      To read from `lm_sensors', see the `sensors' plugin.
  
 -  * libstatgrab may be used to collect statistics on systems other than Linux
 -    and/or Solaris. Note that CPU- and disk-statistics, while being provided
 -    by this library, are not supported in collectd right now..
 +  * libstatgrab (optional) may be used to collect statistics on systems other
 +    than Linux and/or Solaris. Note that CPU- and disk-statistics, while being
 +    provided by this library, are not supported in collectd right now..
      <http://www.i-scream.org/libstatgrab/> 
  
    * libupsclient/nut (optional)
      For the `nut' plugin which queries nut's `upsd'.
  
 -  * libxmms (optional)
 -
 -  * librt, libsocket, libkstat, libdevinfo
 -    Various standard Solaris libraries which provide system functions.
 -
 -  * CoreFoundation.framework and IOKit.framework
 -    For compiling on Darwin in general and the `apple_sensors' plugin in
 -    particular.
 -
    * libvirt (optional)
      Collect statistics from virtual machines.
  
    * libxml2 (optional)
      Parse XML data. This is needed for the `ascent' and `libvirt' plugins.
  
 +  * libxmms (optional)
 +
  
  Configuring / Compiling / Installing
  ------------------------------------
    disable all plugins whose requirements cannot be fulfilled (any other plugin
    will be enabled). To enable a plugin, install missing dependencies (see
    section `Prerequisites' above) and rerun `configure'. If you specify the
-   `--enable-<plugin>' configure option, you can force the plugin to be built.
-   This will most likely fail though unless you're working in a very unusual
-   setup and you really know what you're doing.
+   `--enable-<plugin>' configure option, the script will fail if the depen-
+   dencies for the specified plugin are not met. If you specify the
+   `--disable-<plugin>' configure option, the plugin will not be built. Both
+   options are meant for package maintainers and should not be used in everyday
+   situations.
  
    By default, collectd will be installed into `/opt/collectd'. You can adjust
    this setting by specifying the `--prefix' configure option - see INSTALL for
diff --combined configure.in
@@@ -45,9 -45,6 +45,9 @@@ case $host_os i
        *darwin*)
        ac_system="Darwin"
        ;;
 +      *openbsd*)
 +      ac_system="OpenBSD"
 +      ;;
        *)
        ac_system="unknown"
  esac
@@@ -72,7 -69,7 +72,7 @@@ AC_HEADER_STD
  AC_HEADER_SYS_WAIT
  AC_HEADER_DIRENT
  
 -AC_CHECK_HEADERS(stdint.h stdio.h errno.h math.h stdarg.h syslog.h fcntl.h signal.h assert.h sys/types.h sys/socket.h sys/select.h poll.h netdb.h arpa/inet.h sys/resource.h sys/param.h kstat.h regex.h sys/ioctl.h endian.h sys/isa_defs.h)
 +AC_CHECK_HEADERS(stdio.h stdint.h stdbool.h errno.h math.h stdarg.h syslog.h fcntl.h signal.h assert.h sys/types.h sys/socket.h sys/select.h poll.h netdb.h arpa/inet.h sys/resource.h sys/param.h kstat.h regex.h sys/ioctl.h endian.h sys/isa_defs.h)
  
  # For ping library
  AC_CHECK_HEADERS(netinet/in_systm.h, [], [],
  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"
 +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
  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")
 +
  with_sensors_cflags=""
  with_sensors_ldflags=""
  AC_ARG_WITH(lm-sensors, [AS_HELP_STRING([--with-lm-sensors@<:@=PREFIX@:>@], [Path to lm_sensors.])],
  AM_CONDITIONAL(BUILD_WITH_LIBOPING, test "x$with_liboping" = "xyes")
  AM_CONDITIONAL(BUILD_WITH_OWN_LIBOPING, test "x$with_own_liboping" = "xyes")
  
 +with_libowcapi_cppflags=""
 +with_libowcapi_libs="-lowcapi"
 +AC_ARG_WITH(libowcapi, [AS_HELP_STRING([--with-libowcapi@<:@=PREFIX@:>@], [Path to libowcapi.])],
 +[
 +      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      then
 +              with_libowcapi_cppflags="-I$withval/include"
 +              with_libowcapi_libs="-L$withval/lib -lowcapi"
 +              with_libowcapi="yes"
 +      else
 +              with_libowcapi="$withval"
 +      fi
 +],
 +[
 +      with_libowcapi="yes"
 +])
 +if test "x$with_libowcapi" = "xyes"
 +then
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      CPPFLAGS="$with_libowcapi_cppflags"
 +      
 +      AC_CHECK_HEADERS(owcapi.h, [with_libowcapi="yes"], [with_libowcapi="no (owcapi.h not found)"])
 +
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_libowcapi" = "xyes"
 +then
 +      SAVE_LDFLAGS="$LDFLAGS"
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      LDFLAGS="$with_libowcapi_libs"
 +      CPPFLAGS="$with_libowcapi_cppflags"
 +      
 +      AC_CHECK_LIB(owcapi, OW_get, [with_libowcapi="yes"], [with_libowcapi="no (libowcapi not found)"])
 +
 +      LDFLAGS="$SAVE_LDFLAGS"
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_libowcapi" = "xyes"
 +then
 +      BUILD_WITH_LIBOWCAPI_CPPFLAGS="$with_libowcapi_cppflags"
 +      BUILD_WITH_LIBOWCAPI_LIBS="$with_libowcapi_libs"
 +      AC_SUBST(BUILD_WITH_LIBOWCAPI_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBOWCAPI_LIBS)
 +fi
 +
 +
  AC_ARG_WITH(libpcap, [AS_HELP_STRING([--with-libpcap@<:@=PREFIX@:>@], [Path to libpcap.])],
  [
        if test "x$withval" != "xno" && test "x$withval" != "xyes"
@@@ -1575,52 -1508,10 +1575,52 @@@ AC_DEFINE_UNQUOTED(COLLECT_LIBPCAP, [$c
        [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")
 +
  perl_interpreter="perl"
  AC_ARG_WITH(libperl, [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
  [
 -      if test "x$withval" != "xno" && test "x$withval" != "xyes"
 +      if test -x "$withval"
 +      then
 +              perl_interpreter="$withval"
 +              with_libperl="yes"
 +      else if test "x$withval" != "xno" && test "x$withval" != "xyes"
        then
                LDFLAGS="$LDFLAGS -L$withval/lib"
                CPPFLAGS="$CPPFLAGS -I$withval/include"
                with_libperl="yes"
        else
                with_libperl="$withval"
 -      fi
 +      fi; fi
  ],
  [
        with_libperl="yes"
@@@ -1638,7 -1529,7 +1638,7 @@@ AC_MSG_CHECKING([for perl]
  perl_interpreter=`which "$perl_interpreter" 2> /dev/null`
  if test -x "$perl_interpreter"
  then
 -      AC_MSG_RESULT([yes])
 +      AC_MSG_RESULT([yes ($perl_interpreter)])
  else
        perl_interpreter=""
        AC_MSG_RESULT([no])
      AC_LINK_IFELSE(
        AC_LANG_PROGRAM(
        [[
 +#define PERL_NO_GET_CONTEXT
  #include <EXTERN.h>
  #include <perl.h>
  #include <XSUB.h>
        ]],
        [[
 -       PerlInterpreter *perl = NULL;
 -       Perl_load_module (perl, PERL_LOADMOD_NOIMPORT,
 +       dTHX;
 +       load_module (PERL_LOADMOD_NOIMPORT,
                         newSVpv ("Collectd::Plugin::FooBar", 24),
                         Nullsv);
        ]]),
  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)"])
 +
  with_libupsclient="no (pkg-config isn't available)"
  with_libupsclient_cflags=""
  with_libupsclient_libs=""
        AC_SUBST(BUILD_WITH_OPENIPMI_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.])],
 +[
 +      if test "x$withval" = "xno"
 +      then
 +              with_libpq="no"
 +      else if 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"
 +              then
 +                      with_pg_config="$withval/bin/pg_config"
 +              fi; fi
 +              with_libpq="yes"
 +      fi; fi
 +],
 +[
 +      with_libpq="yes"
 +])
 +if test "x$with_libpq" = "xyes"
 +then
 +      with_libpq_includedir=`$with_pg_config --includedir 2> /dev/null`
 +      pg_config_status=$?
 +
 +      if test $pg_config_status -eq 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])
 +      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"
 +then
 +      with_libpq_libdir=`$with_pg_config --libdir 2> /dev/null`
 +      pg_config_status=$?
 +
 +      if test $pg_config_status -eq 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])
 +      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"
 +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)
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBPQ, test "x$with_libpq" = "xyes")
 +
  dnl Check for libvirt and libxml2 libraries.
  with_libxml2="no (pkg-config isn't available)"
  with_libxml2_cflags=""
@@@ -2479,7 -2278,13 +2479,13 @@@ AC_DEFUN
      ])
      if test "x$enable_plugin" = "xyes"
      then
-           AC_DEFINE([HAVE_PLUGIN_]my_toupper([$1]), 1, [Define to 1 if the $1 plugin is enabled.])
+           if test "x$2" = "xyes"
+           then
+                   AC_DEFINE([HAVE_PLUGIN_]my_toupper([$1]), 1, [Define to 1 if the $1 plugin is enabled.])
+           else # User passed "yes" but dependency checking yielded "no" => Dependency problem.
+                   dependency_error="yes"
+                   enable_plugin="no (dependency error)"
+           fi
      fi
      AM_CONDITIONAL([BUILD_PLUGIN_]my_toupper([$1]), test "x$enable_plugin" = "xyes")
      enable_$1="$enable_plugin"
@@@ -2493,6 -2298,7 +2499,7 @@@ AC_COLLECTD([debug],     [enable],  [fe
  AC_COLLECTD([daemon],    [disable], [feature], [daemon mode])
  AC_COLLECTD([getifaddrs],[enable],  [feature], [getifaddrs under Linux])
  
+ dependency_error="no"
  plugin_ascent="no"
  plugin_battery="no"
  plugin_cpu="no"
@@@ -2515,7 -2321,6 +2522,7 @@@ plugin_serial="no
  plugin_swap="no"
  plugin_tape="no"
  plugin_tcpconns="no"
 +plugin_thermal="no"
  plugin_users="no"
  plugin_vmem="no"
  plugin_vserver="no"
@@@ -2538,7 -2343,6 +2545,7 @@@ the
        plugin_serial="yes"
        plugin_swap="yes"
        plugin_tcpconns="yes"
 +      plugin_thermal="yes"
        plugin_vmem="yes"
        plugin_vserver="yes"
        plugin_wireless="yes"
        fi
  fi
  
 +if test "x$ac_system" = "xOpenBSD"
 +then
 +      plugin_tcpconns="yes"
 +fi
 +
  # Mac OS X devices
  if test "x$with_libiokit" = "xyes"
  then
        plugin_processes="yes"
  fi
  
 +if test "x$with_kvm_getprocs" = "xyes"
 +then
 +      plugin_processes="yes"
 +fi
 +
  if test "x$with_kvm_getswapinfo" = "xyes"
  then
        plugin_swap="yes"
  fi
  
 +if test "x$with_kvm_nlist" = "xyes"
 +then
 +      plugin_tcpconns="yes"
 +fi
 +
  if test "x$have_getutent" = "xyes"
  then
        plugin_users="yes"
@@@ -2687,14 -2476,12 +2694,14 @@@ AC_PLUGIN([battery],     [$plugin_batte
  AC_PLUGIN([cpu],         [$plugin_cpu],        [CPU usage statistics])
  AC_PLUGIN([cpufreq],     [$plugin_cpufreq],    [CPU frequency statistics])
  AC_PLUGIN([csv],         [yes],                [CSV output plugin])
 +AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
  AC_PLUGIN([df],          [$plugin_df],         [Filesystem usage statistics])
  AC_PLUGIN([disk],        [$plugin_disk],       [Disk usage statistics])
  AC_PLUGIN([dns],         [$with_libpcap],      [DNS traffic analysis])
  AC_PLUGIN([email],       [yes],                [EMail statistics])
  AC_PLUGIN([entropy],     [$plugin_entropy],    [Entropy statistics])
  AC_PLUGIN([exec],        [yes],                [Execution of external programs])
 +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])
@@@ -2713,13 -2500,10 +2720,13 @@@ 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_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([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])
@@@ -2732,7 -2516,6 +2739,7 @@@ AC_PLUGIN([tail],        [yes]
  AC_PLUGIN([tape],        [$plugin_tape],       [Tape drive statistics])
  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_PLUGIN([unixsock],    [yes],                [Unixsock communication plugin])
  AC_PLUGIN([users],       [$plugin_users],      [User statistics])
  AC_PLUGIN([uuid],        [yes],                [UUID as hostname plugin])
@@@ -2814,99 -2597,94 +2821,103 @@@ cat <<EOF
  
  Configuration:
    Libraries:
 -    libcurl . . . . . . $with_libcurl
 -    libiokit  . . . . . $with_libiokit
 -    libiptc . . . . . . $with_libiptc
 -    libkstat  . . . . . $with_kstat
 -    libkvm  . . . . . . $with_libkvm
 -    libmysql  . . . . . $with_libmysql
 -    libnetlink  . . . . $with_libnetlink
 -    libnetsnmp  . . . . $with_libnetsnmp
 -    liboconfig  . . . . $with_liboconfig
 -    libopenipmi . . . . $with_libopenipmipthread
 -    liboping  . . . . . $with_liboping
 -    libpcap . . . . . . $with_libpcap
 -    libperl . . . . . . $with_libperl
 -    libpthread  . . . . $with_libpthread
 -    librrd  . . . . . . $with_rrdtool
 -    libsensors  . . . . $with_lm_sensors
 -    libstatgrab . . . . $with_libstatgrab
 -    libupsclient  . . . $with_libupsclient
 -    libvirt . . . . . . $with_libvirt
 -    libxml2 . . . . . . $with_libxml2
 -    libxmms . . . . . . $with_libxmms
 +    libcurl . . . . . . . $with_libcurl
 +    libesmtp  . . . . . . $with_libesmtp
 +    libiokit  . . . . . . $with_libiokit
 +    libiptc . . . . . . . $with_libiptc
 +    libkstat  . . . . . . $with_kstat
 +    libkvm  . . . . . . . $with_libkvm
 +    libmysql  . . . . . . $with_libmysql
 +    libnetlink  . . . . . $with_libnetlink
 +    libnetsnmp  . . . . . $with_libnetsnmp
 +    libnotify . . . . . . $with_libnotify
 +    liboconfig  . . . . . $with_liboconfig
 +    libopenipmi . . . . . $with_libopenipmipthread
 +    liboping  . . . . . . $with_liboping
 +    libpcap . . . . . . . $with_libpcap
 +    libperl . . . . . . . $with_libperl
 +    libpthread  . . . . . $with_libpthread
 +    libpq . . . . . . . . $with_libpq
 +    librrd  . . . . . . . $with_rrdtool
 +    libsensors  . . . . . $with_lm_sensors
 +    libstatgrab . . . . . $with_libstatgrab
 +    libupsclient  . . . . $with_libupsclient
 +    libvirt . . . . . . . $with_libvirt
 +    libxml2 . . . . . . . $with_libxml2
 +    libxmms . . . . . . . $with_libxmms
  
    Features:
 -    daemon mode . . . . $enable_daemon
 -    debug . . . . . . . $enable_debug
 +    daemon mode . . . . $enable_daemon
 +    debug . . . . . . . $enable_debug
  
    Bindings:
 -    perl  . . . . . . . $with_perl_bindings
 +    perl  . . . . . . . $with_perl_bindings
  
    Modules:
 -    apache  . . . . . . $enable_apache
 -    apcups  . . . . . . $enable_apcups
 -    apple_sensors . . . $enable_apple_sensors
 -    ascent  . . . . . . $enable_ascent
 -    battery . . . . . . $enable_battery
 -    cpu . . . . . . . . $enable_cpu
 -    cpufreq . . . . . . $enable_cpufreq
 -    csv . . . . . . . . $enable_csv
 -    df  . . . . . . . . $enable_df
 -    disk  . . . . . . . $enable_disk
 -    dns . . . . . . . . $enable_dns
 -    email . . . . . . . $enable_email
 -    entropy . . . . . . $enable_entropy
 -    exec  . . . . . . . $enable_exec
 -    hddtemp . . . . . . $enable_hddtemp
 -    interface . . . . . $enable_interface
 -    iptables  . . . . . $enable_iptables
 -    ipmi  . . . . . . . $enable_ipmi
 -    ipvs  . . . . . . . $enable_ipvs
 -    irq . . . . . . . . $enable_irq
 -    libvirt . . . . . . $enable_libvirt
 -    load  . . . . . . . $enable_load
 -    logfile . . . . . . $enable_logfile
 -    mbmon . . . . . . . $enable_mbmon
 -    memcached . . . . . $enable_memcached
 -    memory  . . . . . . $enable_memory
 -    multimeter  . . . . $enable_multimeter
 -    mysql . . . . . . . $enable_mysql
 -    netlink . . . . . . $enable_netlink
 -    network . . . . . . $enable_network
 -    nfs . . . . . . . . $enable_nfs
 -    nginx . . . . . . . $enable_nginx
 -    ntpd  . . . . . . . $enable_ntpd
 -    nut . . . . . . . . $enable_nut
 -    perl  . . . . . . . $enable_perl
 -    ping  . . . . . . . $enable_ping
 -    powerdns  . . . . . $enable_powerdns
 -    processes . . . . . $enable_processes
 -    rrdtool . . . . . . $enable_rrdtool
 -    sensors . . . . . . $enable_sensors
 -    serial  . . . . . . $enable_serial
 -    snmp  . . . . . . . $enable_snmp
 -    swap  . . . . . . . $enable_swap
 -    syslog  . . . . . . $enable_syslog
 -    tail  . . . . . . . $enable_tail
 -    tape  . . . . . . . $enable_tape
 -    tcpconns  . . . . . $enable_tcpconns
 -    teamspeak2  . . . . $enable_teamspeak2
 -    unixsock  . . . . . $enable_unixsock
 -    users . . . . . . . $enable_users
 -    uuid  . . . . . . . $enable_uuid
 -    vmem  . . . . . . . $enable_vmem
 -    vserver . . . . . . $enable_vserver
 -    wireless  . . . . . $enable_wireless
 -    xmms  . . . . . . . $enable_xmms
 +    apache  . . . . . . . $enable_apache
 +    apcups  . . . . . . . $enable_apcups
 +    apple_sensors . . . . $enable_apple_sensors
 +    ascent  . . . . . . . $enable_ascent
 +    battery . . . . . . . $enable_battery
 +    cpu . . . . . . . . . $enable_cpu
 +    cpufreq . . . . . . . $enable_cpufreq
 +    csv . . . . . . . . . $enable_csv
 +    df  . . . . . . . . . $enable_df
 +    disk  . . . . . . . . $enable_disk
 +    dns . . . . . . . . . $enable_dns
 +    email . . . . . . . . $enable_email
 +    entropy . . . . . . . $enable_entropy
 +    exec  . . . . . . . . $enable_exec
 +    filecount . . . . . . $enable_filecount
 +    hddtemp . . . . . . . $enable_hddtemp
 +    interface . . . . . . $enable_interface
 +    iptables  . . . . . . $enable_iptables
 +    ipmi  . . . . . . . . $enable_ipmi
 +    ipvs  . . . . . . . . $enable_ipvs
 +    irq . . . . . . . . . $enable_irq
 +    libvirt . . . . . . . $enable_libvirt
 +    load  . . . . . . . . $enable_load
 +    logfile . . . . . . . $enable_logfile
 +    mbmon . . . . . . . . $enable_mbmon
 +    memcached . . . . . . $enable_memcached
 +    memory  . . . . . . . $enable_memory
 +    multimeter  . . . . . $enable_multimeter
 +    mysql . . . . . . . . $enable_mysql
 +    netlink . . . . . . . $enable_netlink
 +    network . . . . . . . $enable_network
 +    nfs . . . . . . . . . $enable_nfs
 +    nginx . . . . . . . . $enable_nginx
 +    notify_desktop  . . . $enable_notify_desktop
 +    notify_email  . . . . $enable_notify_email
 +    ntpd  . . . . . . . . $enable_ntpd
 +    nut . . . . . . . . . $enable_nut
 +    onewire . . . . . . . $enable_onewire
 +    perl  . . . . . . . . $enable_perl
 +    ping  . . . . . . . . $enable_ping
 +    postgresql  . . . . . $enable_postgresql
 +    powerdns  . . . . . . $enable_powerdns
 +    processes . . . . . . $enable_processes
 +    rrdtool . . . . . . . $enable_rrdtool
 +    sensors . . . . . . . $enable_sensors
 +    serial  . . . . . . . $enable_serial
 +    snmp  . . . . . . . . $enable_snmp
 +    swap  . . . . . . . . $enable_swap
 +    syslog  . . . . . . . $enable_syslog
 +    tail  . . . . . . . . $enable_tail
 +    tape  . . . . . . . . $enable_tape
 +    tcpconns  . . . . . . $enable_tcpconns
 +    teamspeak2  . . . . . $enable_teamspeak2
 +    thermal . . . . . . . $enable_thermal
 +    unixsock  . . . . . . $enable_unixsock
 +    users . . . . . . . . $enable_users
 +    uuid  . . . . . . . . $enable_uuid
 +    vmem  . . . . . . . . $enable_vmem
 +    vserver . . . . . . . $enable_vserver
 +    wireless  . . . . . . $enable_wireless
 +    xmms  . . . . . . . . $enable_xmms
  
  EOF
+ if test "x$dependency_error" = "xyes"; then
+       AC_MSG_ERROR("Some plugins are missing dependencies - see above summary for details")
+ fi
diff --combined src/configfile.c
@@@ -182,7 -182,8 +182,7 @@@ static int dispatch_global_option (cons
        else if (ci->values[0].type == OCONFIG_TYPE_NUMBER)
        {
                char tmp[128];
 -              snprintf (tmp, sizeof (tmp), "%lf", ci->values[0].value.number);
 -              tmp[127] = '\0';
 +              ssnprintf (tmp, sizeof (tmp), "%lf", ci->values[0].value.number);
                return (global_option_set (ci->key, tmp));
        }
        else if (ci->values[0].type == OCONFIG_TYPE_BOOLEAN)
@@@ -257,13 -258,13 +257,13 @@@ static int dispatch_value_plugin (cons
                int status = -1;
  
                if (ci->values[i].type == OCONFIG_TYPE_STRING)
 -                      status = snprintf (buffer_ptr, buffer_free, " %s",
 +                      status = ssnprintf (buffer_ptr, buffer_free, " %s",
                                        ci->values[i].value.string);
                else if (ci->values[i].type == OCONFIG_TYPE_NUMBER)
 -                      status = snprintf (buffer_ptr, buffer_free, " %lf",
 +                      status = ssnprintf (buffer_ptr, buffer_free, " %lf",
                                        ci->values[i].value.number);
                else if (ci->values[i].type == OCONFIG_TYPE_BOOLEAN)
 -                      status = snprintf (buffer_ptr, buffer_free, " %s",
 +                      status = ssnprintf (buffer_ptr, buffer_free, " %s",
                                        ci->values[i].value.boolean
                                        ? "true" : "false");
  
@@@ -547,7 -548,7 +547,7 @@@ static oconfig_item_t *cf_read_dir (con
                if ((de->d_name[0] == '.') || (de->d_name[0] == '\0'))
                        continue;
  
 -              status = snprintf (name, sizeof (name), "%s/%s",
 +              status = ssnprintf (name, sizeof (name), "%s/%s",
                                dir, de->d_name);
                if (status >= sizeof (name))
                {
@@@ -887,7 -888,11 +887,11 @@@ int cf_read (char *filename
                        dispatch_block (conf->children + i);
        }
  
+       oconfig_free (conf);
+       /* Read the default types.db if no `TypesDB' option was given. */
        if (cf_default_typesdb)
-               read_types_list (PLUGINDIR"/types.db"); /* FIXME: Configure path */
+               read_types_list (PLUGINDIR"/types.db");
        return (0);
  } /* int cf_read */
diff --combined src/netlink.c
@@@ -173,13 -173,12 +173,13 @@@ static void submit_one (const char *dev
    vl.time = time (NULL);
    sstrncpy (vl.host, hostname_g, sizeof (vl.host));
    sstrncpy (vl.plugin, "netlink", sizeof (vl.plugin));
 -  strncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
 +  sstrncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
 +  sstrncpy (vl.type, type, sizeof (vl.type));
  
    if (type_instance != NULL)
 -    strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
 +    sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
  
 -  plugin_dispatch_values (type, &vl);
 +  plugin_dispatch_values (&vl);
  } /* void submit_one */
  
  static void submit_two (const char *dev, const char *type,
    vl.time = time (NULL);
    sstrncpy (vl.host, hostname_g, sizeof (vl.host));
    sstrncpy (vl.plugin, "netlink", sizeof (vl.plugin));
 -  strncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
 +  sstrncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
 +  sstrncpy (vl.type, type, sizeof (vl.type));
  
    if (type_instance != NULL)
 -    strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
 +    sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance));
  
 -  plugin_dispatch_values (type, &vl);
 +  plugin_dispatch_values (&vl);
  } /* void submit_two */
  
  static int link_filter (const struct sockaddr_nl *sa,
 -    const struct nlmsghdr *nmh, void *args)
 +    struct nlmsghdr *nmh, void *args)
  {
    struct ifinfomsg *msg;
    int msg_len;
  } /* int link_filter */
  
  static int qos_filter (const struct sockaddr_nl *sa,
 -    const struct nlmsghdr *nmh, void *args)
 +    struct nlmsghdr *nmh, void *args)
  {
    struct tcmsg *msg;
    int msg_len;
    if (msg->tcm_ifindex >= iflist_len)
    {
      ERROR ("netlink plugin: qos_filter: msg->tcm_ifindex = %i "
-       ">= iflist_len = %i",
+       ">= iflist_len = %zu",
        msg->tcm_ifindex, iflist_len);
      return (-1);
    }
      if (strcmp (tc_type, "filter") == 0)
        numberic_id = msg->tcm_parent;
  
 -    snprintf (tc_inst, sizeof (tc_inst), "%s-%x:%x",
 +    ssnprintf (tc_inst, sizeof (tc_inst), "%s-%x:%x",
        (const char *) RTA_DATA (attrs[TCA_KIND]),
        numberic_id >> 16,
        numberic_id & 0x0000FFFF);
 -    tc_inst[sizeof (tc_inst) - 1] = '\0';
    }
  
    DEBUG ("netlink plugin: qos_filter: got %s for %s (%i).",
        struct gnet_stats_basic bs;
        char type_instance[DATA_MAX_NAME_LEN];
  
 -      snprintf (type_instance, sizeof (type_instance), "%s-%s",
 +      ssnprintf (type_instance, sizeof (type_instance), "%s-%s",
          tc_type, tc_inst);
 -      type_instance[sizeof (type_instance) - 1] = '\0';
  
        memset (&bs, '\0', sizeof (bs));
        memcpy (&bs, RTA_DATA (attrs_stats[TCA_STATS_BASIC]),
      struct tc_stats ts;
      char type_instance[DATA_MAX_NAME_LEN];
  
 -    snprintf (type_instance, sizeof (type_instance), "%s-%s",
 +    ssnprintf (type_instance, sizeof (type_instance), "%s-%s",
        tc_type, tc_inst);
 -    type_instance[sizeof (type_instance) - 1] = '\0';
  
      memset(&ts, '\0', sizeof (ts));
      memcpy(&ts, RTA_DATA (attrs[TCA_STATS]),
diff --combined src/network.c
@@@ -246,7 -246,7 +246,7 @@@ static int cache_flush (void
        return (0);
  } /* int cache_flush */
  
 -static int cache_check (const char *type, const value_list_t *vl)
 +static int cache_check (const value_list_t *vl)
  {
        char key[1024];
        time_t *value = NULL;
                return (-1);
  
        if (format_name (key, sizeof (key), vl->host, vl->plugin,
 -                              vl->plugin_instance, type, vl->type_instance))
 +                              vl->plugin_instance, vl->type, vl->type_instance))
                return (-1);
  
        pthread_mutex_lock (&cache_lock);
@@@ -678,12 -678,14 +678,12 @@@ static int parse_packet (void *buffer, 
        int status;
  
        value_list_t vl = VALUE_LIST_INIT;
 -      char type[DATA_MAX_NAME_LEN];
        notification_t n;
  
        DEBUG ("network plugin: parse_packet: buffer = %p; buffer_len = %i;",
                        buffer, buffer_len);
  
        memset (&vl, '\0', sizeof (vl));
 -      memset (&type, '\0', sizeof (type));
        memset (&n, '\0', sizeof (n));
        status = 0;
  
                        if ((vl.time > 0)
                                        && (strlen (vl.host) > 0)
                                        && (strlen (vl.plugin) > 0)
 -                                      && (strlen (type) > 0)
 -                                      && (cache_check (type, &vl) == 0))
 +                                      && (strlen (vl.type) > 0)
 +                                      && (cache_check (&vl) == 0))
                        {
 -                              plugin_dispatch_values (type, &vl);
 +                              plugin_dispatch_values (&vl);
                        }
                        else
                        {
                else if (pkg_type == TYPE_TYPE)
                {
                        status = parse_part_string (&buffer, &buffer_len,
 -                                      type, sizeof (type));
 +                                      vl.type, sizeof (vl.type));
                        if (status == 0)
 -                              sstrncpy (n.type, type, sizeof (n.type));
 +                              sstrncpy (n.type, vl.type, sizeof (n.type));
                }
                else if (pkg_type == TYPE_TYPE_INSTANCE)
                {
@@@ -1439,12 -1441,12 +1439,12 @@@ static int add_to_buffer (char *buffer
                sstrncpy (vl_def->plugin_instance, vl->plugin_instance, sizeof (vl_def->plugin_instance));
        }
  
 -      if (strcmp (type_def, ds->type) != 0)
 +      if (strcmp (type_def, vl->type) != 0)
        {
                if (write_part_string (&buffer, &buffer_size, TYPE_TYPE,
 -                                      ds->type, strlen (ds->type)) != 0)
 +                                      vl->type, strlen (vl->type)) != 0)
                        return (-1);
 -              sstrncpy (type_def, ds->type, sizeof (type_def));
 +              sstrncpy (type_def, vl->type, sizeof (type_def));
        }
  
        if (strcmp (vl_def->type_instance, vl->type_instance) != 0)
@@@ -1481,7 -1483,7 +1481,7 @@@ static int network_write (const data_se
        /* If the value is already in the cache, we have received it via the
         * network. We write it again if forwarding is activated. It's then in
         * the cache and should we receive it again we will ignore it. */
 -      status = cache_check (ds->type, vl);
 +      status = cache_check (vl);
        if ((network_config_forward == 0)
                        && (status != 0))
                return (0);
@@@ -1548,7 -1550,10 +1548,10 @@@ static int network_config (const char *
                fields_num = strsplit (val_cpy, fields, 3);
                if ((fields_num != 1)
                                && (fields_num != 2))
+               {
+                       sfree (val_cpy);
                        return (1);
+               }
                else if (fields_num == 2)
                {
                        if ((service = strchr (fields[1], '.')) != NULL)
                        network_add_listen_socket (node, service);
                else
                        network_add_sending_socket (node, service);
+               sfree (val_cpy);
        }
        else if (strcasecmp ("TimeToLive", key) == 0)
        {
@@@ -1765,14 -1772,7 +1770,14 @@@ static int network_init (void
        return (0);
  } /* int network_init */
  
 -static int network_flush (int timeout)
 +/* 
 + * The flush option of the network plugin cannot flush individual identifiers.
 + * All the values are added to a buffer and sent when the buffer is full, the
 + * requested value may or may not be in there, it's not worth finding out. We
 + * 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)
  {
        pthread_mutex_lock (&send_buffer_lock);
  
diff --combined src/utils_cache.c
@@@ -156,12 -156,13 +156,12 @@@ static int uc_send_notification (const 
      return (-1);
    }
  
 -  snprintf (n.message, sizeof (n.message),
 +  ssnprintf (n.message, sizeof (n.message),
        "%s has not been updated for %i seconds.", name,
        (int) (n.time - ce->last_update));
  
    pthread_mutex_unlock (&cache_lock);
  
 -  n.message[sizeof (n.message) - 1] = '\0';
    plugin_dispatch_notification (&n);
  
    return (0);
@@@ -298,6 -299,7 +298,7 @@@ int uc_check_timeout (void
        ERROR ("uc_check_timeout: c_avl_remove (%s) failed.", keys[i]);
        }
        sfree (keys[i]);
+       sfree (key);
        cache_free (ce);
      }
      else if (status == 1) /* persist */
      }
      else
      {
 -      WARNING ("uc_check_timeout: ut_check_interesting (%s) returned ",
 +      WARNING ("uc_check_timeout: ut_check_interesting (%s) returned "
          "invalid status %i.",
          keys[i], status);
      }
@@@ -449,9 -451,10 +450,9 @@@ int uc_update (const data_set_t *ds, co
    n.severity = NOTIF_OKAY;
    n.time = vl->time;
  
 -  snprintf (n.message, sizeof (n.message),
 +  ssnprintf (n.message, sizeof (n.message),
        "Received a value for %s. It was missing for %u seconds.",
        name, (unsigned int) update_delay);
 -  n.message[sizeof (n.message) - 1] = '\0';
  
    plugin_dispatch_notification (&n);
  
@@@ -522,7 -525,7 +523,7 @@@ gauge_t *uc_get_rate (const data_set_t 
    if (ret_num != ds->ds_num)
    {
      ERROR ("utils_cache: uc_get_rate: ds[%s] has %i values, "
 -      "but uc_get_rate_by_name returned %i.",
 +      "but uc_get_rate_by_name returned %zu.",
        ds->type, ds->ds_num, ret_num);
      sfree (ret);
      return (NULL);