Merge branch 'collectd-5.4' into collectd-5.5
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Tue, 26 Jul 2016 10:50:07 +0000 (12:50 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Tue, 26 Jul 2016 10:50:07 +0000 (12:50 +0200)
Conflicts:
ChangeLog
contrib/redhat/collectd.spec
version-gen.sh

1  2 
ChangeLog
src/daemon/meta_data.c
src/network.c

diff --combined ChangeLog
+++ b/ChangeLog
 -2016-07-26, Version 5.4.3
 -      * Build system: A deprecation warning has been removed. Thanks to
 -        Florian Forster.
 -      * Build system: An ordering issue when build the AMQP plugin was
 -        corrected. Thanks to Shahul Hameed.
 -      * Build system: Building the gmond plugin against recent libganglia
 -        versions has been added. Thanks to Marc Fournier. #1129
 -      * Build system: "collectd-tg" now builds on AIX. Thanks to Manuel Luis
 -        Sanmartín Rozada. #542
 -      * Build system: "version-gen.sh" portablility was improved. Thanks to
 -        Marc Fournier and Ruben Kerkhof.
 -      * Build system: Compiling utils_dns.c on Solaris has beed fixed. Thanks
 -        to Yves Mettier, Dagobert Michelsen and Florian Forster. #348
 -      * Build system: Default JDK detection got improved. Thanks to Ruben
 -        Kerkhof and Marc Fournier.
 -      * Build system: Detection and handling of librrd 1.6 and later has been
 -        fixed. Thanks to Ruben Kerkhof.
 -      * Build system: notify_email build options got corrected to make it
 -        build on non-GNU libc systems. Thanks to Marc Fournier.
 -      * Build system: Protobuf building and logging has been improved. Thanks
 -        to Ruben Kerkhof.
 -      * Build system: The "make distcheck" target was fixed to properly handle
 -        java build artifacts. Thanks to Florian Forster.
 -      * Build system: The configure script got fixed to work properly when
 -        called with "CC="gcc -Wall -Werror"" . Thanks to Marc Fournier.
 -      * Build system: The configure script will now fail if pkg-config isn't
 -        available. Thanks to Ruben Kerkhof.
 -      * Build system: The users plugin now builds properly on Solaris when
 -        libstatgrab is available. Thanks to Dagobert Michelsen. #1061
 -      * Build system: Various fixes have been done to improve library
 -        detection on FreeBSD. Thanks to Ruben Kerkhof.
 -      * collectd2html: Several perl errors have been corrected. Thanks to Ruud
 -        van Melick. #1103
 -      * collectd: A global gauge format-string is now used to avoid loss of
 -        precision. Thanks to Florian Forster. #1039
 -      * collectd: A race condition at plugin initialization time was fixed.
 -        Thanks to Jan Andres. #1316
 -      * collectd: Autoloading now properly sets plugin context, allowing
 -        plugins to determine the interval. Thanks to Florian Forster. #1069
 -      * collectd: Empty "Plugin" blocks are now supported by the configuration
 -        file parser. Thanks to Manuel Luis Sanmartín Rozada. #1035
 +2016-07-25, Version 5.5.2
 +      * collectd: A division by zero has been fixed in the
 +        "plugin_dispatch_multivalue()" function. Thanks to Corey Kosak.
        * collectd: The address of the Free Software Foundation has been fixed
          in GPL license headers. Thanks to Ruben Kerkhof.
 -      * collectd: Writing to a closed TCP socket is now properly handled.
 -        Thanks to Tamás Földesi. #1104
 -      * Documentation: iptables plugin: IPv6 configuration option has been
 -        added to the collectd.conf(5) manpage. Thanks to 'Marc Fournier''.
 -        #1496
 -      * AMQP plugin: The plugin was fixed to build against librabbitmq 0.6.0.
 -        Thanks to Remi Collet. #1008
 +      * Build system: Detection and handling of librrd 1.6 and later has been
 +        fixed. Thanks to Ruben Kerkof.
        * Apache plugin: A warning about a possible misconfiguration has been
          added. Thanks to Marc Fournier.
 -      * Apache plugin: The plugin was extended to parse the whole response,
 -        required to support Apache versions greater than 2.4.17. Thanks to
 -        Marc Fournier and Florian Forster. #1170, #1343
 -      * APC UPS plugin: Log messages are now prefixed with the plugin name.
 -        Thanks to Sergey. #1329
 -      * Bind plugin: The type_instance now gets properly sanitized. Thanks to
 -        Thomas Kho. #992
 -      * CPU plugin: Error messages on MacOSX have been improved. Thanks to
 -        Florian Forster. #22
 -      * cURL plugin: A typo in an error message got corrected. Thanks to Marc
 -        Fournier.
        * cURL, cURL-JSON and cURL-XML plugins: A memory leak when allocating
          more memory fails has been fixed. Thanks to Brandon Arp.
 -      * DF plugin: An bug preventing filesystems which don't report inodes
 -        such as btrfs has been corrected. Thanks to Marek Becka. #1096
 -      * DF plugin: Duplicate entries are no longer reported twice. Thanks to
 -        Stefan Brüns and Florian Forster. #1402
 -      * DF plugin: Legacy code for skipping "rootfs" mount points has been
 -        removed. Thanks to Marc Fournier. #1402
 -      * DF plugin: Legacy references to the "ReportReserved" option have been
 -        removed. Thanks to Marc Fournier.
 -      * DF plugin: Reading the mtab now uses a reentrant function when
 -        possible. Thanks to Ruben Kerkhof. #1163
 +      * DF plugin: A build issue on DragonFlyBSD has been fixed. Thanks to
 +        Ruben Kerkhof. #1575
        * Ethstat plugin: Code to strip leading whitespace from device names.
          This works around an issue in the VMXNet3 driver. Thanks to Thomas
          Guthmann. #1059
 -      * Exec plugin: A file descriptor leak when the plugin is configured to
 -        run as a non-existing user was corrected. Thanks to Gautam BT and Marc
 -        Fournier. #762
        * Exec plugin: A problem in the error handling of an fdopen() failure
          has been fixed. Thanks to @ciomaire.
 -      * Interface plugin: Documentation about regular expressions in the
 -        ignore list has been added. Thanks to Jakub Jankowski.
 -      * IRQ plugin: The "FIQ" line is now skipped as it doesn't contain any
 -        counter. Thanks to Ruben Kerkhof. #971
        * Modbus plugin: The debug output has been disabled by default. It is
          now only enabled when building with "--enable-debug". Thanks to Eric
          Sandeen and Marc Fournier.
 -      * MongoDB plugin: A memory leak has been fixed and some adaptations to
 -        the current API of the mongo-c-driver have been made. Thanks to
 -        Florian Forster. #956
        * Network plugin: A check for the initialization of secure memory has
 -        been added. Previously, failure to initialize this memory was ignored.
 -        Thanks to @yujokang. #1665
 +        been added. Previously, failure to initialize this memory was
 +        ignored. Thanks to @yujokang. #1665
        * Network plugin: A heap overflow has been fixed in the server code.
          This issue can be triggered remotely and is potentially exploitable.
          Thanks to Emilien Gaspar. CVE-2016-6254
 -      * Network plugin: The TimeToLive option handling was made more robust.
 -        Thanks to Tim Laszlo. #654
 -      * NTPd plugin: Documentation about the required "mode 7" has been added.
 -        Thanks to Jakub Jankowski.
 -      * NTPd plugin: Reporting of "time_offset-loop" was corrected to match
 -        the values from ntpq/ntpdc. Thanks to Pierre Fersing and Florian
 -        Forster. #1300
 -      * OpenVPN plugin: The plugin was fixe to avoid signaling an error when
 -        no clients were connected. Thanks to Florian Forster. #731
        * Perl plugin: Init callbacks have been changed to run essentially
          single-threaded to avoid race conditions by init functions which
          create additional threads. Thanks to Pavel Rochnyack. #1706
 -      * PF plugin and DNS plugin: These plugins have been fixed to build
 -        properly on OpenBSD again. Thanks to Ruben Kerkhof.
--      * Processes plugin: A compilation error on systems without "regex.h" has
--        been fixed. Thanks to Corey Kosak.
--      * Processes plugin: A memory leak on Solaris has been fixed. Thanks to
--        Jim Quinn.
 +      * Processes plugin: A warning about too long process names has been
 +        added. Thanks to Marc Fournier. #1284
 +      * Redis plugin: A memory leak in an error handling code path has been
 +        fixed. Thanks to Andrés J. Díaz.
 +      * Redis plugin: The data source type of the expired_keys metric has been
 +        corrected to "DERIVE". Thanks to Marc Falzon and Marc Fournier. #1483.
 +      * SMART plugin: A build dependency on libudev has been added. Thanks to
 +        Pavel Rochnyack. #1724
 +      * StatsD plugin: A deadlock on plugin shutdown has been fixed. Thanks to
 +        Pavel Rochnyack #1703
 +      * Write HTTP plugin: Freeing of memory holding HTTP headers during
 +        shutdown has been fixed. Thanks to Tolga Ceylan.
 +      * Write Sensu plugin: A segfault when the Tag was unset has been fixed.
 +        Thanks to Marc Fournier.
 +      * ZFS ARC plugin: The cache_operation-stolen metric has been removed for
 +        FreeBSD 10.2 and later. Thanks to Ruben Kerkhof. #1580
 +
 +2016-01-22, Version 5.5.1
 +      * Build system: Compilation errors have been avoided by correctly
 +        defining package name and version used by autoconf. Thanks to Nathan
 +        Berkley. #1063
 +      * Build system: Dependency ordering was fixed to ensure parallel builds
 +        work reliably. Thanks to Gustavo Zacarias. #1125
 +      * Build system: Error messages have been improved and building the unit
 +        tests has been fixed on Solaris. Thanks to Florian Forster and
 +        Dagobert Michelsen. #1077
 +      * Build system: The move of the "utils_ignorelist" functions has been
 +        reverted. This fixes build issues of numerous plugins. Thanks to
 +        Benjamin Drung;. #1323
 +      * Build system: The fhcount plugin has been restricted to Linux. Thanks
 +        to Ruben Kerkhof. #1195
 +      * Build system: Detection of header files for the turbostat plugin has
 +        been fixed. Thanks to Marc Fournier. #1075
 +      * collectd: The "LC_NUMERIC" locale is now forced, to prevent issues
 +        with some plugins on environments using a comma as decimal separator.
 +        Thanks to Florian Forster. #1237
 +      * Documentation: Some precisions related to the virt plugin have beed
 +        added. Thanks to Wojtek Bocer and Ruben Kerkhof.
 +      * Documentation: The CollectdInternalStats documentation has been
 +        improved. Thanks to Yves Mettier and Florian Forster.
 +      * Battery plugin: A missing Type has been added. Thanks to Marc
 +        Fournier. #1338
 +      * Bind plugin: An off-by-one error has been fixed: an index was checked
 +        against a wrong variable, which may lead to an out-of-bounds read.
 +        Thanks to Michal Humpula. #1123
 +      * Ceph plugin: JSON parsing has been refactored to support ceph 10.0.0
 +        and fixes several buffer overflows. Thanks to Florian Forster. #1350
 +      * CPU plugin: A Mac OS X specific bug has been fixed: the plugin
 +        expected an incorrect number of CPU states, resulting in failing read
 +        callbacks. This regression was introduced in 5.5.0. Thanks to Robert
 +        Viduya.
 +      * Disk plugin: Support for Mac OS X 10.10 has been added. Thanks to
 +        Robert Viduya. #1065
 +      * IPC plugin: Support for building with musl-libc has been added. Thanks
 +        to Natanael Copa. #1147
 +      * Log Logstash plugin: A segfault when using libyajl, version 1 was
 +        fixed. Thanks to Vincent Bernat. #1190
 +      * Log Logstash plugin: The timestamp is now ISO 8601 compliant. Thanks
 +        to Marc Fournier. #1132
 +      * memcached plugin: The Type of the listen-disabled metric was fixed.
 +        Thanks to Florian Forster. #1356
 +      * MySQL plugin: The Type used by Innodb_buffer_pool_pages_flushed was
 +        fixed. Thanks to Marek Becka. #1085
 +      * OpenLDAP plugin: A crash when using LDAPI (LDAP-over-IPC) got fixed.
 +        Thanks to Marek Becka. #1080
 +      * OpenLDAP plugin: Support for Mac OS X has been added. Thanks to Ruben
 +        Kerkhof. #1489
 +      * SMART plugin: A memory leak has been fixed. Thanks to Florian
 +        Schüller and Pierre-Yves Ritschard. #1076
 +      * Swap plugin: A regression that would lead to swap usage being reported
 +        in kilobytes (instead of bytes) has been fixed. Thanks to Marek Becka.
 +        #1071
 +      * Varnish plugin: Support for FreeBSD has been added. Thanks to Ruben
 +        Kerkhof. #1182
 +      * Varnish plugin: Support for versions 3 and 4 has been made more
 +        tolerant to minor changes in Varnish point releases. Thanks to Marc
 +        Fournier. #1302
 +      * virt plugin: A copy-and-paste mistake in an error message has been
 +        fixed. Thanks to Ruben Kerkhof. #1101
 +      * Write Kafka plugin: Support for Solaris has been added. Thanks to
 +        Shahul Hameed. #1171
 +      * Write Redis plugin: Dead code has been removed. Thanks to Brian Kelly.
 +        #1143
 +      * 27 patches have been applied to numerous plugins and core components,
 +        fixing various programming errors which were reported by scan-build,
 +        libasan, FBInfer, coverity-scan and clang: Thanks to Ruben Kerkhof,
 +        Florian Forster and Marek Becka.
 +      * Collectd::Unixsock: A Perl error got corrected. Thanks to Ciaran Mac
 +        An Iomaire. #1295
 +
 +2015-05-27, Version 5.5.0
 +      * Build system: Ability to make out-of-tree builds has been fixed.
 +        Thanks to Vincent Bernat. #792
 +      * Build system, Disk and Users plugins: Detection and use of libstatgrab
 +        ≧ 0.90 has been added. Thanks to Vincent Bernat. #445, #795, #806,
 +        #807, #908
 +      * Build system, Memory, CPU, TCPConns and Processes plugins: Numerous
 +        fixes related to OpenBSD support have been added. Thanks to Landry
 +        Breuil. #777, #778, #779, #808
 +      * Build system: Plugins now only export "module_register()". Thanks to
 +        Florian Forster.
 +      * Build system: Various cleanups and improvements have been done. Thanks
 +        to Marc Fournier.
 +      * collectd: Numerous internal changes and improvements to the daemon and
 +        the plugin API have been make. Thanks to Florian Forster, Pierre-Yves
 +        Ritschard and Alex Petrov. #512, #727
 +      * collectd: Numerous spelling mistakes have been corrected in comments
 +        and documentation and several error messages have been improved.
 +        Thanks to Ruben Kerkhof, Abhinav Upadhyay, Olivier Bazoud, Pierre-Yves
 +        Ritschard, Tim Smith, Moshe Zada, Katelyn Perry and Marc Fournier.
 +      * collectd: Rules/Targets can now be appended to existing Filter Chains.
 +        Thanks to Marc Falzon. #444
 +      * collectd: Failing Filter Chains destinations will now log the list of
 +        available write targets. Thanks to Wilfried Goesgens. #650, #1043
 +      * collectd: Support for process signaling and management by upstart and
 +        systemd has been implemented for the Linux platform. Thanks to
 +        Pierre-Yves Ritschard and Marc Fournier. #798, #811, #814
 +      * collectd: The "CollectInternalStats" option has been added. Thanks to
 +        Yves Mettier. #691
 +      * collectd: The daemon source code and dependencies have moved to the
 +        "src/daemon/" directory. Thanks to Florian Forster.
 +      * collectd: The new "MaxReadInterval" option allows to cap the
 +        exponential retry interval of plugins read errors. Thanks to Alexey
 +        Remizov and Florian Forster. #713
 +      * collectd: The "-P" command-line option now has precedence over the
 +        "PIDFile" option. Thanks to Thomas D. #553
 +      * collection.cgi: Various data-source related adjustments have been
 +        made. Thanks to Fabiano Pires and Sebastian Harl.
 +      * libcollectdclient: Now propagates errors when signing / encrypting
 +        network packets. Thanks to Florian Forster.
 +      * Configuration: Support for unquoted IPv6 addresses has been added.
 +        Thanks to Sebastian Harl. #489
 +      * Documentation: Various improvements have been done. Thanks to Florian
 +        Forster and Marc Fournier.
 +      * Examples: the sample C plugin has been updated to the current plugin
 +        API. Thanks to Sebastian Harl.
 +      * Licensing: The following components have been relicensed to the MIT
 +        license: the Apple Sensors, Ascent, DBI, E-Mail, Entropy, GenericJMX,
 +        gmond, LogFile, nginx, Notify Desktop, NTPd, NUT, olsrd, Perl, Ping,
 +        PostgreSQL, Protocols, RouterOS, RRDCacheD, SNMP, StatsD, SysLog,
 +        Table, Tail, UnixSock, vmem, VServer, Wireless, Write Riemann and XMMS
 +        plugins, the core collectd daemon, the collectdmon, collectd-nagios
 +        and collectd-tg utilities, all the Targets and Matches, liboconfig,
 +        most of the "utils_*" files and the plugin API.
 +      * Tests: A test suite has been added. Thanks to Florian Forster.
 +      * Threshold: The hysteresis calculation has been made more reliable.
 +        Thanks to Jan Kundrát. #581
 +      * Threshold: Various fixes and improvements have been made. Thanks to
 +        Manuel Luis Sanmartín Rozada. #649, #644
 +      * AMQP plugin: The "ConnectionRetryDelay" option has been added,
 +        allowing to delay reconnection. Thanks to Yoga Ramalingam and Marc
 +        Fournier. #833
 +      * AMQP plugin: The "QueueDurable" and "QueueAutoDelete" options have
 +        been added, giving control over queue creation and deletion. Thanks to
 +        David Blundell and Marc Fournier. #623
 +      * Apache, Ascent, BIND, cURL, cURL-JSON, cURL-XML, nginx and Write HTTP
 +        plugins: Customizing the "User-Agent" field is now possible at
 +        compile-time. Thanks to Jeremy Katz. #440
 +      * Apache, Ascent, BIND, cURL, cURL-JSON, cURL-XML, nginx plugins: The
 +        connection will be reset if it hasn't completed within the configured
 +        "Interval". The new "Timeout" option gives control over this behavior.
 +        Thanks to Jan Kundrát and Marc Fournier. #982, #983, #993
 +      * Apache, Ascent, cURL, cURL-JSON, cURL-XML, nginx, Write HTTP plugins:
 +        Allow usernames and passwords to contain colons if built against
 +        libcurl ≧ 7.19.1. Thanks to Marc Fournier. #695, #947
 +      * Apache plugin: The "SSLCiphers" option gives control over the
 +        encryption algorithms to use with TLS connections. Thanks to Toni
 +        Moreno. #946
 +      * Barometer plugin: This new plugin reads sensor data from various
 +        Freescale and Bosch digital barometers. Thanks to Tomas Menzl. #69,
 +        #693
 +      * Battery plugin: Reporting values as percentages and reporting degraded
 +        batteries has been added. Thanks to Florian Forster.
 +      * Battery plugin: Support for reading values from sysfs on Linux has
 +        been added. Thanks to Andy Parkins, Nicholas Humfrey, Peter Wu and
 +        Florian Forster. #725, #810, #998
 +      * Battery plugin: The value for current is no longer supplied unless the
 +        battery provides this information. Thanks to Florian Forster.
 +      * BIND plugin: Bind's XML v3 API is now supported; Thanks to Victor
 +        Berger, Bruno Prémont and Michal Humpula. #742, #847
 +      * Ceph plugin: This new plugin collects statistics from the Ceph
 +        distributed storage system. Thanks to Dan Ryder, Dennis Zou, Colin
 +        McCabe, Sage Weil. #522, #598
 +      * ConnTrack plugin: Support for reporting values as percentages as well
 +        as legacy conntrack files in "/proc" has been added. Thanks to
 +        Pierre-Yves Ritschard. #497, #680
 +      * CPU plugin: The plugin is now able to report values as percentages and
 +        aggregate values per-state and per-CPU. Thanks to Pierre-Yves
 +        Ritschard, Florian Forster, Fabien Wernli, Nicholas Humfrey and
 +        Wilfried Goesgens. #499, #516, #639 #734, #812, #802
 +      * cURL-JSON plugin: Extracting values from complex JSON structures has
 +        been enhanced. Thanks to Jim Radford. #408, #411
 +      * cURL-JSON plugin: Intervals can now be configured on a per-URL basis.
 +        Thanks to Stan Sawa. #685
 +      * cURL-JSON, cURL-XML, Write HTTP plugins: These plugins now also follow
 +        HTTP redirects. Thanks to Marc Fournier.
 +      * cURL, cURL-JSON, cURL-XML plugins: HTTP Digest authentication has been
 +        implemented. Thanks to Frank Cornelis. #482
 +      * DBI, Oracle, PostgreSQL plugins: A "MetadataFrom" parameter has been
 +        added which allows to set metadata from database columns. Thanks to
 +        Mark Wong. #317, #321
 +      * DBI plugin: Querying several databases in parallel is now possible.
 +        Thanks to Vincent Bernat. #453
 +      * Disk plugin: On the Linux platform, disk names can now get looked up
 +        in udev with the "UdevNameAttr" option. Thanks to Patrick Mooney. #537
 +      * Disk plugin: This plugin now collects several additional I/O-related
 +        metrics on the Linux platform. Thanks to Florian Forster and Michael
 +        Schenck. #705, #759
 +      * DRBD plugin: This new plugin reads Linux's Distributed Replicated
 +        Block Device (DRBD) statistics. Thanks to Tim Laszlo. #566, #700
 +      * Exec, UnixSock plugins: The "PUTNOTIF" command now allows to set
 +        metadata on notifications. Thanks to John-John Tedro. #416
 +      * fhcount plugin: This new plugin reports the number of used file
 +        handles. Thanks to Jiri Tyr. #1009
 +      * GenericJMX plugin: A Class Loader for "JMXConnectorFactory" has been
 +        added, allowing the plugin to work with JBOSS > 7. Thanks to Alexandre
 +        Moutot. #452
 +      * IPC plugin: This new plugin collects information related to shared
 +        memory. Thanks to Andrés J. Díaz. #925
 +      * Java plugin: Now uses the hostname defined in the configuration file.
 +        Thanks to Pierre-Yves Ritschard. #530, #681
 +      * Load plugin: The plugin is now able to report values as percentages.
 +        Thanks to Vedran Bartonicek and Pierre-Yves Ritschard. #344, #498
 +      * Log Logstash plugin: This new plugin writes collectd logs and events
 +        as Logstash JSON formatted events. Thanks to Pierre-Yves Ritschard.
 +        #360
 +      * LVM plugin: The plugin collects thin pool data volumes size, and no
 +        longer reports virtual volumes. Thanks to Benjamin Gilbert. #603
 +      * memcached plugin: "listen_disabled_num" are now also reported. Thanks
 +        to Matt Cottingham. #622
 +      * Memory plugin: Slab memory reporting on the Linux platform has been
 +        added. Thanks to Manuel CISSÉ and Marc Fournier. #560, #697
 +      * Memory plugin: The plugin is now able to report values as percentages.
 +        Thanks to Jeremy Katz, Florian Forster and Manuel CISSÉ. #501, #511,
 +        #559
 +      * Modbus plugin: Selecting between holding and input registers is now
 +        possible. Thanks to Jan Vitek. #338
 +      * Modbus plugin: Support for accessing devices through an RS-485 serial
 +        port has been added. Thanks to Eric Sandeen.
 +      * Multimeter plugin: This plugin isn't built by default on the AIX
 +        platform anymore. Thanks to Manuel Luis Sanmartin Rozada. #549, #684
 +      * MySQL and PostgreSQL plugins: Passing "127.0.0.1" as a host will now
 +        result in the global Hostname being used in metric names. Thanks to
 +        Jeremy Katz. #441
 +      * MySQL plugin: InnoDB, Select and Sort statistics collection has been
 +        added. Thanks to Wilson Felipe, Marek Becka and Pierre-Yves Ritschard.
 +        #248, #621, #699, #824
 +      * MySQL plugin: The "Alias" and "ConnectTimeout" options have been
 +        added. Thanks to William Tisäter.
 +      * Netlink plugin: Support for 64bit netlink counters has been added.
 +        Thanks to Marek Becka. #435
 +      * Network plugin: The "ReconnectInterval" configuration option has been
 +        added. Thanks to John Ferlito. #732
 +      * NFS plugin: Support for NFSv4.0 has been implemented. Thanks to Marek
 +        Becka. #550
 +      * OneWire plugin: Support for more temperature-providing sensor families
 +        has been added. Thanks to Tomasz Torcz. #672
 +      * OneWire plugin: Support for full OWFS path and more device families
 +        has been implemented. Thanks to Tomas Menzl. #68
 +      * OpenLDAP plugin: This new plugin reads monitoring information from
 +        OpenLDAP's "cn=Monitor" subtree. Thanks to Kimo Rosenbaum, Marc
 +        Fournier and Nicholas Humfrey. #719
 +      * OpenVPN plugin: Support for OpenVPN 2.3.0 has been implemented. Thanks
 +        to Ed Okerson. #252
 +      * OpenVZ plugin: Various improvements have been made, making the plugin
 +        report values like the other collectd plugins do. Thanks to Chris
 +        Lundquist. #264
 +      * Perl plugin: A new "listval_filter" method has been added, various
 +        internal cleanups and improvements have been made and a test suite has
 +        been added. Thanks to Matthias Bethke. #728
 +      * PostgreSQL plugin: The new "ExpireDelay" option allows skipping older
 +        values pending write when the database slows down. Thanks to Stephen
 +        O'Dor. #593
 +      * PowerDNS plugin: The plugin was updated for stats from pdns 3.4.3.
 +        Thanks to Ruben Kerkhof. #965
 +      * Processes plugin: A memory-usage related optimization for low-profile
 +        systems has been added. Thanks to Florian Forster. #652
 +      * Python plugin: Support for Python3 has been improved, "ModulePath" is
 +        now prepended to "sys.path", and the "get_dataset()" function has been
 +        added to the Python API. Thanks to Sven Trenkel and Patrick Browne.
 +        #890, #751, #771
 +      * Redis and Write_Redis plugins: The support library has been switched
 +        from credis to hiredis. Thanks to Andrés J. Díaz, Victor Seva, Marc
 +        Fournier, Johan Bergström, Michael Spiegle and brianpkelly. #296,
 +        #464, #475, #799, #1030
 +      * Redis plugin: Custom commands can now be used to fetch values stored
 +        in Redis. Thanks to Pierre-Yves Ritschard. #816
 +      * Redis plugin: Support for passwords up to 512 characters long has been
 +        added. Thanks to Jeremy Katz. #532
 +      * Sensors plugin: Support for lm_sensors' power sensors has been added.
 +        Thanks to Jan Kundrát. #571
 +      * SMART plugin: This new plugin collects SMART statistics from disk
 +        drives. Thanks to Vincent Bernat. #797
 +      * SNMP plugin: A blacklist/whitelist feature can now be used to filter
 +        which OIDs to collect. Thanks to Christophe Courtaut. #414
 +      * SNMP plugin: SNMPv3 authentication and encryption support has been
 +        implemented. Thanks to Michael Pilat. #362
 +      * SNMP plugin: Two error messages have been disambiguated. Thanks to
 +        Sergey. #939, #952
 +      * Swap plugin: The plugin is now able to report values as percentages.
 +        Thanks to Jeremy Katz and Florian Forster. #500, #510
 +      * Swap plugin: The plugin no longer fails on Linux systems where
 +        "SwapCached" isn't exposed by the kernel. Thanks to Florian Forster.
 +        #733
 +      * Tail plugin: "GaugeInc" and "GaugeAdd" options have been implemented.
 +        Thanks to Andre Ferraz. #673
 +      * Tail plugin: Intervals can now be configured on a per-File basis.
 +        Thanks to Tom Leaman. #446
 +      * TCPConns plugin: The "AllPortsSummary" option, allowing to summarize
 +        all connections, has been added. Thanks to Marek Becka. #488
 +      * TCPConns plugin: Three metrics were renamed on the AIX platform, for
 +        the sake of consistency. Thanks to Manuel Luis Sanmartín Rozada. #546
 +      * Turbostat plugin: This new plugin reads CPU frequency and C-state
 +        residency on modern Intel turbo-capable processors. Thanks to Vincent
 +        Brillault, Jean Delvare and Nicolas Iooss. #651
 +      * UnixSock plugin: The "GETTHRESHOLD" command has been re-added. Thanks
 +        to Manuel Luis Sanmartín Rozada. #674
 +      * Varnish plugin: Varnish 4 support has been added, as well as as
 +        monitoring metrics only available in Varnish 4. Thanks to Marc
 +        Fournier. #618, #783
 +      * virt plugin: Guests memory usage is now also collected. Thanks to
 +        Tiago Carvalho, jazzmes and Zollner Robert.
 +      * virt plugin: It is now possible to chose between using guests' name or
 +        UUID as plugin_instance. Thanks to Remi Ferrand. #385
 +      * virt plugin: The libvirt plugin has been renamed to virt. Thanks to
 +        Florian Forster.
 +      * Write Graphite plugin: When the connection to graphite fails,
 +        reconnection attempts are now limited to once per second. Thanks to
 +        Florian Forster. #625
 +      * Write HTTP plugin: Multi-instance support of this plugin has been
 +        improved. The "<URL "url">" block has been deprecated in favor of
 +        "<Node "identifier">". Thanks to Marc Fournier. #902
 +      * Write HTTP plugin: Several TLS-related configuration options have been
 +        added. Thanks to Ingmar Runge. #666
 +      * Write HTTP plugin: The "LowSpeedLimit" and "Timeout" options allow to
 +        reset slow/stalled network connections. Thanks to loginator17 and Marc
 +        Fournier. #752, #985
 +      * Write HTTP plugin: The size of the payload posted to the HTTP server
 +        can now be controlled with the "BufferSize" option. Thanks to Florian
 +        Forster. #722
 +      * Write Kafka plugin: This new plugin sends data to Apache Kafka, a
 +        distributed messaging queue. Thanks to Pierre-Yves Ritschard,
 +        ciomaire, Vincent Bernat, Marc Fournier. #670, #694, #794, #853, #014
 +      * Write Log plugin: This new plugin dispatches collected values to the
 +        configured log destination(s). Thanks to Pierre-Yves Ritschard. #886
 +      * Write Riemann plugin: Extra meta strings are now added as attributes
 +        in notifications. Thanks to John-John Tedro. #417
 +      * Write Riemann plugin: Notification message are now sent to the Riemann
 +        server via the description field. Thanks to Adrian Miron. #575
 +      * Write Riemann plugin: Support for custom attributes has been added.
 +        Thanks to Pierre-Yves Ritschard. #459
 +      * Write Riemann plugin: Support had been implemented for sending events
 +        to Riemann in batches (when using TCP), and is enabled by default.
 +        Thanks to Pierre-Yves Ritschard. #800
 +      * Write Riemann plugin: The "EventServicePrefix" option has been added,
 +        which adds a prefix to event service names. Thanks to Moshe Zada. #706
 +      * Write Riemann plugin: Threshold checks can now be passed down to the
 +        Riemann server. Thanks to Pierre-Yves Ritschard. #518
 +      * Write Sensu plugin: This new plugin submits values to Sensu, a stream
 +        processing and monitoring system. Thanks to Fabrice A. Marie and Marc
 +        Fournier. #912, #1001, #1016
 +      * Write TSDB plugin: This new plugin sends data to OpenTSDB, a scalable
 +        time series database. Thanks to Kevin Bowling, Florian Forster, Dallin
 +        Young, Michael Schenck and Pierre-Yves Ritschard. #703, #772, #945
 +      * ZFS ARC plugin: Support for ZFS-on-Linux has been added. Thanks to
 +        Marc Fournier and Wilfried Goesgens. #552
 +      * Zookeeper plugin: This new plugin reads data from the Apache Zookeeper
 +        "MNTR" command. Thanks to Jeremy Katz. #826
++=======
+       * Processes plugin and Swap plugin: These plugins have been corrected to
+         also work inside FreeBSD jails. Thanks to biancalana. #1019
+       * Processes plugin: A warning about too long process names has been
+         added. Thanks to Marc Fournier. #1284
+       * Processes plugin: Process counting on the FreeBSD and OpenBSD
+         platforms has been fixed. Thanks to Herve COMMOWICK. #1298
+       * Processes plugin: The plugin was fixed to work properly on Solaris.
+         Thanks to Jan Andres. #919
+       * Python plugin: A double-free bug got fixed. Thanks to Sven Trenkel.
+         #1285
+       * RRDtool plugin: A race condition leading to corrupt RRD file creation
+         has been fixed. Thanks to Manuel Luis Sanmartín Rozada. #1031
+       * SNMP plugin: The "Gauge32" signedness was corrected to match RFC1902.
+         Thanks to Nathan Ward. #1325
+       * StatsD plugin: A deadlock on plugin shutdown has been fixed. Thanks to
+         Pavel Rochnyack #1703
+       * StatsD plugin: A memory leak was corrected. Thanks to Florian Forster.
+         #997
+       * StatsD plugin: A symbol lookup error was fixed by properly linking the
+         plugin against libm. Thanks to Florian Forster.
+       * StatsD plugin: "utils_latency": Support for including values above
+         1000 in percentile calculation has been added. Thanks to Yoga
+         Ramalingam. #401
+       * StatsD plugin: "utils_latency": Two division by zero error conditions
+         have been corrected. Thanks to Wilfried Goesgens. #655
+       * StatsD plugin: Counters absolute counts are now also reported. Thanks
+         to Pierre-Yves Ritschard. #1311
+       * StatsD plugin: The plugin now emits NaN values when no timer event is
+         recorded. Thanks to Florian Forster. #1038, #1039
+       * StatsD plugin: The plugin was corrected to avoid crashing when
+         negative timer values are submitted. Thanks to Florian Forster. #1131
+       * Tail CSV plugin: The plugin was fixed to work properly with multiple
+         "Collect" options and a bug got fixed when no "TimeFrom" is specified.
+         Thanks to Manuel Luis Sanmartín Rozada and Florian Forster. #1032
+       * TCPConns plugin: A memory leak was fixed. Thanks to Florian Forster.
+         #1074
+       * TCPConns plugin: An bug causing collectd to enter an inifinite loop on
+         OpenBSD was fixed. Thanks to Landry Breuil. #1094
+       * Threshold plugin: Threshold configuration blocks can now be defined in
+         different files. Thanks to Michael Salmon. #551
+       * vmem plugin: Support for pgsteal in recent Linux kernels has been
+         added. Thanks to Jakub Jankowski. #1307
+       * vmem plugin: The DSType for nr_dirtied and nr_written was corrected to
+         report a derive. Thanks to Marek Becka. #1072
+       * Write Graphite plugin: Error handling when submitting metrics to the
+         server is now more robust. Thanks to Sam Pointer. #1364
+       * Write HTTP plugin: Freeing of memory holding HTTP headers during
+         shutdown has been fixed. Thanks to Tolga Ceylan.
+       * Write Redis plugin: Multi-Valued key was made easier to parse by
+         adding a "|" character as a delimiter. Thanks to brianpkelly and
+         Florian Forster. #1070
+       * Write Redis plugin: The timestamp format was corrected. Thanks to
+         Florian Forster.
+       * ZFS ARC plugin: The plugin was will not emit warning about missing
+         "l2_size" stats anymore. Thanks to Jan Andres. #919
+       * 152 patches have been applied to numerous plugins and core components,
+         fixing various programming errors which were reported by scan-build,
+         libasan, FBInfer, coverity-scan, clang and gcc-6: Thanks to Ruben
+         Kerkhof, Florian Forster, Marc Fournier, Corey Kosak, Laurent,
+         Claudius Zingerli and Fabien Wernli.
++>>>>>>> collectd-5.4
  
  2015-02-26, Version 5.4.2
        * Build system: Numerous fixes. Thanks to Bjørn Nordbø, Jim Radford,
  
  2008-07-15, Version 4.4.2
        * build system: Use pkg-config to detect the upsclient library.
 -      * collectd: Try even harder to determine the endianess of the
 +      * collectd: Try even harder to determine the endianness of the
          architecture collectd is being built on.
        * disk plugin: Fix for Linux 2.4: A wrong field was used as the name
          of disks.
  2008-08-30, Version 4.3.4
        * Build system: Improved detection of and linking with the statgrab
          library.
 -      * collectd: Portability fixes, especially to determine endianess more
 +      * collectd: Portability fixes, especially to determine endianness more
          reliable.
        * Various plugins: Fix format strings.
        * disk plugin: A fix for giving disks under Linux 2.4 the right names
diff --combined src/daemon/meta_data.c
index e1d0ec5,0000000..29236e2
mode 100644,000000..100644
--- /dev/null
@@@ -1,638 -1,0 +1,649 @@@
 +/**
 + * collectd - src/meta_data.c
 + * Copyright (C) 2008-2011  Florian octo Forster
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the "Software"),
 + * to deal in the Software without restriction, including without limitation
 + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 + * and/or sell copies of the Software, and to permit persons to whom the
 + * Software is furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 + * DEALINGS IN THE SOFTWARE.
 + *
 + * Authors:
 + *   Florian octo Forster <octo at collectd.org>
 + **/
 +
 +#include "collectd.h"
 +#include "plugin.h"
 +#include "meta_data.h"
 +
 +#include <pthread.h>
 +
 +/*
 + * Data types
 + */
 +union meta_value_u
 +{
 +  char    *mv_string;
 +  int64_t  mv_signed_int;
 +  uint64_t mv_unsigned_int;
 +  double   mv_double;
 +  _Bool    mv_boolean;
 +};
 +typedef union meta_value_u meta_value_t;
 +
 +struct meta_entry_s;
 +typedef struct meta_entry_s meta_entry_t;
 +struct meta_entry_s
 +{
 +  char         *key;
 +  meta_value_t  value;
 +  int           type;
 +  meta_entry_t *next;
 +};
 +
 +struct meta_data_s
 +{
 +  meta_entry_t   *head;
 +  pthread_mutex_t lock;
 +};
 +
 +/*
 + * Private functions
 + */
 +static char *md_strdup (const char *orig) /* {{{ */
 +{
 +  size_t sz;
 +  char *dest;
 +
 +  if (orig == NULL)
 +    return (NULL);
 +
 +  sz = strlen (orig) + 1;
 +  dest = (char *) malloc (sz);
 +  if (dest == NULL)
 +    return (NULL);
 +
 +  memcpy (dest, orig, sz);
 +
 +  return (dest);
 +} /* }}} char *md_strdup */
 +
 +static meta_entry_t *md_entry_alloc (const char *key) /* {{{ */
 +{
 +  meta_entry_t *e;
 +
 +  e = (meta_entry_t *) malloc (sizeof (*e));
 +  if (e == NULL)
 +  {
 +    ERROR ("md_entry_alloc: malloc failed.");
 +    return (NULL);
 +  }
 +  memset (e, 0, sizeof (*e));
 +
 +  e->key = md_strdup (key);
 +  if (e->key == NULL)
 +  {
 +    free (e);
 +    ERROR ("md_entry_alloc: md_strdup failed.");
 +    return (NULL);
 +  }
 +
 +  e->type = 0;
 +  e->next = NULL;
 +
 +  return (e);
 +} /* }}} meta_entry_t *md_entry_alloc */
 +
 +static meta_entry_t *md_entry_clone (const meta_entry_t *orig) /* {{{ */
 +{
 +  meta_entry_t *copy;
 +
 +  if (orig == NULL)
 +    return (NULL);
 +
 +  copy = md_entry_alloc (orig->key);
 +  if (copy == NULL)
 +    return (NULL);
 +  copy->type = orig->type;
 +  if (copy->type == MD_TYPE_STRING)
 +    copy->value.mv_string = strdup (orig->value.mv_string);
 +  else
 +    copy->value = orig->value;
 +
 +  copy->next = md_entry_clone (orig->next);
 +  return (copy);
 +} /* }}} meta_entry_t *md_entry_clone */
 +
 +static void md_entry_free (meta_entry_t *e) /* {{{ */
 +{
 +  if (e == NULL)
 +    return;
 +
 +  free (e->key);
 +
 +  if (e->type == MD_TYPE_STRING)
 +    free (e->value.mv_string);
 +
 +  if (e->next != NULL)
 +    md_entry_free (e->next);
 +
 +  free (e);
 +} /* }}} void md_entry_free */
 +
 +static int md_entry_insert (meta_data_t *md, meta_entry_t *e) /* {{{ */
 +{
 +  meta_entry_t *this;
 +  meta_entry_t *prev;
 +
 +  if ((md == NULL) || (e == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  prev = NULL;
 +  this = md->head;
 +  while (this != NULL)
 +  {
 +    if (strcasecmp (e->key, this->key) == 0)
 +      break;
 +
 +    prev = this;
 +    this = this->next;
 +  }
 +
 +  if (this == NULL)
 +  {
 +    /* This key does not exist yet. */
 +    if (md->head == NULL)
 +      md->head = e;
 +    else
 +    {
 +      assert (prev != NULL);
 +      prev->next = e;
 +    }
 +
 +    e->next = NULL;
 +  }
 +  else /* (this != NULL) */
 +  {
 +    if (prev == NULL)
 +      md->head = e;
 +    else
 +      prev->next = e;
 +
 +    e->next = this->next;
 +  }
 +
 +  pthread_mutex_unlock (&md->lock);
 +
 +  if (this != NULL)
 +  {
 +    this->next = NULL;
 +    md_entry_free (this);
 +  }
 +
 +  return (0);
 +} /* }}} int md_entry_insert */
 +
 +/* XXX: The lock on md must be held while calling this function! */
 +static meta_entry_t *md_entry_lookup (meta_data_t *md, /* {{{ */
 +    const char *key)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (NULL);
 +
 +  for (e = md->head; e != NULL; e = e->next)
 +    if (strcasecmp (key, e->key) == 0)
 +      break;
 +
 +  return (e);
 +} /* }}} meta_entry_t *md_entry_lookup */
 +
 +/*
++ * Each value_list_t*, as it is going through the system, is handled by exactly
++ * one thread. Plugins which pass a value_list_t* to another thread, e.g. the
++ * rrdtool plugin, must create a copy first. The meta data within a
++ * value_list_t* is not thread safe and doesn't need to be.
++ *
++ * The meta data associated with cache entries are a different story. There, we
++ * need to ensure exclusive locking to prevent leaks and other funky business.
++ * This is ensured by the uc_meta_data_get_*() functions.
++ */
++
++/*
 + * Public functions
 + */
 +meta_data_t *meta_data_create (void) /* {{{ */
 +{
 +  meta_data_t *md;
 +
 +  md = (meta_data_t *) malloc (sizeof (*md));
 +  if (md == NULL)
 +  {
 +    ERROR ("meta_data_create: malloc failed.");
 +    return (NULL);
 +  }
 +  memset (md, 0, sizeof (*md));
 +
 +  md->head = NULL;
 +  pthread_mutex_init (&md->lock, /* attr = */ NULL);
 +
 +  return (md);
 +} /* }}} meta_data_t *meta_data_create */
 +
 +meta_data_t *meta_data_clone (meta_data_t *orig) /* {{{ */
 +{
 +  meta_data_t *copy;
 +
 +  if (orig == NULL)
 +    return (NULL);
 +
 +  copy = meta_data_create ();
 +  if (copy == NULL)
 +    return (NULL);
 +
 +  pthread_mutex_lock (&orig->lock);
 +  copy->head = md_entry_clone (orig->head);
 +  pthread_mutex_unlock (&orig->lock);
 +
 +  return (copy);
 +} /* }}} meta_data_t *meta_data_clone */
 +
 +void meta_data_destroy (meta_data_t *md) /* {{{ */
 +{
 +  if (md == NULL)
 +    return;
 +
 +  md_entry_free (md->head);
 +  pthread_mutex_destroy (&md->lock);
 +  free (md);
 +} /* }}} void meta_data_destroy */
 +
 +int meta_data_exists (meta_data_t *md, const char *key) /* {{{ */
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  for (e = md->head; e != NULL; e = e->next)
 +  {
 +    if (strcasecmp (key, e->key) == 0)
 +    {
 +      pthread_mutex_unlock (&md->lock);
 +      return (1);
 +    }
 +  }
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return (0);
 +} /* }}} int meta_data_exists */
 +
 +int meta_data_type (meta_data_t *md, const char *key) /* {{{ */
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return -EINVAL;
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  for (e = md->head; e != NULL; e = e->next)
 +  {
 +    if (strcasecmp (key, e->key) == 0)
 +    {
 +      pthread_mutex_unlock (&md->lock);
 +      return e->type;
 +    }
 +  }
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return 0;
 +} /* }}} int meta_data_type */
 +
 +int meta_data_toc (meta_data_t *md, char ***toc) /* {{{ */
 +{
 +  int i = 0, count = 0;
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (toc == NULL))
 +    return -EINVAL;
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  for (e = md->head; e != NULL; e = e->next)
 +    ++count;    
 +
 +  if (count == 0)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (count);
 +  }
 +
 +  *toc = calloc(count, sizeof(**toc));
 +  for (e = md->head; e != NULL; e = e->next)
 +    (*toc)[i++] = strdup(e->key);
 +  
 +  pthread_mutex_unlock (&md->lock);
 +  return count;
 +} /* }}} int meta_data_toc */
 +
 +int meta_data_delete (meta_data_t *md, const char *key) /* {{{ */
 +{
 +  meta_entry_t *this;
 +  meta_entry_t *prev;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  prev = NULL;
 +  this = md->head;
 +  while (this != NULL)
 +  {
 +    if (strcasecmp (key, this->key) == 0)
 +      break;
 +
 +    prev = this;
 +    this = this->next;
 +  }
 +
 +  if (this == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (prev == NULL)
 +    md->head = this->next;
 +  else
 +    prev->next = this->next;
 +
 +  pthread_mutex_unlock (&md->lock);
 +
 +  this->next = NULL;
 +  md_entry_free (this);
 +
 +  return (0);
 +} /* }}} int meta_data_delete */
 +
 +/*
 + * Add functions
 + */
 +int meta_data_add_string (meta_data_t *md, /* {{{ */
 +    const char *key, const char *value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  e = md_entry_alloc (key);
 +  if (e == NULL)
 +    return (-ENOMEM);
 +
 +  e->value.mv_string = md_strdup (value);
 +  if (e->value.mv_string == NULL)
 +  {
 +    ERROR ("meta_data_add_string: md_strdup failed.");
 +    md_entry_free (e);
 +    return (-ENOMEM);
 +  }
 +  e->type = MD_TYPE_STRING;
 +
 +  return (md_entry_insert (md, e));
 +} /* }}} int meta_data_add_string */
 +
 +int meta_data_add_signed_int (meta_data_t *md, /* {{{ */
 +    const char *key, int64_t value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  e = md_entry_alloc (key);
 +  if (e == NULL)
 +    return (-ENOMEM);
 +
 +  e->value.mv_signed_int = value;
 +  e->type = MD_TYPE_SIGNED_INT;
 +
 +  return (md_entry_insert (md, e));
 +} /* }}} int meta_data_add_signed_int */
 +
 +int meta_data_add_unsigned_int (meta_data_t *md, /* {{{ */
 +    const char *key, uint64_t value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  e = md_entry_alloc (key);
 +  if (e == NULL)
 +    return (-ENOMEM);
 +
 +  e->value.mv_unsigned_int = value;
 +  e->type = MD_TYPE_UNSIGNED_INT;
 +
 +  return (md_entry_insert (md, e));
 +} /* }}} int meta_data_add_unsigned_int */
 +
 +int meta_data_add_double (meta_data_t *md, /* {{{ */
 +    const char *key, double value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  e = md_entry_alloc (key);
 +  if (e == NULL)
 +    return (-ENOMEM);
 +
 +  e->value.mv_double = value;
 +  e->type = MD_TYPE_DOUBLE;
 +
 +  return (md_entry_insert (md, e));
 +} /* }}} int meta_data_add_double */
 +
 +int meta_data_add_boolean (meta_data_t *md, /* {{{ */
 +    const char *key, _Bool value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL))
 +    return (-EINVAL);
 +
 +  e = md_entry_alloc (key);
 +  if (e == NULL)
 +    return (-ENOMEM);
 +
 +  e->value.mv_boolean = value;
 +  e->type = MD_TYPE_BOOLEAN;
 +
 +  return (md_entry_insert (md, e));
 +} /* }}} int meta_data_add_boolean */
 +
 +/*
 + * Get functions
 + */
 +int meta_data_get_string (meta_data_t *md, /* {{{ */
 +    const char *key, char **value)
 +{
 +  meta_entry_t *e;
 +  char *temp;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  e = md_entry_lookup (md, key);
 +  if (e == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (e->type != MD_TYPE_STRING)
 +  {
 +    ERROR ("meta_data_get_string: Type mismatch for key `%s'", e->key);
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  temp = md_strdup (e->value.mv_string);
 +  if (temp == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    ERROR ("meta_data_get_string: md_strdup failed.");
 +    return (-ENOMEM);
 +  }
 + 
 +  pthread_mutex_unlock (&md->lock);
 +
 +  *value = temp;
 +
 +  return (0);
 +} /* }}} int meta_data_get_string */
 +
 +int meta_data_get_signed_int (meta_data_t *md, /* {{{ */
 +    const char *key, int64_t *value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  e = md_entry_lookup (md, key);
 +  if (e == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (e->type != MD_TYPE_SIGNED_INT)
 +  {
 +    ERROR ("meta_data_get_signed_int: Type mismatch for key `%s'", e->key);
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  *value = e->value.mv_signed_int;
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return (0);
 +} /* }}} int meta_data_get_signed_int */
 +
 +int meta_data_get_unsigned_int (meta_data_t *md, /* {{{ */
 +    const char *key, uint64_t *value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  e = md_entry_lookup (md, key);
 +  if (e == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (e->type != MD_TYPE_UNSIGNED_INT)
 +  {
 +    ERROR ("meta_data_get_unsigned_int: Type mismatch for key `%s'", e->key);
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  *value = e->value.mv_unsigned_int;
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return (0);
 +} /* }}} int meta_data_get_unsigned_int */
 +
 +int meta_data_get_double (meta_data_t *md, /* {{{ */
 +    const char *key, double *value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  e = md_entry_lookup (md, key);
 +  if (e == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (e->type != MD_TYPE_DOUBLE)
 +  {
 +    ERROR ("meta_data_get_double: Type mismatch for key `%s'", e->key);
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  *value = e->value.mv_double;
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return (0);
 +} /* }}} int meta_data_get_double */
 +
 +int meta_data_get_boolean (meta_data_t *md, /* {{{ */
 +    const char *key, _Bool *value)
 +{
 +  meta_entry_t *e;
 +
 +  if ((md == NULL) || (key == NULL) || (value == NULL))
 +    return (-EINVAL);
 +
 +  pthread_mutex_lock (&md->lock);
 +
 +  e = md_entry_lookup (md, key);
 +  if (e == NULL)
 +  {
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  if (e->type != MD_TYPE_BOOLEAN)
 +  {
 +    ERROR ("meta_data_get_boolean: Type mismatch for key `%s'", e->key);
 +    pthread_mutex_unlock (&md->lock);
 +    return (-ENOENT);
 +  }
 +
 +  *value = e->value.mv_boolean;
 +
 +  pthread_mutex_unlock (&md->lock);
 +  return (0);
 +} /* }}} int meta_data_get_boolean */
 +
 +/* vim: set sw=2 sts=2 et fdm=marker : */
diff --combined src/network.c
@@@ -120,8 -120,6 +120,8 @@@ struct sockent_clien
        gcry_cipher_hd_t cypher;
        unsigned char password_hash[32];
  #endif
 +      cdtime_t next_resolve_reconnect;
 +      cdtime_t resolve_interval;
  };
  
  struct sockent_server
@@@ -529,7 -527,7 +529,7 @@@ static void network_init_gcrypt (void) 
    err = gcry_control (GCRYCTL_INIT_SECMEM, 32768);
    if (err)
    {
-     ERROR ("network plugin: gcry_control (GCRYCTL_SET_THREAD_CBS) failed: %s", gcry_strerror (err));
+     ERROR ("network plugin: gcry_control (GCRYCTL_INIT_SECMEM) failed: %s", gcry_strerror (err));
      abort ();
    }
  
@@@ -939,19 -937,15 +939,19 @@@ static int parse_part_number (void **re
  } /* int parse_part_number */
  
  static int parse_part_string (void **ret_buffer, size_t *ret_buffer_len,
 -              char *output, int output_len)
 +              char *output, size_t const output_len)
  {
        char *buffer = *ret_buffer;
        size_t buffer_len = *ret_buffer_len;
  
        uint16_t tmp16;
 -      size_t header_size = 2 * sizeof (uint16_t);
 +      size_t const header_size = 2 * sizeof (uint16_t);
  
        uint16_t pkg_length;
 +      size_t payload_size;
 +
 +      if (output_len <= 0)
 +              return (EINVAL);
  
        if (buffer_len < header_size)
        {
        memcpy ((void *) &tmp16, buffer, sizeof (tmp16));
        buffer += sizeof (tmp16);
        pkg_length = ntohs (tmp16);
 +      payload_size = ((size_t) pkg_length) - header_size;
  
        /* Check that packet fits in the input buffer */
        if (pkg_length > buffer_len)
        /* Check that the package data fits into the output buffer.
         * The previous if-statement ensures that:
         * `pkg_length > header_size' */
 -      if ((output_len < 0)
 -                      || ((size_t) output_len < ((size_t) pkg_length - header_size)))
 +      if (output_len < payload_size)
        {
                WARNING ("network plugin: parse_part_string: "
 -                              "Output buffer too small.");
 +                              "Buffer too small: "
 +                              "Output buffer holds %zu bytes, "
 +                              "which is too small to hold the received "
 +                              "%zu byte string.",
 +                              output_len, payload_size);
                return (-1);
        }
  
        /* All sanity checks successfull, let's copy the data over */
 -      output_len = pkg_length - header_size;
 -      memcpy ((void *) output, (void *) buffer, output_len);
 -      buffer += output_len;
 +      memcpy ((void *) output, (void *) buffer, payload_size);
 +      buffer += payload_size;
  
        /* For some very weird reason '\0' doesn't do the trick on SPARC in
         * this statement. */
 -      if (output[output_len - 1] != 0)
 +      if (output[payload_size - 1] != 0)
        {
                WARNING ("network plugin: parse_part_string: "
                                "Received string does not end "
@@@ -2057,8 -2048,6 +2057,8 @@@ static sockent_t *sockent_create (int t
        {
                se->data.client.fd = -1;
                se->data.client.addr = NULL;
 +              se->data.client.resolve_interval = 0;
 +              se->data.client.next_resolve_reconnect = 0;
  #if HAVE_LIBGCRYPT
                se->data.client.security_level = SECURITY_LEVEL_NONE;
                se->data.client.username = NULL;
@@@ -2125,26 -2114,6 +2125,26 @@@ static int sockent_init_crypto (sockent
        return (0);
  } /* }}} int sockent_init_crypto */
  
 +static int sockent_client_disconnect (sockent_t *se) /* {{{ */
 +{
 +      struct sockent_client *client;
 +
 +      if ((se == NULL) || (se->type != SOCKENT_TYPE_CLIENT))
 +              return (EINVAL);
 +
 +      client = &se->data.client;
 +      if (client->fd >= 0) /* connected */
 +      {
 +              close (client->fd);
 +              client->fd = -1;
 +      }
 +
 +      sfree (client->addr);
 +      client->addrlen = 0;
 +
 +      return (0);
 +} /* }}} int sockent_client_disconnect */
 +
  static int sockent_client_connect (sockent_t *se) /* {{{ */
  {
        static c_complain_t complaint = C_COMPLAIN_INIT_STATIC;
        struct addrinfo  ai_hints;
        struct addrinfo *ai_list = NULL, *ai_ptr;
        int status;
 +      _Bool reconnect = 0;
 +      cdtime_t now;
  
        if ((se == NULL) || (se->type != SOCKENT_TYPE_CLIENT))
                return (EINVAL);
  
        client = &se->data.client;
 -      if (client->fd >= 0) /* already connected */
 +
 +      now = cdtime ();
 +      if (client->resolve_interval != 0 && client->next_resolve_reconnect < now) {
 +              DEBUG("network plugin: Reconnecting socket, resolve_interval = %lf, next_resolve_reconnect = %lf",
 +                      CDTIME_T_TO_DOUBLE(client->resolve_interval), CDTIME_T_TO_DOUBLE(client->next_resolve_reconnect));
 +              reconnect = 1;
 +      }
 +
 +      if (client->fd >= 0 && !reconnect) /* already connected and not stale*/
                return (0);
  
        memset (&ai_hints, 0, sizeof (ai_hints));
  
        for (ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next)
        {
 +              if (client->fd >= 0) /* when we reconnect */
 +                      sockent_client_disconnect(se);
 +
                client->fd = socket (ai_ptr->ai_family,
                                ai_ptr->ai_socktype,
                                ai_ptr->ai_protocol);
        freeaddrinfo (ai_list);
        if (client->fd < 0)
                return (-1);
 -      return (0);
 -} /* }}} int sockent_client_connect */
 -
 -static int sockent_client_disconnect (sockent_t *se) /* {{{ */
 -{
 -      struct sockent_client *client;
 -
 -      if ((se == NULL) || (se->type != SOCKENT_TYPE_CLIENT))
 -              return (EINVAL);
 -
 -      client = &se->data.client;
 -      if (client->fd >= 0) /* connected */
 -      {
 -              close (client->fd);
 -              client->fd = -1;
 -      }
 -
 -      sfree (client->addr);
 -      client->addrlen = 0;
  
 +      if (client->resolve_interval > 0)
 +              client->next_resolve_reconnect = now + client->resolve_interval;
        return (0);
 -} /* }}} int sockent_client_disconnect */
 +} /* }}} int sockent_client_connect */
  
  /* Open the file descriptors for a initialized sockent structure. */
  static int sockent_server_listen (sockent_t *se) /* {{{ */
@@@ -3258,8 -3231,6 +3258,8 @@@ static int network_config_add_server (c
      if (strcasecmp ("Interface", child->key) == 0)
        network_config_set_interface (child,
            &se->interface);
 +              else if (strcasecmp ("ResolveInterval", child->key) == 0)
 +                      cf_util_get_cdtime(child, &se->data.client.resolve_interval);
      else
      {
        WARNING ("network plugin: Option `%s' is not allowed here.",