Merge branch 'collectd-4.3' into collectd-4.4
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 10 Jun 2008 15:09:46 +0000 (17:09 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 10 Jun 2008 15:09:46 +0000 (17:09 +0200)
1  2 
configure.in
src/disk.c
src/network.c
src/plugin.h

diff --combined configure.in
@@@ -57,7 -57,7 +57,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)
+ 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)
  
  # For ping library
  AC_CHECK_HEADERS(netinet/in_systm.h, [], [],
        LDFLAGS=$SAVE_LDFLAGS
  fi
  
 +if test "x$ac_system" = "xLinux"
 +then
 +      AC_ARG_VAR([KERNEL_DIR], [path to Linux kernel sources])
 +      if test -z "$KERNEL_DIR"
 +      then
 +              KERNEL_DIR="/lib/modules/`uname -r`/source"
 +      fi
 +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"
        AC_CHECK_LIB(iptc, iptc_init,
        [
                AC_DEFINE(HAVE_LIBIPTC, 1, [Define to 1 if you have the iptc library (-liptc).])
 -      ], [with_libiptc="no (libiptc not found)"])
 +      ],
 +      [
 +              with_libiptc="yes"
 +              with_own_libiptc="yes"
 +      ])
  fi
 -if test "x$with_libiptc" = "xyes"
 +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="no (libiptc/libiptc.h not found)"])
 +      ],
 +      [
 +              with_libiptc="yes"
 +              with_own_libiptc="yes"
 +      ])
  fi
  if test "x$with_libiptc" = "xyes"
  then
 -      collect_libiptc=1
 -else
 -      collect_libiptc=0
 +      SAVE_CFLAGS=$CFLAGS
 +      CFLAGS="$CFLAGS -I$KERNEL_DIR/include"
 +
 +      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"
 +      ])
 +
 +      CFLAGS=$SAVE_CFLAGS
  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"
 +then
 +      AC_DEFINE(OWN_LIBIPTC, 1, [Define to 1 if we use the shipped iptc library.])
 +fi
  
  with_snmp_config="net-snmp-config"
  with_snmp_cflags=""
  fi
  AM_CONDITIONAL(BUILD_WITH_LIBNETLINK, test "x$with_libnetlink" = "xyes")
  
 +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 Check for libvirt and libxml2 libraries.
  with_libxml2="no (pkg-config isn't available)"
  with_libxml2_cflags=""
@@@ -2078,6 -1966,7 +2078,6 @@@ with_libxml2_ldflags="
  with_libvirt="no (pkg-config isn't available)"
  with_libvirt_cflags=""
  with_libvirt_ldflags=""
 -PKG_PROG_PKG_CONFIG
  if test "x$PKG_CONFIG" != "x"
  then
        pkg-config --exists 'libxml-2.0' 2>/dev/null
