--- /dev/null
+From 4bbfb2b9f391f273744163cfda7bec96671e9d9c Mon Sep 17 00:00:00 2001
+From: Florian Forster <octo@collectd.org>
+Date: Thu, 18 Apr 2013 06:25:58 +0200
+Subject: [PATCH 01/22] src/utils_mount.h: Add <stdio.h>.
+
+This is required on Solaris 10. Thanks to dannypoo@ for reporting this
+problem.
+
+Github: #306
+---
+ src/utils_mount.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/utils_mount.h b/src/utils_mount.h
+index 1f2403c..83f789b 100644
+--- a/src/utils_mount.h
++++ b/src/utils_mount.h
+@@ -26,6 +26,7 @@
+ #ifndef COLLECTD_UTILS_MOUNT_H
+ #define COLLECTD_UTILS_MOUNT_H 1
+
++#include <stdio.h>
+ #if HAVE_FS_INFO_H
+ # include <fs_info.h>
+ #endif
+--
+1.9.3
+
--- /dev/null
+From f2391b9da6127e4acd5b54b7ae6c2d585df0e2a0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Joaqu=C3=ADn=20Cuenca=20Abela?= <e98cuenc@gmail.com>
+Date: Wed, 29 May 2013 16:22:09 +0200
+Subject: [PATCH 02/22] Don't notify continuously when MySQL slave SQL thread
+ is running
+
+Signed-off-by: Florian Forster <octo@collectd.org>
+---
+ src/mysql.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/mysql.c b/src/mysql.c
+index 8b3cd21..f93a442 100644
+--- a/src/mysql.c
++++ b/src/mysql.c
+@@ -689,7 +689,7 @@ static int mysql_read_slave_stats (mysql_database_t *db, MYSQL *con)
+ ssnprintf (n.message, sizeof (n.message),
+ "slave SQL thread started");
+ plugin_dispatch_notification (&n);
+- db->slave_sql_running = 0;
++ db->slave_sql_running = 1;
+ }
+ }
+
+--
+1.9.3
+
--- /dev/null
+From bbbf37d55a3959951604c4be482e9a705a0f86d9 Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Tue, 7 Jan 2014 11:30:59 +0100
+Subject: [PATCH 03/22] curl_xml.c: avoid using uninitalized variable in error
+ message
+
+Thanks to @trtrmitya for reporting this. Fixes GH#507
+---
+ src/curl_xml.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/curl_xml.c b/src/curl_xml.c
+index 75f5cc3..77aee60 100644
+--- a/src/curl_xml.c
++++ b/src/curl_xml.c
+@@ -551,12 +551,12 @@ static int cx_curl_perform (cx_t *db, CURL *curl) /* {{{ */
+ char *ptr;
+ char *url;
+
+- db->buffer_fill = 0;
++ db->buffer_fill = 0;
+ status = curl_easy_perform (curl);
+ if (status != CURLE_OK)
+ {
+- ERROR ("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)",
+- status, db->curl_errbuf, url);
++ ERROR ("curl_xml plugin: curl_easy_perform failed with status %i: %s",
++ status, db->curl_errbuf);
+ return (-1);
+ }
+
+--
+1.9.3
+
--- /dev/null
+From 645dadb3fcc466e8880fda4eb23b21ad433631fc Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Tue, 7 Jan 2014 16:06:10 +0100
+Subject: [PATCH 04/22] interface.c: FreeBSD-10 support
+
+Quoting @trtrmitya in github issue #506 : "[...] it is broken on
+FreeBSD-10, in which getifaddrs() returns not only link level stats for
+a particular interface, but also entries for each IP configured on that
+interface. As a result if_submit() is called several times for each
+interface, which results in incorrect data being logged.
+
+I am attaching a patch which fixes a problem on FreeBSD (9/10), but it
+should work for every *BSD because [...] the getifaddrs implementation
+first appeared in BSDi BSD/OS."
+
+Many thanks to @trtrmitya for providing the patch !
+---
+ src/interface.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/src/interface.c b/src/interface.c
+index db998a3..9b566ea 100644
+--- a/src/interface.c
++++ b/src/interface.c
+@@ -213,18 +213,19 @@ static int interface_read (void)
+
+ for (if_ptr = if_list; if_ptr != NULL; if_ptr = if_ptr->ifa_next)
+ {
+- if ((if_data = (struct IFA_DATA *) if_ptr->ifa_data) == NULL)
+- continue;
++ if (if_ptr->ifa_addr != NULL && if_ptr->ifa_addr->sa_family == AF_LINK) {
++ if_data = (struct IFA_DATA *) if_ptr->ifa_data;
+
+- if_submit (if_ptr->ifa_name, "if_octets",
++ if_submit (if_ptr->ifa_name, "if_octets",
+ if_data->IFA_RX_BYTES,
+ if_data->IFA_TX_BYTES);
+- if_submit (if_ptr->ifa_name, "if_packets",
++ if_submit (if_ptr->ifa_name, "if_packets",
+ if_data->IFA_RX_PACKT,
+ if_data->IFA_TX_PACKT);
+- if_submit (if_ptr->ifa_name, "if_errors",
++ if_submit (if_ptr->ifa_name, "if_errors",
+ if_data->IFA_RX_ERROR,
+ if_data->IFA_TX_ERROR);
++ }
+ }
+
+ freeifaddrs (if_list);
+--
+1.9.3
+
--- /dev/null
+From cde09b547abbeb7595d91259fcc628504d0f55a9 Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Wed, 8 Jan 2014 18:05:40 +0100
+Subject: [PATCH 05/22] Revert "curl_xml.c: avoid using uninitalized variable
+ in error message"
+
+This reverts commit bbbf37d55a3959951604c4be482e9a705a0f86d9.
+
+A different fix for this problem was commited to the collectd-5.4 branch
+(8327ee64) and conflicts with this patch. Also, initializing url the
+same way as 8327ee64 does it, to avoid a merge conflict.
+---
+ src/curl_xml.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/curl_xml.c b/src/curl_xml.c
+index 77aee60..b941f02 100644
+--- a/src/curl_xml.c
++++ b/src/curl_xml.c
+@@ -550,13 +550,14 @@ static int cx_curl_perform (cx_t *db, CURL *curl) /* {{{ */
+ long rc;
+ char *ptr;
+ char *url;
++ url = db->url;
+
+- db->buffer_fill = 0;
++ db->buffer_fill = 0;
+ status = curl_easy_perform (curl);
+ if (status != CURLE_OK)
+ {
+- ERROR ("curl_xml plugin: curl_easy_perform failed with status %i: %s",
+- status, db->curl_errbuf);
++ ERROR ("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)",
++ status, db->curl_errbuf, url);
+ return (-1);
+ }
+
+--
+1.9.3
+
--- /dev/null
+From ddffda7a150cd3abdb6ec392b514a250e91e0c19 Mon Sep 17 00:00:00 2001
+From: Chris Lundquist <chris.lundquist@github.com>
+Date: Tue, 14 Jan 2014 18:33:13 -0800
+Subject: [PATCH 06/22] [network] set_thread_cbs so we initialize the right
+ threading mode in gcry_check_version
+
+Signed-off-by: Florian Forster <octo@collectd.org>
+---
+ src/network.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/network.c b/src/network.c
+index d0ff6bc..be82c6f 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -500,8 +500,8 @@ static void network_init_gcrypt (void) /* {{{ */
+ if (gcry_control (GCRYCTL_ANY_INITIALIZATION_P))
+ return;
+
+- gcry_check_version (NULL); /* before calling any other functions */
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
++ gcry_check_version (NULL); /* before calling *almost* any other functions */
+ gcry_control (GCRYCTL_INIT_SECMEM, 32768);
+ gcry_control (GCRYCTL_INITIALIZATION_FINISHED);
+ } /* }}} void network_init_gcrypt */
+--
+1.9.3
+
--- /dev/null
+From 5f2f969335757f31f42cd8bb7e38eb8c5fe5e56e Mon Sep 17 00:00:00 2001
+From: Florian Forster <octo@collectd.org>
+Date: Wed, 15 Jan 2014 23:47:33 +0100
+Subject: [PATCH 07/22] apache plugin: Call curl_global_init() from the init
+ function.
+
+This is a shot in the dark in trying to address #513. By calling this
+from an init() callback, I hope to be initializing the curl and gcrypt
+libraries before collectd becomes multi-threaded, avoiding the problems
+described in the issue.
+---
+ src/apache.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/src/apache.c b/src/apache.c
+index 899c21e..23bba3e 100644
+--- a/src/apache.c
++++ b/src/apache.c
+@@ -702,9 +702,18 @@ static int apache_read_host (user_data_t *user_data) /* {{{ */
+ return (0);
+ } /* }}} int apache_read_host */
+
++static int apache_init (void) /* {{{ */
++{
++ /* Call this while collectd is still single-threaded to avoid
++ * initialization issues in libgcrypt. */
++ curl_global_init (CURL_GLOBAL_SSL);
++ return (0);
++} /* }}} int apache_init */
++
+ void module_register (void)
+ {
+ plugin_register_complex_config ("apache", config);
++ plugin_register_init ("apache", apache_init);
+ } /* void module_register */
+
+ /* vim: set sw=8 noet fdm=marker : */
+--
+1.9.3
+
--- /dev/null
+From 793c2046de1ac04689d541a5e83513fe8e62578c Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Thu, 16 Jan 2014 00:30:42 +0100
+Subject: [PATCH 08/22] network: comment libgcrypt initalization process
+
+---
+ src/network.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/network.c b/src/network.c
+index be82c6f..f379a5c 100644
+--- a/src/network.c
++++ b/src/network.c
+@@ -500,8 +500,15 @@ static void network_init_gcrypt (void) /* {{{ */
+ if (gcry_control (GCRYCTL_ANY_INITIALIZATION_P))
+ return;
+
++ /* http://www.gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
++ * To ensure thread-safety, it's important to set GCRYCTL_SET_THREAD_CBS
++ * *before* initalizing Libgcrypt with gcry_check_version(), which itself must
++ * be called before any other gcry_* function. GCRYCTL_ANY_INITIALIZATION_P
++ * above doesn't count, as it doesn't implicitly initalize Libgcrypt.
++ *
++ * tl;dr: keep all these gry_* statements in this exact order please. */
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+- gcry_check_version (NULL); /* before calling *almost* any other functions */
++ gcry_check_version (NULL);
+ gcry_control (GCRYCTL_INIT_SECMEM, 32768);
+ gcry_control (GCRYCTL_INITIALIZATION_FINISHED);
+ } /* }}} void network_init_gcrypt */
+--
+1.9.3
+
--- /dev/null
+From 66b400ab01b8133e450bb002e175117a1ab6f9ae Mon Sep 17 00:00:00 2001
+From: Jeremy Katz <jeremy@katzbox.net>
+Date: Sun, 26 Jan 2014 20:43:19 -0500
+Subject: [PATCH 09/22] Call curl_global_init() in _init of plugins using curl
+
+Need to call curl_global_init() or curl_easy_init() during init
+for plugins when we're still running single threaded. This
+updates the remaining ones
+---
+ src/curl.c | 1 +
+ src/curl_json.c | 9 +++++++++
+ src/curl_xml.c | 9 +++++++++
+ src/write_http.c | 9 +++++++++
+ 4 files changed, 28 insertions(+)
+
+diff --git a/src/curl.c b/src/curl.c
+index 3899aaa..8d2893f 100644
+--- a/src/curl.c
++++ b/src/curl.c
+@@ -566,6 +566,7 @@ static int cc_init (void) /* {{{ */
+ INFO ("curl plugin: No pages have been defined.");
+ return (-1);
+ }
++ curl_global_init (CURL_GLOBAL_SSL);
+ return (0);
+ } /* }}} int cc_init */
+
+diff --git a/src/curl_json.c b/src/curl_json.c
+index 24e1df1..0948962 100644
+--- a/src/curl_json.c
++++ b/src/curl_json.c
+@@ -882,9 +882,18 @@ static int cj_read (user_data_t *ud) /* {{{ */
+ return cj_curl_perform (db, db->curl);
+ } /* }}} int cj_read */
+
++static int cj_init (void) /* {{{ */
++{
++ /* Call this while collectd is still single-threaded to avoid
++ * initialization issues in libgcrypt. */
++ curl_global_init (CURL_GLOBAL_SSL);
++ return (0);
++} /* }}} int cj_init */
++
+ void module_register (void)
+ {
+ plugin_register_complex_config ("curl_json", cj_config);
++ plugin_register_init ("curl_json", cj_init);
+ } /* void module_register */
+
+ /* vim: set sw=2 sts=2 et fdm=marker : */
+diff --git a/src/curl_xml.c b/src/curl_xml.c
+index b941f02..e31e73d 100644
+--- a/src/curl_xml.c
++++ b/src/curl_xml.c
+@@ -926,9 +926,18 @@ static int cx_config (oconfig_item_t *ci) /* {{{ */
+ return (0);
+ } /* }}} int cx_config */
+
++static int cx_init (void) /* {{{ */
++{
++ /* Call this while collectd is still single-threaded to avoid
++ * initialization issues in libgcrypt. */
++ curl_global_init (CURL_GLOBAL_SSL);
++ return (0);
++} /* }}} int cx_init */
++
+ void module_register (void)
+ {
+ plugin_register_complex_config ("curl_xml", cx_config);
++ plugin_register_init ("curl_xml", cx_init);
+ } /* void module_register */
+
+ /* vim: set sw=2 sts=2 et fdm=marker : */
+diff --git a/src/write_http.c b/src/write_http.c
+index 62c73b0..04c637b 100644
+--- a/src/write_http.c
++++ b/src/write_http.c
+@@ -656,9 +656,18 @@ static int wh_config (oconfig_item_t *ci) /* {{{ */
+ return (0);
+ } /* }}} int wh_config */
+
++static int wh_init (void) /* {{{ */
++{
++ /* Call this while collectd is still single-threaded to avoid
++ * initialization issues in libgcrypt. */
++ curl_global_init (CURL_GLOBAL_SSL);
++ return (0);
++} /* }}} int wh_init */
++
+ void module_register (void) /* {{{ */
+ {
+ plugin_register_complex_config ("write_http", wh_config);
++ plugin_register_init ("write_http", wh_init);
+ } /* }}} void module_register */
+
+ /* vim: set fdm=marker sw=8 ts=8 tw=78 et : */
+--
+1.9.3
+
--- /dev/null
+From 6bd48f2346c5072dc22da58c7b7cd8e8ceb83fc5 Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Sat, 29 Mar 2014 13:37:36 +0100
+Subject: [PATCH 10/22] indent wh_init() to be consistent with the rest of the
+ file
+
+---
+ src/write_http.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/write_http.c b/src/write_http.c
+index 04c637b..0a13444 100644
+--- a/src/write_http.c
++++ b/src/write_http.c
+@@ -658,10 +658,10 @@ static int wh_config (oconfig_item_t *ci) /* {{{ */
+
+ static int wh_init (void) /* {{{ */
+ {
+- /* Call this while collectd is still single-threaded to avoid
+- * initialization issues in libgcrypt. */
+- curl_global_init (CURL_GLOBAL_SSL);
+- return (0);
++ /* Call this while collectd is still single-threaded to avoid
++ * initialization issues in libgcrypt. */
++ curl_global_init (CURL_GLOBAL_SSL);
++ return (0);
+ } /* }}} int wh_init */
+
+ void module_register (void) /* {{{ */
+--
+1.9.3
+
--- /dev/null
+From 6207fce91a0933e852ec76fc31ca81ec00ffa04b Mon Sep 17 00:00:00 2001
+From: Wilfried Goesgens <dothebart@citadel.org>
+Date: Thu, 5 Jun 2014 20:04:13 +0200
+Subject: [PATCH 11/22] Configparser: when we alocate an empty list, we also
+ need to reset the counter; else we will trip over this later. This fixes
+ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=750440
+
+---
+ src/configfile.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/configfile.c b/src/configfile.c
+index 0b7786f..983d995 100644
+--- a/src/configfile.c
++++ b/src/configfile.c
+@@ -414,6 +414,12 @@ static int cf_ci_replace_child (oconfig_item_t *dst, oconfig_item_t *src,
+
+ /* Resize the memory containing the children to be big enough to hold
+ * all children. */
++ if (dst->children_num + src->children_num - 1 == 0)
++ {
++ dst->children_num = 0;
++ return (0);
++ }
++
+ temp = (oconfig_item_t *) realloc (dst->children,
+ sizeof (oconfig_item_t)
+ * (dst->children_num + src->children_num - 1));
+@@ -514,7 +520,8 @@ static int cf_include_all (oconfig_item_t *root, int depth)
+ continue;
+
+ /* Now replace the i'th child in `root' with `new'. */
+- cf_ci_replace_child (root, new, i);
++ if (cf_ci_replace_child (root, new, i) < 0)
++ return (-1);
+
+ /* ... and go back to the new i'th child. */
+ --i;
+--
+1.9.3
+
--- /dev/null
+From c2ca2a46e617878dcff69de0b8940ea91d3401cc Mon Sep 17 00:00:00 2001
+From: Lauri Tirkkonen <lotheac@iki.fi>
+Date: Thu, 22 May 2014 14:05:40 +0300
+Subject: [PATCH 12/22] don't assume pkg-config is in PATH
+
+---
+ configure.in | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index 0b12630..7086800 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1136,8 +1136,8 @@ AC_CHECK_LIB(hal,libhal_device_property_exists,
+ [with_libhal="no"])
+ if test "x$with_libhal" = "xyes"; then
+ if test "x$PKG_CONFIG" != "x"; then
+- BUILD_WITH_LIBHAL_CFLAGS="`pkg-config --cflags hal`"
+- BUILD_WITH_LIBHAL_LIBS="`pkg-config --libs hal`"
++ BUILD_WITH_LIBHAL_CFLAGS="`$PKG_CONFIG --cflags hal`"
++ BUILD_WITH_LIBHAL_LIBS="`$PKG_CONFIG --libs hal`"
+ AC_SUBST(BUILD_WITH_LIBHAL_CFLAGS)
+ AC_SUBST(BUILD_WITH_LIBHAL_LIBS)
+ fi
+@@ -3434,8 +3434,8 @@ then
+ if $PKG_CONFIG --exists tokyotyrant
+ then
+ with_libtokyotyrant_cppflags="$with_libtokyotyrant_cppflags `$PKG_CONFIG --cflags tokyotyrant`"
+- with_libtokyotyrant_ldflags="$with_libtokyotyrant_ldflags `pkg-config --libs-only-L tokyotyrant`"
+- with_libtokyotyrant_libs="$with_libtokyotyrant_libs `pkg-config --libs-only-l tokyotyrant`"
++ with_libtokyotyrant_ldflags="$with_libtokyotyrant_ldflags `$PKG_CONFIG --libs-only-L tokyotyrant`"
++ with_libtokyotyrant_libs="$with_libtokyotyrant_libs `$PKG_CONFIG --libs-only-l tokyotyrant`"
+ fi
+ fi
+
+@@ -3743,7 +3743,7 @@ with_libvirt_cflags=""
+ with_libvirt_ldflags=""
+ if test "x$PKG_CONFIG" != "x"
+ then
+- pkg-config --exists 'libxml-2.0' 2>/dev/null
++ $PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null
+ if test "$?" = "0"
+ then
+ with_libxml2="yes"
+@@ -3751,7 +3751,7 @@ then
+ with_libxml2="no (pkg-config doesn't know library)"
+ fi
+
+- pkg-config --exists libvirt 2>/dev/null
++ $PKG_CONFIG --exists libvirt 2>/dev/null
+ if test "$?" = "0"
+ then
+ with_libvirt="yes"
+@@ -3761,12 +3761,12 @@ then
+ fi
+ if test "x$with_libxml2" = "xyes"
+ then
+- with_libxml2_cflags="`pkg-config --cflags libxml-2.0`"
++ with_libxml2_cflags="`$PKG_CONFIG --cflags libxml-2.0`"
+ if test $? -ne 0
+ then
+ with_libxml2="no"
+ fi
+- with_libxml2_ldflags="`pkg-config --libs libxml-2.0`"
++ with_libxml2_ldflags="$PKG_CONFIG --libs libxml-2.0`"
+ if test $? -ne 0
+ then
+ with_libxml2="no"
+@@ -3806,12 +3806,12 @@ if test "x$with_libxml2" = "xyes"; then
+ fi
+ if test "x$with_libvirt" = "xyes"
+ then
+- with_libvirt_cflags="`pkg-config --cflags libvirt`"
++ with_libvirt_cflags="$PKG_CONFIG --cflags libvirt`"
+ if test $? -ne 0
+ then
+ with_libvirt="no"
+ fi
+- with_libvirt_ldflags="`pkg-config --libs libvirt`"
++ with_libvirt_ldflags="$PKG_CONFIG --libs libvirt`"
+ if test $? -ne 0
+ then
+ with_libvirt="no"
+--
+1.9.3
+
--- /dev/null
+From 497f5785e8b385f03b5fb5b15bdff8ba39e4699e Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Mon, 23 Jun 2014 18:00:01 +0200
+Subject: [PATCH 13/22] add missing backticks which broke the build
+
+---
+ configure.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/configure.in b/configure.in
+index 7086800..5dac543 100644
+--- a/configure.in
++++ b/configure.in
+@@ -3766,7 +3766,7 @@ then
+ then
+ with_libxml2="no"
+ fi
+- with_libxml2_ldflags="$PKG_CONFIG --libs libxml-2.0`"
++ with_libxml2_ldflags="`$PKG_CONFIG --libs libxml-2.0`"
+ if test $? -ne 0
+ then
+ with_libxml2="no"
+@@ -3806,12 +3806,12 @@ if test "x$with_libxml2" = "xyes"; then
+ fi
+ if test "x$with_libvirt" = "xyes"
+ then
+- with_libvirt_cflags="$PKG_CONFIG --cflags libvirt`"
++ with_libvirt_cflags="`$PKG_CONFIG --cflags libvirt`"
+ if test $? -ne 0
+ then
+ with_libvirt="no"
+ fi
+- with_libvirt_ldflags="$PKG_CONFIG --libs libvirt`"
++ with_libvirt_ldflags="`$PKG_CONFIG --libs libvirt`"
+ if test $? -ne 0
+ then
+ with_libvirt="no"
+--
+1.9.3
+
--- /dev/null
+From 0da910fb1bf2bd4982ca6541458c795ec296f398 Mon Sep 17 00:00:00 2001
+From: Marc Fournier <marc.fournier@camptocamp.com>
+Date: Fri, 8 Aug 2014 15:55:10 +0200
+Subject: [PATCH 14/22] snmp: free snmp_pdu struct allocated by
+ snmp_pdu_create()
+
+This should fix the leak reported in issue #610.
+---
+ src/snmp.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/snmp.c b/src/snmp.c
+index d440f7f..dacdede 100644
+--- a/src/snmp.c
++++ b/src/snmp.c
+@@ -1503,6 +1503,10 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
+ snmp_free_pdu (res);
+ res = NULL;
+
++ if (req != NULL)
++ snmp_free_pdu (req);
++ req = NULL;
++
+ if (status == 0)
+ csnmp_dispatch_table (host, data, instance_list_head, value_list_head);
+
+--
+1.9.3
+
--- /dev/null
+From 0afea60611f115a28b8ec331aba610e3038c1ef2 Mon Sep 17 00:00:00 2001
+From: Arthur Marble <arthur@info9.net>
+Date: Sun, 17 Aug 2014 17:34:04 -0500
+Subject: [PATCH 15/22] curl_xml plugin: Fixed tautological pointer comparison
+ error.
+
+Fixes: http://bugs.debian.org/758481
+Signed-off-by: Florian Forster <octo@collectd.org>
+---
+ src/curl_xml.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/curl_xml.c b/src/curl_xml.c
+index e31e73d..28b2ded 100644
+--- a/src/curl_xml.c
++++ b/src/curl_xml.c
+@@ -344,7 +344,7 @@ static int cx_handle_instance_xpath (xmlXPathContextPtr xpath_ctx, /* {{{ */
+ /* If the base xpath returns more than one block, the result is assumed to be
+ * a table. The `Instnce' option is not optional in this case. Check for the
+ * condition and inform the user. */
+- if (is_table && (vl->type_instance == NULL))
++ if (is_table)
+ {
+ WARNING ("curl_xml plugin: "
+ "Base-XPath %s is a table (more than one result was returned), "
+--
+1.9.3
+
--- /dev/null
+From 9d065b401c2c393bef5a6e58b5deeda7d59d4f39 Mon Sep 17 00:00:00 2001
+From: Ed Okerson <ed@okerson.com>
+Date: Mon, 11 Feb 2013 15:46:10 -0600
+Subject: [PATCH 16/22] Add support for OpenVPN 2.3.0 status files.
+
+Fix a bug that breaks this module if a server is running multiple instances of OpenVPN and one instance does not have any clients connected.
+---
+ src/openvpn.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 84 insertions(+), 6 deletions(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index 2aca414..d2b6f17 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -32,6 +32,7 @@
+ #define V1STRING "Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since\n"
+ #define V2STRING "HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)\n"
+ #define V3STRING "HEADER CLIENT_LIST Common Name Real Address Virtual Address Bytes Received Bytes Sent Connected Since Connected Since (time_t)\n"
++#define V4STRING "HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t),Username\n"
+ #define VSSTRING "OpenVPN STATISTICS\n"
+
+
+@@ -43,6 +44,7 @@ struct vpn_status_s
+ MULTI1 = 1, /* status-version 1 */
+ MULTI2, /* status-version 2 */
+ MULTI3, /* status-version 3 */
++ MULTI4, /* status-version 4 */
+ SINGLE = 10 /* currently no versions for single mode, maybe in the future */
+ } version;
+ char *name;
+@@ -452,13 +454,77 @@ static int multi3_read (char *name, FILE *fh)
+ return (read);
+ } /* int multi3_read */
+
++/* for reading status version 4 */
++static int multi4_read (char *name, FILE *fh)
++{
++ char buffer[1024];
++ char *fields[11];
++ const int max_fields = STATIC_ARRAY_SIZE (fields);
++ int fields_num, read = 0;
++ long long sum_users = 0;
++
++ while (fgets (buffer, sizeof (buffer), fh) != NULL)
++ {
++ fields_num = openvpn_strsplit (buffer, fields, max_fields);
++
++ /* status file is generated by openvpn/multi.c:multi_print_status()
++ * http://svn.openvpn.net/projects/openvpn/trunk/openvpn/multi.c
++ *
++ * The line we're expecting has 9 fields. We ignore all lines
++ * with more or less fields.
++ */
++ if (fields_num != 9)
++ continue;
++
++
++ if (strcmp (fields[0], "CLIENT_LIST") != 0)
++ continue;
++
++
++ if (collect_user_count)
++ /* If so, sum all users, ignore the individuals*/
++ {
++ sum_users += 1;
++ }
++ if (collect_individual_users)
++ {
++ if (new_naming_schema)
++ {
++ /* plugin inst = file name, type inst = fields[1] */
++ iostats_submit (name, /* vpn instance */
++ fields[1], /* "Common Name" */
++ atoll (fields[4]), /* "Bytes Received" */
++ atoll (fields[5])); /* "Bytes Sent" */
++ }
++ else
++ {
++ /* plugin inst = fields[1], type inst = "" */
++ iostats_submit (fields[1], /* "Common Name" */
++ NULL, /* unused when in multimode */
++ atoll (fields[4]), /* "Bytes Received" */
++ atoll (fields[5])); /* "Bytes Sent" */
++ }
++ }
++
++ read = 1;
++ }
++
++ if (collect_user_count)
++ {
++ numusers_submit(name, name, sum_users);
++ read = 1;
++ }
++
++ return (read);
++} /* int multi4_read */
++
+ /* read callback */
+ static int openvpn_read (void)
+ {
+ FILE *fh;
+- int i, read;
++ int i, vpn_read, read;
+
+- read = 0;
++ vpn_read = read = 0;
+
+ /* call the right read function for every status entry in the list */
+ for (i = 0; i < vpn_num; i++)
+@@ -476,23 +542,28 @@ static int openvpn_read (void)
+ switch (vpn_list[i]->version)
+ {
+ case SINGLE:
+- read = single_read(vpn_list[i]->name, fh);
++ vpn_read = single_read(vpn_list[i]->name, fh);
+ break;
+
+ case MULTI1:
+- read = multi1_read(vpn_list[i]->name, fh);
++ vpn_read = multi1_read(vpn_list[i]->name, fh);
+ break;
+
+ case MULTI2:
+- read = multi2_read(vpn_list[i]->name, fh);
++ vpn_read = multi2_read(vpn_list[i]->name, fh);
+ break;
+
+ case MULTI3:
+- read = multi3_read(vpn_list[i]->name, fh);
++ vpn_read = multi3_read(vpn_list[i]->name, fh);
++ break;
++
++ case MULTI4:
++ vpn_read = multi4_read(vpn_list[i]->name, fh);
+ break;
+ }
+
+ fclose (fh);
++ read += vpn_read;
+ }
+
+ return (read ? 0 : -1);
+@@ -549,6 +620,13 @@ static int version_detect (const char *filename)
+ version = MULTI3;
+ break;
+ }
++ /* searching for multi version 4 */
++ else if (strcmp (buffer, V4STRING) == 0)
++ {
++ DEBUG ("openvpn plugin: found status file version MULTI4");
++ version = MULTI4;
++ break;
++ }
+ }
+
+ if (version == 0)
+--
+1.9.3
+
--- /dev/null
+From 8516f9abb625fa7b9321e62307305aa6499be4e8 Mon Sep 17 00:00:00 2001
+From: Florian Forster <octo@collectd.org>
+Date: Sun, 14 Sep 2014 19:28:05 +0200
+Subject: [PATCH 17/22] openvpn plugin: Don't signal an error when no clients
+ are connected.
+
+In the multi1_read() function, an error (zero) was returned when no
+clients were currently connected to the OpenVPN server, because the
+"read" variable was initialized to zero and the while loop exited before
+it was set to one. This is not the intended behavior.
+
+Thanks to @srix for reporting this issue!
+
+Fixes: #731
+---
+ src/openvpn.c | 12 +++++-------
+ 1 file changed, 5 insertions(+), 7 deletions(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index d2b6f17..7d4e4a0 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -267,7 +267,7 @@ static int multi1_read (char *name, FILE *fh)
+ {
+ char buffer[1024];
+ char *fields[10];
+- int fields_num, read = 0, found_header = 0;
++ int fields_num, found_header = 0;
+ long long sum_users = 0;
+
+ /* read the file until the "ROUTING TABLE" line is found (no more info after) */
+@@ -314,17 +314,15 @@ static int multi1_read (char *name, FILE *fh)
+ atoll (fields[3])); /* "Bytes Sent" */
+ }
+ }
+-
+- read = 1;
+ }
+
++ if (ferror (fh))
++ return (0);
++
+ if (collect_user_count)
+- {
+ numusers_submit(name, name, sum_users);
+- read = 1;
+- }
+
+- return (read);
++ return (1);
+ } /* int multi1_read */
+
+ /* for reading status version 2 */
+--
+1.9.3
+
--- /dev/null
+From 5dbc1cfb4baff831f950b3c9de8c332bc9aa2b6e Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Wed, 17 Sep 2014 11:25:17 +0200
+Subject: [PATCH 18/22] openvpn: Remove boguous file handler check
+
+---
+ src/openvpn.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index 7d4e4a0..9598abc 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -316,9 +316,6 @@ static int multi1_read (char *name, FILE *fh)
+ }
+ }
+
+- if (ferror (fh))
+- return (0);
+-
+ if (collect_user_count)
+ numusers_submit(name, name, sum_users);
+
+--
+1.9.3
+
--- /dev/null
+From a45710a5a887d25ab0e04ce1553bb268013ef780 Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Tue, 16 Sep 2014 14:44:42 +0200
+Subject: [PATCH 19/22] openvpn: Ignore not fully established connections
+
+---
+ src/openvpn.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index 9598abc..6a0ffbd 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -292,6 +292,10 @@ static int multi1_read (char *name, FILE *fh)
+ if (fields_num < 4)
+ continue;
+
++ // Ignore not yet fully established connections
++ if (strcmp(fields[1], "UNDEF") == 0)
++ continue;
++
+ if (collect_user_count)
+ /* If so, sum all users, ignore the individuals*/
+ {
+@@ -347,6 +351,10 @@ static int multi2_read (char *name, FILE *fh)
+ if (strcmp (fields[0], "CLIENT_LIST") != 0)
+ continue;
+
++ // Ignore not yet fully established connections
++ if (strcmp(fields[0], "UNDEF") == 0)
++ continue;
++
+ if (collect_user_count)
+ /* If so, sum all users, ignore the individuals*/
+ {
+@@ -412,6 +420,10 @@ static int multi3_read (char *name, FILE *fh)
+ if (strcmp (fields[0], "CLIENT_LIST") != 0)
+ continue;
+
++ // Ignore not yet fully established connections
++ if (strcmp(fields[0], "UNDEF") == 0)
++ continue;
++
+ if (collect_user_count)
+ /* If so, sum all users, ignore the individuals*/
+ {
+@@ -475,6 +487,9 @@ static int multi4_read (char *name, FILE *fh)
+ if (strcmp (fields[0], "CLIENT_LIST") != 0)
+ continue;
+
++ // Ignore not yet fully established connections
++ if (strcmp(fields[0], "UNDEF") == 0)
++ continue;
+
+ if (collect_user_count)
+ /* If so, sum all users, ignore the individuals*/
+--
+1.9.3
+
--- /dev/null
+From 46e716ee8d4208924d10f57f9ed97c99674a6ef4 Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Wed, 17 Sep 2014 11:31:13 +0200
+Subject: [PATCH 20/22] openvpn: Make read functions robust like in
+ 8516f9abb625fa7b9321e62307305aa6499be4e8
+
+---
+ src/openvpn.c | 21 ++++++---------------
+ 1 file changed, 6 insertions(+), 15 deletions(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index 6a0ffbd..f686721 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -332,7 +332,7 @@ static int multi2_read (char *name, FILE *fh)
+ char buffer[1024];
+ char *fields[10];
+ const int max_fields = STATIC_ARRAY_SIZE (fields);
+- int fields_num, read = 0;
++ int fields_num;
+ long long sum_users = 0;
+
+ while (fgets (buffer, sizeof (buffer), fh) != NULL)
+@@ -379,17 +379,14 @@ static int multi2_read (char *name, FILE *fh)
+ atoll (fields[5])); /* "Bytes Sent" */
+ }
+ }
+-
+- read = 1;
+ }
+
+ if (collect_user_count)
+ {
+ numusers_submit(name, name, sum_users);
+- read = 1;
+ }
+
+- return (read);
++ return (1);
+ } /* int multi2_read */
+
+ /* for reading status version 3 */
+@@ -398,7 +395,7 @@ static int multi3_read (char *name, FILE *fh)
+ char buffer[1024];
+ char *fields[15];
+ const int max_fields = STATIC_ARRAY_SIZE (fields);
+- int fields_num, read = 0;
++ int fields_num;
+ long long sum_users = 0;
+
+ while (fgets (buffer, sizeof (buffer), fh) != NULL)
+@@ -447,18 +444,15 @@ static int multi3_read (char *name, FILE *fh)
+ atoll (fields[5])); /* "Bytes Sent" */
+ }
+ }
+-
+- read = 1;
+ }
+ }
+
+ if (collect_user_count)
+ {
+ numusers_submit(name, name, sum_users);
+- read = 1;
+ }
+
+- return (read);
++ return (1);
+ } /* int multi3_read */
+
+ /* for reading status version 4 */
+@@ -467,7 +461,7 @@ static int multi4_read (char *name, FILE *fh)
+ char buffer[1024];
+ char *fields[11];
+ const int max_fields = STATIC_ARRAY_SIZE (fields);
+- int fields_num, read = 0;
++ int fields_num;
+ long long sum_users = 0;
+
+ while (fgets (buffer, sizeof (buffer), fh) != NULL)
+@@ -515,17 +509,14 @@ static int multi4_read (char *name, FILE *fh)
+ atoll (fields[5])); /* "Bytes Sent" */
+ }
+ }
+-
+- read = 1;
+ }
+
+ if (collect_user_count)
+ {
+ numusers_submit(name, name, sum_users);
+- read = 1;
+ }
+
+- return (read);
++ return (1);
+ } /* int multi4_read */
+
+ /* read callback */
+--
+1.9.3
+
--- /dev/null
+From 41253b68808deade2a1866f0c24f4bbc029a92c2 Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Wed, 24 Sep 2014 14:38:04 +0200
+Subject: [PATCH 21/22] openvpn: Fix copy-and-paste error
+
+---
+ src/openvpn.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index f686721..2db3677 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -293,7 +293,7 @@ static int multi1_read (char *name, FILE *fh)
+ continue;
+
+ // Ignore not yet fully established connections
+- if (strcmp(fields[1], "UNDEF") == 0)
++ if (strcmp(fields[0], "UNDEF") == 0)
+ continue;
+
+ if (collect_user_count)
+--
+1.9.3
+
--- /dev/null
+From 3458d610e8b99eb88c2f06ad576b4f46e0169877 Mon Sep 17 00:00:00 2001
+From: Michael Tremer <michael.tremer@ipfire.org>
+Date: Fri, 26 Sep 2014 12:02:27 +0200
+Subject: [PATCH 22/22] openvpn: Change data type from COUNTER to DERIVE
+
+COUNTER is not what we want here, so we will use DERIVE.
+---
+ src/openvpn.c | 26 +++++++++++++-------------
+ src/types.db | 2 ++
+ 2 files changed, 15 insertions(+), 13 deletions(-)
+
+diff --git a/src/openvpn.c b/src/openvpn.c
+index 2db3677..d446e99 100644
+--- a/src/openvpn.c
++++ b/src/openvpn.c
+@@ -116,13 +116,13 @@ static void numusers_submit (char *pinst, char *tinst, gauge_t value)
+ } /* void numusers_submit */
+
+ /* dispatches stats about traffic (TCP or UDP) generated by the tunnel per single endpoint */
+-static void iostats_submit (char *pinst, char *tinst, counter_t rx, counter_t tx)
++static void iostats_submit (char *pinst, char *tinst, derive_t rx, derive_t tx)
+ {
+ value_t values[2];
+ value_list_t vl = VALUE_LIST_INIT;
+
+- values[0].counter = rx;
+- values[1].counter = tx;
++ values[0].derive = rx;
++ values[1].derive = tx;
+
+ /* NOTE ON THE NEW NAMING SCHEMA:
+ * using plugin_instance to identify each vpn config (and
+@@ -137,7 +137,7 @@ static void iostats_submit (char *pinst, char *tinst, counter_t rx, counter_t tx
+ if (pinst != NULL)
+ sstrncpy (vl.plugin_instance, pinst,
+ sizeof (vl.plugin_instance));
+- sstrncpy (vl.type, "if_octets", sizeof (vl.type));
++ sstrncpy (vl.type, "if_octets_derive", sizeof (vl.type));
+ if (tinst != NULL)
+ sstrncpy (vl.type_instance, tinst, sizeof (vl.type_instance));
+
+@@ -146,13 +146,13 @@ static void iostats_submit (char *pinst, char *tinst, counter_t rx, counter_t tx
+
+ /* dispatches stats about data compression shown when in single mode */
+ static void compression_submit (char *pinst, char *tinst,
+- counter_t uncompressed, counter_t compressed)
++ derive_t uncompressed, derive_t compressed)
+ {
+ value_t values[2];
+ value_list_t vl = VALUE_LIST_INIT;
+
+- values[0].counter = uncompressed;
+- values[1].counter = compressed;
++ values[0].derive = uncompressed;
++ values[1].derive = compressed;
+
+ vl.values = values;
+ vl.values_len = STATIC_ARRAY_SIZE (values);
+@@ -161,7 +161,7 @@ static void compression_submit (char *pinst, char *tinst,
+ if (pinst != NULL)
+ sstrncpy (vl.plugin_instance, pinst,
+ sizeof (vl.plugin_instance));
+- sstrncpy (vl.type, "compression", sizeof (vl.type));
++ sstrncpy (vl.type, "compression_dervice", sizeof (vl.type));
+ if (tinst != NULL)
+ sstrncpy (vl.type_instance, tinst, sizeof (vl.type_instance));
+
+@@ -175,11 +175,11 @@ static int single_read (char *name, FILE *fh)
+ const int max_fields = STATIC_ARRAY_SIZE (fields);
+ int fields_num, read = 0;
+
+- counter_t link_rx, link_tx;
+- counter_t tun_rx, tun_tx;
+- counter_t pre_compress, post_compress;
+- counter_t pre_decompress, post_decompress;
+- counter_t overhead_rx, overhead_tx;
++ derive_t link_rx, link_tx;
++ derive_t tun_rx, tun_tx;
++ derive_t pre_compress, post_compress;
++ derive_t pre_decompress, post_decompress;
++ derive_t overhead_rx, overhead_tx;
+
+ link_rx = 0;
+ link_tx = 0;
+diff --git a/src/types.db b/src/types.db
+index ad54240..03ec75b 100644
+--- a/src/types.db
++++ b/src/types.db
+@@ -18,6 +18,7 @@ cache_result value:COUNTER:0:4294967295
+ cache_size value:GAUGE:0:4294967295
+ charge value:GAUGE:0:U
+ compression uncompressed:COUNTER:0:U, compressed:COUNTER:0:U
++compression_derive uncompressed:DERIVE:0:U, compressed:DERIVE:0:U
+ compression_ratio value:GAUGE:0:2
+ connections value:COUNTER:0:U
+ conntrack entropy:GAUGE:0:4294967295
+@@ -74,6 +75,7 @@ if_dropped rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295
+ if_errors rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295
+ if_multicast value:COUNTER:0:4294967295
+ if_octets rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295
++if_octets_derive rx:DERIVE:0:U, tx:DERIVE:0:U
+ if_packets rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295
+ if_rx_errors value:COUNTER:0:4294967295
+ if_tx_errors value:COUNTER:0:4294967295
+--
+1.9.3
+