@@@ -2292,7 -2181,6 +2292,7 @@@ AC_COLLECTD([debug],     [enable],  [fe
  AC_COLLECTD([daemon],    [disable], [feature], [daemon mode])
  AC_COLLECTD([getifaddrs],[enable],  [feature], [getifaddrs under Linux])
  
 +plugin_ascent="no"
  plugin_battery="no"
  plugin_cpu="no"
  plugin_cpufreq="no"
@@@ -2300,7 -2188,6 +2300,7 @@@ plugin_df="no
  plugin_disk="no"
  plugin_entropy="no"
  plugin_interface="no"
 +plugin_ipmi="no"
  plugin_ipvs="no"
  plugin_irq="no"
  plugin_libvirt="no"
@@@ -2315,7 -2202,6 +2315,7 @@@ plugin_swap="no
  plugin_tape="no"
  plugin_tcpconns="no"
  plugin_users="no"
 +plugin_vmem="no"
  plugin_vserver="no"
  plugin_wireless="no"
  
@@@ -2336,7 -2222,6 +2336,7 @@@ the
        plugin_serial="yes"
        plugin_swap="yes"
        plugin_tcpconns="yes"
 +      plugin_vmem="yes"
        plugin_vserver="yes"
        plugin_wireless="yes"
  
  # libstatgrab
  if test "x$with_libstatgrab" = "xyes"
  then
 +      plugin_cpu="yes"
 +      plugin_disk="yes"
        plugin_interface="yes"
        plugin_load="yes"
        plugin_memory="yes"
        plugin_swap="yes"
 +      plugin_users="yes"
 +fi
 +
 +if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"
 +then
 +      plugin_ascent="yes"
 +fi
 +
 +if test "x$with_libopenipmipthread" = "xyes"
 +then
 +      plugin_ipmi="yes"
  fi
  
  if test "x$have_processor_info" = "xyes"
@@@ -2464,7 -2336,6 +2464,7 @@@ collectd plugins:]
  AC_PLUGIN([apache],      [$with_libcurl],      [Apache httpd statistics])
  AC_PLUGIN([apcups],      [yes],                [Statistics of UPSes by APC])
  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([cpufreq],     [$plugin_cpufreq],    [CPU frequency statistics])
@@@ -2478,7 -2349,6 +2478,7 @@@ AC_PLUGIN([exec],        [yes]
  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([ipvs],        [$plugin_ipvs],       [IPVS connection statistics])
  AC_PLUGIN([irq],         [$plugin_irq],        [IRQ statistics])
  AC_PLUGIN([libvirt],     [$plugin_libvirt],    [Virtual machine statistics])
@@@ -2497,7 -2367,6 +2497,7 @@@ AC_PLUGIN([ntpd],        [yes]
  AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
  AC_PLUGIN([perl],        [$plugin_perl],       [Embed a Perl interpreter])
  AC_PLUGIN([ping],        [$with_liboping],     [Network latency 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])
@@@ -2505,14 -2374,11 +2505,14 @@@ AC_PLUGIN([serial],      [$plugin_seria
  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([tcpconns],    [$plugin_tcpconns],   [TCP connection statistics])
 +AC_PLUGIN([teamspeak2],  [yes],                [TeamSpeak2 server statistics])
  AC_PLUGIN([unixsock],    [yes],                [Unixsock communication plugin])
  AC_PLUGIN([users],       [$plugin_users],      [User statistics])
  AC_PLUGIN([uuid],        [yes],                [UUID as hostname plugin])
 +AC_PLUGIN([vmem],        [$plugin_vmem],       [Virtual memory statistics])
  AC_PLUGIN([vserver],     [$plugin_vserver],    [Linux VServer statistics])
  AC_PLUGIN([wireless],    [$plugin_wireless],   [Wireless statistics])
  AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
  AC_SUBST(PERL_BINDINGS)
  AC_SUBST(PERL_BINDINGS_OPTIONS)
  
 -AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/liboconfig/Makefile src/liboping/Makefile bindings/Makefile)
 +AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/libiptc/Makefile src/liboconfig/Makefile src/liboping/Makefile bindings/Makefile)
  
  if test "x$with_rrdtool" = "xyes" \
        && test "x$librrd_threadsafe" != "xyes"
        with_liboping="yes (shipped version)"
  fi
  
 +if test "x$with_libiptc" = "xyes" -a "x$with_own_libiptc" = "xyes"
 +then
 +      with_libiptc="yes (shipped version)"
 +fi
 +
  if test "x$with_libperl" = "xyes"
  then
        with_libperl="yes (version `$perl_interpreter -MConfig -e 'print $Config{version};'`)"
@@@ -2599,7 -2460,6 +2599,7 @@@ Configuration
      libnetlink  . . . . $with_libnetlink
      libnetsnmp  . . . . $with_libnetsnmp
      liboconfig  . . . . $with_liboconfig
 +    libopenipmi . . . . $with_libopenipmipthread
      liboping  . . . . . $with_liboping
      libpcap . . . . . . $with_libpcap
      libperl . . . . . . $with_libperl
      apache  . . . . . . $enable_apache
      apcups  . . . . . . $enable_apcups
      apple_sensors . . . $enable_apple_sensors
 +    ascent  . . . . . . $enable_ascent
      battery . . . . . . $enable_battery
      cpu . . . . . . . . $enable_cpu
      cpufreq . . . . . . $enable_cpufreq
      hddtemp . . . . . . $enable_hddtemp
      interface . . . . . $enable_interface
      iptables  . . . . . $enable_iptables
 +    ipmi  . . . . . . . $enable_ipmi
      ipvs  . . . . . . . $enable_ipvs
      irq . . . . . . . . $enable_irq
      libvirt . . . . . . $enable_libvirt
      nut . . . . . . . . $enable_nut
      perl  . . . . . . . $enable_perl
      ping  . . . . . . . $enable_ping
 +    powerdns  . . . . . $enable_powerdns
      processes . . . . . $enable_processes
      rrdtool . . . . . . $enable_rrdtool
      sensors . . . . . . $enable_sensors
      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
diff --combined src/disk.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/disk.c
 - * Copyright (C) 2005-2007  Florian octo Forster
 + * Copyright (C) 2005-2008  Florian octo Forster
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the
@@@ -22,7 -22,6 +22,7 @@@
  #include "collectd.h"
  #include "common.h"
  #include "plugin.h"
 +#include "utils_ignorelist.h"
  
  #if HAVE_MACH_MACH_TYPES_H
  #  include <mach/mach_types.h>
  #  define UINT_MAX 4294967295U
  #endif
  
 +#if HAVE_STATGRAB_H
 +# include <statgrab.h>
 +#endif
 +
  #if HAVE_IOKIT_IOKITLIB_H
  static mach_port_t io_master_port = MACH_PORT_NULL;
  /* #endif HAVE_IOKIT_IOKITLIB_H */
@@@ -102,50 -97,10 +102,50 @@@ static kstat_t *ksp[MAX_NUMDISK]
  static int numdisk = 0;
  /* #endif HAVE_LIBKSTAT */
  
 +#elif defined(HAVE_LIBSTATGRAB)
 +/* #endif HAVE_LIBKSTATGRAB */
 +
  #else
  # error "No applicable input method."
  #endif
  
 +static const char *config_keys[] =
 +{
 +      "Disk",
 +      "IgnoreSelected"
 +};
 +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 +
 +static ignorelist_t *ignorelist = NULL;
 +
 +static int disk_config (const char *key, const char *value)
 +{
 +  if (ignorelist == NULL)
 +    ignorelist = ignorelist_create (/* invert = */ 1);
 +  if (ignorelist == NULL)
 +    return (1);
 +
 +  if (strcasecmp ("Disk", key) == 0)
 +  {
 +    ignorelist_add (ignorelist, value);
 +  }
 +  else if (strcasecmp ("IgnoreSelected", key) == 0)
 +  {
 +    int invert = 1;
 +    if ((strcasecmp ("True", value) == 0)
 +      || (strcasecmp ("Yes", value) == 0)
 +      || (strcasecmp ("On", value) == 0))
 +      invert = 0;
 +    ignorelist_set_invert (ignorelist, invert);
 +  }
 +  else
 +  {
 +    return (-1);
 +  }
 +
 +  return (0);
 +} /* int disk_config */
 +
  static int disk_init (void)
  {
  #if HAVE_IOKIT_IOKITLIB_H
@@@ -203,10 -158,6 +203,10 @@@ static void disk_submit (const char *pl
        value_t values[2];
        value_list_t vl = VALUE_LIST_INIT;
  
 +      /* Both `ignorelist' and `plugin_instance' may be NULL. */
 +      if (ignorelist_match (ignorelist, plugin_instance) != 0)
 +        return;
 +
        values[0].counter = read;
        values[1].counter = write;
  
@@@ -452,7 -403,7 +452,7 @@@ static int disk_read (void
                major = atoll (fields[0]);
                minor = atoll (fields[1]);
  
-               disk_name = fields[2];
+               disk_name = fields[2 + fieldshift];
  
                for (ds = disklist, pre_ds = disklist; ds != NULL; pre_ds = ds, ds = ds->next)
                        if (strcmp (disk_name, ds->name) == 0)
                                        kio.KIO_ROPS, kio.KIO_WOPS);
                }
        }
 -#endif /* defined(HAVE_LIBKSTAT) */
 +/* #endif defined(HAVE_LIBKSTAT) */
 +
 +#elif defined(HAVE_LIBSTATGRAB)
 +      sg_disk_io_stats *ds;
 +      int disks, counter;
 +      char name[DATA_MAX_NAME_LEN];
 +      
 +      if ((ds = sg_get_disk_io_stats(&disks)) == NULL)
 +              return (0);
 +              
 +      for (counter=0; counter < disks; counter++) {
 +              strncpy(name, ds->disk_name, sizeof(name));
 +              name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */
 +              disk_submit (name, "disk_octets", ds->read_bytes, ds->write_bytes);
 +              ds++;
 +      }
 +#endif /* defined(HAVE_LIBSTATGRAB) */
  
        return (0);
  } /* int disk_read */
  
  void module_register (void)
  {
 -      plugin_register_init ("disk", disk_init);
 -      plugin_register_read ("disk", disk_read);
 +  plugin_register_config ("disk", disk_config,
 +      config_keys, config_keys_num);
 +  plugin_register_init ("disk", disk_init);
 +  plugin_register_read ("disk", disk_read);
  } /* void module_register */
diff --combined src/network.c
@@@ -183,7 -183,7 +183,7 @@@ static pthread_mutex_t send_buffer_loc
  
  static c_avl_tree_t      *cache_tree = NULL;
  static pthread_mutex_t  cache_lock = PTHREAD_MUTEX_INITIALIZER;
- static time_t           cache_flush_last;
+ static time_t           cache_flush_last = 0;
  static int              cache_flush_interval = 1800;
  
  /*
@@@ -1706,11 -1706,19 +1706,19 @@@ static int network_shutdown (void
        plugin_unregister_write ("network");
        plugin_unregister_shutdown ("network");
  
+       /* Let the init function do it's move again ;) */
+       cache_flush_last = 0;
        return (0);
  } /* int network_shutdown */
  
  static int network_init (void)
  {
+       /* Check if we were already initialized. If so, just return - there's
+        * nothing more to do (for now, that is). */
+       if (cache_flush_last != 0)
+               return (0);
        plugin_register_shutdown ("network", network_shutdown);
  
        send_buffer_ptr  = send_buffer;
        return (0);
  } /* int network_init */
  
 +static int network_flush (int timeout)
 +{
 +      pthread_mutex_lock (&send_buffer_lock);
 +
 +      if (((time (NULL) - cache_flush_last) >= timeout)
 +                      && (send_buffer_fill > 0))
 +      {
 +              flush_buffer ();
 +      }
 +
 +      pthread_mutex_unlock (&send_buffer_lock);
 +
 +      return (0);
 +} /* int network_flush */
 +
  void module_register (void)
  {
        plugin_register_config ("network", network_config,
                        config_keys, config_keys_num);
        plugin_register_init   ("network", network_init);
 +      plugin_register_flush   ("network", network_flush);
  } /* void module_register */
diff --combined src/plugin.h
@@@ -2,7 -2,7 +2,7 @@@
  #define PLUGIN_H
  /**
   * collectd - src/plugin.h
 - * Copyright (C) 2005-2007  Florian octo Forster
 + * Copyright (C) 2005-2008  Florian octo Forster
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the
@@@ -19,7 -19,6 +19,7 @@@
   *
   * Authors:
   *   Florian octo Forster <octo at verplant.org>
 + *   Sebastian Harl <sh at tokkee.org>
   **/
  
  #include "collectd.h"
@@@ -150,11 -149,8 +150,11 @@@ int plugin_load (const char *name)
  
  void plugin_init_all (void);
  void plugin_read_all (void);
 +void plugin_flush_all (int timeout);
  void plugin_shutdown_all (void);
  
 +int plugin_flush_one (int timeout, const char *name);
 +
  /*
   * The `plugin_register_*' functions are used to make `config', `init',
   * `read', `write' and `shutdown' functions known to the plugin
@@@ -171,8 -167,6 +171,8 @@@ int plugin_register_read (const char *n
                int (*callback) (void));
  int plugin_register_write (const char *name,
                int (*callback) (const data_set_t *ds, const value_list_t *vl));
 +int plugin_register_flush (const char *name,
 +              int (*callback) (const int));
  int plugin_register_shutdown (char *name,
                int (*callback) (void));
  int plugin_register_data_set (const data_set_t *ds);
@@@ -186,7 -180,6 +186,7 @@@ int plugin_unregister_complex_config (c
  int plugin_unregister_init (const char *name);
  int plugin_unregister_read (const char *name);
  int plugin_unregister_write (const char *name);
 +int plugin_unregister_flush (const char *name);
  int plugin_unregister_shutdown (const char *name);
  int plugin_unregister_data_set (const char *name);
  int plugin_unregister_log (const char *name);
@@@ -212,7 -205,9 +212,9 @@@ int plugin_dispatch_values (const char 
  
  int plugin_dispatch_notification (const notification_t *notif);
  
- void plugin_log (int level, const char *format, ...);
+ void plugin_log (int level, const char *format, ...)
+       __attribute__ ((format(printf,2,3)));
  #define ERROR(...)   plugin_log (LOG_ERR,     __VA_ARGS__)
  #define WARNING(...) plugin_log (LOG_WARNING, __VA_ARGS__)
  #define NOTICE(...)  plugin_log (LOG_NOTICE,  __VA_ARGS__)