Merge branch 'collectd-5.7'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 2 Jul 2017 18:52:18 +0000 (20:52 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 2 Jul 2017 18:52:18 +0000 (20:52 +0200)
291 files changed:
.gitignore
.travis.yml
AUTHORS
Makefile.am
README
bindings/Makefile.am [deleted file]
bindings/java/Makefile.am [deleted file]
bindings/java/org/collectd/java/GenericJMXConfValue.java
build.sh
clean.sh
configure.ac
contrib/README
contrib/docker/50docker-apt-conf [new file with mode: 0644]
contrib/docker/Dockerfile [new file with mode: 0644]
contrib/docker/collectd.conf [new file with mode: 0644]
contrib/docker/collectd.conf.d/sample.conf [new file with mode: 0644]
contrib/docker/rootfs_prefix/.gitignore [new file with mode: 0644]
contrib/docker/rootfs_prefix/Makefile [new file with mode: 0644]
contrib/docker/rootfs_prefix/rootfs_prefix.c [new file with mode: 0644]
contrib/redhat/collectd.spec
contrib/systemd.collectd.service
docs/BUILD.dpdkstat.md
docs/README.virt.md [new file with mode: 0644]
m4/.gitignore [new file with mode: 0644]
m4/ax_compare_version.m4 [new file with mode: 0644]
m4/ax_compiler_vendor.m4 [new file with mode: 0644]
proto/Makefile.am [deleted file]
src/Makefile.am [deleted file]
src/aggregation.c
src/amqp.c
src/apache.c
src/apcups.c
src/apple_sensors.c
src/aquaero.c
src/ascent.c
src/battery.c
src/battery_statefs.c
src/bind.c
src/ceph.c
src/ceph_test.c
src/cgroups.c
src/chrony.c
src/collectd-nagios.c
src/collectd-python.pod
src/collectd-snmp.pod
src/collectd-tg.c
src/collectd.conf.in
src/collectd.conf.pod
src/collectdctl.c
src/collectdmon.c
src/conntrack.c
src/contextswitch.c
src/cpu.c
src/cpufreq.c
src/cpusleep.c
src/csv.c
src/curl.c
src/curl_json.c
src/curl_json_test.c [new file with mode: 0644]
src/curl_xml.c
src/daemon/Makefile.am [deleted file]
src/daemon/collectd.c
src/daemon/collectd.h
src/daemon/common.c
src/daemon/common_test.c
src/daemon/configfile.c
src/daemon/filter_chain.c
src/daemon/filter_chain.h
src/daemon/meta_data.c
src/daemon/meta_data.h
src/daemon/meta_data_test.c
src/daemon/plugin.c
src/daemon/plugin.h
src/daemon/plugin_mock.c
src/daemon/types_list.c
src/daemon/utils_avltree.c
src/daemon/utils_avltree_test.c
src/daemon/utils_cache.c
src/daemon/utils_cache.h
src/daemon/utils_cache_mock.c
src/daemon/utils_complain.c
src/daemon/utils_complain.h
src/daemon/utils_heap.c
src/daemon/utils_heap.h
src/daemon/utils_heap_test.c
src/daemon/utils_ignorelist.c [deleted file]
src/daemon/utils_ignorelist.h [deleted file]
src/daemon/utils_llist.c
src/daemon/utils_random.c
src/daemon/utils_random.h
src/daemon/utils_subst.c
src/daemon/utils_subst.h
src/daemon/utils_subst_test.c
src/daemon/utils_threshold.c
src/daemon/utils_threshold.h
src/daemon/utils_time.c
src/daemon/utils_time.h
src/daemon/utils_time_test.c
src/dbi.c
src/df.c
src/disk.c
src/dns.c
src/dpdkevents.c [new file with mode: 0644]
src/dpdkstat.c
src/drbd.c
src/email.c
src/entropy.c
src/ethstat.c
src/exec.c
src/fhcount.c
src/filecount.c
src/fscache.c
src/gmond.c
src/gps.c
src/grpc.cc
src/hddtemp.c
src/hugepages.c
src/intel_rdt.c
src/interface.c
src/ipc.c
src/ipmi.c
src/iptables.c
src/ipvs.c
src/irq.c
src/java.c
src/libcollectdclient/Makefile.am [deleted file]
src/libcollectdclient/client.c
src/libcollectdclient/collectd/client.h
src/libcollectdclient/collectd/lcc_features.h.in
src/libcollectdclient/collectd/network.h
src/libcollectdclient/collectd/network_buffer.h
src/libcollectdclient/network.c
src/libcollectdclient/network_buffer.c
src/liboconfig/Makefile.am [deleted file]
src/liboconfig/oconfig.c
src/liboconfig/oconfig.h
src/load.c
src/log_logstash.c
src/logfile.c
src/lpar.c
src/lua.c
src/lvm.c
src/madwifi.c
src/match_empty_counter.c
src/match_hashed.c
src/match_regex.c
src/match_timediff.c
src/match_value.c
src/mbmon.c
src/mcelog.c [new file with mode: 0644]
src/md.c
src/memcachec.c
src/memcached.c
src/memory.c
src/mic.c
src/modbus.c
src/mqtt.c
src/multimeter.c
src/mysql.c
src/netapp.c
src/netlink.c
src/network.c
src/nfs.c
src/nginx.c
src/notify_desktop.c
src/notify_email.c
src/notify_nagios.c
src/ntpd.c
src/numa.c
src/nut.c
src/olsrd.c
src/onewire.c
src/openldap.c
src/openvpn.c
src/oracle.c
src/ovs_events.c [new file with mode: 0644]
src/ovs_stats.c [new file with mode: 0644]
src/perl.c
src/pf.c
src/pinba.c
src/ping.c
src/postgresql.c
src/powerdns.c
src/processes.c
src/protocols.c
src/python.c
src/redis.c
src/routeros.c
src/rrdcached.c
src/rrdtool.c
src/sensors.c
src/serial.c
src/smart.c
src/snmp.c
src/snmp_agent.c [new file with mode: 0644]
src/statsd.c
src/swap.c
src/syslog.c
src/table.c
src/tail.c
src/tail_csv.c
src/tape.c
src/target_notification.c
src/target_replace.c
src/target_scale.c
src/target_set.c
src/target_v5upgrade.c
src/tcpconns.c
src/teamspeak2.c
src/ted.c
src/testing.h
src/thermal.c
src/threshold.c
src/tokyotyrant.c
src/turbostat.c
src/types.db
src/unixsock.c
src/uptime.c
src/users.c
src/utils_cmd_flush.c
src/utils_cmd_flush.h
src/utils_cmd_getthreshold.c
src/utils_cmd_getthreshold.h
src/utils_cmd_getval.c
src/utils_cmd_getval.h
src/utils_cmd_listval.c
src/utils_cmd_listval.h
src/utils_cmd_putnotif.c
src/utils_cmd_putnotif.h
src/utils_cmd_putval.c
src/utils_cmds.c
src/utils_cmds_test.c
src/utils_db_query.c
src/utils_db_query.h
src/utils_dns.c
src/utils_dpdk.c [new file with mode: 0644]
src/utils_dpdk.h [new file with mode: 0644]
src/utils_fbhash.c
src/utils_fbhash.h
src/utils_format_graphite.c
src/utils_format_graphite_test.c
src/utils_format_json.c
src/utils_format_kairosdb.c
src/utils_format_kairosdb.h
src/utils_ignorelist.c [new file with mode: 0644]
src/utils_ignorelist.h [new file with mode: 0644]
src/utils_latency.c
src/utils_latency.h
src/utils_latency_config.c
src/utils_latency_test.c
src/utils_lua.c
src/utils_lua.h
src/utils_match.c
src/utils_match.h
src/utils_mount.c
src/utils_mount_test.c
src/utils_ovs.c [new file with mode: 0644]
src/utils_ovs.h [new file with mode: 0644]
src/utils_parse_option.c
src/utils_parse_option.h
src/utils_rrdcreate.c
src/utils_rrdcreate.h
src/utils_tail.c
src/utils_tail_match.c
src/utils_tail_match.h
src/utils_vl_lookup.c
src/utils_vl_lookup_test.c
src/uuid.c
src/valgrind.FreeBSD.suppress
src/varnish.c
src/virt.c
src/virt_test.c [new file with mode: 0644]
src/vmem.c
src/vserver.c
src/wireless.c
src/write_graphite.c
src/write_http.c
src/write_kafka.c
src/write_log.c
src/write_mongodb.c
src/write_prometheus.c
src/write_redis.c
src/write_riemann.c
src/write_riemann_threshold.c
src/write_sensu.c
src/write_tsdb.c
src/xencpu.c
src/xmms.c
src/zfs_arc.c
src/zone.c
src/zookeeper.c

index 8154d73..2911069 100644 (file)
@@ -4,6 +4,7 @@ Makefile.in
 /aclocal.m4
 /autom4te.cache
 /autom4te.cache
+/build-aux/
 /compile
 /config.guess
 /config.sub
@@ -12,8 +13,15 @@ Makefile.in
 /install-sh
 /libltdl/
 /ltmain.sh
+/m4/libtool.m4
+/m4/ltargz.m4
+/m4/ltdl.m4
+/m4/lt~obsolete.m4
+/m4/ltoptions.m4
+/m4/ltsugar.m4
+/m4/ltversion.m4
 /missing
-src/config.h.in
+/src/config.h.in
 
 # configure stuff:
 Makefile
@@ -29,12 +37,13 @@ src/stamp-h1
 *.la
 *.lo
 *.o
+.dirstamp
 .libs/
 .deps/
-src/collectd-nagios
-src/collectd-tg
-src/collectdctl
-src/collectdmon
+/collectd-nagios
+/collectd-tg
+/collectdctl
+/collectdmon
 src/*.1
 src/*.5
 src/.pod2man.tmp.*
@@ -51,26 +60,28 @@ src/liboconfig/parser.h
 src/liboconfig/scanner.c
 
 # protobuf stuff:
-src/*.pb-c.[ch]
-src/*.grpc.pb.cc
-src/*.pb.cc
-src/*.pb.h
+*.pb-c.[ch]
+*.grpc.pb.cc
+*.pb.cc
+*.pb.h
 
 # make dist stuff:
 /collectd-*.tar.gz
 /collectd-*.tar.bz2
 
 # perl stuff:
-bindings/.perl-directory-stamp
+/.perl-directory-stamp
 bindings/perl/Collectd/pm_to_blib
 bindings/perl/blib/
 bindings/perl/pm_to_blib
-bindings/buildperl
+/buildperl
 
 # java stuff
-bindings/java/java-build-stamp
-bindings/java/org/collectd/api/*.class
-bindings/java/org/collectd/java/*.class
+*.jar
+/org/collectd/api/*.class
+/org/collectd/java/*.class
+/bindings/java/java-build-stamp
+/classnoinst.stamp
 
 # python stuff
 *.pyc
@@ -94,4 +105,4 @@ src/test-suite.log
 test_*
 
 # src/daemon/...
-src/daemon/collectd
+/collectd
index 03d9dde..fc250cb 100644 (file)
@@ -16,12 +16,15 @@ before_install:
       libganglia1-dev
       libgcrypt11-dev
       libglib2.0-dev
+      libgps-dev
       libhiredis-dev
       libi2c-dev
       libldap2-dev
       libltdl-dev
+      liblua5.2-dev
       liblvm2-dev
       libmemcached-dev
+      libmicrohttpd-dev
       libmnl-dev
       libmodbus-dev
       libmosquitto0-dev
@@ -53,4 +56,4 @@ before_install:
       perl
       protobuf-c-compiler
       python-dev
-script: sh build.sh && ./configure --with-python=/usr/bin/python && make distcheck DISTCHECK_CONFIGURE_FLAGS="--with-python=/usr/bin/python"
+script: sh build.sh && ./configure && make distcheck
diff --git a/AUTHORS b/AUTHORS
index 8962e77..d866c70 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -294,6 +294,9 @@ Sjoerd van der Berg <harekiet at gmail.com>
 Stefan Hacker <stefan.hacker at web.de>
  - teamspeak2 plugin.
 
+Steven Bell <stv.bell07 at gmail.com>
+ - nut plugin.
+
 Sven Trenkel <collectd at semidefinite.de>
  - netapp plugin.
  - python plugin.
index 03bdd39..f927399 100644 (file)
-ACLOCAL_AMFLAGS = -I libltdl/m4
+ACLOCAL_AMFLAGS = -I m4
+AM_YFLAGS = -d
 
-SUBDIRS =
 
-if BUILD_INCLUDED_LTDL
-SUBDIRS += libltdl
+BUILT_SOURCES = \
+       src/libcollectdclient/collectd/lcc_features.h \
+       src/liboconfig/parser.h \
+       $(dist_man_MANS)
+
+
+CLEANFILES = \
+       .perl-directory-stamp \
+       bindings/buildperl/Collectd.pm \
+       bindings/buildperl/Collectd/Plugins/OpenVZ.pm \
+       bindings/buildperl/Collectd/Unixsock.pm \
+       bindings/buildperl/Makefile.PL \
+       collectd-api.jar \
+       collectd.grpc.pb.cc \
+       collectd.grpc.pb.h \
+       collectd.pb.cc \
+       collectd.pb.h \
+       generic-jmx.jar \
+       org/collectd/api/*.class \
+       org/collectd/java/*.class \
+       prometheus.pb-c.c \
+       prometheus.pb-c.h \
+       src/pinba.pb-c.c \
+       src/pinba.pb-c.h \
+       types.pb.cc \
+       types.pb.h
+
+
+EXTRA_DIST = \
+       bindings/perl/Makefile.PL \
+       bindings/perl/lib/Collectd.pm \
+       bindings/perl/lib/Collectd/Plugins/Monitorus.pm \
+       bindings/perl/lib/Collectd/Plugins/OpenVZ.pm \
+       bindings/perl/lib/Collectd/Unixsock.pm \
+       bindings/perl/uninstall_mod.pl \
+       contrib \
+       proto/collectd.proto \
+       proto/prometheus.proto \
+       proto/types.proto \
+       src/collectd-email.pod \
+       src/collectd-exec.pod \
+       src/collectd-java.pod \
+       src/collectd-lua.pod \
+       src/collectd-nagios.pod \
+       src/collectd-perl.pod \
+       src/collectd-python.pod \
+       src/collectd-snmp.pod \
+       src/collectd-tg.pod \
+       src/collectd-threshold.pod \
+       src/collectd-unixsock.pod \
+       src/collectd.conf.pod \
+       src/collectd.pod \
+       src/collectdctl.pod \
+       src/collectdmon.pod \
+       src/pinba.proto \
+       src/postgresql_default.conf \
+       src/types.db \
+       src/types.db.pod \
+       src/valgrind.FreeBSD.suppress \
+       testwrapper.sh \
+       version-gen.sh
+
+
+dist_man_MANS = \
+       src/collectd.1 \
+       src/collectd.conf.5 \
+       src/collectd-email.5 \
+       src/collectd-exec.5 \
+       src/collectdctl.1 \
+       src/collectd-java.5 \
+       src/collectd-lua.5 \
+       src/collectdmon.1 \
+       src/collectd-nagios.1 \
+       src/collectd-perl.5 \
+       src/collectd-python.5 \
+       src/collectd-snmp.5 \
+       src/collectd-tg.1 \
+       src/collectd-threshold.5 \
+       src/collectd-unixsock.5 \
+       src/types.db.5
+
+
+nodist_pkgconfig_DATA = \
+       src/libcollectdclient/libcollectdclient.pc
+
+pkginclude_HEADERS = \
+       src/libcollectdclient/collectd/client.h \
+       src/libcollectdclient/collectd/network.h \
+       src/libcollectdclient/collectd/network_buffer.h \
+       src/libcollectdclient/collectd/lcc_features.h
+
+lib_LTLIBRARIES = libcollectdclient.la
+
+
+sbin_PROGRAMS = \
+       collectd \
+       collectdmon
+
+
+bin_PROGRAMS = \
+       collectd-nagios \
+       collectd-tg \
+       collectdctl
+
+
+noinst_LTLIBRARIES = \
+       libavltree.la \
+       libcmds.la \
+       libcommon.la \
+       libformat_graphite.la \
+       libformat_json.la \
+       libheap.la \
+       libignorelist.la \
+       liblatency.la \
+       liblookup.la \
+       libmetadata.la \
+       libmount.la \
+       liboconfig.la
+
+
+check_LTLIBRARIES = \
+       libplugin_mock.la
+
+
+check_PROGRAMS = \
+       test_common \
+       test_format_graphite \
+       test_meta_data \
+       test_utils_avltree \
+       test_utils_cmds \
+       test_utils_heap \
+       test_utils_latency \
+       test_utils_mount \
+       test_utils_subst \
+       test_utils_time \
+       test_utils_vl_lookup
+
+
+TESTS = $(check_PROGRAMS)
+
+LOG_COMPILER = env VALGRIND="@VALGRIND@" $(abs_srcdir)/testwrapper.sh
+
+
+jardir = $(pkgdatadir)/java
+
+pkglib_LTLIBRARIES =
+
+
+PLUGIN_LDFLAGS = \
+       -module \
+       -avoid-version \
+       -export-symbols-regex '\<module_register\>'
+
+
+AM_CPPFLAGS = \
+       -I$(top_srcdir)/src -I$(top_srcdir)/src/daemon \
+       -DPREFIX='"${prefix}"' \
+       -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"' \
+       -DLOCALSTATEDIR='"${localstatedir}"' \
+       -DPKGLOCALSTATEDIR='"${localstatedir}/lib/${PACKAGE_NAME}"' \
+       -DPLUGINDIR='"${pkglibdir}"' \
+       -DPKGDATADIR='"${pkgdatadir}"'
+
+
+# Link to these libraries..
+COMMON_LIBS = $(PTHREAD_LIBS)
+if BUILD_WITH_CAPABILITY
+COMMON_LIBS += -lcap
+endif
+if BUILD_WITH_LIBRT
+COMMON_LIBS += -lrt
+endif
+if BUILD_WITH_LIBPOSIX4
+COMMON_LIBS += -lposix4
+endif
+if BUILD_WITH_LIBSOCKET
+COMMON_LIBS += -lsocket
+endif
+if BUILD_WITH_LIBKSTAT
+COMMON_LIBS += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+COMMON_LIBS += -ldevinfo
+endif
+
+
+collectd_SOURCES = \
+       src/daemon/collectd.c \
+       src/daemon/collectd.h \
+       src/daemon/configfile.c \
+       src/daemon/configfile.h \
+       src/daemon/filter_chain.c \
+       src/daemon/filter_chain.h \
+       src/daemon/meta_data.c \
+       src/daemon/meta_data.h \
+       src/daemon/plugin.c \
+       src/daemon/plugin.h \
+       src/daemon/utils_cache.c \
+       src/daemon/utils_cache.h \
+       src/daemon/utils_complain.c \
+       src/daemon/utils_complain.h \
+       src/daemon/utils_llist.c \
+       src/daemon/utils_llist.h \
+       src/daemon/utils_random.c \
+       src/daemon/utils_random.h \
+       src/daemon/utils_subst.c \
+       src/daemon/utils_subst.h \
+       src/daemon/utils_time.c \
+       src/daemon/utils_time.h \
+       src/daemon/types_list.c \
+       src/daemon/types_list.h \
+       src/daemon/utils_threshold.c \
+       src/daemon/utils_threshold.h
+
+
+collectd_CFLAGS = $(AM_CFLAGS)
+collectd_CPPFLAGS = $(AM_CPPFLAGS)
+collectd_LDFLAGS = -export-dynamic
+collectd_LDADD = \
+       libavltree.la \
+       libcommon.la \
+       libheap.la \
+       liboconfig.la \
+       -lm \
+       $(COMMON_LIBS) \
+       $(DLOPEN_LIBS)
+
+if BUILD_FEATURE_DAEMON
+collectd_CPPFLAGS += -DPIDFILE='"${localstatedir}/run/${PACKAGE_NAME}.pid"'
+endif
+
+# The daemon needs to call sg_init, so we need to link it against libstatgrab,
+# too. -octo
+if BUILD_WITH_LIBSTATGRAB
+collectd_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+collectd_LDADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+
+
+collectdmon_SOURCES = src/collectdmon.c
+
+
+collectd_nagios_SOURCES = src/collectd-nagios.c
+collectd_nagios_CPPFLAGS = $(AM_CPPFLAGS) \
+       -I$(srcdir)/src/libcollectdclient/collectd \
+       -I$(top_builddir)/src/libcollectdclient/collectd
+collectd_nagios_LDADD = libcollectdclient.la
+if BUILD_WITH_LIBSOCKET
+collectd_nagios_LDADD += -lsocket
+endif
+if BUILD_AIX
+collectd_nagios_LDADD += -lm
+endif
+
+
+collectdctl_SOURCES = src/collectdctl.c
+collectdctl_CPPFLAGS = $(AM_CPPFLAGS) \
+       -I$(srcdir)/src/libcollectdclient/collectd \
+       -I$(top_builddir)/src/libcollectdclient/collectd
+collectdctl_LDADD = libcollectdclient.la
+if BUILD_WITH_LIBSOCKET
+collectdctl_LDADD += -lsocket
+endif
+if BUILD_AIX
+collectdctl_LDADD += -lm
+endif
+
+
+collectd_tg_SOURCES = src/collectd-tg.c
+collectd_tg_CPPFLAGS = $(AM_CPPFLAGS) \
+       -I$(srcdir)/src/libcollectdclient/collectd \
+       -I$(top_builddir)/src/libcollectdclient/collectd
+collectd_tg_LDADD = \
+       $(PTHREAD_LIBS) \
+       libheap.la \
+       libcollectdclient.la
+if BUILD_WITH_LIBSOCKET
+collectd_tg_LDADD += -lsocket
+endif
+if BUILD_WITH_LIBRT
+collectd_tg_LDADD += -lrt
+endif
+if BUILD_AIX
+collectd_tg_LDADD += -lm
+endif
+
+
+test_common_SOURCES = \
+       src/daemon/common_test.c \
+       src/testing.h
+test_common_LDADD = libplugin_mock.la
+
+test_meta_data_SOURCES = \
+       src/daemon/meta_data_test.c \
+       src/testing.h
+test_meta_data_LDADD = libmetadata.la libplugin_mock.la
+
+test_utils_avltree_SOURCES = \
+       src/daemon/utils_avltree_test.c \
+       src/testing.h
+test_utils_avltree_LDADD = libavltree.la $(COMMON_LIBS)
+
+test_utils_heap_SOURCES = \
+       src/daemon/utils_heap_test.c \
+       src/testing.h
+test_utils_heap_LDADD = libheap.la $(COMMON_LIBS)
+
+test_utils_time_SOURCES = \
+       src/daemon/utils_time_test.c \
+       src/testing.h
+
+test_utils_subst_SOURCES = \
+       src/daemon/utils_subst_test.c \
+       src/testing.h \
+       src/daemon/utils_subst.c \
+       src/daemon/utils_subst.h
+test_utils_subst_LDADD = libplugin_mock.la
+
+libavltree_la_SOURCES = \
+       src/daemon/utils_avltree.c \
+       src/daemon/utils_avltree.h
+
+libcommon_la_SOURCES = \
+       src/daemon/common.c \
+       src/daemon/common.h
+libcommon_la_LIBADD = $(COMMON_LIBS)
+
+libheap_la_SOURCES = \
+       src/daemon/utils_heap.c \
+       src/daemon/utils_heap.h
+
+libignorelist_la_SOURCES = \
+       src/utils_ignorelist.c \
+       src/utils_ignorelist.h
+
+libmetadata_la_SOURCES = \
+       src/daemon/meta_data.c \
+       src/daemon/meta_data.h
+
+libplugin_mock_la_SOURCES = \
+       src/daemon/plugin_mock.c \
+       src/daemon/utils_cache_mock.c \
+       src/daemon/utils_complain.c \
+       src/daemon/utils_complain.h \
+       src/daemon/utils_time.c \
+       src/daemon/utils_time.h
+
+libplugin_mock_la_CPPFLAGS = $(AM_CPPFLAGS) -DMOCK_TIME
+libplugin_mock_la_LIBADD = libcommon.la libignorelist.la $(COMMON_LIBS)
+
+libformat_graphite_la_SOURCES = \
+       src/utils_format_graphite.c \
+       src/utils_format_graphite.h
+
+test_format_graphite_SOURCES = \
+       src/utils_format_graphite_test.c \
+       src/testing.h
+test_format_graphite_LDADD = \
+       libformat_graphite.la \
+       libmetadata.la \
+       libplugin_mock.la \
+       -lm
+
+libformat_json_la_SOURCES = \
+       src/utils_format_json.c \
+       src/utils_format_json.h
+libformat_json_la_CPPFLAGS  = $(AM_CPPFLAGS)
+libformat_json_la_LDFLAGS   = $(AM_LDFLAGS)
+libformat_json_la_LIBADD    =
+if BUILD_WITH_LIBYAJL
+libformat_json_la_CPPFLAGS += $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+libformat_json_la_LDFLAGS  += $(BUILD_WITH_LIBYAJL_LDFLAGS)
+libformat_json_la_LIBADD   += $(BUILD_WITH_LIBYAJL_LIBS)
+
+check_PROGRAMS += test_format_json
+
+test_format_json_SOURCES = \
+       src/utils_format_json_test.c \
+       src/testing.h
+test_format_json_LDADD = \
+       libformat_json.la \
+       libmetadata.la \
+       libplugin_mock.la \
+       -lm
+endif
+
+if BUILD_PLUGIN_CEPH
+test_plugin_ceph_SOURCES = src/ceph_test.c
+test_plugin_ceph_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+test_plugin_ceph_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+test_plugin_ceph_LDADD = libplugin_mock.la $(BUILD_WITH_LIBYAJL_LIBS)
+check_PROGRAMS += test_plugin_ceph
+endif
+
+liblatency_la_SOURCES = \
+       src/utils_latency.c \
+       src/utils_latency.h \
+       src/utils_latency_config.c \
+       src/utils_latency_config.h
+liblatency_la_LIBADD = \
+       libcommon.la \
+       -lm
+
+test_utils_latency_SOURCES = \
+       src/utils_latency_test.c \
+       src/testing.h
+test_utils_latency_LDADD = \
+       liblatency.la \
+       libplugin_mock.la \
+       -lm
+
+libcmds_la_SOURCES = \
+       src/utils_cmds.c \
+       src/utils_cmds.h \
+       src/utils_cmd_flush.c \
+       src/utils_cmd_flush.h \
+       src/utils_cmd_getthreshold.c \
+       src/utils_cmd_getthreshold.h \
+       src/utils_cmd_getval.c \
+       src/utils_cmd_getval.h \
+       src/utils_cmd_listval.c \
+       src/utils_cmd_listval.h \
+       src/utils_cmd_putnotif.c \
+       src/utils_cmd_putnotif.h \
+       src/utils_cmd_putval.c \
+       src/utils_cmd_putval.h \
+       src/utils_parse_option.c \
+       src/utils_parse_option.h
+libcmds_la_LIBADD = \
+       libcommon.la \
+       libmetadata.la \
+       -lm
+
+test_utils_cmds_SOURCES = \
+       src/utils_cmds_test.c \
+       src/testing.h
+test_utils_cmds_LDADD = \
+       libcmds.la \
+       libplugin_mock.la
+
+liblookup_la_SOURCES = \
+       src/utils_vl_lookup.c \
+       src/utils_vl_lookup.h
+liblookup_la_LIBADD = libavltree.la
+
+test_utils_vl_lookup_SOURCES = \
+       src/utils_vl_lookup_test.c \
+       src/testing.h
+test_utils_vl_lookup_LDADD = \
+       liblookup.la \
+       libplugin_mock.la
+if BUILD_WITH_LIBKSTAT
+test_utils_vl_lookup_LDADD += -lkstat
+endif
+
+libmount_la_SOURCES = \
+       src/utils_mount.c \
+       src/utils_mount.h
+
+test_utils_mount_SOURCES = \
+       src/utils_mount_test.c \
+       src/testing.h
+test_utils_mount_LDADD = \
+       libmount.la \
+       libplugin_mock.la
+if BUILD_WITH_LIBKSTAT
+test_utils_mount_LDADD += -lkstat
+endif
+
+
+libcollectdclient_la_SOURCES = \
+       src/libcollectdclient/client.c \
+       src/libcollectdclient/network.c \
+       src/libcollectdclient/network_buffer.c
+libcollectdclient_la_CPPFLAGS = \
+       $(AM_CPPFLAGS) \
+       -I$(srcdir)/src/libcollectdclient/collectd \
+       -I$(top_builddir)/src/libcollectdclient/collectd \
+       -I$(srcdir)/src/daemon
+libcollectdclient_la_LDFLAGS = -version-info 1:0:0
+libcollectdclient_la_LIBADD = 
+if BUILD_WITH_LIBGCRYPT
+libcollectdclient_la_CPPFLAGS += $(GCRYPT_CPPFLAGS)
+libcollectdclient_la_LDFLAGS += $(GCRYPT_LDFLAGS)
+libcollectdclient_la_LIBADD += $(GCRYPT_LIBS)
+endif
+
+
+liboconfig_la_SOURCES = \
+       src/liboconfig/oconfig.c \
+       src/liboconfig/oconfig.h \
+       src/liboconfig/aux_types.h \
+       src/liboconfig/scanner.l \
+       src/liboconfig/parser.y
+liboconfig_la_LDFLAGS = -avoid-version $(LEXLIB)
+
+
+if BUILD_PLUGIN_AGGREGATION
+pkglib_LTLIBRARIES += aggregation.la
+aggregation_la_SOURCES = \
+       src/aggregation.c \
+       src/utils_vl_lookup.c \
+       src/utils_vl_lookup.h
+aggregation_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+aggregation_la_LIBADD = -lm
+endif
+
+if BUILD_PLUGIN_AMQP
+pkglib_LTLIBRARIES += amqp.la
+amqp_la_SOURCES = src/amqp.c
+amqp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
+amqp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
+amqp_la_LIBADD = \
+       $(BUILD_WITH_LIBRABBITMQ_LIBS) \
+       libcmds.la \
+       libformat_graphite.la \
+       libformat_json.la
+endif
+
+if BUILD_PLUGIN_APACHE
+pkglib_LTLIBRARIES += apache.la
+apache_la_SOURCES = src/apache.c
+apache_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
+apache_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+apache_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
+endif
+
+
+if BUILD_PLUGIN_APCUPS
+pkglib_LTLIBRARIES += apcups.la
+apcups_la_SOURCES = src/apcups.c
+apcups_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+apcups_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+apcups_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_APPLE_SENSORS
+pkglib_LTLIBRARIES += apple_sensors.la
+apple_sensors_la_SOURCES = src/apple_sensors.c
+apple_sensors_la_LDFLAGS = $(PLUGIN_LDFLAGS) -framework IOKit
+endif
+
+if BUILD_PLUGIN_AQUAERO
+pkglib_LTLIBRARIES += aquaero.la
+aquaero_la_SOURCES = src/aquaero.c
+aquaero_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBAQUAERO5_CFLAGS)
+aquaero_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBAQUAERO5_LDFLAGS)
+aquaero_la_LIBADD = -laquaero5
+endif
+
+if BUILD_PLUGIN_ASCENT
+pkglib_LTLIBRARIES += ascent.la
+ascent_la_SOURCES = src/ascent.c
+ascent_la_CFLAGS = \
+       $(AM_CFLAGS) \
+       $(BUILD_WITH_LIBCURL_CFLAGS) \
+       $(BUILD_WITH_LIBXML2_CFLAGS)
+ascent_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+ascent_la_LIBADD = \
+       $(BUILD_WITH_LIBCURL_LIBS) \
+       $(BUILD_WITH_LIBXML2_LIBS)
+endif
+
+if BUILD_PLUGIN_BAROMETER
+pkglib_LTLIBRARIES += barometer.la
+barometer_la_SOURCES = src/barometer.c
+barometer_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+barometer_la_LIBADD = -lm
+endif
+
+if BUILD_PLUGIN_BATTERY
+pkglib_LTLIBRARIES += battery.la
+battery_la_SOURCES = \
+       src/battery.c \
+       src/battery_statefs.c
+battery_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+if BUILD_WITH_LIBIOKIT
+battery_la_LDFLAGS += -framework IOKit
+endif
 endif
 
-SUBDIRS += proto src bindings .
+if BUILD_PLUGIN_BIND
+pkglib_LTLIBRARIES += bind.la
+bind_la_SOURCES = src/bind.c
+bind_la_CFLAGS = $(AM_CFLAGS) \
+       $(BUILD_WITH_LIBCURL_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
+bind_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+bind_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
+endif
+
+if BUILD_PLUGIN_CEPH
+pkglib_LTLIBRARIES += ceph.la
+ceph_la_SOURCES = src/ceph.c
+ceph_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+ceph_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+ceph_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
+endif
+
+if BUILD_PLUGIN_CGROUPS
+pkglib_LTLIBRARIES += cgroups.la
+cgroups_la_SOURCES = src/cgroups.c
+cgroups_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+cgroups_la_LIBADD = libignorelist.la libmount.la
+endif
+
+if BUILD_PLUGIN_CHRONY
+pkglib_LTLIBRARIES += chrony.la
+chrony_la_SOURCES = src/chrony.c
+chrony_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+chrony_la_LIBADD = -lm
+endif
+
+if BUILD_PLUGIN_CONNTRACK
+pkglib_LTLIBRARIES += conntrack.la
+conntrack_la_SOURCES = src/conntrack.c
+conntrack_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_CONTEXTSWITCH
+pkglib_LTLIBRARIES += contextswitch.la
+contextswitch_la_SOURCES = src/contextswitch.c
+contextswitch_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+contextswitch_la_LIBADD =
+if BUILD_WITH_PERFSTAT
+contextswitch_la_LIBADD += -lperfstat
+endif
+endif
+
+if BUILD_PLUGIN_CPU
+pkglib_LTLIBRARIES += cpu.la
+cpu_la_SOURCES = src/cpu.c
+cpu_la_CFLAGS = $(AM_CFLAGS)
+cpu_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+cpu_la_LIBADD =
+if BUILD_WITH_LIBKSTAT
+cpu_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+cpu_la_LIBADD += -ldevinfo
+endif
+if BUILD_WITH_LIBSTATGRAB
+cpu_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+cpu_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+if BUILD_WITH_PERFSTAT
+cpu_la_LIBADD += -lperfstat
+endif
+endif
+
+if BUILD_PLUGIN_CPUFREQ
+pkglib_LTLIBRARIES += cpufreq.la
+cpufreq_la_SOURCES = src/cpufreq.c
+cpufreq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_CPUSLEEP
+pkglib_LTLIBRARIES += cpusleep.la
+cpusleep_la_SOURCES = src/cpusleep.c
+cpusleep_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_CSV
+pkglib_LTLIBRARIES += csv.la
+csv_la_SOURCES = src/csv.c
+csv_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_CURL
+pkglib_LTLIBRARIES += curl.la
+curl_la_SOURCES = \
+       src/curl.c \
+       src/utils_curl_stats.c \
+       src/utils_curl_stats.h \
+       src/utils_match.c \
+       src/utils_match.h
+curl_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
+curl_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+curl_la_LIBADD = liblatency.la $(BUILD_WITH_LIBCURL_LIBS)
+endif
+
+if BUILD_PLUGIN_CURL_JSON
+pkglib_LTLIBRARIES += curl_json.la
+curl_json_la_SOURCES = \
+       src/curl_json.c \
+       src/utils_curl_stats.c \
+       src/utils_curl_stats.h
+curl_json_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
+curl_json_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+curl_json_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+curl_json_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBYAJL_LIBS)
+
+test_plugin_curl_json_SOURCES = src/curl_json_test.c \
+                               src/utils_curl_stats.c \
+                               src/daemon/configfile.c \
+                               src/daemon/types_list.c
+test_plugin_curl_json_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+test_plugin_curl_json_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+test_plugin_curl_json_LDADD = libavltree.la liboconfig.la libplugin_mock.la $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBYAJL_LIBS)
+check_PROGRAMS += test_plugin_curl_json
+endif
+
+if BUILD_PLUGIN_CURL_XML
+pkglib_LTLIBRARIES += curl_xml.la
+curl_xml_la_SOURCES = \
+       src/curl_xml.c \
+       src/utils_curl_stats.c \
+       src/utils_curl_stats.h
+curl_xml_la_CFLAGS = $(AM_CFLAGS) \
+               $(BUILD_WITH_LIBCURL_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
+curl_xml_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+curl_xml_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
+endif
+
+if BUILD_PLUGIN_DBI
+pkglib_LTLIBRARIES += dbi.la
+dbi_la_SOURCES = \
+       src/dbi.c \
+       src/utils_db_query.c \
+       src/utils_db_query.h
+dbi_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBDBI_CPPFLAGS)
+dbi_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBDBI_LDFLAGS)
+dbi_la_LIBADD = $(BUILD_WITH_LIBDBI_LIBS)
+endif
+
+if BUILD_PLUGIN_DF
+pkglib_LTLIBRARIES += df.la
+df_la_SOURCES = src/df.c
+df_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+df_la_LIBADD = libignorelist.la libmount.la
+endif
+
+if BUILD_PLUGIN_DISK
+pkglib_LTLIBRARIES += disk.la
+disk_la_SOURCES = src/disk.c
+disk_la_CFLAGS = $(AM_CFLAGS)
+disk_la_CPPFLAGS = $(AM_CPPFLAGS)
+disk_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+disk_la_LIBADD = libignorelist.la
+if BUILD_WITH_LIBKSTAT
+disk_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+disk_la_LIBADD += -ldevinfo
+endif
+if BUILD_WITH_LIBIOKIT
+disk_la_LDFLAGS += -framework IOKit
+endif
+if BUILD_WITH_LIBSTATGRAB
+disk_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+disk_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+if BUILD_WITH_LIBUDEV
+disk_la_CPPFLAGS += $(BUILD_WITH_LIBUDEV_CPPFLAGS)
+disk_la_LDFLAGS += $(BUILD_WITH_LIBUDEV_LDFLAGS)
+disk_la_LIBADD += $(BUILD_WITH_LIBUDEV_LIBS)
+endif
+if BUILD_FREEBSD
+disk_la_LIBADD += -ldevstat -lgeom
+endif
+if BUILD_WITH_PERFSTAT
+disk_la_LIBADD += -lperfstat
+endif
+endif
+
+if BUILD_PLUGIN_DNS
+pkglib_LTLIBRARIES += dns.la
+dns_la_SOURCES = \
+       src/dns.c \
+       src/utils_dns.c \
+       src/utils_dns.h
+dns_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPCAP_CPPFLAGS)
+dns_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPCAP_LDFLAGS)
+dns_la_LIBADD = $(BUILD_WITH_LIBPCAP_LIBS)
+endif
+
+if BUILD_PLUGIN_DPDKEVENTS
+pkglib_LTLIBRARIES += dpdkevents.la
+dpdkevents_la_SOURCES = src/dpdkevents.c src/utils_dpdk.c src/utils_dpdk.h
+dpdkevents_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBDPDK_CPPFLAGS)
+dpdkevents_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBDPDK_LDFLAGS)
+dpdkevents_la_LIBADD = -ldpdk
+endif
+
+if BUILD_PLUGIN_DPDKSTAT
+pkglib_LTLIBRARIES += dpdkstat.la
+dpdkstat_la_SOURCES = src/dpdkstat.c src/utils_dpdk.c src/utils_dpdk.h
+dpdkstat_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBDPDK_CPPFLAGS)
+dpdkstat_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBDPDK_LDFLAGS)
+dpdkstat_la_LIBADD = -ldpdk
+endif
+
+if BUILD_PLUGIN_DRBD
+pkglib_LTLIBRARIES += drbd.la
+drbd_la_SOURCES = src/drbd.c
+drbd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
 
-AM_CPPFLAGS = $(LTDLINCL)
+if BUILD_PLUGIN_EMAIL
+pkglib_LTLIBRARIES += email.la
+email_la_SOURCES = src/email.c
+email_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
 
-EXTRA_DIST = contrib version-gen.sh testwrapper.sh
+if BUILD_PLUGIN_ENTROPY
+pkglib_LTLIBRARIES += entropy.la
+entropy_la_SOURCES = src/entropy.c
+entropy_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_EXEC
+pkglib_LTLIBRARIES += exec.la
+exec_la_SOURCES = src/exec.c
+exec_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+exec_la_LIBADD = libcmds.la
+endif
+
+if BUILD_PLUGIN_ETHSTAT
+pkglib_LTLIBRARIES += ethstat.la
+ethstat_la_SOURCES = src/ethstat.c
+ethstat_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_FHCOUNT
+pkglib_LTLIBRARIES += fhcount.la
+fhcount_la_SOURCES = src/fhcount.c
+fhcount_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_FILECOUNT
+pkglib_LTLIBRARIES += filecount.la
+filecount_la_SOURCES = src/filecount.c
+filecount_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_FSCACHE
+pkglib_LTLIBRARIES += fscache.la
+fscache_la_SOURCES = src/fscache.c
+fscache_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_GMOND
+pkglib_LTLIBRARIES += gmond.la
+gmond_la_SOURCES = src/gmond.c
+gmond_la_CPPFLAGS = $(AM_CPPFLAGS) $(GANGLIA_CPPFLAGS)
+gmond_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(GANGLIA_LDFLAGS)
+gmond_la_LIBADD = $(GANGLIA_LIBS)
+endif
+
+if BUILD_PLUGIN_GPS
+pkglib_LTLIBRARIES += gps.la
+gps_la_SOURCES = src/gps.c
+gps_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBGPS_CFLAGS)
+gps_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGPS_LDFLAGS)
+gps_la_LIBADD = -lpthread $(BUILD_WITH_LIBGPS_LIBS)
+endif
+
+if BUILD_PLUGIN_GRPC
+pkglib_LTLIBRARIES += grpc.la
+grpc_la_SOURCES = src/grpc.cc
+nodist_grpc_la_SOURCES = \
+       collectd.grpc.pb.cc \
+       collectd.pb.cc \
+       types.pb.cc
+grpc_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBGRPCPP_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_CPPFLAGS)
+grpc_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGRPCPP_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_LDFLAGS)
+grpc_la_LIBADD = $(BUILD_WITH_LIBGRPCPP_LIBS) $(BUILD_WITH_LIBPROTOBUF_LIBS)
+endif
+
+if BUILD_PLUGIN_HDDTEMP
+pkglib_LTLIBRARIES += hddtemp.la
+hddtemp_la_SOURCES = src/hddtemp.c
+hddtemp_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+hddtemp_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+hddtemp_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_HUGEPAGES
+pkglib_LTLIBRARIES += hugepages.la
+hugepages_la_SOURCES = src/hugepages.c
+hugepages_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_INTEL_RDT
+pkglib_LTLIBRARIES += intel_rdt.la
+intel_rdt_la_SOURCES = src/intel_rdt.c
+intel_rdt_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBPQOS_CPPFLAGS)
+intel_rdt_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPQOS_LDFLAGS)
+intel_rdt_la_LIBADD = $(BUILD_WITH_LIBPQOS_LIBS)
+endif
+
+if BUILD_PLUGIN_INTERFACE
+pkglib_LTLIBRARIES += interface.la
+interface_la_SOURCES = src/interface.c
+interface_la_CFLAGS = $(AM_CFLAGS)
+interface_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+interface_la_LIBADD = libignorelist.la
+if BUILD_WITH_LIBSTATGRAB
+interface_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+interface_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+else
+if BUILD_WITH_LIBKSTAT
+interface_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+interface_la_LIBADD += -ldevinfo
+endif # BUILD_WITH_LIBDEVINFO
+endif # !BUILD_WITH_LIBSTATGRAB
+if BUILD_WITH_PERFSTAT
+interface_la_LIBADD += -lperfstat
+endif
+endif # BUILD_PLUGIN_INTERFACE
+
+if BUILD_PLUGIN_IPC
+pkglib_LTLIBRARIES += ipc.la
+ipc_la_SOURCES = src/ipc.c
+ipc_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_IPTABLES
+pkglib_LTLIBRARIES += iptables.la
+iptables_la_SOURCES = src/iptables.c
+iptables_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBIPTC_CPPFLAGS)
+iptables_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+iptables_la_LIBADD = $(BUILD_WITH_LIBIPTC_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_IPMI
+pkglib_LTLIBRARIES += ipmi.la
+ipmi_la_SOURCES = src/ipmi.c
+ipmi_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_OPENIPMI_CFLAGS)
+ipmi_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+ipmi_la_LIBADD = libignorelist.la $(BUILD_WITH_OPENIPMI_LIBS)
+endif
+
+if BUILD_PLUGIN_IPVS
+pkglib_LTLIBRARIES += ipvs.la
+ipvs_la_SOURCES = src/ipvs.c
+ipvs_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_IRQ
+pkglib_LTLIBRARIES += irq.la
+irq_la_SOURCES = src/irq.c
+irq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+irq_la_LIBADD = libignorelist.la
+endif
+
+if BUILD_PLUGIN_JAVA
+pkglib_LTLIBRARIES += java.la
+java_la_SOURCES = src/java.c
+java_la_CPPFLAGS = $(AM_CPPFLAGS) $(JAVA_CPPFLAGS)
+java_la_CFLAGS = $(AM_CFLAGS) $(JAVA_CFLAGS)
+java_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(JAVA_LDFLAGS)
+java_la_LIBADD = $(JAVA_LIBS)
+endif
+
+if BUILD_PLUGIN_LOAD
+pkglib_LTLIBRARIES += load.la
+load_la_SOURCES = src/load.c
+load_la_CFLAGS = $(AM_CFLAGS)
+load_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+load_la_LIBADD =
+if BUILD_WITH_LIBSTATGRAB
+load_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+load_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif # BUILD_WITH_LIBSTATGRAB
+if BUILD_WITH_PERFSTAT
+load_la_LIBADD += -lperfstat
+endif
+endif # BUILD_PLUGIN_LOAD
+
+if BUILD_PLUGIN_LOGFILE
+pkglib_LTLIBRARIES += logfile.la
+logfile_la_SOURCES = src/logfile.c
+logfile_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_LOG_LOGSTASH
+pkglib_LTLIBRARIES += log_logstash.la
+log_logstash_la_SOURCES = src/log_logstash.c
+log_logstash_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+log_logstash_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+log_logstash_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
+endif
+
+if BUILD_PLUGIN_LPAR
+pkglib_LTLIBRARIES += lpar.la
+lpar_la_SOURCES = src/lpar.c
+lpar_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+lpar_la_LIBADD = -lperfstat
+endif
+
+if BUILD_PLUGIN_LUA
+pkglib_LTLIBRARIES += lua.la
+lua_la_SOURCES = \
+       src/lua.c \
+       src/utils_lua.c \
+       src/utils_lua.h
+lua_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBLUA_CFLAGS)
+lua_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+lua_la_LIBADD = $(BUILD_WITH_LIBLUA_LIBS)
+endif
+
+if BUILD_PLUGIN_LVM
+pkglib_LTLIBRARIES += lvm.la
+lvm_la_SOURCES = src/lvm.c
+lvm_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBLVM2APP_CPPFLAGS)
+lvm_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBLVM2APP_LDFLAGS)
+lvm_la_LIBADD = $(BUILD_WITH_LIBLVM2APP_LIBS)
+endif
+
+if BUILD_PLUGIN_MADWIFI
+pkglib_LTLIBRARIES += madwifi.la
+madwifi_la_SOURCES = \
+       src/madwifi.c \
+       src/madwifi.h
+madwifi_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+madwifi_la_LIBADD = libignorelist.la
+endif
+
+if BUILD_PLUGIN_MATCH_EMPTY_COUNTER
+pkglib_LTLIBRARIES += match_empty_counter.la
+match_empty_counter_la_SOURCES = src/match_empty_counter.c
+match_empty_counter_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MATCH_HASHED
+pkglib_LTLIBRARIES += match_hashed.la
+match_hashed_la_SOURCES = src/match_hashed.c
+match_hashed_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MATCH_REGEX
+pkglib_LTLIBRARIES += match_regex.la
+match_regex_la_SOURCES = src/match_regex.c
+match_regex_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MATCH_TIMEDIFF
+pkglib_LTLIBRARIES += match_timediff.la
+match_timediff_la_SOURCES = src/match_timediff.c
+match_timediff_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MATCH_VALUE
+pkglib_LTLIBRARIES += match_value.la
+match_value_la_SOURCES = src/match_value.c
+match_value_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MBMON
+pkglib_LTLIBRARIES += mbmon.la
+mbmon_la_SOURCES = src/mbmon.c
+mbmon_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+mbmon_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+mbmon_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_MCELOG
+pkglib_LTLIBRARIES += mcelog.la
+mcelog_la_SOURCES = src/mcelog.c
+mcelog_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MD
+pkglib_LTLIBRARIES += md.la
+md_la_SOURCES = src/md.c
+md_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+md_la_LIBADD = libignorelist.la
+endif
+
+if BUILD_PLUGIN_MEMCACHEC
+pkglib_LTLIBRARIES += memcachec.la
+memcachec_la_SOURCES = \
+       src/memcachec.c \
+       src/utils_match.c \
+       src/utils_match.h
+memcachec_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMEMCACHED_CPPFLAGS)
+memcachec_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMEMCACHED_LDFLAGS)
+memcachec_la_LIBADD = liblatency.la $(BUILD_WITH_LIBMEMCACHED_LIBS)
+endif
+
+if BUILD_PLUGIN_MEMCACHED
+pkglib_LTLIBRARIES += memcached.la
+memcached_la_SOURCES = src/memcached.c
+memcached_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+memcached_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+memcached_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_MEMORY
+pkglib_LTLIBRARIES += memory.la
+memory_la_SOURCES = src/memory.c
+memory_la_CFLAGS = $(AM_CFLAGS)
+memory_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+memory_la_LIBADD =
+if BUILD_WITH_LIBKSTAT
+memory_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+memory_la_LIBADD += -ldevinfo
+endif
+if BUILD_WITH_LIBSTATGRAB
+memory_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+memory_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+if BUILD_WITH_PERFSTAT
+memory_la_LIBADD += -lperfstat
+endif
+endif
+
+if BUILD_PLUGIN_MIC
+pkglib_LTLIBRARIES += mic.la
+mic_la_SOURCES = src/mic.c
+mic_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_MIC_CPPFLAGS)
+mic_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_MIC_LDFLAGS)
+mic_la_LIBADD = libignorelist.la $(BUILD_WITH_MIC_LIBS)
+endif
+
+if BUILD_PLUGIN_MODBUS
+pkglib_LTLIBRARIES += modbus.la
+modbus_la_SOURCES = src/modbus.c
+modbus_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMODBUS_CFLAGS)
+modbus_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+modbus_la_LIBADD = $(BUILD_WITH_LIBMODBUS_LIBS)
+endif
+
+if BUILD_PLUGIN_MQTT
+pkglib_LTLIBRARIES += mqtt.la
+mqtt_la_SOURCES = src/mqtt.c
+mqtt_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMOSQUITTO_CPPFLAGS)
+mqtt_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMOSQUITTO_LDFLAGS)
+mqtt_la_LIBADD = $(BUILD_WITH_LIBMOSQUITTO_LIBS)
+endif
+
+if BUILD_PLUGIN_MULTIMETER
+pkglib_LTLIBRARIES += multimeter.la
+multimeter_la_SOURCES = src/multimeter.c
+multimeter_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_MYSQL
+pkglib_LTLIBRARIES += mysql.la
+mysql_la_SOURCES = src/mysql.c
+mysql_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMYSQL_CFLAGS)
+mysql_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+mysql_la_LIBADD = $(BUILD_WITH_LIBMYSQL_LIBS)
+endif
+
+if BUILD_PLUGIN_NETAPP
+pkglib_LTLIBRARIES += netapp.la
+netapp_la_SOURCES = src/netapp.c
+netapp_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBNETAPP_CPPFLAGS)
+netapp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBNETAPP_LDFLAGS)
+netapp_la_LIBADD = libignorelist.la $(LIBNETAPP_LIBS)
+endif
+
+if BUILD_PLUGIN_NETLINK
+pkglib_LTLIBRARIES += netlink.la
+netlink_la_SOURCES = src/netlink.c
+netlink_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMNL_CFLAGS)
+netlink_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+netlink_la_LIBADD = $(BUILD_WITH_LIBMNL_LIBS)
+endif
+
+if BUILD_PLUGIN_NETWORK
+pkglib_LTLIBRARIES += network.la
+network_la_SOURCES = \
+       src/network.c \
+       src/network.h \
+       src/utils_fbhash.c \
+       src/utils_fbhash.h
+network_la_CPPFLAGS = $(AM_CPPFLAGS)
+network_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+network_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+network_la_LIBADD += -lsocket
+endif
+if BUILD_WITH_LIBGCRYPT
+network_la_CPPFLAGS += $(GCRYPT_CPPFLAGS)
+network_la_LDFLAGS += $(GCRYPT_LDFLAGS)
+network_la_LIBADD += $(GCRYPT_LIBS)
+endif
+endif
+
+if BUILD_PLUGIN_NFS
+pkglib_LTLIBRARIES += nfs.la
+nfs_la_SOURCES = src/nfs.c
+nfs_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_NGINX
+pkglib_LTLIBRARIES += nginx.la
+nginx_la_SOURCES = src/nginx.c
+nginx_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
+nginx_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+nginx_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
+endif
+
+if BUILD_PLUGIN_NOTIFY_DESKTOP
+pkglib_LTLIBRARIES += notify_desktop.la
+notify_desktop_la_SOURCES = src/notify_desktop.c
+notify_desktop_la_CFLAGS = $(AM_CFLAGS) $(LIBNOTIFY_CFLAGS)
+notify_desktop_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+notify_desktop_la_LIBADD = $(LIBNOTIFY_LIBS)
+endif
+
+if BUILD_PLUGIN_NOTIFY_EMAIL
+pkglib_LTLIBRARIES += notify_email.la
+notify_email_la_SOURCES = src/notify_email.c
+notify_email_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBESMTP_CPPFLAGS)
+notify_email_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBESMTP_LDFLAGS)
+notify_email_la_LIBADD = $(BUILD_WITH_LIBESMTP_LIBS)
+endif
+
+if BUILD_PLUGIN_NOTIFY_NAGIOS
+pkglib_LTLIBRARIES += notify_nagios.la
+notify_nagios_la_SOURCES = src/notify_nagios.c
+notify_nagios_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_NTPD
+pkglib_LTLIBRARIES += ntpd.la
+ntpd_la_SOURCES = src/ntpd.c
+ntpd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+ntpd_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+ntpd_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_NUMA
+pkglib_LTLIBRARIES += numa.la
+numa_la_SOURCES = src/numa.c
+numa_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_NUT
+pkglib_LTLIBRARIES += nut.la
+nut_la_SOURCES = src/nut.c
+nut_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBUPSCLIENT_CFLAGS)
+nut_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+nut_la_LIBADD = $(BUILD_WITH_LIBUPSCLIENT_LIBS)
+endif
+
+if BUILD_PLUGIN_OLSRD
+pkglib_LTLIBRARIES += olsrd.la
+olsrd_la_SOURCES = src/olsrd.c
+olsrd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+olsrd_la_LIBADD =
+if BUILD_WITH_LIBSOCKET
+olsrd_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_ONEWIRE
+pkglib_LTLIBRARIES += onewire.la
+onewire_la_SOURCES = src/onewire.c
+onewire_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBOWCAPI_CPPFLAGS)
+onewire_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBOWCAPI_LDFLAGS)
+onewire_la_LIBADD = libignorelist.la $(BUILD_WITH_LIBOWCAPI_LIBS)
+endif
+
+if BUILD_PLUGIN_OPENLDAP
+pkglib_LTLIBRARIES += openldap.la
+openldap_la_SOURCES = src/openldap.c
+openldap_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBLDAP_CPPFLAGS)
+openldap_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBLDAP_LDFLAGS)
+openldap_la_LIBADD = -lldap
+endif
+
+if BUILD_PLUGIN_OPENVPN
+pkglib_LTLIBRARIES += openvpn.la
+openvpn_la_SOURCES = src/openvpn.c
+openvpn_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_ORACLE
+pkglib_LTLIBRARIES += oracle.la
+oracle_la_SOURCES = \
+       src/oracle.c \
+       src/utils_db_query.c \
+       src/utils_db_query.h
+oracle_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_ORACLE_CPPFLAGS)
+oracle_la_LIBADD = $(BUILD_WITH_ORACLE_LIBS)
+oracle_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_OVS_EVENTS
+pkglib_LTLIBRARIES += ovs_events.la
+ovs_events_la_SOURCES = \
+       src/ovs_events.c \
+       src/utils_ovs.c \
+       src/utils_ovs.h
+ovs_events_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+ovs_events_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+ovs_events_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
+endif
+
+if BUILD_PLUGIN_OVS_STATS
+pkglib_LTLIBRARIES += ovs_stats.la
+ovs_stats_la_SOURCES = \
+       src/ovs_stats.c \
+       src/utils_ovs.c \
+       src/utils_ovs.h
+ovs_stats_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+ovs_stats_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+ovs_stats_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
+endif
+
+if BUILD_PLUGIN_PERL
+pkglib_LTLIBRARIES += perl.la
+perl_la_SOURCES = src/perl.c
+# Despite C99 providing the "bool" type thru stdbool.h, Perl defines its own
+# version of that type if HAS_BOOL is not defined... *sigh*
+perl_la_CPPFLAGS = $(AM_CPPFLAGS) -DHAS_BOOL=1
+# Despite off_t being 64 bit wide on 64 bit platforms, Perl insist on using
+# off64_t which is only exposed when _LARGEFILE64_SOURCE is defined... *sigh*
+# On older platforms we also need _REENTRANT. _GNU_SOURCE sets both of these.
+perl_la_CPPFLAGS += -D_GNU_SOURCE
+perl_la_CFLAGS = $(AM_CFLAGS) \
+       $(PERL_CFLAGS) \
+       -DXS_VERSION=\"$(VERSION)\" -DVERSION=\"$(VERSION)\"
+perl_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(PERL_LDFLAGS)
+perl_la_LIBADD = $(PERL_LIBS)
+endif
+
+if BUILD_PLUGIN_PF
+pkglib_LTLIBRARIES += pf.la
+pf_la_SOURCES = src/pf.c
+pf_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_PINBA
+pkglib_LTLIBRARIES += pinba.la
+pinba_la_SOURCES = src/pinba.c
+nodist_pinba_la_SOURCES = \
+       src/pinba.pb-c.c \
+       src/pinba.pb-c.h
+pinba_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS)
+pinba_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_LDFLAGS)
+pinba_la_LIBADD = $(BUILD_WITH_LIBPROTOBUF_C_LIBS)
+endif
+
+if BUILD_PLUGIN_PING
+pkglib_LTLIBRARIES += ping.la
+ping_la_SOURCES = src/ping.c
+ping_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBOPING_CPPFLAGS)
+ping_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBOPING_LDFLAGS)
+ping_la_LIBADD = -loping -lm
+endif
+
+if BUILD_PLUGIN_POSTGRESQL
+pkglib_LTLIBRARIES += postgresql.la
+postgresql_la_SOURCES = \
+       src/postgresql.c \
+       src/utils_db_query.c \
+       src/utils_db_query.h
+postgresql_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPQ_CPPFLAGS)
+postgresql_la_LDFLAGS = $(PLUGIN_LDFLAGS) \
+       $(BUILD_WITH_LIBPQ_LDFLAGS)
+postgresql_la_LIBADD = $(BUILD_WITH_LIBPQ_LIBS)
+endif
+
+if BUILD_PLUGIN_POWERDNS
+pkglib_LTLIBRARIES += powerdns.la
+powerdns_la_SOURCES = src/powerdns.c
+powerdns_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_PYTHON
+pkglib_LTLIBRARIES += python.la
+python_la_SOURCES = \
+       src/python.c \
+       src/pyconfig.c \
+       src/pyvalues.c \
+       src/cpython.h
+python_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBPYTHON_CPPFLAGS)
+python_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBPYTHON_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_PROCESSES
+pkglib_LTLIBRARIES += processes.la
+processes_la_SOURCES = src/processes.c
+processes_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+processes_la_LIBADD =
+if BUILD_WITH_LIBKVM_GETPROCS
+processes_la_LIBADD += -lkvm
+endif
+endif
+
+if BUILD_PLUGIN_PROTOCOLS
+pkglib_LTLIBRARIES += protocols.la
+protocols_la_SOURCES = src/protocols.c
+protocols_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+protocols_la_LIBADD = libignorelist.la
+endif
+
+if BUILD_PLUGIN_REDIS
+pkglib_LTLIBRARIES += redis.la
+redis_la_SOURCES = src/redis.c
+redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
+redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
+redis_la_LIBADD = -lhiredis
+endif
+
+if BUILD_PLUGIN_ROUTEROS
+pkglib_LTLIBRARIES += routeros.la
+routeros_la_SOURCES = src/routeros.c
+routeros_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBROUTEROS_CPPFLAGS)
+routeros_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBROUTEROS_LDFLAGS)
+routeros_la_LIBADD = -lrouteros
+endif
+
+if BUILD_PLUGIN_RRDCACHED
+pkglib_LTLIBRARIES += rrdcached.la
+rrdcached_la_SOURCES = \
+       src/rrdcached.c \
+       src/utils_rrdcreate.c \
+       src/utils_rrdcreate.h
+rrdcached_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBRRD_CFLAGS)
+rrdcached_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRRD_LDFLAGS)
+rrdcached_la_LIBADD = $(BUILD_WITH_LIBRRD_LIBS)
+endif
+
+if BUILD_PLUGIN_RRDTOOL
+pkglib_LTLIBRARIES += rrdtool.la
+rrdtool_la_SOURCES = \
+       src/rrdtool.c \
+       src/utils_rrdcreate.c \
+       src/utils_rrdcreate.h
+rrdtool_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBRRD_CFLAGS)
+rrdtool_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRRD_LDFLAGS)
+rrdtool_la_LIBADD = $(BUILD_WITH_LIBRRD_LIBS)
+endif
+
+if BUILD_PLUGIN_SENSORS
+pkglib_LTLIBRARIES += sensors.la
+sensors_la_SOURCES = src/sensors.c
+sensors_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBSENSORS_CPPFLAGS)
+sensors_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBSENSORS_LDFLAGS)
+sensors_la_LIBADD = libignorelist.la $(BUILD_WITH_LIBSENSORS_LIBS)
+endif
+
+if BUILD_PLUGIN_SERIAL
+pkglib_LTLIBRARIES += serial.la
+serial_la_SOURCES = src/serial.c
+serial_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_SIGROK
+pkglib_LTLIBRARIES += sigrok.la
+sigrok_la_SOURCES = src/sigrok.c
+sigrok_la_CFLAGS = $(AM_CFLAGS) $(LIBSIGROK_CFLAGS)
+sigrok_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+sigrok_la_LIBADD = $(LIBSIGROK_LIBS)
+endif
+
+if BUILD_PLUGIN_SMART
+if BUILD_WITH_LIBUDEV
+pkglib_LTLIBRARIES += smart.la
+smart_la_SOURCES = src/smart.c
+smart_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBATASMART_CPPFLAGS) $(BUILD_WITH_LIBUDEV_CPPFLAGS)
+smart_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBATASMART_LDFLAGS) $(BUILD_WITH_LIBUDEV_LDFLAGS)
+smart_la_LIBADD = libignorelist.la $(BUILD_WITH_LIBATASMART_LIBS) $(BUILD_WITH_LIBUDEV_LIBS)
+endif
+endif
+
+if BUILD_PLUGIN_SNMP
+pkglib_LTLIBRARIES += snmp.la
+snmp_la_SOURCES = src/snmp.c
+snmp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBNETSNMP_CPPFLAGS)
+snmp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBNETSNMP_LDFLAGS)
+snmp_la_LIBADD = $(BUILD_WITH_LIBNETSNMP_LIBS)
+endif
+
+if BUILD_PLUGIN_SNMP_AGENT
+pkglib_LTLIBRARIES += snmp_agent.la
+snmp_agent_la_SOURCES = src/snmp_agent.c
+snmp_agent_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBNETSNMPAGENT_CPPFLAGS)
+snmp_agent_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBNETSNMPAGENT_LDFLAGS)
+snmp_agent_la_LIBADD = $(BUILD_WITH_LIBNETSNMPAGENT_LIBS)
+endif
+
+if BUILD_PLUGIN_STATSD
+pkglib_LTLIBRARIES += statsd.la
+statsd_la_SOURCES = src/statsd.c
+statsd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+statsd_la_LIBADD = liblatency.la
+endif
+
+if BUILD_PLUGIN_SWAP
+pkglib_LTLIBRARIES += swap.la
+swap_la_SOURCES = src/swap.c
+swap_la_CFLAGS = $(AM_CFLAGS)
+swap_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+swap_la_LIBADD =
+if BUILD_WITH_LIBKSTAT
+swap_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_LIBDEVINFO
+swap_la_LIBADD += -ldevinfo
+endif
+if BUILD_WITH_LIBKVM_GETSWAPINFO
+swap_la_LIBADD += -lkvm
+endif
+if BUILD_WITH_LIBSTATGRAB
+swap_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+swap_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+if BUILD_WITH_PERFSTAT
+swap_la_LIBADD += -lperfstat
+endif
+
+endif
+
+if BUILD_PLUGIN_SYSLOG
+pkglib_LTLIBRARIES += syslog.la
+syslog_la_SOURCES = src/syslog.c
+syslog_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TABLE
+pkglib_LTLIBRARIES += table.la
+table_la_SOURCES = src/table.c
+table_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TAIL
+pkglib_LTLIBRARIES += tail.la
+tail_la_SOURCES = \
+       src/tail.c \
+       src/utils_match.c \
+       src/utils_match.h \
+       src/utils_tail.c \
+       src/utils_tail.h \
+       src/utils_tail_match.c \
+       src/utils_tail_match.h
+tail_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+tail_la_LIBADD = liblatency.la
+endif
+
+if BUILD_PLUGIN_TAIL_CSV
+pkglib_LTLIBRARIES += tail_csv.la
+tail_csv_la_SOURCES = \
+       src/tail_csv.c \
+       src/utils_tail.c \
+       src/utils_tail.h
+tail_csv_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TAPE
+pkglib_LTLIBRARIES += tape.la
+tape_la_SOURCES = src/tape.c
+tape_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+tape_la_LIBADD = -lkstat -ldevinfo
+endif
+
+if BUILD_PLUGIN_TARGET_NOTIFICATION
+pkglib_LTLIBRARIES += target_notification.la
+target_notification_la_SOURCES = src/target_notification.c
+target_notification_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TARGET_REPLACE
+pkglib_LTLIBRARIES += target_replace.la
+target_replace_la_SOURCES = src/target_replace.c
+target_replace_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TARGET_SCALE
+pkglib_LTLIBRARIES += target_scale.la
+target_scale_la_SOURCES = src/target_scale.c
+target_scale_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TARGET_SET
+pkglib_LTLIBRARIES += target_set.la
+target_set_la_SOURCES = src/target_set.c
+target_set_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TARGET_V5UPGRADE
+pkglib_LTLIBRARIES += target_v5upgrade.la
+target_v5upgrade_la_SOURCES = src/target_v5upgrade.c
+target_v5upgrade_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TCPCONNS
+pkglib_LTLIBRARIES += tcpconns.la
+tcpconns_la_SOURCES = src/tcpconns.c
+tcpconns_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+tcpconns_la_LIBADD =
+if BUILD_WITH_LIBKVM_NLIST
+tcpconns_la_LIBADD += -lkvm
+endif
+endif
+
+if BUILD_PLUGIN_TEAMSPEAK2
+pkglib_LTLIBRARIES += teamspeak2.la
+teamspeak2_la_SOURCES = src/teamspeak2.c
+teamspeak2_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TED
+pkglib_LTLIBRARIES += ted.la
+ted_la_SOURCES = src/ted.c
+ted_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_THERMAL
+pkglib_LTLIBRARIES += thermal.la
+thermal_la_SOURCES = src/thermal.c
+thermal_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+thermal_la_LIBADD = libignorelist.la
+endif
+
+if BUILD_PLUGIN_THRESHOLD
+pkglib_LTLIBRARIES += threshold.la
+threshold_la_SOURCES = src/threshold.c
+threshold_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_TOKYOTYRANT
+pkglib_LTLIBRARIES += tokyotyrant.la
+tokyotyrant_la_SOURCES = src/tokyotyrant.c
+tokyotyrant_la_CPPFLAGS  = $(AM_CPPFLAGS) $(BUILD_WITH_LIBTOKYOTYRANT_CPPFLAGS)
+tokyotyrant_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBTOKYOTYRANT_LDFLAGS)
+tokyotyrant_la_LIBADD  = $(BUILD_WITH_LIBTOKYOTYRANT_LIBS)
+if BUILD_WITH_LIBSOCKET
+tokyotyrant_la_LIBADD += -lsocket
+endif
+endif
+
+if BUILD_PLUGIN_TURBOSTAT
+pkglib_LTLIBRARIES += turbostat.la
+turbostat_la_SOURCES = src/turbostat.c
+turbostat_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_UNIXSOCK
+pkglib_LTLIBRARIES += unixsock.la
+unixsock_la_SOURCES = src/unixsock.c
+unixsock_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+unixsock_la_LIBADD = libcmds.la
+endif
+
+if BUILD_PLUGIN_UPTIME
+pkglib_LTLIBRARIES += uptime.la
+uptime_la_SOURCES = src/uptime.c
+uptime_la_CFLAGS = $(AM_CFLAGS)
+uptime_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+uptime_la_LIBADD =
+if BUILD_WITH_LIBKSTAT
+uptime_la_LIBADD += -lkstat
+endif
+if BUILD_WITH_PERFSTAT
+uptime_la_LIBADD += -lperfstat
+endif
+endif
+
+if BUILD_PLUGIN_USERS
+pkglib_LTLIBRARIES += users.la
+users_la_SOURCES = src/users.c
+users_la_CFLAGS = $(AM_CFLAGS)
+users_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+users_la_LIBADD =
+if BUILD_WITH_LIBSTATGRAB
+users_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
+users_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+endif
+endif
+
+if BUILD_PLUGIN_UUID
+pkglib_LTLIBRARIES += uuid.la
+uuid_la_SOURCES = src/uuid.c
+uuid_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_VARNISH
+pkglib_LTLIBRARIES += varnish.la
+varnish_la_SOURCES = src/varnish.c
+varnish_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBVARNISH_CFLAGS)
+varnish_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+varnish_la_LIBADD = $(BUILD_WITH_LIBVARNISH_LIBS)
+endif
+
+if BUILD_PLUGIN_VIRT
+pkglib_LTLIBRARIES += virt.la
+virt_la_SOURCES = src/virt.c
+virt_la_CFLAGS = $(AM_CFLAGS) \
+       $(BUILD_WITH_LIBVIRT_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
+virt_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+virt_la_LIBADD = libignorelist.la $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
+
+# TODO: enable once we support only modern libvirts which depends on libnl-3
+# the libvirt on wheezy is linked in libnl v1, and there is a small leak here,
+# triggered by the library initialization. There are no means to avoid it,
+# and libvirt switched to libnl3 anyway
+#test_plugin_virt_SOURCES = src/virt_test.c
+#test_plugin_virt_CPPFLAGS = $(AM_CPPFLAGS) \
+#      $(BUILD_WITH_LIBVIRT_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
+#test_plugin_virt_LDFLAGS = $(PLUGIN_LDFLAGS)
+#test_plugin_virt_LDADD = libplugin_mock.la \
+#      $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
+#check_PROGRAMS += test_plugin_virt
+#TESTS += test_plugin_virt
+endif
+
+if BUILD_PLUGIN_VMEM
+pkglib_LTLIBRARIES += vmem.la
+vmem_la_SOURCES = src/vmem.c
+vmem_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_VSERVER
+pkglib_LTLIBRARIES += vserver.la
+vserver_la_SOURCES = src/vserver.c
+vserver_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_WIRELESS
+pkglib_LTLIBRARIES += wireless.la
+wireless_la_SOURCES = src/wireless.c
+wireless_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_WRITE_GRAPHITE
+pkglib_LTLIBRARIES += write_graphite.la
+write_graphite_la_SOURCES = src/write_graphite.c
+write_graphite_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+write_graphite_la_LIBADD = libformat_graphite.la
+endif
+
+if BUILD_PLUGIN_WRITE_HTTP
+pkglib_LTLIBRARIES += write_http.la
+write_http_la_SOURCES = \
+       src/write_http.c \
+       src/utils_format_kairosdb.c \
+       src/utils_format_kairosdb.h
+write_http_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
+write_http_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+write_http_la_LIBADD = libformat_json.la $(BUILD_WITH_LIBCURL_LIBS)
+endif
+
+if BUILD_PLUGIN_WRITE_KAFKA
+pkglib_LTLIBRARIES += write_kafka.la
+write_kafka_la_SOURCES = src/write_kafka.c
+write_kafka_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRDKAFKA_CPPFLAGS)
+write_kafka_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRDKAFKA_LDFLAGS)
+write_kafka_la_LIBADD = \
+       libcmds.la \
+       libformat_graphite.la \
+       libformat_json.la \
+       $(BUILD_WITH_LIBRDKAFKA_LIBS)
+endif
+
+if BUILD_PLUGIN_WRITE_LOG
+pkglib_LTLIBRARIES += write_log.la
+write_log_la_SOURCES = src/write_log.c
+write_log_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+write_log_la_LIBADD = libformat_graphite.la libformat_json.la
+endif
+
+if BUILD_PLUGIN_WRITE_MONGODB
+pkglib_LTLIBRARIES += write_mongodb.la
+write_mongodb_la_SOURCES = src/write_mongodb.c
+write_mongodb_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMONGOC_CFLAGS)
+write_mongodb_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMONGOC_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_WRITE_PROMETHEUS
+pkglib_LTLIBRARIES += write_prometheus.la
+write_prometheus_la_SOURCES = src/write_prometheus.c
+nodist_write_prometheus_la_SOURCES = \
+       prometheus.pb-c.c \
+       prometheus.pb-c.h
+write_prometheus_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS) $(BUILD_WITH_LIBMICROHTTPD_CPPFLAGS)
+write_prometheus_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_LDFLAGS) $(BUILD_WITH_LIBMICROHTTPD_LDFLAGS)
+write_prometheus_la_LIBADD = $(BUILD_WITH_LIBPROTOBUF_C_LIBS) $(BUILD_WITH_LIBMICROHTTPD_LIBS)
+endif
+
+if BUILD_PLUGIN_WRITE_REDIS
+pkglib_LTLIBRARIES += write_redis.la
+write_redis_la_SOURCES = src/write_redis.c
+write_redis_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
+write_redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
+write_redis_la_LIBADD = -lhiredis
+endif
+
+if BUILD_PLUGIN_WRITE_RIEMANN
+pkglib_LTLIBRARIES += write_riemann.la
+write_riemann_la_SOURCES = \
+       src/write_riemann.c \
+       src/write_riemann_threshold.c \
+       src/write_riemann_threshold.h
+write_riemann_la_CFLAGS = $(AM_CFLAGS) $(LIBRIEMANN_CLIENT_CFLAGS)
+write_riemann_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBRIEMANN_CLIENT_LIBS)
+endif
+
+if BUILD_PLUGIN_WRITE_SENSU
+pkglib_LTLIBRARIES += write_sensu.la
+write_sensu_la_SOURCES = src/write_sensu.c
+write_sensu_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_WRITE_TSDB
+pkglib_LTLIBRARIES += write_tsdb.la
+write_tsdb_la_SOURCES = src/write_tsdb.c
+write_tsdb_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_XENCPU
+pkglib_LTLIBRARIES += xencpu.la
+xencpu_la_SOURCES = src/xencpu.c
+xencpu_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBXENCTL_CPPFLAGS)
+xencpu_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBXENCTL_LDFLAGS)
+xencpu_la_LIBADD = -lxenctrl
+endif
+
+if BUILD_PLUGIN_XMMS
+pkglib_LTLIBRARIES += xmms.la
+xmms_la_SOURCES = src/xmms.c
+xmms_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBXMMS_CFLAGS)
+xmms_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+xmms_la_LIBADD = $(BUILD_WITH_LIBXMMS_LIBS)
+endif
+
+if BUILD_PLUGIN_ZFS_ARC
+pkglib_LTLIBRARIES += zfs_arc.la
+zfs_arc_la_SOURCES = src/zfs_arc.c
+zfs_arc_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+if BUILD_FREEBSD
+zfs_arc_la_LIBADD = -lm
+endif
+if BUILD_SOLARIS
+zfs_arc_la_LIBADD = -lkstat
+endif
+endif
+
+if BUILD_PLUGIN_ZOOKEEPER
+pkglib_LTLIBRARIES += zookeeper.la
+zookeeper_la_SOURCES = src/zookeeper.c
+zookeeper_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+if BUILD_PLUGIN_ZONE
+pkglib_LTLIBRARIES += zone.la
+zone_la_SOURCES = src/zone.c
+zone_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
+AM_V_POD2MAN_C = $(am__v_POD2MAN_C_@AM_V@)
+am__v_POD2MAN_C_ = $(am__v_POD2MAN_C_@AM_DEFAULT_V@)
+am__v_POD2MAN_C_0 = @echo "  POD2MAN " $@;
+am__v_POD2MAN_C_1 =
+
+.pod.1:
+       $(AM_V_POD2MAN_C)pod2man --release=$(VERSION) --center=$(PACKAGE) $< \
+               >.pod2man.tmp.$$$$ 2>/dev/null && mv -f .pod2man.tmp.$$$$ $@ || true
+       @if grep '\<POD ERRORS\>' $@ >/dev/null 2>&1; \
+       then \
+               echo "$@ has some POD errors!"; false; \
+       fi
+
+.pod.5:
+       $(AM_V_POD2MAN_C)pod2man --section=5 --release=$(VERSION) --center=$(PACKAGE) $< \
+               >.pod2man.tmp.$$$$ 2>/dev/null && mv -f .pod2man.tmp.$$$$ $@ || true
+       @if grep '\<POD ERRORS\>' $@ >/dev/null 2>&1; \
+       then \
+               echo "$@ has some POD errors!"; false; \
+       fi
+
+V_PROTOC = $(v_protoc_@AM_V@)
+v_protoc_ = $(v_protoc_@AM_DEFAULT_V@)
+v_protoc_0 = @echo "  PROTOC  " $@;
+
+AM_V_PROTOC_C = $(am__v_PROTOC_C_@AM_V@)
+am__v_PROTOC_C_ = $(am__v_PROTOC_C_@AM_DEFAULT_V@)
+am__v_PROTOC_C_0 = @echo "  PROTOC-C" $@;
+am__v_PROTOC_C_1 =
+
+# Protocol buffer for the "pinba" plugin.
+if BUILD_PLUGIN_PINBA
+BUILT_SOURCES += src/pinba.pb-c.c src/pinba.pb-c.h
+
+src/pinba.pb-c.c src/pinba.pb-c.h: $(srcdir)/src/pinba.proto
+       $(AM_V_PROTOC_C)$(PROTOC_C) -I$(srcdir) --c_out . $(srcdir)/src/pinba.proto
+endif
+
+# Protocol buffer for the "write_prometheus" plugin.
+if BUILD_PLUGIN_WRITE_PROMETHEUS
+BUILT_SOURCES += prometheus.pb-c.c prometheus.pb-c.h
+
+prometheus.pb-c.c prometheus.pb-c.h: $(srcdir)/proto/prometheus.proto
+       $(AM_V_PROTOC_C)$(PROTOC_C) -I$(srcdir)/proto --c_out=$(builddir) $(srcdir)/proto/prometheus.proto
+endif
+
+if HAVE_PROTOC3
+if HAVE_GRPC_CPP
+BUILT_SOURCES += collectd.grpc.pb.cc collectd.pb.cc types.pb.cc
+
+collectd.grpc.pb.cc: $(srcdir)/proto/collectd.proto $(srcdir)/proto/types.proto
+       $(V_PROTOC)$(PROTOC) -I$(srcdir)/proto \
+               --grpc_out=$(builddir) --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN) $<
+
+collectd.pb.cc: $(srcdir)/proto/collectd.proto $(srcdir)/proto/types.proto
+       $(V_PROTOC)$(PROTOC) -I$(srcdir)/proto --cpp_out=$(builddir) $<
+
+types.pb.cc: $(srcdir)/proto/types.proto
+       $(V_PROTOC)$(PROTOC) -I$(srcdir)/proto --cpp_out=$(builddir) $<
+endif
+endif
 
 install-exec-hook:
        $(mkinstalldirs) $(DESTDIR)$(localstatedir)/run
        $(mkinstalldirs) $(DESTDIR)$(localstatedir)/lib/$(PACKAGE_NAME)
        $(mkinstalldirs) $(DESTDIR)$(localstatedir)/log
+       $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
+       if test -e $(DESTDIR)$(sysconfdir)/collectd.conf; \
+       then \
+               $(INSTALL) -m 0640 $(srcdir)/src/collectd.conf $(DESTDIR)$(sysconfdir)/collectd.conf.pkg-orig; \
+       else \
+               $(INSTALL) -m 0640 $(srcdir)/src/collectd.conf $(DESTDIR)$(sysconfdir)/collectd.conf; \
+       fi; \
+       $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+       $(INSTALL) -m 0644 $(srcdir)/src/types.db $(DESTDIR)$(pkgdatadir)/types.db;
+       $(INSTALL) -m 0644 $(srcdir)/src/postgresql_default.conf \
+               $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
+
+uninstall-hook:
+       rm -f $(DESTDIR)$(pkgdatadir)/types.db;
+       rm -f $(DESTDIR)$(sysconfdir)/collectd.conf
+       rm -f $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
 
-maintainer-clean-local:
-       -rm -f -r libltdl
-       -rm -f INSTALL
-       -rm -f aclocal.m4
+all-local: @PERL_BINDINGS@
+
+install-exec-local:
+       [ ! -f buildperl/Makefile ] || ( cd buildperl && $(MAKE) install )
+
+# Perl 'make uninstall' does not work as well as wanted.
+# So we do the work here.
+uninstall-local:
+       @PERL@ -I$(DESTDIR)$(prefix) $(srcdir)/bindings/perl/uninstall_mod.pl Collectd
+       find $(DESTDIR)$(prefix) -name "perllocal.pod" -exec rm {} \;
+
+clean-local:
+       rm -rf buildperl
+
+perl: buildperl/Makefile
+       cd buildperl && $(MAKE)
+
+buildperl/Makefile: .perl-directory-stamp buildperl/Makefile.PL \
+       $(top_builddir)/config.status
+       @# beautify the output a bit
+       @echo 'cd buildperl && @PERL@ Makefile.PL @PERL_BINDINGS_OPTIONS@'
+       @cd buildperl && ( if ! @PERL@ Makefile.PL @PERL_BINDINGS_OPTIONS@; then \
+                       echo ""; \
+                       echo 'Check whether you have set $$PERL_MM_OPT in your environment and try using ./configure --with-perl-bindings=""'; \
+                       echo ""; \
+               fi )
+
+buildperl/Makefile.PL: .perl-directory-stamp $(top_builddir)/config.status
+
+.perl-directory-stamp:
+       if test ! -d buildperl; then \
+         mkdir -p buildperl/Collectd/Plugins; \
+         cp $(srcdir)/bindings/perl/lib/Collectd.pm buildperl/; \
+         cp $(srcdir)/bindings/perl/Makefile.PL buildperl/; \
+         cp $(srcdir)/bindings/perl/lib/Collectd/Unixsock.pm buildperl/Collectd/; \
+         cp $(srcdir)/bindings/perl/lib/Collectd/Plugins/OpenVZ.pm buildperl/Collectd/Plugins/; \
+       fi
+       touch $@
+
+.PHONY: perl
+
+
+if BUILD_WITH_JAVA
+dist_noinst_JAVA = \
+       bindings/java/org/collectd/api/Collectd.java \
+       bindings/java/org/collectd/api/CollectdConfigInterface.java \
+       bindings/java/org/collectd/api/CollectdFlushInterface.java \
+       bindings/java/org/collectd/api/CollectdInitInterface.java \
+       bindings/java/org/collectd/api/CollectdLogInterface.java \
+       bindings/java/org/collectd/api/CollectdMatchFactoryInterface.java \
+       bindings/java/org/collectd/api/CollectdMatchInterface.java \
+       bindings/java/org/collectd/api/CollectdNotificationInterface.java \
+       bindings/java/org/collectd/api/CollectdReadInterface.java \
+       bindings/java/org/collectd/api/CollectdShutdownInterface.java \
+       bindings/java/org/collectd/api/CollectdTargetFactoryInterface.java \
+       bindings/java/org/collectd/api/CollectdTargetInterface.java \
+       bindings/java/org/collectd/api/CollectdWriteInterface.java \
+       bindings/java/org/collectd/api/DataSet.java \
+       bindings/java/org/collectd/api/DataSource.java \
+       bindings/java/org/collectd/api/Notification.java \
+       bindings/java/org/collectd/api/OConfigItem.java \
+       bindings/java/org/collectd/api/OConfigValue.java \
+       bindings/java/org/collectd/api/PluginData.java \
+       bindings/java/org/collectd/api/ValueList.java \
+       bindings/java/org/collectd/java/GenericJMX.java \
+       bindings/java/org/collectd/java/GenericJMXConfConnection.java \
+       bindings/java/org/collectd/java/GenericJMXConfMBean.java \
+       bindings/java/org/collectd/java/GenericJMXConfValue.java \
+       bindings/java/org/collectd/java/JMXMemory.java
+
+collectd-api.jar: $(JAVA_TIMESTAMP_FILE)
+       $(JAR) cf $(JARFLAGS) $@ org/collectd/api/*.class
+
+generic-jmx.jar: $(JAVA_TIMESTAMP_FILE)
+       $(JAR) cf $(JARFLAGS) $@ org/collectd/java/*.class
+
+jar_DATA = collectd-api.jar generic-jmx.jar
+endif
diff --git a/README b/README
index 803fbaa..b0b5921 100644 (file)
--- a/README
+++ b/README
@@ -198,14 +198,19 @@ Features
       Queries very detailed usage statistics from wireless LAN adapters and
       interfaces that use the Atheros chipset and the MadWifi driver.
 
-    - md
-      Linux software-RAID device information (number of active, failed, spare
-      and missing disks).
-
     - mbmon
       Motherboard sensors: temperature, fan speed and voltage information,
       using mbmon(1).
 
+    - mcelog
+      Monitor machine check exceptions (hardware errors detected by hardware
+      and reported to software) reported by mcelog and generate appropriate
+      notifications when machine check exceptions are detected.
+
+    - md
+      Linux software-RAID device information (number of active, failed, spare
+      and missing disks).
+
     - memcachec
       Query and parse data from a memcache daemon (memcached).
 
@@ -283,6 +288,22 @@ Features
     - oracle
       Query data from an Oracle database.
 
+    - ovs_events
+      The plugin monitors the link status of Open vSwitch (OVS) connected
+      interfaces, dispatches the values to collectd and sends the notification
+      whenever the link state change occurs in the OVS database. It requires
+      YAJL library to be installed.
+      Detailed instructions for installing and setting up Open vSwitch, see
+      OVS documentation.
+      <http://openvswitch.org/support/dist-docs/INSTALL.rst.html>
+
+    - ovs_stats
+      The plugin collects the statistics of OVS connected bridges and
+      interfaces. It requires YAJL library to be installed.
+      Detailed instructions for installing and setting up Open vSwitch, see
+      OVS documentation.
+      <http://openvswitch.org/support/dist-docs/INSTALL.rst.html>
+
     - perl
       The perl plugin implements a Perl-interpreter into collectd. You can
       write your own plugins in Perl and return arbitrary values using this
@@ -476,6 +497,13 @@ Features
       updates to the files and write a bunch of updates at once, which lessens
       system load a lot.
 
+    - snmp_agent
+      Receives and handles queries from SNMP master agent and returns the data
+      collected by read plugins. Handles requests only for OIDs specified in
+      configuration file. To handle SNMP queries the plugin gets data from
+      collectd and translates requested values from collectd's internal format
+      to SNMP format.
+
     - unixsock
       One can query the values from the unixsock plugin whenever they're
       needed. Please read collectd-unixsock(5) for a description on how that's
@@ -750,10 +778,6 @@ Prerequisites
     Used by the `gps' plugin.
     <http://developer.berlios.de/projects/gpsd/>
 
-  * libhal (optional)
-    If present, the `uuid' plugin will check for UUID from HAL.
-    <http://hal.freedesktop.org/>
-
   * libi2c-dev (optional)
     Used for the plugin `barometer', provides just the i2c-dev.h header file
     for user space i2c development.
@@ -807,7 +831,11 @@ Prerequisites
     This library is part of the “Manage ONTAP SDK” published by NetApp.
 
   * libnetsnmp (optional)
-    For the `snmp' plugin.
+    For the `snmp' and 'snmp_agent' plugins.
+    <http://www.net-snmp.org/>
+
+  * libnetsnmpagent (optional)
+    Required for the 'snmp_agent' plugin.
     <http://www.net-snmp.org/>
 
   * libnotify (optional)
@@ -925,8 +953,8 @@ Prerequisites
     <http://www.xmms.org/>
 
   * libyajl (optional)
-    Parse JSON data. This is needed for the `ceph', `curl_json' and
-    `log_logstash' plugins.
+    Parse JSON data. This is needed for the `ceph', `curl_json', 'ovs_events',
+    'ovs_stats' and `log_logstash' plugins.
     <http://github.com/lloyd/yajl>
 
   * libvarnish (optional)
@@ -981,7 +1009,6 @@ To generate the `configure` script, you'll need the following dependencies:
 - flex
 - bison
 - libtool
-- libtool-ltdl
 - pkg-config
 
 The `build.sh' script takes no arguments.
diff --git a/bindings/Makefile.am b/bindings/Makefile.am
deleted file mode 100644 (file)
index 07373e8..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-SUBDIRS =
-
-if BUILD_WITH_JAVA
-SUBDIRS += java
-endif
-
-EXTRA_DIST = perl/Makefile.PL \
-            perl/uninstall_mod.pl \
-            perl/lib/Collectd.pm \
-            perl/lib/Collectd/Unixsock.pm \
-            perl/lib/Collectd/Plugins/Monitorus.pm \
-            perl/lib/Collectd/Plugins/OpenVZ.pm
-
-CLEANFILES = \
-       buildperl/Collectd.pm \
-       buildperl/Collectd/Plugins/OpenVZ.pm \
-       buildperl/Collectd/Unixsock.pm \
-       buildperl/Makefile.PL \
-       .perl-directory-stamp
-
-DISTCLEANFILES = \
-       buildperl/Collectd.pm \
-       buildperl/Collectd/Plugins/OpenVZ.pm \
-       buildperl/Collectd/Unixsock.pm \
-       buildperl/Makefile.PL \
-       .perl-directory-stamp
-
-all-local: @PERL_BINDINGS@
-
-
-install-exec-local:
-       [ ! -f buildperl/Makefile ] || ( cd buildperl && $(MAKE) install )
-
-# Perl 'make uninstall' does not work as well as wanted.
-# So we do the work here.
-uninstall-local:
-       @PERL@ -I$(DESTDIR)$(prefix) $(srcdir)/perl/uninstall_mod.pl Collectd
-       find $(DESTDIR)$(prefix) -name "perllocal.pod" -exec rm {} \;
-
-clean-local:
-       rm -rf buildperl
-
-perl: buildperl/Makefile
-       cd buildperl && $(MAKE)
-
-buildperl/Makefile: .perl-directory-stamp buildperl/Makefile.PL \
-       $(top_builddir)/config.status
-       @# beautify the output a bit
-       @echo 'cd buildperl && @PERL@ Makefile.PL @PERL_BINDINGS_OPTIONS@'
-       @cd buildperl && ( if ! @PERL@ Makefile.PL @PERL_BINDINGS_OPTIONS@; then \
-                       echo ""; \
-                       echo 'Check whether you have set $$PERL_MM_OPT in your environment and try using ./configure --with-perl-bindings=""'; \
-                       echo ""; \
-               fi )
-
-buildperl/Makefile.PL: .perl-directory-stamp $(top_builddir)/config.status
-
-.perl-directory-stamp:
-       if test ! -d buildperl; then \
-         mkdir -p buildperl/Collectd/Plugins; \
-         cp $(srcdir)/perl/lib/Collectd.pm buildperl/; \
-         cp $(srcdir)/perl/Makefile.PL buildperl/; \
-         cp $(srcdir)/perl/lib/Collectd/Unixsock.pm buildperl/Collectd/; \
-         cp $(srcdir)/perl/lib/Collectd/Plugins/OpenVZ.pm buildperl/Collectd/Plugins/; \
-       fi
-       touch $@
-
-.PHONY: perl
-
diff --git a/bindings/java/Makefile.am b/bindings/java/Makefile.am
deleted file mode 100644 (file)
index 8d2e49d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-EXTRA_DIST = org/collectd/api/CollectdConfigInterface.java \
-            org/collectd/api/CollectdFlushInterface.java \
-            org/collectd/api/CollectdInitInterface.java \
-            org/collectd/api/Collectd.java \
-            org/collectd/api/CollectdLogInterface.java \
-            org/collectd/api/CollectdMatchFactoryInterface.java \
-            org/collectd/api/CollectdMatchInterface.java \
-            org/collectd/api/CollectdNotificationInterface.java \
-            org/collectd/api/CollectdReadInterface.java \
-            org/collectd/api/CollectdShutdownInterface.java \
-            org/collectd/api/CollectdTargetFactoryInterface.java \
-            org/collectd/api/CollectdTargetInterface.java \
-            org/collectd/api/CollectdWriteInterface.java \
-            org/collectd/api/DataSet.java \
-            org/collectd/api/DataSource.java \
-            org/collectd/api/Notification.java \
-            org/collectd/api/OConfigItem.java \
-            org/collectd/api/OConfigValue.java \
-            org/collectd/api/PluginData.java \
-            org/collectd/api/ValueList.java \
-            org/collectd/java/GenericJMXConfConnection.java \
-            org/collectd/java/GenericJMXConfMBean.java \
-            org/collectd/java/GenericJMXConfValue.java \
-            org/collectd/java/GenericJMX.java \
-            org/collectd/java/JMXMemory.java
-
-java-build-stamp: $(srcdir)/org/collectd/api/*.java $(srcdir)/org/collectd/java/*.java
-       $(JAVAC) -d "." "$(srcdir)/org/collectd/api"/*.java
-       $(JAVAC) -d "." "$(srcdir)/org/collectd/java"/*.java
-       mkdir -p .libs
-       $(JAR) cf .libs/collectd-api.jar "org/collectd/api"/*.class
-       $(JAR) cf .libs/generic-jmx.jar "org/collectd/java"/*.class
-       touch "$@"
-
-all-local: java-build-stamp
-
-install-exec-local: java-build-stamp
-       mkdir -p "$(DESTDIR)$(pkgdatadir)/java"
-       $(INSTALL) -m 644 .libs/collectd-api.jar \
-               "$(DESTDIR)$(pkgdatadir)/java"
-       $(INSTALL) -m 644 .libs/generic-jmx.jar \
-               "$(DESTDIR)$(pkgdatadir)/java"
-
-uninstall-local:
-       rm -f "$(DESTDIR)$(pkgdatadir)/java/collectd-api.jar"
-       rm -f "$(DESTDIR)$(pkgdatadir)/java/generic-jmx.jar"
-       rmdir "$(DESTDIR)$(pkgdatadir)/java" || true
-
-clean-local:
-       rm -f "org/collectd/api"/*.class
-       rm -f "org/collectd/java"/*.class
-       rm -f .libs
-       rm -f "java-build-stamp"
index 63b7628..6d3d688 100644 (file)
@@ -30,6 +30,8 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Collection;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.Iterator;
 import java.util.ArrayList;
 
@@ -128,6 +130,14 @@ class GenericJMXConfValue
     {
       return (BigInteger.ZERO.add ((BigInteger) obj));
     }
+    else if (obj instanceof AtomicInteger)
+    {
+        return (new Integer(((AtomicInteger) obj).get()));
+    }
+    else if (obj instanceof AtomicLong)
+    {
+        return (new Long(((AtomicLong) obj).get()));
+    }
 
     return (null);
   } /* }}} Number genericObjectToNumber */
index 57f3d44..40f5361 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -18,12 +18,7 @@ EOF
        done
 }
 
-check_for_application lex bison autoheader aclocal automake autoconf
-
-# Actually we don't need the pkg-config executable, but we need the M4 macros.
-# We check for `pkg-config' here and hope that M4 macros will then be
-# available, too.
-check_for_application pkg-config
+check_for_application lex bison autoheader aclocal automake autoconf pkg-config
 
 libtoolize=""
 libtoolize --version >/dev/null 2>/dev/null
@@ -54,6 +49,6 @@ set -x
 
 autoheader \
 && aclocal \
-&& $libtoolize --ltdl --copy --force \
+&& $libtoolize --copy --force \
 && automake --add-missing --copy \
 && autoconf
index 6780cda..ac3c310 100755 (executable)
--- a/clean.sh
+++ b/clean.sh
@@ -15,7 +15,6 @@ true \
 && rm -f configure \
 && rm -f depcomp \
 && rm -f install-sh \
-&& rm -f -r libltdl \
 && rm -f libtool \
 && rm -f ltmain.sh \
 && rm -f Makefile \
index feed085..3357375 100644 (file)
@@ -3,34 +3,15 @@ AC_PREREQ([2.60])
 AC_INIT([collectd],[m4_esyscmd(./version-gen.sh)])
 AC_CONFIG_SRCDIR(src/target_set.c)
 AC_CONFIG_HEADERS(src/config.h)
-AC_CONFIG_AUX_DIR([libltdl/config])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_MACRO_DIR([m4])
 
 dnl older automake's default of ARFLAGS=cru is noisy on newer binutils;
 dnl we don't really need the 'u' even in older toolchains.  Then there is
 dnl older libtool, which spelled it AR_FLAGS
 m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"])
 
-m4_ifdef([LT_PACKAGE_VERSION],
-       # libtool >= 2.2
-       [
-        LT_CONFIG_LTDL_DIR([libltdl])
-        LT_INIT([dlopen])
-        LTDL_INIT([convenience])
-        AC_DEFINE(LIBTOOL_VERSION, 2, [Define to used libtool version.])
-       ]
-,
-       # libtool <= 1.5
-       [
-        AC_LIBLTDL_CONVENIENCE
-        AC_SUBST(LTDLINCL)
-        AC_SUBST(LIBLTDL)
-        AC_LIBTOOL_DLOPEN
-        AC_CONFIG_SUBDIRS(libltdl)
-        AC_DEFINE(LIBTOOL_VERSION, 1, [Define to used libtool version.])
-       ]
-)
-
-AM_CONDITIONAL([BUILD_INCLUDED_LTDL], [test "x$LTDLDEPS" != "x"])
+LT_INIT([dlopen disable-static])
 
 AM_INIT_AUTOMAKE([subdir-objects tar-pax dist-bzip2 no-dist-gzip foreign])
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -46,6 +27,9 @@ AC_SYS_LARGEFILE
 AC_PROG_CC_C99([],
   [AC_MSG_ERROR([No compiler found that supports C99])]
 )
+
+AX_COMPILER_VENDOR
+
 AC_PROG_CXX
 AC_PROG_CPP
 AC_PROG_EGREP
@@ -53,10 +37,7 @@ AC_PROG_INSTALL
 AC_PROG_LN_S
 AC_PROG_MAKE_SET
 AM_PROG_CC_C_O
-AM_CONDITIONAL(COMPILER_IS_GCC, test "x$GCC" = "xyes")
 
-AC_DISABLE_STATIC
-AC_PROG_LIBTOOL
 AC_PROG_LEX
 AC_PROG_YACC
 
@@ -67,78 +48,60 @@ m4_pattern_forbid([^_?PKG_[A-Z_]+$],[*** pkg.m4 missing, please install pkg-conf
 
 PKG_PROG_PKG_CONFIG
 
-AC_CACHE_CHECK([if bison is the parser generator],
-       [collectd_cv_prog_bison],
-       [AS_IF([$YACC --version 2>/dev/null | $EGREP -q '^bison '],
-               [collectd_cv_prog_bison=yes], [collectd_cv_prog_bison=no]
-       )]
+AC_CACHE_CHECK([if Bison is the parser generator],
+  [collectd_cv_prog_bison],
+  [
+    AS_IF([$YACC --version 2>/dev/null | $EGREP -q '^bison '],
+      [collectd_cv_prog_bison=yes],
+      [collectd_cv_prog_bison=no]
+    )
+  ]
 )
 
-if test "x$collectd_cv_prog_bison" = "xno" && test ! -f "${srcdir}/src/liboconfig/parser.c"
-then
-       AC_MSG_ERROR([bison is missing and you do not have ${srcdir}/src/liboconfig/parser.c. Please install bison])
+if test "x$collectd_cv_prog_bison" = "xno" && test ! -f "${srcdir}/src/liboconfig/parser.c"; then
+  AC_MSG_ERROR([bison is missing and you do not have ${srcdir}/src/liboconfig/parser.c. Please install bison])
 fi
 
-AC_ARG_VAR([PROTOC], [path to the protoc binary])
-AC_PATH_PROG([PROTOC], [protoc])
-have_protoc3="no"
-if test "x$PROTOC" != "x"; then
-       AC_MSG_CHECKING([for protoc 3.0.0+])
-       if $PROTOC --version | $EGREP libprotoc.3 >/dev/null; then
-               protoc3="yes (`$PROTOC --version`)"
-               have_protoc3="yes"
-       else
-               protoc3="no (`$PROTOC --version`)"
-       fi
-       AC_MSG_RESULT([$protoc3])
+if test "x$lt_cv_dlopen" = "xno"; then
+  AC_MSG_ERROR([Your system does not support dlopen])
 fi
-AM_CONDITIONAL(HAVE_PROTOC3, test "x$have_protoc3" = "xyes")
 
-AC_ARG_VAR([GRPC_CPP_PLUGIN], [path to the grpc_cpp_plugin binary])
-AC_PATH_PROG([GRPC_CPP_PLUGIN], [grpc_cpp_plugin])
-AM_CONDITIONAL(HAVE_GRPC_CPP, test "x$GRPC_CPP_PLUGIN" != "x")
+AC_SUBST([DLOPEN_LIBS], [$lt_cv_dlopen_libs])
 
-AC_ARG_VAR([PROTOC_C], [path to the protoc-c binary])
-AC_PATH_PROG([PROTOC_C], [protoc-c])
-if test "x$PROTOC_C" = "x"
-then
-  have_protoc_c="no (protoc-c compiler not found)"
-else
-  have_protoc_c="yes"
-fi
 
 AC_MSG_CHECKING([for kernel type ($host_os)])
 case $host_os in
-       *linux*)
-       AC_DEFINE([KERNEL_LINUX], 1, [True if program is to be compiled for a Linux kernel])
-       ac_system="Linux"
-       ;;
-       *solaris*)
-       AC_DEFINE([KERNEL_SOLARIS], 1, [True if program is to be compiled for a Solaris kernel])
-       ac_system="Solaris"
-       ;;
-       *darwin*)
-       AC_DEFINE([KERNEL_DARWIN], 1, [True if program is to be compiled for a Darwin kernel])
-       ac_system="Darwin"
-       ;;
-       *openbsd*)
-       AC_DEFINE([KERNEL_OPENBSD], 1, [True if program is to be compiled for an OpenBSD kernel])
-       ac_system="OpenBSD"
-       ;;
-       *netbsd*)
-       AC_DEFINE([KERNEL_NETBSD], 1, [True if program is to be compiled for a NetBSD kernel])
-       ac_system="NetBSD"
-       ;;
-       *aix*)
-       AC_DEFINE([KERNEL_AIX], 1, [True if program is to be compiled for a AIX kernel])
-       ac_system="AIX"
-       ;;
-       *freebsd*)
-       AC_DEFINE([KERNEL_FREEBSD], 1, [True if program is to be compiled for a FreeBSD kernel])
-       ac_system="FreeBSD"
-       ;;
-       *)
-       ac_system="unknown"
+  *aix*)
+    AC_DEFINE([KERNEL_AIX], [1], [True if program is to be compiled for a AIX kernel])
+    ac_system="AIX"
+    ;;
+  *darwin*)
+    AC_DEFINE([KERNEL_DARWIN], [1], [True if program is to be compiled for a Darwin kernel])
+    ac_system="Darwin"
+    ;;
+  *freebsd*)
+    AC_DEFINE([KERNEL_FREEBSD], [1], [True if program is to be compiled for a FreeBSD kernel])
+    ac_system="FreeBSD"
+    ;;
+  *linux*)
+    AC_DEFINE([KERNEL_LINUX], [1], [True if program is to be compiled for a Linux kernel])
+    ac_system="Linux"
+    ;;
+  *netbsd*)
+    AC_DEFINE([KERNEL_NETBSD], [1], [True if program is to be compiled for a NetBSD kernel])
+    ac_system="NetBSD"
+    ;;
+  *openbsd*)
+    AC_DEFINE([KERNEL_OPENBSD], [1], [True if program is to be compiled for an OpenBSD kernel])
+    ac_system="OpenBSD"
+    ;;
+  *solaris*)
+    AC_DEFINE([KERNEL_SOLARIS], [1], [True if program is to be compiled for a Solaris kernel])
+    ac_system="Solaris"
+    ;;
+  *)
+    ac_system="unknown"
+    ;;
 esac
 AC_MSG_RESULT([$ac_system])
 
@@ -149,77 +112,46 @@ AM_CONDITIONAL([BUILD_LINUX], [test "x$ac_system" = "xLinux"])
 AM_CONDITIONAL([BUILD_OPENBSD], [test "x$ac_system" = "xOpenBSD"])
 AM_CONDITIONAL([BUILD_SOLARIS], [test "x$ac_system" = "xSolaris"])
 
-if test "x$ac_system" = "xLinux"
-then
-       AC_ARG_VAR([KERNEL_DIR], [path to Linux kernel sources])
-       if test -z "$KERNEL_DIR"
-       then
-               KERNEL_DIR="/lib/modules/`uname -r`/source"
-       fi
+if test "x$ac_system" = "xSolaris"; then
+  AC_DEFINE([_POSIX_PTHREAD_SEMANTICS], [1], [Define to enforce POSIX thread semantics under Solaris.])
+  AC_DEFINE([_REENTRANT], [1], [Define to enable reentrancy interfaces.])
 
-       KERNEL_CFLAGS="-I$KERNEL_DIR/include"
-       AC_SUBST(KERNEL_CFLAGS)
+  AC_MSG_CHECKING([whether compiler builds 64bit binaries])
+  AC_COMPILE_IFELSE(
+    [
+      AC_LANG_PROGRAM(
+        [
+          #ifndef _LP64
+          # error "Compiler not in 64bit mode."
+          #endif
+        ]
+      )
+    ],
+    [AC_MSG_RESULT([yes])],
+    [
+      AC_MSG_RESULT([no])
+      AC_MSG_NOTICE([Solaris detected. Please consider building a 64-bit binary.])
+    ]
+  )
 fi
 
-if test "x$ac_system" = "xSolaris"
-then
-       AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Define to enforce POSIX thread semantics under Solaris.])
-       AC_DEFINE(_REENTRANT,               1, [Define to enable reentrancy interfaces.])
-
-       AC_MSG_CHECKING([whether compiler builds 64bit binaries])
-       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
-                          #ifndef _LP64
-                          # error "Compiler not in 64bit mode."
-                          #endif
-                          ])],
-                          [AC_MSG_RESULT([yes])],
-                          [
-                           AC_MSG_RESULT([no])
-                           AC_MSG_NOTICE([Solaris detected. Please consider building a 64-bit binary.])
-                          ])
-fi
-
-if test "x$ac_system" = "xAIX"
-then
-       AC_DEFINE(_THREAD_SAFE_ERRNO, 1, [Define to use the thread-safe version of errno under AIX.])
+if test "x$ac_system" = "xAIX"; then
+  AC_DEFINE([_THREAD_SAFE_ERRNO], [1], [Define to use the thread-safe version of errno under AIX.])
 fi
 
 # Where to install .pc files.
 pkgconfigdir="${libdir}/pkgconfig"
-AC_SUBST(pkgconfigdir)
-
-# Check for standards compliance mode
-AC_ARG_ENABLE(standards,
-             AS_HELP_STRING([--enable-standards], [Enable standards compliance mode]),
-             [enable_standards="$enableval"],
-             [enable_standards="no"])
-if test "x$enable_standards" = "xyes"
-then
-       AC_DEFINE(_ISOC99_SOURCE,        1, [Define to enforce ISO C99 compliance.])
-       AC_DEFINE(_POSIX_C_SOURCE, 200809L, [Define to enforce POSIX.1-2008 compliance.])
-       AC_DEFINE(_XOPEN_SOURCE,       700, [Define to enforce X/Open 7 (XSI) compliance.])
-       AC_DEFINE(_REENTRANT,            1, [Define to enable reentrancy interfaces.])
-       if test "x$GCC" = "xyes"
-       then
-               CFLAGS="$CFLAGS -std=c99"
-       fi
-fi
-AM_CONDITIONAL(BUILD_FEATURE_STANDARDS, test "x$enable_standards" = "xyes")
+AC_SUBST([pkgconfigdir])
 
 #
 # Checks for header files.
 #
-AC_HEADER_STDC
 AC_HEADER_SYS_WAIT
 AC_HEADER_DIRENT
-AC_HEADER_STDBOOL
 
-AC_CHECK_HEADERS([ \
+AC_CHECK_HEADERS_ONCE([ \
   arpa/inet.h \
-  assert.h \
-  ctype.h \
   endian.h \
-  errno.h \
   fcntl.h \
   fnmatch.h \
   fs_info.h \
@@ -228,9 +160,6 @@ AC_CHECK_HEADERS([ \
   kstat.h \
   kvm.h \
   libgen.h \
-  limits.h \
-  locale.h \
-  math.h \
   mntent.h \
   mnttab.h \
   netdb.h \
@@ -239,9 +168,6 @@ AC_CHECK_HEADERS([ \
   pthread_np.h \
   pwd.h \
   regex.h \
-  signal.h \
-  stdarg.h \
-  stdio.h \
   sys/fs_types.h \
   sys/fstyp.h \
   sys/ioctl.h \
@@ -260,450 +186,447 @@ AC_CHECK_HEADERS([ \
   sys/vfstab.h \
   sys/vmmeter.h \
   syslog.h \
-  wordexp.h \
+  wordexp.h
 ])
 
-# For entropy plugin on newer NetBSD
-AC_CHECK_HEADERS(sys/rndio.h, [], [],
-[#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-])
+if test "x$ac_system" = "xNetBSD"; then
+  # For entropy plugin on newer NetBSD
+  AC_CHECK_HEADERS([sys/rndio.h], [], [],
+    [[
+      #if HAVE_SYS_TYPES_H
+      # include <sys/types.h>
+      #endif
+      #if HAVE_SYS_IOCTL_H
+      # include <sys/ioctl.h>
+      #endif
+      #if HAVE_SYS_PARAM_H
+      # include <sys/param.h>
+      #endif
+    ]]
+  )
+fi
 
 # For ping library
-AC_CHECK_HEADERS(netinet/in_systm.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/in.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/ip.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/ip_icmp.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/ip_var.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/ip6.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/icmp6.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP6_H
-# include <netinet/ip6.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/tcp.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/udp.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-])
+AC_CHECK_HEADERS([netinet/in_systm.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+  ]]
+)
 
-have_ip6_ext="no"
-AC_CHECK_TYPES([struct ip6_ext], [have_ip6_ext="yes"], [have_ip6_ext="no"],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP6_H
-# include <netinet/ip6.h>
-#endif
-])
+AC_CHECK_HEADERS([netinet/in.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+  ]]
+)
 
-if test "x$have_ip6_ext" = "xno"; then
-       SAVE_CFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS -DSOLARIS2=8"
-
-       AC_CHECK_TYPES([struct ip6_ext],
-                      [have_ip6_ext="yes, with -DSOLARIS2=8"],
-                      [have_ip6_ext="no"],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP6_H
-# include <netinet/ip6.h>
-#endif
-])
+AC_CHECK_HEADERS([netinet/ip.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+  ]]
+)
 
-       if test "x$have_ip6_ext" = "xno"; then
-               CFLAGS="$SAVE_CFLAGS"
-       fi
-fi
+AC_CHECK_HEADERS([netinet/ip_icmp.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+  ]]
+)
 
-# For cpu modules
-AC_CHECK_HEADERS(sys/dkstat.h)
-if test "x$ac_system" = "xDarwin"
-then
-       AC_CHECK_HEADERS(mach/mach_init.h mach/host_priv.h mach/mach_error.h mach/mach_host.h mach/mach_port.h mach/mach_types.h mach/message.h mach/processor_set.h mach/processor.h mach/processor_info.h mach/task.h mach/thread_act.h mach/vm_region.h mach/vm_map.h mach/vm_prot.h mach/vm_statistics.h mach/kern_return.h)
-       AC_CHECK_HEADERS(CoreFoundation/CoreFoundation.h IOKit/IOKitLib.h IOKit/IOTypes.h IOKit/ps/IOPSKeys.h IOKit/IOBSD.h IOKit/storage/IOBlockStorageDriver.h)
-       # For the battery plugin
-       AC_CHECK_HEADERS(IOKit/ps/IOPowerSources.h, [], [],
-[
-#if HAVE_IOKIT_IOKITLIB_H
-#  include <IOKit/IOKitLib.h>
-#endif
-#if HAVE_IOKIT_IOTYPES_H
-#  include <IOKit/IOTypes.h>
-#endif
-])
+AC_CHECK_HEADERS([netinet/ip_var.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+  ]]
+)
 
-fi
+AC_CHECK_HEADERS([netinet/ip6.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+  ]]
+)
 
-AC_CHECK_HEADERS(sys/sysctl.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-])
+AC_CHECK_HEADERS([netinet/icmp6.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP6_H
+    # include <netinet/ip6.h>
+    #endif
+  ]]
+)
 
-AC_MSG_CHECKING([for sysctl kern.cp_times])
-if test -x /sbin/sysctl
-then
-       /sbin/sysctl kern.cp_times >/dev/null 2>&1
-       if test $? -eq 0
-       then
-               AC_MSG_RESULT([yes])
-               AC_DEFINE(HAVE_SYSCTL_KERN_CP_TIMES, 1,
-               [Define if sysctl supports kern.cp_times])
-       else
-               AC_MSG_RESULT([no])
-       fi
-else
-       AC_MSG_RESULT([no])
-fi
+AC_CHECK_HEADERS([netinet/tcp.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+  ]]
+)
 
-AC_MSG_CHECKING([for sysctl kern.cp_time])
-if test -x /sbin/sysctl
-then
-       /sbin/sysctl kern.cp_time >/dev/null 2>&1
-       if test $? -eq 0
-       then
-               AC_MSG_RESULT([yes])
-               AC_DEFINE(HAVE_SYSCTL_KERN_CP_TIME, 1,
-                       [Define if sysctl supports kern.cp_time])
-       else
-               AC_MSG_RESULT([no])
-       fi
-else
-       AC_MSG_RESULT([no])
-fi
+AC_CHECK_HEADERS([netinet/udp.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+  ]]
+)
 
-# For hddtemp module
-AC_CHECK_HEADERS(linux/major.h)
+# For cpu modules
+AC_CHECK_HEADERS([sys/dkstat.h])
+if test "x$ac_system" = "xDarwin"; then
+  AC_CHECK_HEADERS(
+    [ \
+      mach/mach_init.h \
+      mach/host_priv.h \
+      mach/mach_error.h \
+      mach/mach_host.h \
+      mach/mach_port.h \
+      mach/mach_types.h \
+      mach/message.h \
+      mach/processor_set.h \
+      mach/processor.h \
+      mach/processor_info.h \
+      mach/task.h \
+      mach/thread_act.h \
+      mach/vm_region.h \
+      mach/vm_map.h \
+      mach/vm_prot.h \
+      mach/vm_statistics.h \
+      mach/kern_return.h \
+      CoreFoundation/CoreFoundation.h \
+      IOKit/IOKitLib.h \
+      IOKit/IOTypes.h \
+      IOKit/ps/IOPSKeys.h \
+      IOKit/IOBSD.h \
+      IOKit/storage/IOBlockStorageDriver.h
+    ]
+  )
 
-# For md module (Linux only)
-if test "x$ac_system" = "xLinux"
-then
-       AC_CHECK_HEADERS(linux/raid/md_u.h,
-                        [have_linux_raid_md_u_h="yes"],
-                        [have_linux_raid_md_u_h="no"],
-[
-#include <sys/ioctl.h>
-#include <linux/major.h>
-#include <linux/types.h>
-])
-       AC_CHECK_HEADERS([sys/sysmacros.h])
-else
-       have_linux_raid_md_u_h="no"
+  # For the battery plugin
+  AC_CHECK_HEADERS([IOKit/ps/IOPowerSources.h], [], [],
+    [[
+      #if HAVE_IOKIT_IOKITLIB_H
+      #  include <IOKit/IOKitLib.h>
+      #endif
+      #if HAVE_IOKIT_IOTYPES_H
+      #  include <IOKit/IOTypes.h>
+      #endif
+    ]]
+  )
 fi
 
-# For the wireless module
-have_linux_wireless_h="no"
-if test "x$ac_system" = "xLinux"
-then
-  AC_CHECK_HEADERS(linux/wireless.h,
-                  [have_linux_wireless_h="yes"],
-                  [have_linux_wireless_h="no"],
-[
-#include <dirent.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-])
-fi
+AC_CHECK_HEADERS([sys/sysctl.h], [], [],
+  [[
+    #if HAVE_SYS_TYPES_H
+    #  include <sys/types.h>
+    #endif
+    #if HAVE_SYS_PARAM_H
+    # include <sys/param.h>
+    #endif
+  ]]
+)
 
-# For the swap module
-have_sys_swap_h="yes"
-AC_CHECK_HEADERS(sys/swap.h vm/anon.h, [], [have_sys_swap_h="no"],
-[
-#undef _FILE_OFFSET_BITS
-#undef _LARGEFILE64_SOURCE
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-])
+# For interface plugin
+AC_CHECK_HEADERS([ifaddrs.h])
+AC_CHECK_HEADERS([net/if.h], [], [],
+  [[
+    #if HAVE_SYS_TYPES_H
+    #  include <sys/types.h>
+    #endif
+    #if HAVE_SYS_SOCKET_H
+    #  include <sys/socket.h>
+    #endif
+  ]]
+)
 
-# For load module
-# For the processes plugin
-# For users module
-AC_CHECK_HEADERS(sys/loadavg.h linux/config.h utmp.h utmpx.h)
+if test "x$ac_system" = "xLinux"; then
+  # For hddtemp module
+  AC_CHECK_HEADERS([linux/major.h])
+
+  # For md module (Linux only)
+  AC_CHECK_HEADERS([linux/raid/md_u.h],
+    [have_linux_raid_md_u_h="yes"],
+    [have_linux_raid_md_u_h="no"],
+    [[
+      #include <sys/ioctl.h>
+      #include <linux/major.h>
+      #include <linux/types.h>
+    ]]
+  )
+  AC_CHECK_HEADERS([sys/sysmacros.h])
+
+  AC_CHECK_HEADERS([linux/wireless.h],
+    [have_linux_wireless_h="yes"],
+    [have_linux_wireless_h="no"],
+    [[
+      #include <dirent.h>
+      #include <sys/ioctl.h>
+      #include <sys/socket.h>
+    ]]
+  )
 
-# For interface plugin
-AC_CHECK_HEADERS(ifaddrs.h)
-AC_CHECK_HEADERS(net/if.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-#  include <sys/socket.h>
-#endif
-])
-AC_CHECK_HEADERS(linux/if.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-#  include <sys/socket.h>
-#endif
-])
-AC_CHECK_HEADERS(linux/inet_diag.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-#  include <sys/socket.h>
-#endif
-#if HAVE_LINUX_INET_DIAG_H
-# include <linux/inet_diag.h>
-#endif
-])
-AC_CHECK_HEADERS(linux/netdevice.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-#  include <sys/socket.h>
-#endif
-#if HAVE_LINUX_IF_H
-# include <linux/if.h>
-#endif
-])
+  AC_CHECK_HEADERS([linux/if.h], [], [],
+    [[
+      #if HAVE_SYS_TYPES_H
+      #  include <sys/types.h>
+      #endif
+      #if HAVE_SYS_SOCKET_H
+      #  include <sys/socket.h>
+      #endif
+    ]]
+  )
 
-# For ethstat module
-AC_CHECK_HEADERS(linux/sockios.h,
+  AC_CHECK_HEADERS([linux/inet_diag.h], [], [],
+    [[
+      #if HAVE_SYS_TYPES_H
+      #  include <sys/types.h>
+      #endif
+      #if HAVE_SYS_SOCKET_H
+      #  include <sys/socket.h>
+      #endif
+    ]]
+  )
+
+  AC_CHECK_HEADERS([linux/netdevice.h], [], [],
+    [[
+      #if HAVE_SYS_TYPES_H
+      #  include <sys/types.h>
+      #endif
+      #if HAVE_SYS_SOCKET_H
+      #  include <sys/socket.h>
+      #endif
+      #if HAVE_LINUX_IF_H
+      # include <linux/if.h>
+      #endif
+    ]]
+  )
+
+  # For ethstat module
+  AC_CHECK_HEADERS([linux/sockios.h],
     [have_linux_sockios_h="yes"],
     [have_linux_sockios_h="no"],
-    [
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#if HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-    ])
-AC_CHECK_HEADERS(linux/ethtool.h,
+    [[
+      #if HAVE_SYS_IOCTL_H
+      # include <sys/ioctl.h>
+      #endif
+      #if HAVE_NET_IF_H
+      # include <net/if.h>
+      #endif
+    ]]
+  )
+
+  AC_CHECK_HEADERS([linux/ethtool.h],
     [have_linux_ethtool_h="yes"],
     [have_linux_ethtool_h="no"],
-    [
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#if HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-#if HAVE_LINUX_SOCKIOS_H
-# include <linux/sockios.h>
-#endif
-    ])
-
-# For ipvs module
-have_linux_ip_vs_h="no"
-have_net_ip_vs_h="no"
-have_ip_vs_h="no"
-ip_vs_h_needs_kernel_cflags="no"
-if test "x$ac_system" = "xLinux"
-then
-       AC_CHECK_HEADERS(linux/ip_vs.h, [have_linux_ip_vs_h="yes"])
-       AC_CHECK_HEADERS(net/ip_vs.h, [have_net_ip_vs_h="yes"])
-       AC_CHECK_HEADERS(ip_vs.h, [have_ip_vs_h="yes"])
+    [[
+      #if HAVE_SYS_IOCTL_H
+      # include <sys/ioctl.h>
+      #endif
+      #if HAVE_NET_IF_H
+      # include <net/if.h>
+      #endif
+      #if HAVE_LINUX_SOCKIOS_H
+      # include <linux/sockios.h>
+      #endif
+    ]]
+  )
+
+  # For ipvs module
+  AC_CHECK_HEADERS_ONCE([linux/ip_vs.h])
 
-       if test "x$have_linux_ip_vs_h$have_net_ip_vs_h$have_ip_vs_h" = "xnonono" && test -d "$KERNEL_DIR"
-       then
-               SAVE_CFLAGS="$CFLAGS"
-               CFLAGS="$CFLAGS $KERNEL_CFLAGS"
+  # For the email plugin
+  AC_CHECK_HEADERS([linux/un.h], [], [],
+    [[
+      #if HAVE_SYS_SOCKET_H
+      #  include <sys/socket.h>
+      #endif
+    ]]
+  )
+  # For the turbostat plugin
+  AC_CHECK_HEADERS([asm/msr-index.h],
+    [have_asm_msrindex_h="yes"],
+    [have_asm_msrindex_h="no"]
+  )
+
+  if test "x$have_asm_msrindex_h" = "xyes"; then
+    AC_CACHE_CHECK([whether asm/msr-index.h has MSR_PKG_C10_RESIDENCY],
+      [c_cv_have_usable_asm_msrindex_h],
+      [
+        AC_COMPILE_IFELSE(
+          [
+            AC_LANG_PROGRAM(
+              [[#include<asm/msr-index.h>]],
+              [[
+                int y = MSR_PKG_C10_RESIDENCY;
+                return(y);
+              ]]
+            )
+          ],
+          [c_cv_have_usable_asm_msrindex_h="yes"],
+          [c_cv_have_usable_asm_msrindex_h="no"],
+        )
+      ]
+    )
+  fi
+
+  AC_CHECK_HEADERS([cpuid.h],
+    [have_cpuid_h="yes"],
+    [have_cpuid_h="no (cpuid.h not found)"]
+  )
+
+  AC_CHECK_HEADERS([sys/capability.h],
+    [have_capability="yes"],
+    [have_capability="no (<sys/capability.h> not found)"]
+  )
 
-               AC_MSG_NOTICE([Did not find ip_vs.h. Trying again using headers from $KERNEL_DIR.])
+  if test "x$have_capability" = "xyes"; then
+    AC_CHECK_LIB([cap], [cap_get_proc],
+      [have_capability="yes"],
+      [have_capability="no (cap_get_proc() not found)"]
+    )
+  fi
 
-               AC_CHECK_HEADERS(linux/ip_vs.h, [have_linux_ip_vs_h="yes"])
-               AC_CHECK_HEADERS(net/ip_vs.h, [have_net_ip_vs_h="yes"])
-               AC_CHECK_HEADERS(ip_vs.h, [have_ip_vs_h="yes"])
+  if test "x$have_capability" = "xyes"; then
+    AC_CHECK_DECL([CAP_IS_SUPPORTED],
+      [have_capability="yes"],
+      [have_capability="no (CAP_IS_SUPPORTED not found)"],
+      [[#include <sys/capability.h>]]
+    )
+  fi
 
-               if test "x$have_linux_ip_vs_h" = "xyes" || test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
-               then
-                       ip_vs_h_needs_kernel_cflags="yes"
-               fi
+  if test "x$have_capability" = "xyes"; then
+    AC_DEFINE([HAVE_CAPABILITY], [1], [Define to 1 if you have cap_get_proc() (-lcap).])
+  fi
 
-               CFLAGS="$SAVE_CFLAGS"
-       fi
+else
+  have_linux_raid_md_u_h="no"
+  have_linux_wireless_h="no"
 fi
-AM_CONDITIONAL(IP_VS_H_NEEDS_KERNEL_CFLAGS, test "x$ip_vs_h_needs_kernel_cflags" = "xyes")
+
+AM_CONDITIONAL([BUILD_WITH_CAPABILITY], [test "x$have_capability" = "xyes"])
+
+# For the swap module
+have_sys_swap_h="yes"
+AC_CHECK_HEADERS([sys/swap.h vm/anon.h],
+  [],
+  [have_sys_swap_h="no"],
+  [[
+    #undef _FILE_OFFSET_BITS
+    #undef _LARGEFILE64_SOURCE
+    #if HAVE_SYS_TYPES_H
+    #  include <sys/types.h>
+    #endif
+    #if HAVE_SYS_PARAM_H
+    # include <sys/param.h>
+    #endif
+  ]]
+)
+
+# For load module
+# For the processes plugin
+# For users module
+AC_CHECK_HEADERS([sys/loadavg.h linux/config.h utmp.h utmpx.h])
 
 # For quota module
-AC_CHECK_HEADERS(sys/ucred.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-])
+AC_CHECK_HEADERS([sys/ucred.h], [], [],
+  [[
+    #if HAVE_SYS_TYPES_H
+    #  include <sys/types.h>
+    #endif
+    #if HAVE_SYS_PARAM_H
+    # include <sys/param.h>
+    #endif
+  ]]
+)
 
 # For mount interface
-AC_CHECK_HEADERS(sys/mount.h, [], [],
-[
-#if HAVE_SYS_TYPES_H
-#  include <sys/types.h>
-#endif
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-])
-
-# For the email plugin
-AC_CHECK_HEADERS(linux/un.h, [], [],
-[
-#if HAVE_SYS_SOCKET_H
-#      include <sys/socket.h>
-#endif
-])
+AC_CHECK_HEADERS([sys/mount.h], [], [],
+  [[
+    #if HAVE_SYS_TYPES_H
+    #  include <sys/types.h>
+    #endif
+    #if HAVE_SYS_PARAM_H
+    # include <sys/param.h>
+    #endif
+  ]]
+)
 
 # --enable-xfs {{{
 AC_ARG_ENABLE([xfs],
@@ -727,128 +650,95 @@ fi
 # }}}
 
 # For the dns plugin
-AC_CHECK_HEADERS(arpa/nameser.h)
-AC_CHECK_HEADERS(arpa/nameser_compat.h, [], [],
-[
-#if HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-])
+AC_CHECK_HEADERS([arpa/nameser.h])
+AC_CHECK_HEADERS([arpa/nameser_compat.h], [], [],
+  [[
+    #if HAVE_ARPA_NAMESER_H
+    # include <arpa/nameser.h>
+    #endif
+  ]]
+)
 
-AC_CHECK_HEADERS(net/if_arp.h, [], [],
-[#if HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-])
-AC_CHECK_HEADERS(net/ppp_defs.h)
-AC_CHECK_HEADERS(net/if_ppp.h, [], [],
-[#if HAVE_NET_PPP_DEFS_H
-# include <net/ppp_defs.h>
-#endif
-])
-AC_CHECK_HEADERS(netinet/if_ether.h, [], [],
-[#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-#if HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-])
+AC_CHECK_HEADERS([net/if_arp.h], [], [],
+  [[
+    #if HAVE_SYS_SOCKET_H
+    # include <sys/socket.h>
+    #endif
+  ]]
+)
 
-have_net_pfvar_h="no"
-AC_CHECK_HEADERS(net/pfvar.h,
-               [have_net_pfvar_h="yes"],
-               [have_net_pfvar_h="no"],
-[
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-# include <sys/socket.h>
-#endif
-#if HAVE_NET_IF_H
-# include <net/if.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-])
+AC_CHECK_HEADERS([net/ppp_defs.h])
+AC_CHECK_HEADERS([net/if_ppp.h], [], [],
+  [[
+    #if HAVE_NET_PPP_DEFS_H
+    # include <net/ppp_defs.h>
+    #endif
+  ]]
+)
 
-# For the multimeter plugin
-have_termios_h="no"
-AC_CHECK_HEADERS(termios.h, [have_termios_h="yes"])
+AC_CHECK_HEADERS([netinet/if_ether.h], [], [],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_SYS_SOCKET_H
+    # include <sys/socket.h>
+    #endif
+    #if HAVE_NET_IF_H
+    # include <net/if.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+  ]]
+)
+
+AC_CHECK_HEADERS([net/pfvar.h],
+  [have_net_pfvar_h="yes"],
+  [have_net_pfvar_h="no"],
+  [[
+    #if HAVE_SYS_IOCTL_H
+    # include <sys/ioctl.h>
+    #endif
+    #if HAVE_SYS_SOCKET_H
+    # include <sys/socket.h>
+    #endif
+    #if HAVE_NET_IF_H
+    # include <net/if.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+  ]]
+)
+
+# For the multimeter plugin
+AC_CHECK_HEADERS([termios.h],
+  [have_termios_h="yes"],
+  [have_termios_h="no"]
+)
 
 # For cpusleep plugin
 AC_CACHE_CHECK([whether clock_boottime and clock_monotonic are supported],
-                      [c_cv_have_clock_boottime_monotonic],
-                      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[
-#include <time.h>
-]],
-[[
- struct timespec b, m;
- clock_gettime(CLOCK_BOOTTIME, &b );
- clock_gettime(CLOCK_MONOTONIC, &m );
-]]
-                      )],
-                      [c_cv_have_clock_boottime_monotonic="yes"],
-                      [c_cv_have_clock_boottime_monotonic="no"]))
-
-
-# For the turbostat plugin
-have_asm_msrindex_h="no"
-AC_CHECK_HEADERS(asm/msr-index.h, [have_asm_msrindex_h="yes"])
-
-if test "x$have_asm_msrindex_h" = "xyes"
-then
-  AC_CACHE_CHECK([whether asm/msr-index.h has MSR_PKG_C10_RESIDENCY],
-                 [c_cv_have_usable_asm_msrindex_h],
-                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include<asm/msr-index.h>
-]]],
-[[[
-int y = MSR_PKG_C10_RESIDENCY;
-return(y);
-]]]
-  )],
-                 [c_cv_have_usable_asm_msrindex_h="yes"],
-                 [c_cv_have_usable_asm_msrindex_h="no"],
-                                  )
-                 )
-fi
-
-have_cpuid_h="no"
-AC_CHECK_HEADERS(cpuid.h, [have_cpuid_h="yes"])
+  [c_cv_have_clock_boottime_monotonic],
+  [
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+        [[#include <time.h>]],
+        [[
+          struct timespec b, m;
+          clock_gettime(CLOCK_BOOTTIME, &b );
+          clock_gettime(CLOCK_MONOTONIC, &m );
+        ]]
+      )
+      ],
+      [c_cv_have_clock_boottime_monotonic="yes"],
+      [c_cv_have_clock_boottime_monotonic="no"]
+    )
+  ]
+)
 
-have_capability="yes"
-AC_CHECK_HEADERS(sys/capability.h,
-                 [have_capability="yes"],
-                 [have_capability="no (<sys/capability.h> not found)"])
-if test "x$have_capability" = "xyes"; then
-AC_CHECK_LIB(cap, cap_get_proc,
-                 [have_capability="yes"],
-                 [have_capability="no (cap_get_proc() not found)"])
-fi
-if test "x$have_capability" = "xyes"; then
-AC_CHECK_DECL([CAP_IS_SUPPORTED],
-                 [have_capability="yes"],
-                 [have_capability="no (CAP_IS_SUPPORTED not found)"],
-                 [[#include <sys/capability.h>]])
-fi
-if test "x$have_capability" = "xyes"; then
-  AC_DEFINE(HAVE_CAPABILITY, 1, [Define to 1 if you have cap_get_proc() (-lcap).])
-fi
-AM_CONDITIONAL(BUILD_WITH_CAPABILITY, test "x$have_capability" = "xyes")
 
 #
 # Checks for typedefs, structures, and compiler characteristics.
@@ -859,212 +749,264 @@ AC_TYPE_SIZE_T
 AC_TYPE_UID_T
 AC_HEADER_TIME
 
+test_cxx_flags() {
+  AC_LANG_PUSH([C++])
+  AC_LANG_CONFTEST(
+    [AC_LANG_SOURCE([[int main(void){}]]) ]
+  )
+  $CXX -c conftest.cpp $CXXFLAGS $@ > /dev/null 2> /dev/null
+  ret=$?
+  rm -f conftest.o
+  AC_LANG_POP([C++])
+  return $ret
+}
+
 #
 # Checks for library functions.
 #
-AC_CHECK_FUNCS(gettimeofday select strdup strtol getaddrinfo getnameinfo strchr memcpy strstr strcmp strncmp strncpy strlen strncasecmp strcasecmp openlog closelog sysconf setenv if_indextoname setlocale asprintf)
+AC_CHECK_FUNCS_ONCE([ \
+    asprintf \
+    closelog \
+    getaddrinfo \
+    getgrnam_r \
+    getnameinfo \
+    getpwnam_r \
+    gettimeofday \
+    if_indextoname \
+    openlog \
+    regcomp \
+    regerror \
+    regexec \
+    regfree \
+    select \
+    setenv \
+    setgroups \
+    strcasecmp \
+    strdup \
+    strncasecmp \
+    sysconf
+  ]
+)
 
 AC_FUNC_STRERROR_R
 
-test_cxx_flags() {
-       AC_LANG_PUSH([C++])
-       AC_LANG_CONFTEST([
-               AC_LANG_SOURCE([[int main(void){}]])
-       ])
-       $CXX -c conftest.cpp $CXXFLAGS $@ > /dev/null 2> /dev/null
-       ret=$?
-       rm -f conftest.o
-       AC_LANG_POP([C++])
-       return $ret
-}
-
 SAVE_CFLAGS="$CFLAGS"
 # Emulate behavior of src/Makefile.am
-if test "x$GCC" = "xyes"
-then
-       CFLAGS="$CFLAGS -Wall -Werror"
+if test "x$GCC" = "xyes"; then
+  CFLAGS="$CFLAGS -Wall -Werror"
 fi
 
 AC_CACHE_CHECK([for strtok_r],
   [c_cv_have_strtok_r_default],
-  AC_LINK_IFELSE(
-    [AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-]]],
-[[[
-      char buffer[] = "foo,bar,baz";
-      char *token;
-      char *dummy;
-      char *saveptr;
-
-      dummy = buffer;
-      saveptr = NULL;
-      while ((token = strtok_r (dummy, ",", &saveptr)) != NULL)
-      {
-        dummy = NULL;
-        printf ("token = %s;\n", token);
-      }
-]]]
-    )],
-    [c_cv_have_strtok_r_default="yes"],
-    [c_cv_have_strtok_r_default="no"]
-  )
+  [
+    AC_LINK_IFELSE(
+      [
+        AC_LANG_PROGRAM(
+          [[
+            #include <stdlib.h>
+            #include <stdio.h>
+            #include <string.h>
+          ]],
+          [[
+            char buffer[] = "foo,bar,baz";
+            char *token;
+            char *dummy;
+            char *saveptr;
+
+            dummy = buffer;
+            saveptr = NULL;
+            while ((token = strtok_r (dummy, ",", &saveptr)) != NULL)
+            {
+              dummy = NULL;
+              printf ("token = %s;\n", token);
+            }
+          ]]
+        )
+      ],
+      [c_cv_have_strtok_r_default="yes"],
+      [c_cv_have_strtok_r_default="no"]
+    )
+  ]
 )
 
-if test "x$c_cv_have_strtok_r_default" = "xno"
-then
+if test "x$c_cv_have_strtok_r_default" = "xno"; then
   CFLAGS="$CFLAGS -D_REENTRANT=1"
 
   AC_CACHE_CHECK([if strtok_r needs _REENTRANT],
     [c_cv_have_strtok_r_reentrant],
-    AC_LINK_IFELSE(
-      [AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-]]],
-[[[
-        char buffer[] = "foo,bar,baz";
-        char *token;
-        char *dummy;
-        char *saveptr;
-
-        dummy = buffer;
-        saveptr = NULL;
-        while ((token = strtok_r (dummy, ",", &saveptr)) != NULL)
-        {
-          dummy = NULL;
-          printf ("token = %s;\n", token);
-        }
-]]]
-      )],
-      [c_cv_have_strtok_r_reentrant="yes"],
-      [AC_MSG_FAILURE([strtok_r isn't available. Please file a bugreport!])]
-    )
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <stdio.h>
+              #include <string.h>
+            ]],
+            [[
+              char buffer[] = "foo,bar,baz";
+              char *token;
+              char *dummy;
+              char *saveptr;
+
+              dummy = buffer;
+              saveptr = NULL;
+              while ((token = strtok_r (dummy, ",", &saveptr)) != NULL)
+              {
+                dummy = NULL;
+                printf ("token = %s;\n", token);
+              }
+            ]]
+          )
+        ],
+        [c_cv_have_strtok_r_reentrant="yes"],
+        [AC_MSG_FAILURE([strtok_r is not available. Please file a bugreport!])]
+      )
+    ]
   )
 fi
 
 CFLAGS="$SAVE_CFLAGS"
-if test "x$c_cv_have_strtok_r_reentrant" = "xyes"
-then
-       CFLAGS="$CFLAGS -D_REENTRANT=1"
+if test "x$c_cv_have_strtok_r_reentrant" = "xyes"; then
+  CFLAGS="$CFLAGS -D_REENTRANT=1"
 fi
 
-AC_CHECK_FUNCS(getpwnam_r getgrnam_r setgroups regcomp regerror regexec regfree)
-
-socket_needs_socket="no"
-AC_CHECK_FUNCS(socket, [], AC_CHECK_LIB(socket, socket, [socket_needs_socket="yes"], AC_MSG_ERROR(cannot find socket)))
-AM_CONDITIONAL(BUILD_WITH_LIBSOCKET, test "x$socket_needs_socket" = "xyes")
+AC_CHECK_FUNCS([socket],
+  [],
+  [
+    AC_CHECK_LIB([socket], [socket],
+      [socket_needs_socket="yes"],
+      [AC_MSG_ERROR([cannot find socket() in libsocket])]
+    )
+  ]
+)
+AM_CONDITIONAL([BUILD_WITH_LIBSOCKET], [test "x$socket_needs_socket" = "xyes"])
 
-clock_gettime_needs_rt="no"
 clock_gettime_needs_posix4="no"
-have_clock_gettime="no"
-AC_CHECK_FUNCS(clock_gettime, [have_clock_gettime="yes"])
-if test "x$have_clock_gettime" = "xno"
-then
-       AC_CHECK_LIB(rt, clock_gettime, [clock_gettime_needs_rt="yes"
-                                        have_clock_gettime="yes"])
+AC_CHECK_FUNCS([clock_gettime],
+  [have_clock_gettime="yes"],
+  [have_clock_gettime="no"]
+)
+
+if test "x$have_clock_gettime" = "xno"; then
+  AC_CHECK_LIB([rt], [clock_gettime],
+    [
+      clock_gettime_needs_rt="yes"
+      have_clock_gettime="yes"
+    ]
+  )
 fi
-if test "x$have_clock_gettime" = "xno"
-then
-       AC_CHECK_LIB(posix4, clock_gettime, [clock_gettime_needs_posix4="yes"
-                                            have_clock_gettime="yes"])
+
+if test "x$have_clock_gettime" = "xno"; then
+  AC_CHECK_LIB([posix4], [clock_gettime],
+    [
+      clock_gettime_needs_posix4="yes"
+      have_clock_gettime="yes"
+    ]
+  )
 fi
-if test "x$have_clock_gettime" = "xyes"
-then
-       AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [Define if the clock_gettime(2) function is available.])
+
+if test "x$have_clock_gettime" = "xyes"; then
+  AC_DEFINE([HAVE_CLOCK_GETTIME], [1], [Define if the clock_gettime(2) function is available.])
 fi
 
-nanosleep_needs_rt="no"
-nanosleep_needs_posix4="no"
-AC_CHECK_FUNCS(nanosleep,
-    [],
-    AC_CHECK_LIB(rt, nanosleep,
-        [nanosleep_needs_rt="yes"],
-        AC_CHECK_LIB(posix4, nanosleep,
-            [nanosleep_needs_posix4="yes"],
-            AC_MSG_ERROR(cannot find nanosleep))))
-
-AM_CONDITIONAL(BUILD_WITH_LIBRT, test "x$clock_gettime_needs_rt" = "xyes" || test "x$nanosleep_needs_rt" = "xyes")
-AM_CONDITIONAL(BUILD_WITH_LIBPOSIX4, test "x$clock_gettime_needs_posix4" = "xyes" || test "x$nanosleep_needs_posix4" = "xyes")
-
-AC_CHECK_FUNCS(sysctl, [have_sysctl="yes"], [have_sysctl="no"])
-AC_CHECK_FUNCS(sysctlbyname, [have_sysctlbyname="yes"], [have_sysctlbyname="no"])
-AC_CHECK_FUNCS(host_statistics, [have_host_statistics="yes"], [have_host_statistics="no"])
-AC_CHECK_FUNCS(processor_info, [have_processor_info="yes"], [have_processor_info="no"])
-AC_CHECK_FUNCS(thread_info, [have_thread_info="yes"], [have_thread_info="no"])
-AC_CHECK_FUNCS(statfs, [have_statfs="yes"], [have_statfs="no"])
-AC_CHECK_FUNCS(statvfs, [have_statvfs="yes"], [have_statvfs="no"])
-AC_CHECK_FUNCS(getifaddrs, [have_getifaddrs="yes"], [have_getifaddrs="no"])
-AC_CHECK_FUNCS(getloadavg, [have_getloadavg="yes"], [have_getloadavg="no"])
-AC_CHECK_FUNCS(syslog, [have_syslog="yes"], [have_syslog="no"])
-AC_CHECK_FUNCS(getutent, [have_getutent="yes"], [have_getutent="no"])
-AC_CHECK_FUNCS(getutxent, [have_getutxent="yes"], [have_getutxent="no"])
+AC_CHECK_FUNCS([nanosleep], [],
+  AC_CHECK_LIB([rt], [nanosleep],
+    [nanosleep_needs_rt="yes"],
+    [
+      AC_CHECK_LIB([posix4], [nanosleep],
+        [nanosleep_needs_posix4="yes"],
+        [AC_MSG_ERROR([cannot find nanosleep])]
+      )
+    ]
+  )
+)
+
+AM_CONDITIONAL([BUILD_WITH_LIBRT], [test "x$clock_gettime_needs_rt" = "xyes" || test "x$nanosleep_needs_rt" = "xyes"])
+AM_CONDITIONAL([BUILD_WITH_LIBPOSIX4], [test "x$clock_gettime_needs_posix4" = "xyes" || test "x$nanosleep_needs_posix4" = "xyes"])
+
+AC_CHECK_FUNCS([getifaddrs], [have_getifaddrs="yes"], [have_getifaddrs="no"])
+AC_CHECK_FUNCS([getloadavg], [have_getloadavg="yes"], [have_getloadavg="no"])
+AC_CHECK_FUNCS([getutent], [have_getutent="yes"], [have_getutent="no"])
+AC_CHECK_FUNCS([getutxent], [have_getutxent="yes"], [have_getutxent="no"])
+AC_CHECK_FUNCS([host_statistics], [have_host_statistics="yes"], [have_host_statistics="no"])
+AC_CHECK_FUNCS([processor_info], [have_processor_info="yes"], [have_processor_info="no"])
+AC_CHECK_FUNCS([statfs], [have_statfs="yes"], [have_statfs="no"])
+AC_CHECK_FUNCS([statvfs], [have_statvfs="yes"], [have_statvfs="no"])
+AC_CHECK_FUNCS([sysctl], [have_sysctl="yes"], [have_sysctl="no"])
+AC_CHECK_FUNCS([sysctlbyname], [have_sysctlbyname="yes"], [have_sysctlbyname="no"])
+AC_CHECK_FUNCS([syslog], [have_syslog="yes"], [have_syslog="no"])
+AC_CHECK_FUNCS([thread_info], [have_thread_info="yes"], [have_thread_info="no"])
 
 # Check for strptime {{{
-if test "x$GCC" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS -Wall -Wextra -Werror"
+if test "x$GCC" = "xyes"; then
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -Wall -Wextra -Werror"
 fi
 
-AC_CHECK_FUNCS(strptime, [have_strptime="yes"], [have_strptime="no"])
-if test "x$have_strptime" = "xyes"
-then
-       AC_CACHE_CHECK([whether strptime is exported by default],
-                      [c_cv_have_strptime_default],
-                      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <time.h>
-]]],
-[[[
- struct tm stm;
- (void) strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
-]]]
-                      )],
-                      [c_cv_have_strptime_default="yes"],
-                      [c_cv_have_strptime_default="no"]))
+AC_CHECK_FUNCS([strptime], [have_strptime="yes"], [have_strptime="no"])
+if test "x$have_strptime" = "xyes"; then
+  AC_CACHE_CHECK([whether strptime is exported by default],
+    [c_cv_have_strptime_default],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[#include <time.h>]],
+            [[
+              struct tm stm;
+              (void)strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
+            ]]
+          )
+        ],
+        [c_cv_have_strptime_default="yes"],
+        [c_cv_have_strptime_default="no"])
+    ]
+  )
 fi
-if test "x$have_strptime" = "xyes" && test "x$c_cv_have_strptime_default" = "xno"
-then
-       AC_CACHE_CHECK([whether strptime needs standards mode],
-                      [c_cv_have_strptime_standards],
-                      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#ifndef _ISOC99_SOURCE
-# define _ISOC99_SOURCE 1
-#endif
-#ifndef _POSIX_C_SOURCE
-# define _POSIX_C_SOURCE 200112L
-#endif
-#ifndef _XOPEN_SOURCE
-# define _XOPEN_SOURCE 500
-#endif
-#include <time.h>
-]]],
-[[[
- struct tm stm;
- (void) strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
-]]]
-                      )],
-                      [c_cv_have_strptime_standards="yes"],
-                      [c_cv_have_strptime_standards="no"]))
 
-       if test "x$c_cv_have_strptime_standards" = "xyes"
-       then
-               AC_DEFINE([STRPTIME_NEEDS_STANDARDS], 1, [Set to true if strptime is only exported in X/Open mode (GNU libc).])
-       else
-               have_strptime="no"
-       fi
+if test "x$have_strptime" = "xyes" && test "x$c_cv_have_strptime_default" = "xno"; then
+  AC_CACHE_CHECK([whether strptime needs standards mode],
+    [c_cv_have_strptime_standards],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #ifndef _ISOC99_SOURCE
+              # define _ISOC99_SOURCE 1
+              #endif
+              #ifndef _POSIX_C_SOURCE
+              # define _POSIX_C_SOURCE 200112L
+              #endif
+              #ifndef _XOPEN_SOURCE
+              # define _XOPEN_SOURCE 500
+              #endif
+              #include <time.h>
+            ]],
+            [[
+              struct tm stm;
+              (void)strptime ("2010-12-30%13:42:42", "%Y-%m-%dT%T", &stm);
+            ]]
+          )
+        ],
+        [c_cv_have_strptime_standards="yes"],
+        [c_cv_have_strptime_standards="no"]
+      )
+    ]
+  )
+
+  if test "x$c_cv_have_strptime_standards" = "xyes"; then
+    AC_DEFINE([STRPTIME_NEEDS_STANDARDS], [1],
+      [Set to true if strptime is only exported in X/Open mode (GNU libc).]
+    )
+  else
+    have_strptime="no"
+  fi
 fi
 
-if test "x$GCC" = "xyes"
-then
-       CFLAGS="$SAVE_CFLAGS"
+if test "x$GCC" = "xyes"; then
+  CFLAGS="$SAVE_CFLAGS"
 fi
 # }}} Check for strptime
 
 CFLAGS="$SAVE_CFLAGS"
 # }}} Check for timegm
 
-AC_CHECK_FUNCS(swapctl, [have_swapctl="yes"], [have_swapctl="no"])
+AC_MSG_CHECKING([for sysctl kern.cp_times])
+if test -x /sbin/sysctl; then
+  /sbin/sysctl kern.cp_times >/dev/null 2>&1
+  if test $? -eq 0; then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE([HAVE_SYSCTL_KERN_CP_TIMES], [1], [Define if sysctl supports kern.cp_times])
+  else
+    AC_MSG_RESULT([no])
+  fi
+else
+  AC_MSG_RESULT([no])
+fi
+
+AC_MSG_CHECKING([for sysctl kern.cp_time])
+if test -x /sbin/sysctl; then
+  /sbin/sysctl kern.cp_time >/dev/null 2>&1
+  if test $? -eq 0
+  then
+    AC_MSG_RESULT([yes])
+    AC_DEFINE([HAVE_SYSCTL_KERN_CP_TIME], [1], [Define if sysctl supports kern.cp_time])
+  else
+    AC_MSG_RESULT([no])
+  fi
+else
+  AC_MSG_RESULT([no])
+fi
+
+AC_CHECK_FUNCS([swapctl], [have_swapctl="yes"], [have_swapctl="no"])
 if test "x$have_swapctl" = "xyes"; then
-        AC_CACHE_CHECK([whether swapctl takes two arguments],
-                [c_cv_have_swapctl_two_args],
-                AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
-#  undef _FILE_OFFSET_BITS
-#  undef _LARGEFILE64_SOURCE
-#endif
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/swap.h>
-#include <unistd.h>
-]]],
-[[[
-int num = swapctl(0, NULL);
-]]]
-                        )],
-                        [c_cv_have_swapctl_two_args="yes"],
-                        [c_cv_have_swapctl_two_args="no"]
-                )
-        )
-        AC_CACHE_CHECK([whether swapctl takes three arguments],
-                [c_cv_have_swapctl_three_args],
-                AC_COMPILE_IFELSE(
-                        [AC_LANG_PROGRAM(
-[[[
-#if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
-#  undef _FILE_OFFSET_BITS
-#  undef _LARGEFILE64_SOURCE
-#endif
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <sys/swap.h>
-#include <unistd.h>
-]]],
-[[[
-int num = swapctl(0, NULL, 0);
-]]]
-                        )],
-                        [c_cv_have_swapctl_three_args="yes"],
-                        [c_cv_have_swapctl_three_args="no"]
-                )
-        )
+  AC_CACHE_CHECK([whether swapctl takes two arguments],
+    [c_cv_have_swapctl_two_args],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
+              #  undef _FILE_OFFSET_BITS
+              #  undef _LARGEFILE64_SOURCE
+              #endif
+              #include <sys/stat.h>
+              #include <sys/param.h>
+              #include <sys/swap.h>
+              #include <unistd.h>
+            ]],
+            [[int num = swapctl(0, NULL);]]
+          )
+        ],
+        [c_cv_have_swapctl_two_args="yes"],
+        [c_cv_have_swapctl_two_args="no"]
+      )
+    ]
+  )
+
+  AC_CACHE_CHECK([whether swapctl takes three arguments],
+    [c_cv_have_swapctl_three_args],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #if HAVE_SYS_SWAP_H && !defined(_LP64) && _FILE_OFFSET_BITS == 64
+              #  undef _FILE_OFFSET_BITS
+              #  undef _LARGEFILE64_SOURCE
+              #endif
+              #include <sys/stat.h>
+              #include <sys/param.h>
+              #include <sys/swap.h>
+              #include <unistd.h>
+            ]],
+            [[int num = swapctl(0, NULL, 0);]]
+          )
+        ],
+        [c_cv_have_swapctl_three_args="yes"],
+        [c_cv_have_swapctl_three_args="no"]
+      )
+    ]
+  )
 fi
+
 # Check for different versions of `swapctl' here..
 if test "x$have_swapctl" = "xyes"; then
-        if test "x$c_cv_have_swapctl_two_args" = "xyes"; then
-                AC_DEFINE(HAVE_SWAPCTL_TWO_ARGS, 1,
-                          [Define if the function swapctl exists and takes two arguments.])
-        fi
-        if test "x$c_cv_have_swapctl_three_args" = "xyes"; then
-                AC_DEFINE(HAVE_SWAPCTL_THREE_ARGS, 1,
-                          [Define if the function swapctl exists and takes three arguments.])
-        fi
+  if test "x$c_cv_have_swapctl_two_args" = "xyes"; then
+    AC_DEFINE([HAVE_SWAPCTL_TWO_ARGS], [1], [Define if the function swapctl exists and takes two arguments.])
+  fi
+
+  if test "x$c_cv_have_swapctl_three_args" = "xyes"; then
+    AC_DEFINE([HAVE_SWAPCTL_THREE_ARGS], [1], [Define if the function swapctl exists and takes three arguments.])
+  fi
 fi
 
 # Check for NAN
-AC_ARG_WITH(nan-emulation, [AS_HELP_STRING([--with-nan-emulation], [use emulated NAN. For crosscompiling only.])],
-[
- if test "x$withval" = "xno"; then
-        nan_type="none"
- else if test "x$withval" = "xyes"; then
-        nan_type="zero"
- else
-        nan_type="$withval"
- fi; fi
-],
-[nan_type="none"])
+AC_ARG_WITH([nan-emulation],
+  [AS_HELP_STRING([--with-nan-emulation], [use emulated NAN. For crosscompiling only.])],
+  [
+    if test "x$withval" = "xno"; then
+      nan_type="none"
+    else if test "x$withval" = "xyes"; then
+      nan_type="zero"
+    else
+      nan_type="$withval"
+    fi; fi
+  ],
+  [nan_type="none"]
+)
+
 if test "x$nan_type" = "xnone"; then
   AC_CACHE_CHECK([whether NAN is defined by default],
     [c_cv_have_nan_default],
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <math.h>
-static double foo = NAN;
-]]],
-[[[
-       if (isnan (foo))
-        return 0;
-       else
-       return 1;
-]]]
-      )],
-      [c_cv_have_nan_default="yes"],
-      [c_cv_have_nan_default="no"]
-    )
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <math.h>
+              static double foo = NAN;
+            ]],
+            [[
+              if (isnan (foo))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_have_nan_default="yes"],
+        [c_cv_have_nan_default="no"]
+      )
+    ]
   )
-  if test "x$c_cv_have_nan_default" = "xyes"
-  then
-    nan_type="default"
-  fi
 fi
+
+if test "x$c_cv_have_nan_default" = "xyes"; then
+  nan_type="default"
+fi
+
 if test "x$nan_type" = "xnone"; then
   AC_CACHE_CHECK([whether NAN is defined by __USE_ISOC99],
     [c_cv_have_nan_isoc],
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#define __USE_ISOC99 1
-#include <math.h>
-static double foo = NAN;
-]]],
-[[[
-       if (isnan (foo))
-        return 0;
-       else
-       return 1;
-]]]
-      )],
-      [c_cv_have_nan_isoc="yes"],
-      [c_cv_have_nan_isoc="no"]
-    )
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #define __USE_ISOC99 1
+              #include <math.h>
+              static double foo = NAN;
+            ]],
+            [[
+              if (isnan (foo))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_have_nan_isoc="yes"],
+        [c_cv_have_nan_isoc="no"]
+      )
+    ]
   )
-  if test "x$c_cv_have_nan_isoc" = "xyes"
-  then
-    nan_type="isoc99"
-  fi
 fi
+
+if test "x$c_cv_have_nan_isoc" = "xyes"; then
+  nan_type="isoc99"
+fi
+
 if test "x$nan_type" = "xnone"; then
-  SAVE_LDFLAGS=$LDFLAGS
+  SAVE_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS -lm"
   AC_CACHE_CHECK([whether NAN can be defined by 0/0],
     [c_cv_have_nan_zero],
-    AC_RUN_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <math.h>
-#ifdef NAN
-# undef NAN
-#endif
-#define NAN (0.0 / 0.0)
-#ifndef isnan
-# define isnan(f) ((f) != (f))
-#endif
-static double foo = NAN;
-]]],
-[[[
-       if (isnan (foo))
-        return 0;
-       else
-       return 1;
-]]]
-      )],
-      [c_cv_have_nan_zero="yes"],
-      [c_cv_have_nan_zero="no"]
-    )
+    [
+      AC_RUN_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <math.h>
+              #ifdef NAN
+              # undef NAN
+              #endif
+              #define NAN (0.0 / 0.0)
+              #ifndef isnan
+              # define isnan(f) ((f) != (f))
+              #endif
+              static double foo = NAN;
+            ]],
+            [[
+              if (isnan (foo))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_have_nan_zero="yes"],
+        [c_cv_have_nan_zero="no"]
+      )
+    ]
   )
   LDFLAGS=$SAVE_LDFLAGS
-  if test "x$c_cv_have_nan_zero" = "xyes"
-  then
-    nan_type="zero"
-  fi
+fi
+
+if test "x$c_cv_have_nan_zero" = "xyes"; then
+  nan_type="zero"
 fi
 
 if test "x$nan_type" = "xdefault"; then
-  AC_DEFINE(NAN_STATIC_DEFAULT, 1,
-    [Define if NAN is defined by default and can initialize static variables.])
+  AC_DEFINE([NAN_STATIC_DEFAULT], [1],
+    [Define if NAN is defined by default and can initialize static variables.]
+  )
 else if test "x$nan_type" = "xisoc99"; then
-  AC_DEFINE(NAN_STATIC_ISOC, 1,
-    [Define if NAN is defined by __USE_ISOC99 and can initialize static variables.])
+  AC_DEFINE([NAN_STATIC_ISOC], [1],
+    [Define if NAN is defined by __USE_ISOC99 and can initialize static variables.]
+  )
 else if test "x$nan_type" = "xzero"; then
-  AC_DEFINE(NAN_ZERO_ZERO, 1,
-    [Define if NAN can be defined as (0.0 / 0.0)])
+  AC_DEFINE([NAN_ZERO_ZERO], [1],
+    [Define if NAN can be defined as (0.0 / 0.0)]
+  )
 else
   AC_MSG_ERROR([Didn't find out how to statically initialize variables to NAN. Sorry.])
 fi; fi; fi
 
-AC_ARG_WITH(fp-layout, [AS_HELP_STRING([--with-fp-layout], [set the memory layout of doubles. For crosscompiling only.])],
-[
- if test "x$withval" = "xnothing"; then
-       fp_layout_type="nothing"
- else if test "x$withval" = "xendianflip"; then
-       fp_layout_type="endianflip"
- else if test "x$withval" = "xintswap"; then
-       fp_layout_type="intswap"
- else
-       AC_MSG_ERROR([Invalid argument for --with-fp-layout. Valid arguments are: nothing, endianflip, intswap]);
-fi; fi; fi
-],
-[fp_layout_type="unknown"])
+AC_ARG_WITH([fp-layout],
+  [
+    AS_HELP_STRING([--with-fp-layout],
+      [set the memory layout of doubles. For crosscompiling only.]
+    )
+  ],
+  [
+    if test "x$withval" = "xnothing"; then
+      fp_layout_type="nothing"
+    else if test "x$withval" = "xendianflip"; then
+      fp_layout_type="endianflip"
+    else if test "x$withval" = "xintswap"; then
+      fp_layout_type="intswap"
+    else
+      AC_MSG_ERROR([Invalid argument for --with-fp-layout. Valid arguments are: nothing, endianflip, intswap]);
+    fi; fi; fi
+  ],
+  [fp_layout_type="unknown"]
+)
 
 if test "x$fp_layout_type" = "xunknown"; then
   AC_CACHE_CHECK([if doubles are stored in x86 representation],
     [c_cv_fp_layout_need_nothing],
-    AC_RUN_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#if HAVE_STDBOOL_H
-# include <stdbool.h>
-#endif
-]]],
-[[[
-       uint64_t i0;
-       uint64_t i1;
-       uint8_t c[8];
-       double d;
-
-       d = 8.642135e130;
-       memcpy ((void *) &i0, (void *) &d, 8);
-
-       i1 = i0;
-       memcpy ((void *) c, (void *) &i1, 8);
-
-       if ((c[0] == 0x2f) && (c[1] == 0x25)
-                       && (c[2] == 0xc0) && (c[3] == 0xc7)
-                       && (c[4] == 0x43) && (c[5] == 0x2b)
-                       && (c[6] == 0x1f) && (c[7] == 0x5b))
-               return (0);
-       else
-               return (1);
-]]]
-      )],
-      [c_cv_fp_layout_need_nothing="yes"],
-      [c_cv_fp_layout_need_nothing="no"]
-    )
+    [
+      AC_RUN_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <stdio.h>
+              #include <string.h>
+              #include <stdint.h>
+              #include <inttypes.h>
+              #include <stdbool.h>
+            ]],
+            [[
+              uint64_t i0;
+              uint64_t i1;
+              uint8_t c[8];
+              double d;
+
+              d = 8.642135e130;
+              memcpy ((void *) &i0, (void *) &d, 8);
+
+              i1 = i0;
+              memcpy ((void *) c, (void *) &i1, 8);
+
+              if ((c[0] == 0x2f) && (c[1] == 0x25)
+                  && (c[2] == 0xc0) && (c[3] == 0xc7)
+                  && (c[4] == 0x43) && (c[5] == 0x2b)
+                  && (c[6] == 0x1f) && (c[7] == 0x5b))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_fp_layout_need_nothing="yes"],
+        [c_cv_fp_layout_need_nothing="no"]
+      )
+    ]
   )
-  if test "x$c_cv_fp_layout_need_nothing" = "xyes"; then
-    fp_layout_type="nothing"
-  fi
 fi
+
+if test "x$c_cv_fp_layout_need_nothing" = "xyes"; then
+  fp_layout_type="nothing"
+fi
+
 if test "x$fp_layout_type" = "xunknown"; then
   AC_CACHE_CHECK([if endianflip converts to x86 representation],
     [c_cv_fp_layout_need_endianflip],
-    AC_RUN_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#if HAVE_STDBOOL_H
-# include <stdbool.h>
-#endif
-#define endianflip(A) ((((uint64_t)(A) & 0xff00000000000000LL) >> 56) | \
-                       (((uint64_t)(A) & 0x00ff000000000000LL) >> 40) | \
-                       (((uint64_t)(A) & 0x0000ff0000000000LL) >> 24) | \
-                       (((uint64_t)(A) & 0x000000ff00000000LL) >> 8)  | \
-                       (((uint64_t)(A) & 0x00000000ff000000LL) << 8)  | \
-                       (((uint64_t)(A) & 0x0000000000ff0000LL) << 24) | \
-                       (((uint64_t)(A) & 0x000000000000ff00LL) << 40) | \
-                       (((uint64_t)(A) & 0x00000000000000ffLL) << 56))
-]]],
-[[[
-       uint64_t i0;
-       uint64_t i1;
-       uint8_t c[8];
-       double d;
-
-       d = 8.642135e130;
-       memcpy ((void *) &i0, (void *) &d, 8);
-
-       i1 = endianflip (i0);
-       memcpy ((void *) c, (void *) &i1, 8);
-
-       if ((c[0] == 0x2f) && (c[1] == 0x25)
-                       && (c[2] == 0xc0) && (c[3] == 0xc7)
-                       && (c[4] == 0x43) && (c[5] == 0x2b)
-                       && (c[6] == 0x1f) && (c[7] == 0x5b))
-               return (0);
-       else
-               return (1);
-]]]
-      )],
-      [c_cv_fp_layout_need_endianflip="yes"],
-      [c_cv_fp_layout_need_endianflip="no"]
+    [
+      AC_RUN_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <stdio.h>
+              #include <string.h>
+              #include <stdint.h>
+              #include <inttypes.h>
+              #include <stdbool.h>
+              #define endianflip(A) ((((uint64_t)(A) & 0xff00000000000000LL) >> 56) | \
+                                     (((uint64_t)(A) & 0x00ff000000000000LL) >> 40) | \
+                                     (((uint64_t)(A) & 0x0000ff0000000000LL) >> 24) | \
+                                     (((uint64_t)(A) & 0x000000ff00000000LL) >> 8)  | \
+                                     (((uint64_t)(A) & 0x00000000ff000000LL) << 8)  | \
+                                     (((uint64_t)(A) & 0x0000000000ff0000LL) << 24) | \
+                                     (((uint64_t)(A) & 0x000000000000ff00LL) << 40) | \
+                                     (((uint64_t)(A) & 0x00000000000000ffLL) << 56))
+            ]],
+            [[
+              uint64_t i0;
+              uint64_t i1;
+              uint8_t c[8];
+              double d;
+
+              d = 8.642135e130;
+              memcpy ((void *) &i0, (void *) &d, 8);
+
+              i1 = endianflip (i0);
+              memcpy ((void *) c, (void *) &i1, 8);
+
+              if ((c[0] == 0x2f) && (c[1] == 0x25)
+                  && (c[2] == 0xc0) && (c[3] == 0xc7)
+                  && (c[4] == 0x43) && (c[5] == 0x2b)
+                  && (c[6] == 0x1f) && (c[7] == 0x5b))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_fp_layout_need_endianflip="yes"],
+        [c_cv_fp_layout_need_endianflip="no"]
+      ]
     )
   )
-  if test "x$c_cv_fp_layout_need_endianflip" = "xyes"; then
-    fp_layout_type="endianflip"
-  fi
 fi
+
+if test "x$c_cv_fp_layout_need_endianflip" = "xyes"; then
+  fp_layout_type="endianflip"
+fi
+
 if test "x$fp_layout_type" = "xunknown"; then
   AC_CACHE_CHECK([if intswap converts to x86 representation],
     [c_cv_fp_layout_need_intswap],
-    AC_RUN_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#if HAVE_STDBOOL_H
-# include <stdbool.h>
-#endif
-#define intswap(A)    ((((uint64_t)(A) & 0xffffffff00000000LL) >> 32) | \
-                       (((uint64_t)(A) & 0x00000000ffffffffLL) << 32))
-]]],
-[[[
-       uint64_t i0;
-       uint64_t i1;
-       uint8_t c[8];
-       double d;
-
-       d = 8.642135e130;
-       memcpy ((void *) &i0, (void *) &d, 8);
-
-       i1 = intswap (i0);
-       memcpy ((void *) c, (void *) &i1, 8);
-
-       if ((c[0] == 0x2f) && (c[1] == 0x25)
-                       && (c[2] == 0xc0) && (c[3] == 0xc7)
-                       && (c[4] == 0x43) && (c[5] == 0x2b)
-                       && (c[6] == 0x1f) && (c[7] == 0x5b))
-               return (0);
-       else
-               return (1);
-]]]
-      )],
-      [c_cv_fp_layout_need_intswap="yes"],
-      [c_cv_fp_layout_need_intswap="no"]
-    )
+    [
+      AC_RUN_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdlib.h>
+              #include <stdio.h>
+              #include <string.h>
+              #include <stdint.h>
+              #include <inttypes.h>
+              #include <stdbool.h>
+              #define intswap(A)    ((((uint64_t)(A) & 0xffffffff00000000LL) >> 32) | \
+                                     (((uint64_t)(A) & 0x00000000ffffffffLL) << 32))
+            ]],
+            [[
+              uint64_t i0;
+              uint64_t i1;
+              uint8_t c[8];
+              double d;
+
+              d = 8.642135e130;
+              memcpy ((void *) &i0, (void *) &d, 8);
+
+              i1 = intswap (i0);
+              memcpy ((void *) c, (void *) &i1, 8);
+
+              if ((c[0] == 0x2f) && (c[1] == 0x25)
+                  && (c[2] == 0xc0) && (c[3] == 0xc7)
+                  && (c[4] == 0x43) && (c[5] == 0x2b)
+                  && (c[6] == 0x1f) && (c[7] == 0x5b))
+                return 0;
+              return 1;
+            ]]
+          )
+        ],
+        [c_cv_fp_layout_need_intswap="yes"],
+        [c_cv_fp_layout_need_intswap="no"]
+      )
+    ]
   )
-  if test "x$c_cv_fp_layout_need_intswap" = "xyes"; then
-    fp_layout_type="intswap"
-  fi
+fi
+
+if test "x$c_cv_fp_layout_need_intswap" = "xyes"; then
+  fp_layout_type="intswap"
 fi
 
 if test "x$fp_layout_type" = "xnothing"; then
-  AC_DEFINE(FP_LAYOUT_NEED_NOTHING, 1,
-  [Define if doubles are stored in x86 representation.])
+  AC_DEFINE([FP_LAYOUT_NEED_NOTHING], [1],
+    [Define if doubles are stored in x86 representation.]
+  )
 else if test "x$fp_layout_type" = "xendianflip"; then
-  AC_DEFINE(FP_LAYOUT_NEED_ENDIANFLIP, 1,
-  [Define if endianflip is needed to convert to x86 representation.])
+  AC_DEFINE([FP_LAYOUT_NEED_ENDIANFLIP], [1],
+    [Define if endianflip is needed to convert to x86 representation.]
+  )
 else if test "x$fp_layout_type" = "xintswap"; then
-  AC_DEFINE(FP_LAYOUT_NEED_INTSWAP, 1,
-  [Define if intswap is needed to convert to x86 representation.])
+  AC_DEFINE([FP_LAYOUT_NEED_INTSWAP], [1],
+    [Define if intswap is needed to convert to x86 representation.]
+  )
 else
   AC_MSG_ERROR([Didn't find out how doubles are stored in memory. Sorry.])
 fi; fi; fi
 
+# For cpusleep plugin
+AC_CACHE_CHECK([whether clock_boottime and clock_monotonic are supported],
+  [c_cv_have_clock_boottime_monotonic],
+  [
+    AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+        [[#include <time.h>]],
+        [[
+          struct timespec b, m;
+          clock_gettime(CLOCK_BOOTTIME, &b );
+          clock_gettime(CLOCK_MONOTONIC, &m );
+        ]]
+      )
+      ],
+      [c_cv_have_clock_boottime_monotonic="yes"],
+      [c_cv_have_clock_boottime_monotonic="no"]
+    )
+  ]
+)
+
 # --with-useragent {{{
-AC_ARG_WITH(useragent, [AS_HELP_STRING([--with-useragent@<:@=AGENT@:>@], [User agent to use on http requests])],
-[
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
-        AC_DEFINE_UNQUOTED(COLLECTD_USERAGENT, ["$withval"], [User agent for http requests])
+AC_ARG_WITH([useragent],
+  [AS_HELP_STRING([--with-useragent@<:@=AGENT@:>@], [User agent to use on http requests])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      AC_DEFINE_UNQUOTED([COLLECTD_USERAGENT], ["$withval"], [User agent for http requests])
     fi
-])
+  ]
+)
 
 # }}}
 
 # --with-data-max-name-len {{{
-AC_ARG_WITH(data-max-name-len, [AS_HELP_STRING([--with-data-max-name-len@<:@=VALUE@:>@], [Maximum length of data buffers])],
-[
-    if test "x$withval" != "x" && test $withval -gt 0
-    then
-        AC_DEFINE_UNQUOTED(DATA_MAX_NAME_LEN, [$withval], [Maximum length of data buffers])
+AC_ARG_WITH([data-max-name-len],
+  [AS_HELP_STRING([--with-data-max-name-len@<:@=VALUE@:>@], [Maximum length of data buffers])],
+  [
+    if test "x$withval" != "x" && test $withval -gt 0; then
+      AC_DEFINE_UNQUOTED([DATA_MAX_NAME_LEN], [$withval], [Maximum length of data buffers])
     else
-        AC_MSG_ERROR([DATA_MAX_NAME_LEN must be a positive integer -- $withval given])
+      AC_MSG_ERROR([DATA_MAX_NAME_LEN must be a positive integer -- $withval given])
     fi
-],
-[   AC_DEFINE(DATA_MAX_NAME_LEN, 128, [Maximum length of data buffers])]
+  ],
+  [AC_DEFINE([DATA_MAX_NAME_LEN], [128], [Maximum length of data buffers])]
 )
 # }}}
 
-have_getfsstat="no"
-AC_CHECK_FUNCS(getfsstat, [have_getfsstat="yes"])
-have_getvfsstat="no"
-AC_CHECK_FUNCS(getvfsstat, [have_getvfsstat="yes"])
-have_listmntent="no"
-AC_CHECK_FUNCS(listmntent, [have_listmntent="yes"])
-have_getmntent_r="no"
-AC_CHECK_FUNCS(getmntent_r, [have_getmntent_r="yes"])
-
-have_getmntent="no"
-AC_CHECK_FUNCS(getmntent, [have_getmntent="c"])
+AC_CHECK_FUNCS([getfsstat], [have_getfsstat="yes"], [have_getfsstat="no"])
+AC_CHECK_FUNCS(getvfsstat, [have_getvfsstat="yes"], [have_getvfsstat="no"])
+AC_CHECK_FUNCS(listmntent, [have_listmntent="yes"], [have_listmntent="no"])
+AC_CHECK_FUNCS(getmntent_r, [have_getmntent_r="yes"], [have_getmntent_r="no"])
+
+AC_CHECK_FUNCS(getmntent, [have_getmntent="libc"], [have_getmntent="no"])
 if test "x$have_getmntent" = "xno"; then
-       AC_CHECK_LIB(sun, getmntent, [have_getmntent="sun"])
+  AC_CHECK_LIB([sun], [getmntent],
+    [have_getmntent="sun"],
+    [have_gemntent="no"]
+  )
 fi
+
 if test "x$have_getmntent" = "xno"; then
-       AC_CHECK_LIB(seq, getmntent, [have_getmntent="seq"])
+  AC_CHECK_LIB([seq], [getmntent],
+    [have_getmntent="seq"],
+    [have_getmntent="no"]
+  )
 fi
+
 if test "x$have_getmntent" = "xno"; then
-       AC_CHECK_LIB(gen, getmntent, [have_getmntent="gen"])
+  AC_CHECK_LIB([gen], [getmntent],
+    [have_getmntent="gen"],
+    [have_getmntent="no"]
+  )
 fi
 
-if test "x$have_getmntent" = "xc"; then
-       AC_CACHE_CHECK([whether getmntent takes one argument],
-               [c_cv_have_one_getmntent],
-               AC_COMPILE_IFELSE(
-                       [AC_LANG_PROGRAM(
-[[[
-#include "$srcdir/src/utils_mount.h"
-]]],
-[[[
-FILE *fh;
-struct mntent *me;
-fh = setmntent ("/etc/mtab", "r");
-me = getmntent (fh);
-return(me->mnt_passno);
-]]]
-                       )],
-                       [c_cv_have_one_getmntent="yes"],
-                       [c_cv_have_one_getmntent="no"]
-               )
-       )
-       AC_CACHE_CHECK([whether getmntent takes two arguments],
-               [c_cv_have_two_getmntent],
-               AC_COMPILE_IFELSE(
-                       [AC_LANG_PROGRAM(
-[[[
-#include "$srcdir/src/utils_mount.h"
-]]],
-[[[
-                                FILE *fh;
-                                struct mnttab mt;
-                                int status;
-                                fh = fopen ("/etc/mnttab", "r");
-                                status = getmntent (fh, &mt);
-                                return(status);
-]]]
-                       )],
-                       [c_cv_have_two_getmntent="yes"],
-                       [c_cv_have_two_getmntent="no"]
-               )
-       )
+if test "x$have_getmntent" = "xlibc"; then
+  AC_CACHE_CHECK([whether getmntent takes one argument],
+    [c_cv_have_one_getmntent],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[#include "$srcdir/src/utils_mount.h"]],
+            [[
+              FILE *fh;
+              struct mntent *me;
+              fh = setmntent ("/etc/mtab", "r");
+              me = getmntent (fh);
+              return(me->mnt_passno);
+            ]]
+          )
+        ],
+        [c_cv_have_one_getmntent="yes"],
+        [c_cv_have_one_getmntent="no"]
+      )
+    ]
+  )
+
+  AC_CACHE_CHECK([whether getmntent takes two arguments],
+    [c_cv_have_two_getmntent],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[#include "$srcdir/src/utils_mount.h"]],
+            [[
+              FILE *fh;
+              struct mnttab mt;
+              int status;
+              fh = fopen ("/etc/mnttab", "r");
+              status = getmntent (fh, &mt);
+              return(status);
+            ]]
+          )
+        ],
+        [c_cv_have_two_getmntent="yes"],
+        [c_cv_have_two_getmntent="no"]
+      )
+    ]
+  )
 fi
 
 # Check for different versions of `getmntent' here..
 
-if test "x$have_getmntent" = "xc"; then
-       if test "x$c_cv_have_one_getmntent" = "xyes"; then
-               AC_DEFINE(HAVE_ONE_GETMNTENT, 1,
-                         [Define if the function getmntent exists and takes one argument.])
-       fi
-       if test "x$c_cv_have_two_getmntent" = "xyes"; then
-               AC_DEFINE(HAVE_TWO_GETMNTENT, 1,
-                         [Define if the function getmntent exists and takes two arguments.])
-       fi
+if test "x$have_getmntent" = "xlibc"; then
+  if test "x$c_cv_have_one_getmntent" = "xyes"; then
+    AC_DEFINE([HAVE_ONE_GETMNTENT], [1],
+      [Define if the function getmntent exists and takes one argument.]
+    )
+  fi
+
+  if test "x$c_cv_have_two_getmntent" = "xyes"; then
+    AC_DEFINE([HAVE_TWO_GETMNTENT], [1],
+      [Define if the function getmntent exists and takes two arguments.]
+    )
+  fi
 fi
+
 if test "x$have_getmntent" = "xsun"; then
-       AC_DEFINE(HAVE_SUN_GETMNTENT, 1,
-                 [Define if the function getmntent exists. It is the version from libsun.])
-fi
-if test "x$have_getmntent" = "xseq"; then
-       AC_DEFINE(HAVE_SEQ_GETMNTENT, 1,
-                 [Define if the function getmntent exists. It is the version from libseq.])
+  AC_DEFINE([HAVE_SUN_GETMNTENT], [1],
+    [Define if the function getmntent exists. It is the version from libsun.]
+  )
 fi
+
 if test "x$have_getmntent" = "xgen"; then
-       AC_DEFINE(HAVE_GEN_GETMNTENT, 1,
-                 [Define if the function getmntent exists. It is the version from libgen.])
+  AC_DEFINE([HAVE_GEN_GETMNTENT], [1],
+    [Define if the function getmntent exists. It is the version from libgen.]
+  )
 fi
 
 # Check for htonll
-AC_CACHE_CHECK([if have htonll defined],
-                  [c_cv_have_htonll],
-                  AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <sys/types.h>
-#include <netinet/in.h>
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-]]],
-[[[
-          return htonll(0);
-]]]
-    )],
-    [c_cv_have_htonll="yes"],
-    [c_cv_have_htonll="no"]
-  )
+AC_CACHE_CHECK([whether htonll is defined],
+  [c_cv_have_htonll],
+  [
+    AC_LINK_IFELSE(
+      [
+        AC_LANG_PROGRAM(
+          [[
+            #include <inttypes.h>
+            #include <sys/types.h>
+            #include <netinet/in.h>
+          ]],
+          [[return htonll(0);]]
+        )
+      ],
+      [c_cv_have_htonll="yes"],
+      [c_cv_have_htonll="no"]
+    )
+  ]
 )
-if test "x$c_cv_have_htonll" = "xyes"
-then
-    AC_DEFINE(HAVE_HTONLL, 1, [Define if the function htonll exists.])
+
+if test "x$c_cv_have_htonll" = "xyes"; then
+  AC_DEFINE([HAVE_HTONLL], [1], [Define if the function htonll exists.])
 fi
 
 # Check for structures
 AC_CHECK_MEMBERS([struct if_data.ifi_ibytes, struct if_data.ifi_opackets, struct if_data.ifi_ierrors],
-       [AC_DEFINE(HAVE_STRUCT_IF_DATA, 1, [Define if struct if_data exists and is usable.])],
-       [],
-       [
-       #include <sys/types.h>
-       #include <sys/socket.h>
-       #include <net/if.h>
-       ])
+  [AC_DEFINE([HAVE_STRUCT_IF_DATA], [1], [Define if struct if_data exists and is usable.])],
+  [],
+  [[
+    #include <sys/types.h>
+    #include <sys/socket.h>
+    #include <net/if.h>
+  ]]
+)
+
 AC_CHECK_MEMBERS([struct net_device_stats.rx_bytes, struct net_device_stats.tx_packets, struct net_device_stats.rx_errors],
-       [AC_DEFINE(HAVE_STRUCT_NET_DEVICE_STATS, 1, [Define if struct net_device_stats exists and is usable.])],
-       [],
-       [
-       #include <sys/types.h>
-       #include <sys/socket.h>
-       #include <linux/if.h>
-       #include <linux/netdevice.h>
-       ])
-AC_CHECK_MEMBERS([struct inet_diag_req.id, struct inet_diag_req.idiag_states],
-       [AC_DEFINE(HAVE_STRUCT_LINUX_INET_DIAG_REQ, 1, [Define if struct inet_diag_req exists and is usable.])],
-       [],
-       [
-       #include <linux/inet_diag.h>
-       ])
+  [AC_DEFINE([HAVE_STRUCT_NET_DEVICE_STATS], [1], [Define if struct net_device_stats exists and is usable.])],
+  [],
+  [[
+    #include <sys/types.h>
+    #include <sys/socket.h>
+    #include <linux/if.h>
+    #include <linux/netdevice.h>
+  ]]
+)
 
+AC_CHECK_MEMBERS([struct inet_diag_req.id, struct inet_diag_req.idiag_states],
+  [AC_DEFINE([HAVE_STRUCT_LINUX_INET_DIAG_REQ], [1], [Define if struct inet_diag_req exists and is usable.])],
+  [],
+  [[#include <linux/inet_diag.h>]]
+)
 
 AC_CHECK_MEMBERS([struct ip_mreqn.imr_ifindex], [],
-       [],
-       [
-       #include <netinet/in.h>
-       #include <net/if.h>
-       ])
+  [],
+  [[
+    #include <netinet/in.h>
+    #include <net/if.h>
+  ]]
+)
 
 AC_CHECK_MEMBERS([struct kinfo_proc.ki_pid, struct kinfo_proc.ki_rssize, struct kinfo_proc.ki_rusage],
-       [
-               AC_DEFINE(HAVE_STRUCT_KINFO_PROC_FREEBSD, 1,
-                       [Define if struct kinfo_proc exists in the FreeBSD variant.])
-               have_struct_kinfo_proc_freebsd="yes"
-       ],
-       [
-               have_struct_kinfo_proc_freebsd="no"
-       ],
-       [
-#include <kvm.h>
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <sys/user.h>
-       ])
+  [
+    AC_DEFINE([HAVE_STRUCT_KINFO_PROC_FREEBSD], [1], [Define if struct kinfo_proc exists in the FreeBSD variant.])
+    have_struct_kinfo_proc_freebsd="yes"
+  ],
+  [],
+  [[
+    #include <kvm.h>
+    #include <sys/param.h>
+    #include <sys/sysctl.h>
+    #include <sys/user.h>
+  ]]
+)
 
 AC_CHECK_MEMBERS([struct kinfo_proc.p_pid, struct kinfo_proc.p_vm_rssize],
-       [
-               AC_DEFINE(HAVE_STRUCT_KINFO_PROC_OPENBSD, 1,
-                       [Define if struct kinfo_proc exists in the OpenBSD variant.])
-               have_struct_kinfo_proc_openbsd="yes"
-       ],
-       [
-               have_struct_kinfo_proc_openbsd="no"
-       ],
-       [
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <kvm.h>
-       ])
-
+  [
+    AC_DEFINE([HAVE_STRUCT_KINFO_PROC_OPENBSD], [1], [Define if struct kinfo_proc exists in the OpenBSD variant.])
+    have_struct_kinfo_proc_openbsd="yes"
+  ],
+  [],
+  [[
+    #include <sys/param.h>
+    #include <sys/sysctl.h>
+    #include <kvm.h>
+  ]]
+)
 
 AC_CHECK_MEMBERS([struct kinfo_proc2.p_pid, struct kinfo_proc2.p_uru_maxrss],
-       [
-               AC_DEFINE(HAVE_STRUCT_KINFO_PROC2_NETBSD, 1,
-                       [Define if struct kinfo_proc2 exists in the NetBSD variant.])
-               have_struct_kinfo_proc2_netbsd="yes"
-       ],
-       [
-               have_struct_kinfo_proc2_netbsd="no"
-       ],
-       [
-#include <sys/param.h>
-#include <sys/sysctl.h>
-#include <kvm.h>
-       ])
-
-
-
-AC_CHECK_MEMBERS([struct udphdr.uh_dport, struct udphdr.uh_sport], [], [],
-[#define _BSD_SOURCE
-#define _DEFAULT_SOURCE
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-#if HAVE_NETINET_UDP_H
-# include <netinet/udp.h>
-#endif
-])
-AC_CHECK_MEMBERS([struct udphdr.dest, struct udphdr.source], [], [],
-[#define _BSD_SOURCE
-#define _DEFAULT_SOURCE
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP_H
-# include <netinet/ip.h>
-#endif
-#if HAVE_NETINET_UDP_H
-# include <netinet/udp.h>
-#endif
-])
+  [
+    AC_DEFINE([HAVE_STRUCT_KINFO_PROC2_NETBSD], [1], [Define if struct kinfo_proc2 exists in the NetBSD variant.])
+    have_struct_kinfo_proc2_netbsd="yes"
+  ],
+  [],
+  [[
+    #include <sys/param.h>
+    #include <sys/sysctl.h>
+    #include <kvm.h>
+  ]]
+)
+
+AC_CHECK_MEMBERS([struct udphdr.uh_dport, struct udphdr.uh_sport],
+  [],
+  [],
+  [[
+    #define _BSD_SOURCE
+    #define _DEFAULT_SOURCE
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+    #if HAVE_NETINET_UDP_H
+    # include <netinet/udp.h>
+    #endif
+  ]]
+)
+
+AC_CHECK_MEMBERS([struct udphdr.dest, struct udphdr.source],
+  [],
+  [],
+  [[
+    #define _BSD_SOURCE
+    #define _DEFAULT_SOURCE
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP_H
+    # include <netinet/ip.h>
+    #endif
+    #if HAVE_NETINET_UDP_H
+    # include <netinet/udp.h>
+    #endif
+  ]]
+)
 
 AC_CHECK_MEMBERS([kstat_io_t.nwritten, kstat_io_t.writes, kstat_io_t.nwrites, kstat_io_t.wtime],
-       [],
-       [],
-       [
-#if HAVE_KSTAT_H
-# include <kstat.h>
-#endif
-       ])
+  [],
+  [],
+  [[# include <kstat.h>]]
+)
 
 # check for pthread_setname_np
 SAVE_LDFLAGS="$LDFLAGS"
 LDFLAGS="$LDFLAGS -lpthread"
 
 AC_MSG_CHECKING([for pthread_setname_np])
-       have_pthread_setname_np="no"
-       AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[
-#define _GNU_SOURCE
-#include <pthread.h>
-]],
-[[
-        pthread_setname_np((pthread_t) {0}, "conftest");
-]]
-       )], [
-               have_pthread_setname_np="yes"
-               AC_DEFINE(HAVE_PTHREAD_SETNAME_NP, 1, [pthread_setname_np() is available.])
-       ])
+have_pthread_setname_np="no"
+AC_LINK_IFELSE(
+  [
+    AC_LANG_PROGRAM(
+      [[
+        #define _GNU_SOURCE
+        #include <pthread.h>
+      ]],
+      [[pthread_setname_np((pthread_t) {0}, "conftest");]]
+    )
+  ],
+  [
+    have_pthread_setname_np="yes"
+    AC_DEFINE(HAVE_PTHREAD_SETNAME_NP, 1, [pthread_setname_np() is available.])
+  ]
+)
 
 AC_MSG_RESULT([$have_pthread_setname_np])
 
 # check for pthread_set_name_np(3) (FreeBSD)
 AC_MSG_CHECKING([for pthread_set_name_np])
-       have_pthread_set_name_np="no"
-       AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[
-#include <pthread_np.h>
-]],
-[[
-        pthread_set_name_np((pthread_t) {0}, "conftest");
-]]
-       )], [
-               have_pthread_set_name_np="yes"
-               AC_DEFINE(HAVE_PTHREAD_SET_NAME_NP, 1, [pthread_set_name_np() is available.])
-       ])
+have_pthread_set_name_np="no"
+AC_LINK_IFELSE(
+  [
+    AC_LANG_PROGRAM(
+      [[#include <pthread_np.h>]],
+      [[pthread_set_name_np((pthread_t) {0}, "conftest");]]
+    )
+   ],
+  [
+    have_pthread_set_name_np="yes"
+    AC_DEFINE(HAVE_PTHREAD_SET_NAME_NP, 1, [pthread_set_name_np() is available.])
+  ]
+)
 AC_MSG_RESULT([$have_pthread_set_name_np])
 
 LDFLAGS="$SAVE_LDFLAGS"
 
-#
-# Checks for libraries begin here
-#
+AC_CHECK_TYPES([struct ip6_ext],
+  [have_ip6_ext="yes"],
+  [have_ip6_ext="no"],
+  [[
+    #include <stdint.h>
+    #if HAVE_SYS_TYPES_H
+    # include <sys/types.h>
+    #endif
+    #if HAVE_NETINET_IN_SYSTM_H
+    # include <netinet/in_systm.h>
+    #endif
+    #if HAVE_NETINET_IN_H
+    # include <netinet/in.h>
+    #endif
+    #if HAVE_NETINET_IP6_H
+    # include <netinet/ip6.h>
+    #endif
+  ]]
+)
 
-with_libresolv="yes"
-AC_CHECK_LIB(resolv, res_search,
-[
-       AC_DEFINE(HAVE_LIBRESOLV, 1, [Define to 1 if you have the 'resolv' library (-lresolv).])
-],
-[with_libresolv="no"])
-AM_CONDITIONAL(BUILD_WITH_LIBRESOLV, test "x$with_libresolv" = "xyes")
+if test "x$have_ip6_ext" = "xno"; then
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -DSOLARIS2=8"
+  AC_CHECK_TYPES([struct ip6_ext],
+    [have_ip6_ext="yes, with -DSOLARIS2=8"],
+    [have_ip6_ext="no"],
+    [[
+      #include <stdint.h>
+      #if HAVE_SYS_TYPES_H
+      # include <sys/types.h>
+      #endif
+      #if HAVE_NETINET_IN_SYSTM_H
+      # include <netinet/in_systm.h>
+      #endif
+      #if HAVE_NETINET_IN_H
+      # include <netinet/in.h>
+      #endif
+      #if HAVE_NETINET_IP6_H
+      # include <netinet/ip6.h>
+      #endif
+    ]]
+  )
+  if test "x$have_ip6_ext" = "xno"; then
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+fi
 
-dnl Check for HAL (hardware abstraction library)
-with_libhal="no"
-PKG_CHECK_MODULES([HAL], [hal],
-  [
-    SAVE_LIBS="$LIBS"
-    LIBS="$HAL_LIBS $LIBS"
-    AC_CHECK_LIB([hal], [libhal_device_property_exists],
-      [
-        SAVE_CPPFLAGS="$CPPFLAGS"
-        CPPFLAGS="$HAL_CFLAGS $CPPFLAGS"
-        AC_CHECK_HEADERS([libhal.h],
-        [
-          with_libhal="yes"
-          BUILD_WITH_LIBHAL_CFLAGS="$HAL_CFLAGS"
-          BUILD_WITH_LIBHAL_LIBS="$HAL_LIBS"
-        ])
-        CPPFLAGS="$SAVE_CPPFLAGS"
-      ],
-      [ : ]
-    )
-    LIBS="$SAVE_LIBS"
-  ],
-  [ : ]
-)
-AC_SUBST(BUILD_WITH_LIBHAL_CFLAGS)
-AC_SUBST(BUILD_WITH_LIBHAL_LIBS)
+# libi2c-dev
+if test "x$ac_system" = "xLinux"; then
+  AC_CHECK_DECL([i2c_smbus_read_i2c_block_data],
+    [with_libi2c="yes"],
+    [with_libi2c="no (symbol i2c_smbus_read_i2c_block_data not found - have you installed libi2c-dev ?)"],
+    [[
+      #include <stdlib.h>
+      #include <linux/i2c-dev.h>
+    ]]
+  )
+else
+  with_libi2c="no (Linux only)"
+fi
 
+#
+# Checks for libraries begin here
+#
 
+# Check for libpthread
 SAVE_LIBS="$LIBS"
 AC_CHECK_LIB([pthread],
   [pthread_create],
   [],
-  [AC_MSG_ERROR([Symbol 'pthread_create' not found in libpthread"])],
+  [AC_MSG_ERROR([Symbol 'pthread_create' not found in libpthread])],
   []
 )
 PTHREAD_LIBS="$LIBS"
 LIBS="$SAVE_LIBS"
+AC_SUBST([PTHREAD_LIBS])
 
 AC_CHECK_HEADERS([pthread.h],
   [],
   [AC_MSG_ERROR([pthread.h not found])]
 )
-AC_SUBST([PTHREAD_LIBS])
 
 m4_divert_once([HELP_WITH], [
-collectd additional packages:])
+Collectd additional packages:])
 
-if test "x$ac_system" = "xAIX"
-then
-       with_perfstat="yes"
-       with_procinfo="yes"
+if test "x$ac_system" = "xAIX"; then
+  with_perfstat="yes"
+  with_procinfo="yes"
 else
-       with_perfstat="no (AIX only)"
-       with_procinfo="no (AIX only)"
+  with_perfstat="no (AIX only)"
+  with_procinfo="no (AIX only)"
 fi
 
-if test "x$with_perfstat" = "xyes"
-then
-       AC_CHECK_LIB(perfstat, perfstat_reset, [with_perfstat="yes"], [with_perfstat="no (perfstat not found)"], [])
-#      AC_CHECK_HEADERS(sys/protosw.h libperfstat.h,, [with_perfstat="no (perfstat not found)"])
+if test "x$with_perfstat" = "xyes"; then
+  AC_CHECK_LIB([perfstat], [perfstat_reset],
+    [with_perfstat="yes"],
+    [with_perfstat="no (perfstat not found)"]
+  )
 fi
-if test "x$with_perfstat" = "xyes"
-then
-        AC_DEFINE(HAVE_PERFSTAT, 1, [Define to 1 if you have the 'perfstat' library (-lperfstat)])
-        # struct members pertaining to donation have been added to libperfstat somewhere between AIX5.3ML5 and AIX5.3ML9
-        AC_CHECK_MEMBER([perfstat_partition_type_t.b.donate_enabled], [], [], [[#include <libperfstat.h]])
-        if test "x$av_cv_member_perfstat_partition_type_t_b_donate_enabled" = "xyes"
-        then
-               AC_DEFINE(PERFSTAT_SUPPORTS_DONATION, 1, [Define to 1 if your version of the 'perfstat' library supports donation])
-        fi
+
+if test "x$with_perfstat" = "xyes"; then
+  AC_DEFINE([HAVE_PERFSTAT], [1], [Define to 1 if you have the 'perfstat' library (-lperfstat)])
+  # struct members pertaining to donation have been added to libperfstat somewhere between AIX5.3ML5 and AIX5.3ML9
+  AC_CHECK_MEMBER([perfstat_partition_type_t.b.donate_enabled],
+    [],
+    [],
+    [[#include <libperfstat.h]]
+  )
+  if test "x$av_cv_member_perfstat_partition_type_t_b_donate_enabled" = "xyes"; then
+    AC_DEFINE([PERFSTAT_SUPPORTS_DONATION], [1], [Define to 1 if your version of the 'perfstat' library supports donation])
+  fi
 fi
-AM_CONDITIONAL(BUILD_WITH_PERFSTAT, test "x$with_perfstat" = "xyes")
+AM_CONDITIONAL([BUILD_WITH_PERFSTAT], [test "x$with_perfstat" = "xyes"])
 
 # Processes plugin under AIX.
-if test "x$with_procinfo" = "xyes"
-then
-       AC_CHECK_HEADERS(procinfo.h,, [with_procinfo="no (procinfo.h not found)"])
-fi
-if test "x$with_procinfo" = "xyes"
-then
-        AC_DEFINE(HAVE_PROCINFO_H, 1, [Define to 1 if you have the procinfo.h])
+if test "x$with_procinfo" = "xyes"; then
+  AC_CHECK_HEADERS([procinfo.h],
+    [AC_DEFINE([HAVE_PROCINFO_H], [1], [Define to 1 if you have the procinfo.h])],
+    [with_procinfo="no (procinfo.h not found)"]
+  )
 fi
 
-if test "x$ac_system" = "xSolaris"
-then
-       with_kstat="yes"
-       with_devinfo="yes"
+if test "x$ac_system" = "xSolaris"; then
+  with_kstat="yes"
+  with_devinfo="yes"
 else
-       with_kstat="no (Solaris only)"
-       with_devinfo="no (Solaris only)"
+  with_kstat="no (Solaris only)"
+  with_devinfo="no (Solaris only)"
 fi
 
-if test "x$with_kstat" = "xyes"
-then
-       AC_CHECK_LIB(kstat, kstat_open, [with_kstat="yes"], [with_kstat="no (libkstat not found)"], [])
-fi
-if test "x$with_kstat" = "xyes"
-then
-       AC_CHECK_LIB(devinfo, di_init, [with_devinfo="yes"], [with_devinfo="no (not found)"], [])
-       AC_CHECK_HEADERS(kstat.h,, [with_kstat="no (kstat.h not found)"])
+if test "x$with_kstat" = "xyes"; then
+  AC_CHECK_LIB([kstat], [kstat_open],
+    [with_kstat="yes"],
+    [with_kstat="no (libkstat not found)"]
+  )
 fi
-if test "x$with_kstat" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBKSTAT, 1,
-                 [Define to 1 if you have the 'kstat' library (-lkstat)])
+
+if test "x$with_kstat" = "xyes"; then
+  AC_CHECK_LIB([devinfo], [di_init],
+    [with_devinfo="yes"],
+    [with_devinfo="no (not found)"]
+  )
+  AC_CHECK_HEADERS([kstat.h],
+    [AC_DEFINE(HAVE_LIBKSTAT, [1], [Define to 1 if you have the 'kstat' library (-lkstat)])],
+    [with_kstat="no (kstat.h not found)"]
+  )
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBKSTAT, test "x$with_kstat" = "xyes")
-AM_CONDITIONAL(BUILD_WITH_LIBDEVINFO, test "x$with_devinfo" = "xyes")
 
-with_libiokit="no"
-if test "x$ac_system" = "xDarwin"
-then
-       with_libiokit="yes"
+AM_CONDITIONAL([BUILD_WITH_LIBDEVINFO], [test "x$with_devinfo" = "xyes"])
+AM_CONDITIONAL([BUILD_WITH_LIBKSTAT], [test "x$with_kstat" = "xyes"])
+
+if test "x$ac_system" = "xDarwin"; then
+  with_libiokit="yes"
 else
-       with_libiokit="no"
+  with_libiokit="no"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBIOKIT, test "x$with_libiokit" = "xyes")
+AM_CONDITIONAL([BUILD_WITH_LIBIOKIT], [test "x$with_libiokit" = "xyes"])
 
 with_libkvm="no"
-AC_CHECK_LIB(kvm, kvm_getprocs, [with_kvm_getprocs="yes"], [with_kvm_getprocs="no"])
-if test "x$with_kvm_getprocs" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBKVM_GETPROCS, 1,
-                 [Define to 1 if you have the 'kvm' library with the 'kvm_getprocs' symbol (-lkvm)])
-       with_libkvm="yes"
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETPROCS, test "x$with_kvm_getprocs" = "xyes")
+AC_CHECK_LIB([kvm], [kvm_getprocs],
+  [with_kvm_getprocs="yes"],
+  [with_kvm_getprocs="no"]
+)
 
-AC_CHECK_LIB(kvm, kvm_getswapinfo, [with_kvm_getswapinfo="yes"], [with_kvm_getswapinfo="no"])
-if test "x$with_kvm_getswapinfo" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBKVM_GETSWAPINFO, 1,
-                 [Define to 1 if you have the 'kvm' library with the 'kvm_getswapinfo' symbol (-lkvm)])
-       with_libkvm="yes"
+if test "x$with_kvm_getprocs" = "xyes"; then
+  AC_DEFINE([HAVE_LIBKVM_GETPROCS], [1],
+    [Define to 1 if you have the 'kvm' library with the 'kvm_getprocs' symbol (-lkvm)]
+  )
+  with_libkvm="yes"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBKVM_GETSWAPINFO, test "x$with_kvm_getswapinfo" = "xyes")
 
-AC_CHECK_LIB(kvm, kvm_nlist, [with_kvm_nlist="yes"], [with_kvm_nlist="no"])
-if test "x$with_kvm_nlist" = "xyes"
-then
-       AC_CHECK_HEADERS(bsd/nlist.h nlist.h)
-       AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
-                 [Define to 1 if you have the 'kvm' library with the 'kvm_nlist' symbol (-lkvm)])
-       with_libkvm="yes"
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBKVM_NLIST, test "x$with_kvm_nlist" = "xyes")
+AM_CONDITIONAL([BUILD_WITH_LIBKVM_GETPROCS], [test "x$with_kvm_getprocs" = "xyes"])
 
-AC_CHECK_LIB(kvm, kvm_openfiles, [with_kvm_openfiles="yes"], [with_kvm_openfiles="no"])
-if test "x$with_kvm_openfiles" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBKVM_NLIST, 1,
-                 [Define to 1 if you have the 'kvm' library with the 'kvm_openfiles' symbol (-lkvm)])
-       with_libkvm="yes"
+AC_CHECK_LIB([kvm], [kvm_getswapinfo],
+  [with_kvm_getswapinfo="yes"],
+  [with_kvm_getswapinfo="no"]
+)
+
+if test "x$with_kvm_getswapinfo" = "xyes"; then
+  AC_DEFINE([HAVE_LIBKVM_GETSWAPINFO], [1],
+    [Define to 1 if you have the 'kvm' library with the 'kvm_getswapinfo' symbol (-lkvm)]
+  )
+  with_libkvm="yes"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBKVM_OPENFILES, test "x$with_kvm_openfiles" = "xyes")
 
-# --with-libaquaero5 {{{
-AC_ARG_WITH(libaquaero5, [AS_HELP_STRING([--with-libaquaero5@<:@=PREFIX@:>@], [Path to aquatools-ng source code.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_libaquaero5="yes"
- else if test "x$withval" = "xno"
- then
-        with_libaquaero5="no"
- else
-        with_libaquaero5="yes"
-        LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS -I$withval/src"
-        LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS -L$withval/obj"
- fi; fi
-],
-[with_libaquaero5="yes"])
+AM_CONDITIONAL([BUILD_WITH_LIBKVM_GETSWAPINFO], [test "x$with_kvm_getswapinfo" = "xyes"])
+
+AC_CHECK_LIB([kvm], [kvm_nlist],
+  [with_kvm_nlist="yes"],
+  [with_kvm_nlist="no"]
+)
+
+if test "x$with_kvm_nlist" = "xyes"; then
+  AC_CHECK_HEADERS([bsd/nlist.h nlist.h])
+  AC_DEFINE([HAVE_LIBKVM_NLIST], [1],
+    [Define to 1 if you have the 'kvm' library with the 'kvm_nlist' symbol (-lkvm)]
+  )
+  with_libkvm="yes"
+fi
+
+AM_CONDITIONAL([BUILD_WITH_LIBKVM_NLIST], [test "x$with_kvm_nlist" = "xyes"])
+
+AC_CHECK_LIB([kvm], [kvm_openfiles],
+  [with_kvm_openfiles="yes"],
+  [with_kvm_openfiles="no"]
+)
+
+if test "x$with_kvm_openfiles" = "xyes"; then
+  AC_DEFINE([HAVE_LIBKVM_NLIST], [1],
+    [Define to 1 if you have the 'kvm' library with the 'kvm_openfiles' symbol (-lkvm)]
+  )
+  with_libkvm="yes"
+fi
+
+# --with-libaquaero5 {{{
+AC_ARG_WITH([libaquaero5],
+  [AS_HELP_STRING([--with-libaquaero5@<:@=PREFIX@:>@], [Path to aquatools-ng source code.])],
+  [
+    if test "x$withval" = "xyes"; then
+      with_libaquaero5="yes"
+    else if test "x$withval" = "xno"; then
+      with_libaquaero5="no"
+    else
+      with_libaquaero5="yes"
+      LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS -I$withval/src"
+      LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS -L$withval/obj"
+    fi; fi
+  ],
+  [with_libaquaero5="yes"]
+)
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
-
 CPPFLAGS="$CPPFLAGS $LIBAQUAERO5_CFLAGS"
 LDFLAGS="$LDFLAGS $LIBAQUAERO5_LDFLAGS"
 
-if test "x$with_libaquaero5" = "xyes"
-then
-       if test "x$LIBAQUAERO5_CFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libaquaero5 CPPFLAGS: $LIBAQUAERO5_CFLAGS])
-       fi
-       AC_CHECK_HEADERS(libaquaero5.h,
-       [with_libaquaero5="yes"],
-       [with_libaquaero5="no (libaquaero5.h not found)"])
-fi
-if test "x$with_libaquaero5" = "xyes"
-then
-       if test "x$LIBAQUAERO5_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libaquaero5 LDFLAGS: $LIBAQUAERO5_LDFLAGS])
-       fi
-       AC_CHECK_LIB(aquaero5, libaquaero5_poll,
-       [with_libaquaero5="yes"],
-       [with_libaquaero5="no (symbol 'libaquaero5_poll' not found)"])
+if test "x$with_libaquaero5" = "xyes"; then
+  if test "x$LIBAQUAERO5_CFLAGS" != "x"; then
+    AC_MSG_NOTICE([libaquaero5 CPPFLAGS: $LIBAQUAERO5_CFLAGS])
+  fi
+  AC_CHECK_HEADERS([libaquaero5.h],
+    [with_libaquaero5="yes"],
+    [with_libaquaero5="no (libaquaero5.h not found)"]
+  )
+fi
+
+if test "x$with_libaquaero5" = "xyes"; then
+  if test "x$LIBAQUAERO5_LDFLAGS" != "x"; then
+    AC_MSG_NOTICE([libaquaero5 LDFLAGS: $LIBAQUAERO5_LDFLAGS])
+  fi
+  AC_CHECK_LIB([aquaero5], libaquaero5_poll,
+    [with_libaquaero5="yes"],
+    [with_libaquaero5="no (symbol 'libaquaero5_poll' not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 
-if test "x$with_libaquaero5" = "xyes"
-then
-       BUILD_WITH_LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS"
-       BUILD_WITH_LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBAQUAERO5_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBAQUAERO5_LDFLAGS)
+if test "x$with_libaquaero5" = "xyes"; then
+  BUILD_WITH_LIBAQUAERO5_CFLAGS="$LIBAQUAERO5_CFLAGS"
+  BUILD_WITH_LIBAQUAERO5_LDFLAGS="$LIBAQUAERO5_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBAQUAERO5, test "x$with_libaquaero5" = "xyes")
+AC_SUBST([BUILD_WITH_LIBAQUAERO5_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBAQUAERO5_LDFLAGS])
 # }}}
 
 # --with-libhiredis {{{
-AC_ARG_WITH(libhiredis, [AS_HELP_STRING([--with-libhiredis@<:@=PREFIX@:>@],
-      [Path to libhiredis.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_libhiredis="yes"
- else if test "x$withval" = "xno"
- then
-        with_libhiredis="no"
- else
-        with_libhiredis="yes"
-        LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS -I$withval/include"
-        LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS -L$withval/lib"
- fi; fi
-],
-[with_libhiredis="yes"])
+AC_ARG_WITH([libhiredis],
+  [AS_HELP_STRING([--with-libhiredis@<:@=PREFIX@:>@], [Path to libhiredis.])],
+  [
+    if test "x$withval" = "xyes"; then
+      with_libhiredis="yes"
+    else if test "x$withval" = "xno"; then
+      with_libhiredis="no"
+    else
+      with_libhiredis="yes"
+      LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS -I$withval/include"
+      LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS -L$withval/lib"
+    fi; fi
+  ],
+  [with_libhiredis="yes"]
+)
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
-
 CPPFLAGS="$CPPFLAGS $LIBHIREDIS_CPPFLAGS"
 LDFLAGS="$LDFLAGS $LIBHIREDIS_LDFLAGS"
 
-if test "x$with_libhiredis" = "xyes"
-then
-       if test "x$LIBHIREDIS_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libhiredis CPPFLAGS: $LIBHIREDIS_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(hiredis/hiredis.h,
-       [with_libhiredis="yes"],
-       [with_libhiredis="no (hiredis.h not found)"])
-fi
-if test "x$with_libhiredis" = "xyes"
-then
-       if test "x$LIBHIREDIS_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libhiredis LDFLAGS: $LIBHIREDIS_LDFLAGS])
-       fi
-       AC_CHECK_LIB(hiredis, redisCommand,
-       [with_libhiredis="yes"],
-       [with_libhiredis="no (symbol 'redisCommand' not found)"])
+if test "x$with_libhiredis" = "xyes"; then
+  if test "x$LIBHIREDIS_CPPFLAGS" != "x"; then
+    AC_MSG_NOTICE([libhiredis CPPFLAGS: $LIBHIREDIS_CPPFLAGS])
+  fi
+  AC_CHECK_HEADERS([hiredis/hiredis.h],
+    [with_libhiredis="yes"],
+    [with_libhiredis="no (hiredis.h not found)"]
+  )
+fi
 
+if test "x$with_libhiredis" = "xyes"; then
+  if test "x$LIBHIREDIS_LDFLAGS" != "x"; then
+    AC_MSG_NOTICE([libhiredis LDFLAGS: $LIBHIREDIS_LDFLAGS])
+  fi
+  AC_CHECK_LIB([hiredis], [redisCommand],
+    [with_libhiredis="yes"],
+    [with_libhiredis="no (symbol 'redisCommand' not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 
-if test "x$with_libhiredis" = "xyes"
-then
-       BUILD_WITH_LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS"
-       BUILD_WITH_LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBHIREDIS_LDFLAGS)
+if test "x$with_libhiredis" = "xyes"; then
+  BUILD_WITH_LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS"
+  BUILD_WITH_LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBHIREDIS, test "x$with_libhiredis" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBHIREDIS_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBHIREDIS_LDFLAGS])
 # }}}
 
 # --with-libcurl {{{
 with_curl_config="curl-config"
 with_curl_cflags=""
 with_curl_libs=""
-AC_ARG_WITH(libcurl, [AS_HELP_STRING([--with-libcurl@<:@=PREFIX@:>@], [Path to libcurl.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libcurl="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libcurl="yes"
-       else
-               if test -f "$withval" && test -x "$withval"
-               then
-                       with_curl_config="$withval"
-                       with_libcurl="yes"
-               else if test -x "$withval/bin/curl-config"
-               then
-                       with_curl_config="$withval/bin/curl-config"
-                       with_libcurl="yes"
-               fi; fi
-               with_libcurl="yes"
-       fi; fi
-],
-[
-       with_libcurl="yes"
-])
-if test "x$with_libcurl" = "xyes"
-then
-       with_curl_cflags=`$with_curl_config --cflags 2>/dev/null`
-       curl_config_status=$?
+AC_ARG_WITH(libcurl,
+  [AS_HELP_STRING([--with-libcurl@<:@=PREFIX@:>@], [Path to libcurl.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libcurl="no"
+    else if test "x$withval" = "xyes"; then
+      with_libcurl="yes"
+    else
+      if test -f "$withval" && test -x "$withval"; then
+        with_curl_config="$withval"
+        with_libcurl="yes"
+      else if test -x "$withval/bin/curl-config"; then
+        with_curl_config="$withval/bin/curl-config"
+        with_libcurl="yes"
+      fi; fi
+      with_libcurl="yes"
+    fi; fi
+  ],
+  [with_libcurl="yes"]
+)
 
-       if test $curl_config_status -ne 0
-       then
-               with_libcurl="no ($with_curl_config failed)"
-       else
-               SAVE_CPPFLAGS="$CPPFLAGS"
-               CPPFLAGS="$CPPFLAGS $with_curl_cflags"
+if test "x$with_libcurl" = "xyes"; then
+  with_curl_cflags=`$with_curl_config --cflags 2>/dev/null`
+  curl_config_status=$?
+
+  if test $curl_config_status -ne 0; then
+    with_libcurl="no ($with_curl_config failed)"
+  else
+    SAVE_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $with_curl_cflags"
 
-               AC_CHECK_HEADERS(curl/curl.h, [], [with_libcurl="no (curl/curl.h not found)"], [])
+    AC_CHECK_HEADERS([curl/curl.h],
+      [with_libcurl="yes"],
+      [with_libcurl="no (curl/curl.h not found)"]
+    )
 
-               CPPFLAGS="$SAVE_CPPFLAGS"
-       fi
+    CPPFLAGS="$SAVE_CPPFLAGS"
+  fi
 fi
-if test "x$with_libcurl" = "xyes"
-then
-       with_curl_libs=`$with_curl_config --libs 2>/dev/null`
-       curl_config_status=$?
-
-       if test $curl_config_status -ne 0
-       then
-               with_libcurl="no ($with_curl_config failed)"
-       else
-               AC_CHECK_LIB(curl, curl_easy_init,
-                [with_libcurl="yes"],
-                [with_libcurl="no (symbol 'curl_easy_init' not found)"],
-                [$with_curl_libs])
-               AC_CHECK_DECL(CURLOPT_USERNAME,
-                [have_curlopt_username="yes"],
-                [have_curlopt_username="no"],
-                [[#include <curl/curl.h>]])
-               AC_CHECK_DECL(CURLOPT_TIMEOUT_MS,
-                [have_curlopt_timeout="yes"],
-                [have_curlopt_timeout="no"],
-                [[#include <curl/curl.h>]])
-       fi
-fi
-if test "x$with_libcurl" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_curl_cflags"
-       LDFLAGS="$LDFLAGS $with_curl_libs"
-       AC_CACHE_CHECK([for CURLINFO_APPCONNECT_TIME],
-               [c_cv_have_curlinfo_appconnect_time],
-               AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[
-#include <curl/curl.h>
-]],
-[[
-int val = CURLINFO_APPCONNECT_TIME;
-return val;
-]]
-                       )],
-                       [c_cv_have_curlinfo_appconnect_time="yes"],
-                       [c_cv_have_curlinfo_appconnect_time="no"]
-               )
-       )
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBCURL, test "x$with_libcurl" = "xyes")
-if test "x$c_cv_have_curlinfo_appconnect_time" = "xyes"
-then
-       AC_DEFINE(HAVE_CURLINFO_APPCONNECT_TIME, 1, [Define if curl.h defines CURLINFO_APPCONNECT_TIME.])
+
+if test "x$with_libcurl" = "xyes"; then
+  with_curl_libs=`$with_curl_config --libs 2>/dev/null`
+  curl_config_status=$?
+
+  if test $curl_config_status -ne 0; then
+    with_libcurl="no ($with_curl_config failed)"
+  else
+    AC_CHECK_LIB([curl], [curl_easy_init],
+      [with_libcurl="yes"],
+      [with_libcurl="no (symbol 'curl_easy_init' not found)"],
+      [$with_curl_libs]
+    )
+
+    AC_CHECK_DECL([CURLOPT_USERNAME],
+      [have_curlopt_username="yes"],
+      [have_curlopt_username="no"],
+      [[#include <curl/curl.h>]]
+    )
+
+    AC_CHECK_DECL(CURLOPT_TIMEOUT_MS,
+      [have_curlopt_timeout="yes"],
+      [have_curlopt_timeout="no"],
+      [[#include <curl/curl.h>]]
+    )
+  fi
 fi
 
-if test "x$with_libcurl" = "xyes"
-then
-       BUILD_WITH_LIBCURL_CFLAGS="$with_curl_cflags"
-       BUILD_WITH_LIBCURL_LIBS="$with_curl_libs"
-       AC_SUBST(BUILD_WITH_LIBCURL_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBCURL_LIBS)
+if test "x$with_libcurl" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_curl_cflags"
+  LDFLAGS="$LDFLAGS $with_curl_libs"
+  AC_CACHE_CHECK([for CURLINFO_APPCONNECT_TIME],
+    [c_cv_have_curlinfo_appconnect_time],
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[#include <curl/curl.h>]],
+            [[
+              int val = CURLINFO_APPCONNECT_TIME;
+              return val;
+            ]]
+          )
+        ],
+        [c_cv_have_curlinfo_appconnect_time="yes"],
+        [c_cv_have_curlinfo_appconnect_time="no"]
+      )
+    ]
+  )
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+if test "x$c_cv_have_curlinfo_appconnect_time" = "xyes"; then
+  AC_DEFINE([HAVE_CURLINFO_APPCONNECT_TIME], [1],
+    [Define if curl.h defines CURLINFO_APPCONNECT_TIME.]
+  )
+fi
 
-       if test "x$have_curlopt_username" = "xyes"
-       then
-               AC_DEFINE(HAVE_CURLOPT_USERNAME, 1, [Define if libcurl supports CURLOPT_USERNAME option.])
-       fi
+if test "x$with_libcurl" = "xyes"; then
+  BUILD_WITH_LIBCURL_CFLAGS="$with_curl_cflags"
+  BUILD_WITH_LIBCURL_LIBS="$with_curl_libs"
+
+  if test "x$have_curlopt_username" = "xyes"; then
+    AC_DEFINE([HAVE_CURLOPT_USERNAME], [1],
+      [Define if libcurl supports CURLOPT_USERNAME option.]
+    )
+  fi
 
-       if test "x$have_curlopt_timeout" = "xyes"
-       then
-               AC_DEFINE(HAVE_CURLOPT_TIMEOUT_MS, 1, [Define if libcurl supports CURLOPT_TIMEOUT_MS option.])
-       fi
+  if test "x$have_curlopt_timeout" = "xyes"; then
+    AC_DEFINE([HAVE_CURLOPT_TIMEOUT_MS], [1],
+      [Define if libcurl supports CURLOPT_TIMEOUT_MS option.]
+    )
+  fi
 fi
+
+AC_SUBST(BUILD_WITH_LIBCURL_CFLAGS)
+AC_SUBST(BUILD_WITH_LIBCURL_LIBS)
 # }}}
 
 # --with-libdbi {{{
-with_libdbi_cppflags=""
-with_libdbi_ldflags=""
-AC_ARG_WITH(libdbi, [AS_HELP_STRING([--with-libdbi@<:@=PREFIX@:>@], [Path to libdbi.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libdbi_cppflags="-I$withval/include"
-               with_libdbi_ldflags="-L$withval/lib"
-               with_libdbi="yes"
-       else
-               with_libdbi="$withval"
-       fi
-],
-[
-       with_libdbi="yes"
-])
-if test "x$with_libdbi" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libdbi_cppflags"
+AC_ARG_WITH([libdbi],
+  [AS_HELP_STRING([--with-libdbi@<:@=PREFIX@:>@], [Path to libdbi.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libdbi_cppflags="-I$withval/include"
+      with_libdbi_ldflags="-L$withval/lib"
+      with_libdbi="yes"
+    else
+      with_libdbi="$withval"
+    fi
+  ],
+  [with_libdbi="yes"]
+)
+
+if test "x$with_libdbi" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libdbi_cppflags"
 
-       AC_CHECK_HEADERS(dbi/dbi.h, [with_libdbi="yes"], [with_libdbi="no (dbi/dbi.h not found)"])
+  AC_CHECK_HEADERS([dbi/dbi.h],
+    [with_libdbi="yes"],
+    [with_libdbi="no (dbi/dbi.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libdbi" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libdbi_cppflags"
-       LDFLAGS="$LDFLAGS $with_libdbi_ldflags"
 
-       AC_CHECK_LIB(dbi, dbi_initialize, [with_libdbi="yes"], [with_libdbi="no (Symbol 'dbi_initialize' not found)"])
+if test "x$with_libdbi" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libdbi_ldflags"
+
+  AC_CHECK_LIB([dbi], [dbi_initialize],
+    [with_libdbi="yes"],
+    [with_libdbi="no (Symbol 'dbi_initialize' not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libdbi" = "xyes"
-then
-       BUILD_WITH_LIBDBI_CPPFLAGS="$with_libdbi_cppflags"
-       BUILD_WITH_LIBDBI_LDFLAGS="$with_libdbi_ldflags"
-       BUILD_WITH_LIBDBI_LIBS="-ldbi"
-       AC_SUBST(BUILD_WITH_LIBDBI_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBDBI_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBDBI_LIBS)
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBDBI, test "x$with_libdbi" = "xyes")
+
+BUILD_WITH_LIBDBI_CPPFLAGS="$with_libdbi_cppflags"
+BUILD_WITH_LIBDBI_LDFLAGS="$with_libdbi_ldflags"
+BUILD_WITH_LIBDBI_LIBS="-ldbi"
+AC_SUBST(BUILD_WITH_LIBDBI_CPPFLAGS)
+AC_SUBST(BUILD_WITH_LIBDBI_LDFLAGS)
+AC_SUBST(BUILD_WITH_LIBDBI_LIBS)
 # }}}
 
-# --with-libesmtp {{{
-AC_ARG_WITH(libesmtp, [AS_HELP_STRING([--with-libesmtp@<:@=PREFIX@:>@], [Path to libesmtp.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               LDFLAGS="$LDFLAGS -L$withval/lib"
-               CPPFLAGS="$CPPFLAGS -I$withval/include -D_THREAD_SAFE"
-               with_libesmtp="yes"
-       else
-               with_libesmtp="$withval"
-       fi
-],
-[
-       with_libesmtp="yes"
-])
-if test "x$with_libesmtp" = "xyes"
-then
-       AC_CHECK_LIB(esmtp, smtp_create_session,
-       [
-               AC_DEFINE(HAVE_LIBESMTP, 1, [Define to 1 if you have the esmtp library (-lesmtp).])
-       ], [with_libesmtp="no (libesmtp not found)"])
+# --with-libdpdk {{{
+AC_ARG_VAR([LIBDPDK_CPPFLAGS], [Preprocessor flags for libdpdk])
+AC_ARG_VAR([LIBDPDK_LDFLAGS], [Linker flags for libdpdk])
+
+AC_ARG_WITH([libdpdk],
+  [AS_HELP_STRING([--without-libdpdk], [Disable libdpdk.])],
+  [with_libdpdk="$withval"],
+  [with_libdpdk="yes"]
+)
+
+if test "x$with_libdpdk" != "xno"; then
+  if test "x$LIBDPDK_CPPFLAGS" = "x"; then
+    LIBDPDK_CPPFLAGS="-I/usr/include/dpdk"
+  fi
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$LIBDPDK_CPPFLAGS $CPPFLAGS"
+  AC_CHECK_HEADERS([rte_config.h],
+    [
+      with_libdpdk="yes"
+      AC_PREPROC_IFELSE(
+        [
+          AC_LANG_SOURCE(
+            [[
+              #include <rte_version.h>
+              #if RTE_VERSION < RTE_VERSION_NUM(16,7,0,0)
+              #error "required DPDK >= 16.07"
+              #endif
+            ]]
+          )
+        ],
+        [dpdk_keepalive="yes"],
+        [dpdk_keepalive="no (DPDK version < 16.07)"]
+      )
+    ],
+    [with_libdpdk="no (rte_config.h not found)"]
+  )
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libesmtp" = "xyes"
-then
-       AC_CHECK_HEADERS(libesmtp.h,
-       [
-               AC_DEFINE(HAVE_LIBESMTP_H, 1, [Define to 1 if you have the <libesmtp.h> header file.])
-       ], [with_libesmtp="no (libesmtp.h not found)"])
+
+if test "x$with_libdpdk" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LIBDPDK_LDFLAGS $LDFLAGS"
+  AC_CHECK_LIB([dpdk], [rte_eal_init],
+    [with_libdpdk="yes"],
+    [with_libdpdk="no (symbol 'rte_eal_init' not found)"]
+  )
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libesmtp" = "xyes"
-then
-       collect_libesmtp=1
-else
-       collect_libesmtp=0
+
+# }}}
+
+# --with-libesmtp {{{
+AC_ARG_WITH([libesmtp],
+  [AS_HELP_STRING([--with-libesmtp@<:@=PREFIX@:>@], [Path to libesmtp.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libesmtp_cppflags="-I$withval/include"
+      with_libesmtp_ldflags="-L$withval/lib"
+      with_libesmtp="yes"
+    else
+      with_libesmtp="$withval"
+    fi
+  ],
+  [with_libesmtp="yes"]
+)
+
+if test "x$with_libesmtp" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libesmtp_cppflags"
+
+  AC_CHECK_HEADERS([libesmtp.h],
+    [with_libesmtp="yes"],
+    [with_libesmtp="no (libesmtp.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
+fi
+
+if test "x$with_libesmtp" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_esmtp_ldflags"
+
+  AC_CHECK_LIB([esmtp], [smtp_create_session],
+    [with_libesmtp="yes"],
+    [with_libesmtp="no (Symbol 'smtp_create_session' not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-AC_DEFINE_UNQUOTED(COLLECT_LIBESMTP, [$collect_libesmtp],
-       [Wether or not to use the esmtp library])
-AM_CONDITIONAL(BUILD_WITH_LIBESMTP, test "x$with_libesmtp" = "xyes")
+
+BUILD_WITH_LIBESMTP_CPPFLAGS="$with_libesmtp_cppflags"
+BUILD_WITH_LIBESMTP_LDFLAGS="$with_libesmtp_ldflags"
+BUILD_WITH_LIBESMTP_LIBS="-lesmtp"
+AC_SUBST(BUILD_WITH_LIBESMTP_CPPFLAGS)
+AC_SUBST(BUILD_WITH_LIBESMTP_LDFLAGS)
+AC_SUBST(BUILD_WITH_LIBESMTP_LIBS)
 # }}}
 
 # --with-libganglia {{{
-AC_ARG_WITH(libganglia, [AS_HELP_STRING([--with-libganglia@<:@=PREFIX@:>@], [Path to libganglia.])],
-[
- if test -f "$withval" && test -x "$withval"
- then
-        with_libganglia_config="$withval"
-        with_libganglia="yes"
- else if test -f "$withval/bin/ganglia-config" && test -x "$withval/bin/ganglia-config"
- then
-        with_libganglia_config="$withval/bin/ganglia-config"
-        with_libganglia="yes"
- else if test -d "$withval"
- then
-        GANGLIA_CPPFLAGS="-I$withval/include"
-        GANGLIA_LDFLAGS="-L$withval/lib"
-        with_libganglia="yes"
- else
-        with_libganglia="$withval"
- fi; fi; fi
-],
-[
- with_libganglia="yes"
-])
+AC_ARG_WITH([libganglia],
+  [AS_HELP_STRING([--with-libganglia@<:@=PREFIX@:>@], [Path to libganglia.])],
+  [
+    if test -f "$withval" && test -x "$withval"; then
+      with_libganglia_config="$withval"
+      with_libganglia="yes"
+    else if test -f "$withval/bin/ganglia-config" && test -x "$withval/bin/ganglia-config"; then
+      with_libganglia_config="$withval/bin/ganglia-config"
+      with_libganglia="yes"
+    else if test -d "$withval"; then
+      GANGLIA_CPPFLAGS="-I$withval/include"
+      GANGLIA_LDFLAGS="-L$withval/lib"
+      with_libganglia="yes"
+    else
+      with_libganglia="$withval"
+    fi; fi; fi
+  ],
+  [with_libganglia="yes"]
+)
 
-if test "x$with_libganglia" = "xyes"
-then
-       if test "x$with_libganglia_config" != "x"
-       then
-               if test "x$GANGLIA_CPPFLAGS" = "x"
-               then
-                       GANGLIA_CPPFLAGS=`"$with_libganglia_config" --cflags 2>/dev/null`
-               fi
-
-               if test "x$GANGLIA_LDFLAGS" = "x"
-               then
-                       GANGLIA_LDFLAGS=`"$with_libganglia_config" --ldflags 2>/dev/null`
-               fi
-
-               if test "x$GANGLIA_LIBS" = "x"
-               then
-                       GANGLIA_LIBS=`"$with_libganglia_config" --libs 2>/dev/null`
-               fi
-       else
-               GANGLIA_LIBS="-lganglia"
-       fi
+if test "x$with_libganglia" = "xyes"; then
+  if test "x$with_libganglia_config" != "x"; then
+    if test "x$GANGLIA_CPPFLAGS" = "x"; then
+      GANGLIA_CPPFLAGS=`"$with_libganglia_config" --cflags 2>/dev/null`
+    fi
+
+    if test "x$GANGLIA_LDFLAGS" = "x"; then
+      GANGLIA_LDFLAGS=`"$with_libganglia_config" --ldflags 2>/dev/null`
+    fi
+
+    if test "x$GANGLIA_LIBS" = "x"; then
+      GANGLIA_LIBS=`"$with_libganglia_config" --libs 2>/dev/null`
+    fi
+  else
+    GANGLIA_LIBS="-lganglia"
+  fi
 fi
 
 SAVE_CPPFLAGS="$CPPFLAGS"
@@ -2358,22 +2489,18 @@ SAVE_LDFLAGS="$LDFLAGS"
 CPPFLAGS="$CPPFLAGS $GANGLIA_CPPFLAGS"
 LDFLAGS="$LDFLAGS $GANGLIA_LDFLAGS"
 
-if test "x$with_libganglia" = "xyes"
-then
-       AC_CHECK_HEADERS(gm_protocol.h,
-       [
-               AC_DEFINE(HAVE_GM_PROTOCOL_H, 1,
-                         [Define to 1 if you have the <gm_protocol.h> header file.])
-       ], [with_libganglia="no (gm_protocol.h not found)"])
+if test "x$with_libganglia" = "xyes"; then
+  AC_CHECK_HEADERS([gm_protocol.h],
+    [with_libganglia="yes"],
+    [with_libganglia="no (gm_protocol.h not found)"]
+  )
 fi
 
-if test "x$with_libganglia" = "xyes"
-then
-       AC_CHECK_LIB(ganglia, xdr_Ganglia_value_msg,
-       [
-               AC_DEFINE(HAVE_LIBGANGLIA, 1,
-                         [Define to 1 if you have the ganglia library (-lganglia).])
-       ], [with_libganglia="no (symbol xdr_Ganglia_value_msg not found)"])
+if test "x$with_libganglia" = "xyes"; then
+  AC_CHECK_LIB([ganglia], [xdr_Ganglia_value_msg],
+    [with_libganglia="yes"],
+    [with_libganglia="no (symbol xdr_Ganglia_value_msg not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
@@ -2382,49 +2509,44 @@ LDFLAGS="$SAVE_LDFLAGS"
 AC_SUBST(GANGLIA_CPPFLAGS)
 AC_SUBST(GANGLIA_LDFLAGS)
 AC_SUBST(GANGLIA_LIBS)
-AM_CONDITIONAL(BUILD_WITH_LIBGANGLIA, test "x$with_libganglia" = "xyes")
 # }}}
 
 # --with-libgcrypt {{{
 GCRYPT_CPPFLAGS="$GCRYPT_CPPFLAGS"
 GCRYPT_LDFLAGS="$GCRYPT_LDFLAGS"
 GCRYPT_LIBS="$GCRYPT_LIBS"
-AC_ARG_WITH(libgcrypt, [AS_HELP_STRING([--with-libgcrypt@<:@=PREFIX@:>@], [Path to libgcrypt.])],
-[
- if test -f "$withval" && test -x "$withval"
- then
-        with_libgcrypt_config="$withval"
-        with_libgcrypt="yes"
- else if test -f "$withval/bin/gcrypt-config" && test -x "$withval/bin/gcrypt-config"
- then
-        with_libgcrypt_config="$withval/bin/gcrypt-config"
-        with_libgcrypt="yes"
- else if test -d "$withval"
- then
-        GCRYPT_CPPFLAGS="$GCRYPT_CPPFLAGS -I$withval/include"
-        GCRYPT_LDFLAGS="$GCRYPT_LDFLAGS -L$withval/lib"
-        with_libgcrypt="yes"
- else
-        with_libgcrypt_config="gcrypt-config"
-        with_libgcrypt="$withval"
- fi; fi; fi
-],
-[
- with_libgcrypt_config="libgcrypt-config"
- with_libgcrypt="yes"
-])
+AC_ARG_WITH([libgcrypt],
+  [AS_HELP_STRING([--with-libgcrypt@<:@=PREFIX@:>@], [Path to libgcrypt.])],
+  [
+    if test -f "$withval" && test -x "$withval"; then
+      with_libgcrypt_config="$withval"
+      with_libgcrypt="yes"
+    else if test -f "$withval/bin/gcrypt-config" && test -x "$withval/bin/gcrypt-config"; then
+      with_libgcrypt_config="$withval/bin/gcrypt-config"
+      with_libgcrypt="yes"
+    else if test -d "$withval"; then
+      GCRYPT_CPPFLAGS="$GCRYPT_CPPFLAGS -I$withval/include"
+      GCRYPT_LDFLAGS="$GCRYPT_LDFLAGS -L$withval/lib"
+      with_libgcrypt="yes"
+    else
+      with_libgcrypt_config="gcrypt-config"
+      with_libgcrypt="$withval"
+    fi; fi; fi
+  ],
+  [
+    with_libgcrypt_config="libgcrypt-config"
+    with_libgcrypt="yes"
+  ]
+)
 
-if test "x$with_libgcrypt" = "xyes" && test "x$with_libgcrypt_config" != "x"
-then
-       if test "x$GCRYPT_CPPFLAGS" = "x"
-       then
-               GCRYPT_CPPFLAGS=`"$with_libgcrypt_config" --cflags 2>/dev/null`
-       fi
+if test "x$with_libgcrypt" = "xyes" && test "x$with_libgcrypt_config" != "x"; then
+  if test "x$GCRYPT_CPPFLAGS" = "x"; then
+    GCRYPT_CPPFLAGS=`"$with_libgcrypt_config" --cflags 2>/dev/null`
+  fi
 
-       if test "x$GCRYPT_LIBS" = "x"
-       then
-               GCRYPT_LIBS=`"$with_libgcrypt_config" --libs 2>/dev/null`
-       fi
+  if test "x$GCRYPT_LIBS" = "x"; then
+    GCRYPT_LIBS=`"$with_libgcrypt_config" --libs 2>/dev/null`
+  fi
 fi
 
 SAVE_CPPFLAGS="$CPPFLAGS"
@@ -2434,118 +2556,108 @@ CPPFLAGS="$CPPFLAGS $GCRYPT_CPPFLAGS"
 LDFLAGS="$LDFLAGS $GCRYPT_LDFLAGS"
 LIBS="$LIBS $GCRYPT_LIBS"
 
-if test "x$with_libgcrypt" = "xyes"
-then
-       if test "x$GCRYPT_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([gcrypt CPPFLAGS: $GCRYPT_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(gcrypt.h,
-               [with_libgcrypt="yes"],
-               [with_libgcrypt="no (gcrypt.h not found)"])
+if test "x$with_libgcrypt" = "xyes"; then
+  if test "x$GCRYPT_CPPFLAGS" != "x"; then
+    AC_MSG_NOTICE([gcrypt CPPFLAGS: $GCRYPT_CPPFLAGS])
+  fi
+  AC_CHECK_HEADERS([gcrypt.h],
+    [with_libgcrypt="yes"],
+    [with_libgcrypt="no (gcrypt.h not found)"]
+  )
 fi
 
-if test "x$with_libgcrypt" = "xyes"
-then
-       AC_CHECK_LIB(gcrypt, gcry_md_hash_buffer,
-               [with_libgcrypt="yes"],
-               [with_libgcrypt="no (symbol gcry_md_hash_buffer not found)"])
+if test "x$with_libgcrypt" = "xyes"; then
+  AC_CHECK_LIB(gcrypt, gcry_md_hash_buffer,
+    [with_libgcrypt="yes"],
+    [with_libgcrypt="no (symbol gcry_md_hash_buffer not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 LIBS="$SAVE_LIBS"
 
-if test "x$with_libgcrypt" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBGCRYPT, 1, [Define to 1 if you have the gcrypt library (-lgcrypt).])
-fi
-
-AC_SUBST(GCRYPT_CPPFLAGS)
-AC_SUBST(GCRYPT_LDFLAGS)
-AC_SUBST(GCRYPT_LIBS)
-AM_CONDITIONAL(BUILD_WITH_LIBGCRYPT, test "x$with_libgcrypt" = "xyes")
+AC_SUBST([GCRYPT_CPPFLAGS])
+AC_SUBST([GCRYPT_LDFLAGS])
+AC_SUBST([GCRYPT_LIBS])
+AM_CONDITIONAL([BUILD_WITH_LIBGCRYPT], [test "x$with_libgcrypt" = "xyes"])
 # }}}
 
 # --with-libgps {{{
-with_libgps_cflags=""
-with_libgps_ldflags=""
-AC_ARG_WITH(libgps, [AS_HELP_STRING([--with-libgps@<:@=PREFIX@:>@], [Path to libgps.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libgps_cflags="-I$withval/include"
-               with_libgps_ldflags="-L$withval/lib"
-               with_libgps="yes"
-       else
-               with_libgps="$withval"
-       fi
-],
-[
-       with_libgps="yes"
-])
-if test "x$with_libgps" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       CFLAGS="$CFLAGS $with_libgps_cflags"
+AC_ARG_WITH([libgps],
+  [AS_HELP_STRING([--with-libgps@<:@=PREFIX@:>@], [Path to libgps.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libgps_cflags="-I$withval/include"
+      with_libgps_ldflags="-L$withval/lib"
+      with_libgps="yes"
+    else
+      with_libgps="$withval"
+    fi
+  ],
+  [with_libgps="yes"]
+)
 
-       AC_CHECK_HEADERS(gps.h, [with_libgps="yes"], [with_libgps="no (gps.h not found)"])
+if test "x$with_libgps" = "xyes"; then
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $with_libgps_cflags"
+
+  AC_CHECK_HEADERS([gps.h],
+    [with_libgps="yes"],
+    [with_libgps="no (gps.h not found)"]
+  )
 
-       CFLAGS="$SAVE_CFLAGS"
+  CFLAGS="$SAVE_CFLAGS"
 fi
-if test "x$with_libgps" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CFLAGS="$CFLAGS $with_libgps_cflags"
-       LDFLAGS="$LDFLAGS $with_libgps_ldflags"
 
-       AC_CHECK_LIB(gps, gps_open, [with_libgps="yes"], [with_libgps="no (symbol gps_open not found)"])
+if test "x$with_libgps" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libgps_ldflags"
+
+  AC_CHECK_LIB([gps], [gps_open],
+    [with_libgps="yes"],
+    [with_libgps="no (symbol gps_open not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
 
-       CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+if test "x$with_libgps" = "xyes"; then
+  BUILD_WITH_LIBGPS_CFLAGS="$with_libgps_cflags"
+  BUILD_WITH_LIBGPS_LDFLAGS="$with_libgps_ldflags"
+  BUILD_WITH_LIBGPS_LIBS="-lgps"
 fi
-if test "x$with_libgps" = "xyes"
-then
-       BUILD_WITH_LIBGPS_CFLAGS="$with_libgps_cflags"
-       BUILD_WITH_LIBGPS_LDFLAGS="$with_libgps_ldflags"
-       BUILD_WITH_LIBGPS_LIBS="-lgps"
-       AC_SUBST(BUILD_WITH_LIBGPS_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBGPS_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBGPS_LIBS)
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBGPS, test "x$with_libgps" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBGPS_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBGPS_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBGPS_LIBS])
+
 # }}}
 
 # --with-libgrpc++ {{{
-with_libgrpcpp_cppflags=""
-with_libgrpcpp_ldflags=""
-AC_ARG_WITH([libgrpc++], [AS_HELP_STRING([--with-libgrpc++@<:@=PREFIX@:>@], [Path to libgrpc++.])],
+AC_ARG_WITH([libgrpc++],
+  [AS_HELP_STRING([--with-libgrpc++@<:@=PREFIX@:>@], [Path to libgrpc++.])],
   [
     with_grpcpp="$withval"
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
       with_libgrpcpp_cppflags="-I$withval/include"
       with_libgrpcpp_ldflags="-L$withval/lib"
       with_libgrpcpp="yes"
     fi
-    if test "x$withval" = "xno"
-    then
+    if test "x$withval" = "xno"; then
       with_libgrpcpp="no (disabled on command line)"
     fi
   ],
   [withval="yes"]
 )
-if test "x$withval" = "xyes"
-then
+if test "x$withval" = "xyes"; then
 PKG_CHECK_MODULES([GRPCPP], [grpc++],
   [with_libgrpcpp="yes"],
   [with_libgrpcpp="no (pkg-config could not find libgrpc++)"]
 )
 fi
 
-if test "x$withval" != "xno"
-then
+if test "x$withval" != "xno"; then
   AC_MSG_CHECKING([whether $CXX accepts -std=c++11])
   if test_cxx_flags -std=c++11; then
     AC_MSG_RESULT([yes])
@@ -2555,40 +2667,40 @@ then
   fi
 fi
 
-if test "x$with_libgrpcpp" = "xyes"
-then
+if test "x$with_libgrpcpp" = "xyes"; then
   AC_LANG_PUSH(C++)
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS $CPPFLAGS"
-  AC_CHECK_HEADERS([grpc++/grpc++.h], [],
+  AC_CHECK_HEADERS([grpc++/grpc++.h],
+    [with_libgrpcpp="yes"],
     [with_libgrpcpp="no (<grpc++/grpc++.h> not found)"]
   )
   CPPFLAGS="$SAVE_CPPFLAGS"
   AC_LANG_POP(C++)
 fi
-if test "x$with_libgrpcpp" = "xyes"
-then
+
+if test "x$with_libgrpcpp" = "xyes"; then
   AC_LANG_PUSH(C++)
   SAVE_CPPFLAGS="$CPPFLAGS"
   SAVE_LDFLAGS="$LDFLAGS"
   SAVE_LIBS="$LIBS"
   CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS $CPPFLAGS"
   LDFLAGS="$with_libgrpcpp_ldflags"
-  if test "x$GRPCPP_LIBS" = "x"
-  then
+  if test "x$GRPCPP_LIBS" = "x"; then
     LIBS="-lgrpc++"
   else
     LIBS="$GRPCPP_LIBS"
   fi
   AC_LINK_IFELSE(
-    [AC_LANG_PROGRAM(
-      [[#include <grpc++/grpc++.h>]],
-      [[grpc::ServerBuilder sb;]]
-    )],
+    [
+      AC_LANG_PROGRAM(
+        [[#include <grpc++/grpc++.h>]],
+        [[grpc::ServerBuilder sb;]]
+      )
+    ],
     [
       with_libgrpcpp="yes"
-      if test "x$GRPCPP_LIBS" = "x"
-      then
+      if test "x$GRPCPP_LIBS" = "x"; then
         GRPCPP_LIBS="-lgrpc++"
       fi
     ],
@@ -2599,6 +2711,7 @@ then
   LIBS="$SAVE_LIBS"
   AC_LANG_POP(C++)
 fi
+
 BUILD_WITH_LIBGRPCPP_CPPFLAGS="-std=c++11 $with_libgrpcpp_cppflags $GRPCPP_CFLAGS"
 BUILD_WITH_LIBGRPCPP_LDFLAGS="$with_libgrpcpp_ldflags"
 BUILD_WITH_LIBGRPCPP_LIBS="$GRPCPP_LIBS"
@@ -2607,267 +2720,219 @@ AC_SUBST([BUILD_WITH_LIBGRPCPP_LDFLAGS])
 AC_SUBST([BUILD_WITH_LIBGRPCPP_LIBS])
 # }}}
 
-# --with-libiptc {{{
-AC_ARG_WITH(libiptc, [AS_HELP_STRING([--with-libiptc@<:@=PREFIX@:>@], [Path to libiptc.])],
-[
-       if test "x$withval" = "xyes"
-       then
-               with_libiptc="pkgconfig"
-       else if test "x$withval" = "xno"
-       then
-               with_libiptc="no"
-       else
-               with_libiptc="yes"
-               with_libiptc_cflags="-I$withval/include"
-               with_libiptc_libs="-L$withval/lib"
-       fi; fi
-],
-[
-       if test "x$ac_system" = "xLinux"
-       then
-               with_libiptc="pkgconfig"
-       else
-               with_libiptc="no (Linux only)"
-       fi
-])
-
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       $PKG_CONFIG --exists 'libiptc' 2>/dev/null
-       if test $? -ne 0
-       then
-               with_libiptc="no (pkg-config doesn't know libiptc)"
-       fi
-fi
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       with_libiptc_cflags="`$PKG_CONFIG --cflags 'libiptc'`"
-       if test $? -ne 0
-       then
-               with_libiptc="no ($PKG_CONFIG failed)"
-       fi
-       with_libiptc_libs="`$PKG_CONFIG --libs 'libiptc'`"
-       if test $? -ne 0
-       then
-               with_libiptc="no ($PKG_CONFIG failed)"
-       fi
-fi
+AC_ARG_VAR([GRPC_CPP_PLUGIN], [path to the grpc_cpp_plugin binary])
+AC_PATH_PROG([GRPC_CPP_PLUGIN], [grpc_cpp_plugin])
+AM_CONDITIONAL([HAVE_GRPC_CPP], [test "x$GRPC_CPP_PLUGIN" != "x"])
 
-SAVE_CPPFLAGS="$CPPFLAGS"
+# --with-libiptc {{{
+AC_ARG_WITH([libiptc],
+  [AS_HELP_STRING([--with-libiptc@<:@=PREFIX@:>@], [Path to libiptc.])],
+  [
+    if test "x$withval" = "xyes"; then
+      with_libiptc="pkgconfig"
+    else if test "x$withval" = "xno"; then
+      with_libiptc="no"
+    else
+      with_libiptc="yes"
+      with_libiptc_cflags="-I$withval/include"
+      with_libiptc_libs="-L$withval/lib"
+    fi; fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_libiptc="pkgconfig"
+    else
+      with_libiptc="no (Linux only)"
+    fi
+  ]
+)
+
+if test "x$with_libiptc" = "xpkgconfig"; then
+  $PKG_CONFIG --exists 'libiptc' 2>/dev/null
+  if test $? -ne 0; then
+    with_libiptc="no (pkg-config doesn't know libiptc)"
+  fi
+fi
+
+if test "x$with_libiptc" = "xpkgconfig"; then
+  with_libiptc_cflags="`$PKG_CONFIG --cflags 'libiptc'`"
+  if test $? -ne 0; then
+    with_libiptc="no ($PKG_CONFIG failed)"
+  fi
+
+  with_libiptc_libs="`$PKG_CONFIG --libs 'libiptc'`"
+  if test $? -ne 0; then
+    with_libiptc="no ($PKG_CONFIG failed)"
+  fi
+fi
+
+SAVE_CPPFLAGS="$CPPFLAGS"
 CPPFLAGS="$CPPFLAGS $with_libiptc_cflags"
 
 # check whether the header file for libiptc is available.
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       AC_CHECK_HEADERS(libiptc/libiptc.h libiptc/libip6tc.h, ,
-                       [with_libiptc="no (header file missing)"])
+if test "x$with_libiptc" = "xpkgconfig"; then
+  AC_CHECK_HEADERS([libiptc/libiptc.h libiptc/libip6tc.h],
+    [],
+    [with_libiptc="no (header file missing)"]
+  )
 fi
+
 # If the header file is available, check for the required type declaractions.
 # They may be missing in old versions of libiptc. In that case, they will be
 # declared in the iptables plugin.
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       AC_CHECK_TYPES([iptc_handle_t, ip6tc_handle_t], [], [])
+if test "x$with_libiptc" = "xpkgconfig"; then
+  AC_CHECK_TYPES([iptc_handle_t, ip6tc_handle_t], [], [])
 fi
+
 # Check for the iptc_init symbol in the library.
 # This could be in iptc or ip4tc
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       SAVE_LIBS="$LIBS"
-       AC_SEARCH_LIBS(iptc_init, [iptc ip4tc],
-                       [with_libiptc="pkgconfig"],
-                       [with_libiptc="no"],
-                       [$with_libiptc_libs])
-       LIBS="$SAVE_LIBS"
-fi
-if test "x$with_libiptc" = "xpkgconfig"
-then
-       with_libiptc="yes"
+if test "x$with_libiptc" = "xpkgconfig"; then
+  SAVE_LIBS="$LIBS"
+  AC_SEARCH_LIBS([iptc_init], [iptc ip4tc],
+    [with_libiptc="pkgconfig"],
+    [with_libiptc="no"],
+    [$with_libiptc_libs]
+  )
+  LIBS="$SAVE_LIBS"
 fi
 
-CPPFLAGS="$SAVE_CPPFLAGS"
-
-AM_CONDITIONAL(BUILD_WITH_LIBIPTC, test "x$with_libiptc" = "xyes")
-if test "x$with_libiptc" = "xyes"
-then
-       BUILD_WITH_LIBIPTC_CPPFLAGS="$with_libiptc_cflags"
-       BUILD_WITH_LIBIPTC_LDFLAGS="$with_libiptc_libs"
-       AC_SUBST(BUILD_WITH_LIBIPTC_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBIPTC_LDFLAGS)
+if test "x$with_libiptc" = "xpkgconfig"; then
+  with_libiptc="yes"
 fi
-# }}}
-
-# --with-libdpdk {{{
-AC_ARG_VAR([LIBDPDK_CPPFLAGS], [Preprocessor flags for libdpdk])
-AC_ARG_VAR([LIBDPDK_LDFLAGS], [Linker flags for libdpdk])
-
-AC_ARG_WITH([libdpdk], [AS_HELP_STRING([--without-libdpdk], [Disable libdpdk.])])
 
-if test "x$with_libdpdk" != "xno"
-then
-       if test "x$LIBDPDK_CPPFLAGS" = "x"
-       then
-               LIBDPDK_CPPFLAGS="-I/usr/include/dpdk"
-       fi
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$LIBDPDK_CPPFLAGS $CPPFLAGS"
-       AC_CHECK_HEADERS([rte_config.h],
-               [with_libdpdk="yes"],
-               [with_libdpdk="no (rte_config.h not found)"]
-       )
-       CPPFLAGS="$SAVE_CPPFLAGS"
-fi
+CPPFLAGS="$SAVE_CPPFLAGS"
 
-if test "x$with_libdpdk" = "xyes"
-then
-       SAVE_LDFLAGS="$LDFLAGS"
-       LDFLAGS="$LIBDPDK_LDFLAGS $LDFLAGS"
-       AC_CHECK_LIB([dpdk], [rte_eal_init],
-               [with_libdpdk="yes"],
-               [with_libdpdk="no (symbol 'rte_eal_init' not found)"]
-       )
-       LDFLAGS="$SAVE_LDFLAGS"
+if test "x$with_libiptc" = "xyes"; then
+  BUILD_WITH_LIBIPTC_CPPFLAGS="$with_libiptc_cflags"
+  BUILD_WITH_LIBIPTC_LDFLAGS="$with_libiptc_libs"
 fi
-
+AC_SUBST([BUILD_WITH_LIBIPTC_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBIPTC_LDFLAGS])
 # }}}
 
 # --with-java {{{
 with_java_home="$JAVA_HOME"
-if test "x$with_java_home" = "x"
-then
-       with_java_home="/usr/lib/jvm"
+if test "x$with_java_home" = "x"; then
+  with_java_home="/usr/lib/jvm"
 fi
+
 JAVAC="$JAVAC"
 JAR="$JAR"
-AC_ARG_WITH(java, [AS_HELP_STRING([--with-java@<:@=PREFIX@:>@], [Path to Java home.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_java="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_java="yes"
-       else
-               with_java_home="$withval"
-               with_java="yes"
-       fi; fi
-],
-[with_java="yes"])
-if test "x$with_java" = "xyes"
-then
-       if test -d "$with_java_home"
-       then
-               AC_MSG_CHECKING([for jni.h])
-               TMPVAR=`find -L "$with_java_home" -name jni.h -type f -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
-               if test "x$TMPVAR" != "x"
-               then
-                       AC_MSG_RESULT([found in $TMPVAR])
-                       JAVA_CPPFLAGS="$JAVA_CPPFLAGS -I$TMPVAR"
-               else
-                       AC_MSG_RESULT([not found])
-               fi
-
-               AC_MSG_CHECKING([for jni_md.h])
-               TMPVAR=`find -L "$with_java_home" -name jni_md.h -type f -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
-               if test "x$TMPVAR" != "x"
-               then
-                       AC_MSG_RESULT([found in $TMPVAR])
-                       JAVA_CPPFLAGS="$JAVA_CPPFLAGS -I$TMPVAR"
-               else
-                       AC_MSG_RESULT([not found])
-               fi
-
-               AC_MSG_CHECKING([for libjvm.so])
-               TMPVAR=`find -L "$with_java_home" -type f \( -name libjvm.so -o -name libjvm.dylib \) -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
-               if test "x$TMPVAR" != "x"
-               then
-                       AC_MSG_RESULT([found in $TMPVAR])
-                       JAVA_LDFLAGS="$JAVA_LDFLAGS -L$TMPVAR -Wl,-rpath -Wl,$TMPVAR"
-               else
-                       AC_MSG_RESULT([not found])
-               fi
-
-               if test "x$JAVAC" = "x"
-               then
-                       AC_MSG_CHECKING([for javac])
-                       TMPVAR=`find -L "$with_java_home" -name javac -type f 2>/dev/null | LC_ALL=C sort | head -n 1`
-                       if test "x$TMPVAR" != "x"
-                       then
-                               JAVAC="$TMPVAR"
-                               AC_MSG_RESULT([$JAVAC])
-                       else
-                               AC_MSG_RESULT([not found])
-                       fi
-               fi
-               if test "x$JAR" = "x"
-               then
-                       AC_MSG_CHECKING([for jar])
-                       TMPVAR=`find -L "$with_java_home" -name jar -type f 2>/dev/null | LC_ALL=C sort | head -n 1`
-                       if test "x$TMPVAR" != "x"
-                       then
-                               JAR="$TMPVAR"
-                               AC_MSG_RESULT([$JAR])
-                       else
-                               AC_MSG_RESULT([not found])
-                       fi
-               fi
-       else if test "x$with_java_home" != "x"
-       then
-               AC_MSG_WARN([JAVA_HOME: No such directory: $with_java_home])
-       fi; fi
-fi
-
-if test "x$JAVA_CPPFLAGS" != "x"
-then
-       AC_MSG_NOTICE([Building with JAVA_CPPFLAGS set to: $JAVA_CPPFLAGS])
+AC_ARG_WITH([java],
+  [AS_HELP_STRING([--with-java@<:@=PREFIX@:>@], [Path to Java home.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_java="no"
+    else if test "x$withval" = "xyes"; then
+      with_java="yes"
+    else
+      with_java_home="$withval"
+      with_java="yes"
+    fi; fi
+  ],
+  [with_java="yes"]
+)
+
+AX_COMPARE_VERSION([$am__api_version],[lt],[1.12],
+  [JAVA_TIMESTAMP_FILE="classdist_noinst.stamp"],
+  [JAVA_TIMESTAMP_FILE="classnoinst.stamp"])
+if test "x$with_java" = "xyes"; then
+  if test -d "$with_java_home"; then
+    AC_MSG_CHECKING([for jni.h])
+    TMPVAR=`find -L "$with_java_home" -name jni.h -type f -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
+    if test "x$TMPVAR" != "x"; then
+      AC_MSG_RESULT([found in $TMPVAR])
+      JAVA_CPPFLAGS="$JAVA_CPPFLAGS -I$TMPVAR"
+    else
+      AC_MSG_RESULT([not found])
+    fi
+
+    AC_MSG_CHECKING([for jni_md.h])
+    TMPVAR=`find -L "$with_java_home" -name jni_md.h -type f -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
+    if test "x$TMPVAR" != "x"; then
+      AC_MSG_RESULT([found in $TMPVAR])
+      JAVA_CPPFLAGS="$JAVA_CPPFLAGS -I$TMPVAR"
+    else
+      AC_MSG_RESULT([not found])
+    fi
+
+    AC_MSG_CHECKING([for libjvm.so])
+    TMPVAR=`find -L "$with_java_home" -type f \( -name libjvm.so -o -name libjvm.dylib \) -exec 'dirname' '{}' ';' 2>/dev/null | LC_ALL=C sort | head -n 1`
+    if test "x$TMPVAR" != "x"; then
+      AC_MSG_RESULT([found in $TMPVAR])
+      JAVA_LDFLAGS="$JAVA_LDFLAGS -L$TMPVAR -Wl,-rpath -Wl,$TMPVAR"
+    else
+      AC_MSG_RESULT([not found])
+    fi
+
+    if test "x$JAVAC" = "x"; then
+      AC_MSG_CHECKING([for javac])
+      TMPVAR=`find -L "$with_java_home" -name javac -type f 2>/dev/null | LC_ALL=C sort | head -n 1`
+      if test "x$TMPVAR" != "x"; then
+        JAVAC="$TMPVAR"
+        AC_MSG_RESULT([$JAVAC])
+      else
+        AC_MSG_RESULT([not found])
+      fi
+    fi
+
+    if test "x$JAR" = "x"; then
+      AC_MSG_CHECKING([for jar])
+      TMPVAR=`find -L "$with_java_home" -name jar -type f 2>/dev/null | LC_ALL=C sort | head -n 1`
+      if test "x$TMPVAR" != "x"; then
+        JAR="$TMPVAR"
+        AC_MSG_RESULT([$JAR])
+      else
+        AC_MSG_RESULT([not found])
+      fi
+    fi
+  else if test "x$with_java_home" != "x"; then
+    AC_MSG_WARN([JAVA_HOME: No such directory: $with_java_home])
+  fi; fi
 fi
-if test "x$JAVA_CFLAGS" != "x"
-then
-       AC_MSG_NOTICE([Building with JAVA_CFLAGS set to: $JAVA_CFLAGS])
+
+if test "x$JAVA_CPPFLAGS" != "x"; then
+  AC_MSG_NOTICE([Building with JAVA_CPPFLAGS set to: $JAVA_CPPFLAGS])
 fi
-if test "x$JAVA_LDFLAGS" != "x"
-then
-       AC_MSG_NOTICE([Building with JAVA_LDFLAGS set to: $JAVA_LDFLAGS])
+if test "x$JAVA_CFLAGS" != "x"; then
+  AC_MSG_NOTICE([Building with JAVA_CFLAGS set to: $JAVA_CFLAGS])
 fi
-if test "x$JAVA_LIBS" != "x"
-then
-       AC_MSG_NOTICE([Building with JAVA_LIBS set to: $JAVA_LIBS])
+if test "x$JAVA_LDFLAGS" != "x"; then
+  AC_MSG_NOTICE([Building with JAVA_LDFLAGS set to: $JAVA_LDFLAGS])
 fi
-if test "x$JAVAC" = "x"
-then
-       with_javac_path="$PATH"
-       if test "x$with_java_home" != "x"
-       then
-               with_javac_path="$with_java_home:with_javac_path"
-               if test -d "$with_java_home/bin"
-               then
-                       with_javac_path="$with_java_home/bin:with_javac_path"
-               fi
-       fi
-
-       AC_PATH_PROG(JAVAC, javac, [], "$with_javac_path")
-fi
-if test "x$JAVAC" = "x"
-then
-       with_java="no (javac not found)"
+if test "x$JAVA_LIBS" != "x"; then
+  AC_MSG_NOTICE([Building with JAVA_LIBS set to: $JAVA_LIBS])
 fi
-if test "x$JAR" = "x"
-then
-       with_jar_path="$PATH"
-       if test "x$with_java_home" != "x"
-       then
-               with_jar_path="$with_java_home:$with_jar_path"
-               if test -d "$with_java_home/bin"
-               then
-                       with_jar_path="$with_java_home/bin:$with_jar_path"
-               fi
-       fi
-
-       AC_PATH_PROG(JAR, jar, [], "$with_jar_path")
-fi
-if test "x$JAR" = "x"
-then
-       with_java="no (jar not found)"
+if test "x$JAVAC" = "x"; then
+  with_javac_path="$PATH"
+  if test "x$with_java_home" != "x"; then
+    with_javac_path="$with_java_home:with_javac_path"
+    if test -d "$with_java_home/bin"; then
+      with_javac_path="$with_java_home/bin:with_javac_path"
+    fi
+  fi
+
+  AC_PATH_PROG([JAVAC], [javac], [], "$with_javac_path")
+fi
+
+if test "x$JAVAC" = "x"; then
+  with_java="no (javac not found)"
+fi
+
+if test "x$JAR" = "x"; then
+  with_jar_path="$PATH"
+  if test "x$with_java_home" != "x"; then
+    with_jar_path="$with_java_home:$with_jar_path"
+    if test -d "$with_java_home/bin"; then
+      with_jar_path="$with_java_home/bin:$with_jar_path"
+    fi
+  fi
+
+  AC_PATH_PROG([JAR], [jar], [], "$with_jar_path")
+fi
+
+if test "x$JAR" = "x"; then
+  with_java="no (jar not found)"
 fi
 
 SAVE_CPPFLAGS="$CPPFLAGS"
@@ -2879,21 +2944,23 @@ CFLAGS="$CFLAGS $JAVA_CFLAGS"
 LDFLAGS="$LDFLAGS $JAVA_LDFLAGS"
 LIBS="$LIBS $JAVA_LIBS"
 
-if test "x$with_java" = "xyes"
-then
-       AC_CHECK_HEADERS(jni.h, [], [with_java="no (jni.h not found)"])
+if test "x$with_java" = "xyes"; then
+  AC_CHECK_HEADERS([jni.h],
+    [with_jave="yes"],
+    [with_java="no (jni.h not found)"])
 fi
-if test "x$with_java" = "xyes"
-then
-       AC_CHECK_LIB(jvm, JNI_CreateJavaVM,
-       [with_java="yes"],
-       [with_java="no (Symbol 'JNI_CreateJavaVM' not found)"],
-       [$JAVA_LIBS $PTHREAD_LIBS])
+
+if test "x$with_java" = "xyes"; then
+  AC_CHECK_LIB([jvm], [JNI_CreateJavaVM],
+    [with_java="yes"],
+    [with_java="no (Symbol 'JNI_CreateJavaVM' not found)"],
+    [$JAVA_LIBS $PTHREAD_LIBS]
+  )
 fi
-if test "x$with_java" = "xyes"
-then
-       JAVA_LIBS="$JAVA_LIBS -ljvm"
-       AC_MSG_NOTICE([Building with JAVA_LIBS set to: $JAVA_LIBS])
+
+if test "x$with_java" = "xyes"; then
+  JAVA_LIBS="$JAVA_LIBS -ljvm"
+  AC_MSG_NOTICE([Building with JAVA_LIBS set to: $JAVA_LIBS])
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
@@ -2901,29 +2968,30 @@ CFLAGS="$SAVE_CFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 LIBS="$SAVE_LIBS"
 
-AC_SUBST(JAVA_CPPFLAGS)
-AC_SUBST(JAVA_CFLAGS)
-AC_SUBST(JAVA_LDFLAGS)
-AC_SUBST(JAVA_LIBS)
-AM_CONDITIONAL(BUILD_WITH_JAVA, test "x$with_java" = "xyes")
+AC_SUBST([JAVA_CPPFLAGS])
+AC_SUBST([JAVA_CFLAGS])
+AC_SUBST([JAVA_LDFLAGS])
+AC_SUBST([JAVA_LIBS])
+AC_SUBST([JAVA_TIMESTAMP_FILE])
+AM_CONDITIONAL([BUILD_WITH_JAVA], [test "x$with_java" = "xyes"])
 # }}}
 
 # --with-libldap {{{
-AC_ARG_WITH(libldap, [AS_HELP_STRING([--with-libldap@<:@=PREFIX@:>@], [Path to libldap.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_libldap="yes"
- else if test "x$withval" = "xno"
- then
-        with_libldap="no"
- else
-        with_libldap="yes"
-        LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS -I$withval/include"
-        LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS -L$withval/lib"
- fi; fi
-],
-[with_libldap="yes"])
+AC_ARG_WITH([libldap],
+  [AS_HELP_STRING([--with-libldap@<:@=PREFIX@:>@], [Path to libldap.])],
+  [
   if test "x$withval" = "xyes"; then
+      with_libldap="yes"
+    else if test "x$withval" = "xno"; then
+      with_libldap="no"
+    else
+      with_libldap="yes"
+      LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS -I$withval/include"
+      LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS -L$withval/lib"
+    fi; fi
+  ],
+  [with_libldap="yes"]
+)
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
@@ -2931,26 +2999,26 @@ SAVE_LDFLAGS="$LDFLAGS"
 CPPFLAGS="$CPPFLAGS $LIBLDAP_CPPFLAGS"
 LDFLAGS="$LDFLAGS $LIBLDAP_LDFLAGS"
 
-if test "x$with_libldap" = "xyes"
-then
-       if test "x$LIBLDAP_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libldap CPPFLAGS: $LIBLDAP_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(ldap.h,
-       [with_libldap="yes"],
-       [with_libldap="no ('ldap.h' not found)"])
+if test "x$with_libldap" = "xyes"; then
+  if test "x$LIBLDAP_CPPFLAGS" != "x"; then
+    AC_MSG_NOTICE([libldap CPPFLAGS: $LIBLDAP_CPPFLAGS])
+  fi
+
+  AC_CHECK_HEADERS([ldap.h],
+    [with_libldap="yes"],
+    [with_libldap="no ('ldap.h' not found)"]
+  )
 fi
-if test "x$with_libldap" = "xyes"
-then
-       if test "x$LIBLDAP_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libldap LDFLAGS: $LIBLDAP_LDFLAGS])
-       fi
-       AC_CHECK_LIB(ldap, ldap_initialize,
-       [with_libldap="yes"],
-       [with_libldap="no (symbol 'ldap_initialize' not found)"])
 
+if test "x$with_libldap" = "xyes"; then
+  if test "x$LIBLDAP_LDFLAGS" != "x"; then
+    AC_MSG_NOTICE([libldap LDFLAGS: $LIBLDAP_LDFLAGS])
+  fi
+
+  AC_CHECK_LIB([ldap], [ldap_initialize],
+    [with_libldap="yes"],
+    [with_libldap="no (symbol 'ldap_initialize' not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
@@ -2958,12 +3026,11 @@ LDFLAGS="$SAVE_LDFLAGS"
 
 if test "x$with_libldap" = "xyes"
 then
-       BUILD_WITH_LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS"
-       BUILD_WITH_LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBLDAP_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBLDAP_LDFLAGS)
+  BUILD_WITH_LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS"
+  BUILD_WITH_LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBLDAP, test "x$with_libldap" = "xyes")
+AC_SUBST([BUILD_WITH_LIBLDAP_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBLDAP_LDFLAGS])
 # }}}
 
 # --with-liblua {{{
@@ -2981,7 +3048,7 @@ else
       PKG_CHECK_MODULES([LUA], [lua-5.3],
         [with_liblua="yes"],
         [
-         PKG_CHECK_MODULES([LUA], [lua5.3],
+          PKG_CHECK_MODULES([LUA], [lua5.3],
             [with_liblua="yes"],
             [
               PKG_CHECK_MODULES([LUA], [lua-5.2],
@@ -3047,114 +3114,117 @@ AC_SUBST(BUILD_WITH_LIBLUA_LIBS)
 # }}}
 
 # --with-liblvm2app {{{
-with_liblvm2app_cppflags=""
-with_liblvm2app_ldflags=""
-AC_ARG_WITH(liblvm2app, [AS_HELP_STRING([--with-liblvm2app@<:@=PREFIX@:>@], [Path to liblvm2app.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_liblvm2app="no"
-       else
-               with_liblvm2app="yes"
-               if test "x$withval" != "xyes"
-               then
-                       with_liblvm2app_cppflags="-I$withval/include"
-                       with_liblvm2app_ldflags="-L$withval/lib"
-               fi
-        fi
-],
-[
-       if test "x$ac_system" = "xLinux"
-       then
-               with_liblvm2app="yes"
-       else
-               with_liblvm2app="no (Linux only library)"
-       fi
-])
-if test "x$with_liblvm2app" = "xyes"
-then
-        SAVE_CPPFLAGS="$CPPFLAGS"
-        CPPFLAGS="$CPPFLAGS $with_liblvm2app_cppflags"
+AC_ARG_WITH([liblvm2app],
+  [AS_HELP_STRING([--with-liblvm2app@<:@=PREFIX@:>@], [Path to liblvm2app.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_liblvm2app="no"
+    else
+      with_liblvm2app="yes"
+      if test "x$withval" != "xyes"; then
+        with_liblvm2app_cppflags="-I$withval/include"
+        with_liblvm2app_ldflags="-L$withval/lib"
+      fi
+    fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_liblvm2app="yes"
+    else
+      with_liblvm2app="no (Linux only library)"
+    fi
+  ]
+)
 
-        AC_CHECK_HEADERS(lvm2app.h, [with_liblvm2app="yes"], [with_liblvm2app="no (lvm2app.h not found)"])
+if test "x$with_liblvm2app" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_liblvm2app_cppflags"
+
+  AC_CHECK_HEADERS([lvm2app.h],
+    [with_liblvm2app="yes"],
+    [with_liblvm2app="no (lvm2app.h not found)"]
+  )
 
-        CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-if test "x$with_liblvm2app" = "xyes"
-then
-        SAVE_CPPFLAGS="$CPPFLAGS"
-        SAVE_LDFLAGS="$LDFLAGS"
-        CPPFLAGS="$CPPFLAGS $with_liblvm2app_cppflags"
-        LDFLAGS="$LDFLAGS $with_liblvm2app_ldflags"
+if test "x$with_liblvm2app" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_liblvm2app_cppflags"
+  LDFLAGS="$LDFLAGS $with_liblvm2app_ldflags"
 
-        AC_CHECK_LIB(lvm2app, lvm_lv_get_property, [with_liblvm2app="yes"], [with_liblvm2app="no (Symbol 'lvm_lv_get_property' not found)"])
+  AC_CHECK_LIB([lvm2app], [lvm_lv_get_property],
+    [with_liblvm2app="yes"],
+    [with_liblvm2app="no (Symbol 'lvm_lv_get_property' not found)"]
+  )
 
-        CPPFLAGS="$SAVE_CPPFLAGS"
-        LDFLAGS="$SAVE_LDFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_liblvm2app" = "xyes"
-then
-        BUILD_WITH_LIBLVM2APP_CPPFLAGS="$with_liblvm2app_cppflags"
-        BUILD_WITH_LIBLVM2APP_LDFLAGS="$with_liblvm2app_ldflags"
-        BUILD_WITH_LIBLVM2APP_LIBS="-llvm2app"
-        AC_SUBST(BUILD_WITH_LIBLVM2APP_CPPFLAGS)
-        AC_SUBST(BUILD_WITH_LIBLVM2APP_LDFLAGS)
-        AC_SUBST(BUILD_WITH_LIBLVM2APP_LIBS)
-        AC_DEFINE(HAVE_LIBLVM2APP, 1, [Define if liblvm2app is present and usable.])
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBLVM2APP, test "x$with_liblvm2app" = "xyes")
+
+if test "x$with_liblvm2app" = "xyes"; then
+  BUILD_WITH_LIBLVM2APP_CPPFLAGS="$with_liblvm2app_cppflags"
+  BUILD_WITH_LIBLVM2APP_LDFLAGS="$with_liblvm2app_ldflags"
+  BUILD_WITH_LIBLVM2APP_LIBS="-llvm2app"
+fi
+
+AC_SUBST([BUILD_WITH_LIBLVM2APP_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBLVM2APP_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBLVM2APP_LIBS])
 # }}}
 
 # --with-libmemcached {{{
-with_libmemcached_cppflags=""
-with_libmemcached_ldflags=""
-AC_ARG_WITH(libmemcached, [AS_HELP_STRING([--with-libmemcached@<:@=PREFIX@:>@], [Path to libmemcached.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libmemcached_cppflags="-I$withval/include"
-               with_libmemcached_ldflags="-L$withval/lib"
-               with_libmemcached="yes"
-       else
-               with_libmemcached="$withval"
-       fi
-],
-[
-       with_libmemcached="yes"
-])
-if test "x$with_libmemcached" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libmemcached_cppflags"
+AC_ARG_WITH([libmemcached],
+  [AS_HELP_STRING([--with-libmemcached@<:@=PREFIX@:>@], [Path to libmemcached.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libmemcached_cppflags="-I$withval/include"
+      with_libmemcached_ldflags="-L$withval/lib"
+      with_libmemcached="yes"
+    else
+      with_libmemcached="$withval"
+    fi
+  ],
+  [with_libmemcached="yes"]
+)
 
-       AC_CHECK_HEADERS(libmemcached/memcached.h, [with_libmemcached="yes"], [with_libmemcached="no (libmemcached/memcached.h not found)"])
+if test "x$with_libmemcached" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libmemcached_cppflags"
+
+  AC_CHECK_HEADERS([libmemcached/memcached.h],
+    [with_libmemcached="yes"],
+    [with_libmemcached="no (libmemcached/memcached.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libmemcached" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libmemcached_cppflags"
-       LDFLAGS="$LDFLAGS $with_libmemcached_ldflags"
 
-       AC_CHECK_LIB(memcached, memcached_create, [with_libmemcached="yes"], [with_libmemcached="no (Symbol 'memcached_create' not found)"])
+if test "x$with_libmemcached" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libmemcached_cppflags"
+  LDFLAGS="$LDFLAGS $with_libmemcached_ldflags"
+
+  AC_CHECK_LIB([memcached], [memcached_create],
+    [with_libmemcached="yes"],
+    [with_libmemcached="no (Symbol 'memcached_create' not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libmemcached" = "xyes"
-then
-       BUILD_WITH_LIBMEMCACHED_CPPFLAGS="$with_libmemcached_cppflags"
-       BUILD_WITH_LIBMEMCACHED_LDFLAGS="$with_libmemcached_ldflags"
-       BUILD_WITH_LIBMEMCACHED_LIBS="-lmemcached"
-       AC_SUBST(BUILD_WITH_LIBMEMCACHED_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMEMCACHED_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMEMCACHED_LIBS)
-       AC_DEFINE(HAVE_LIBMEMCACHED, 1, [Define if libmemcached is present and usable.])
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBMEMCACHED, test "x$with_libmemcached" = "xyes")
+
+if test "x$with_libmemcached" = "xyes"; then
+  BUILD_WITH_LIBMEMCACHED_CPPFLAGS="$with_libmemcached_cppflags"
+  BUILD_WITH_LIBMEMCACHED_LDFLAGS="$with_libmemcached_ldflags"
+  BUILD_WITH_LIBMEMCACHED_LIBS="-lmemcached"
+fi
+
+AC_SUBST([BUILD_WITH_LIBMEMCACHED_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBMEMCACHED_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBMEMCACHED_LIBS])
 # }}}
 
 # --with-libmicrohttpd {{{
@@ -3162,29 +3232,25 @@ with_libmicrohttpd_cppflags=""
 with_libmicrohttpd_ldflags=""
 AC_ARG_WITH([libmicrohttpd], [AS_HELP_STRING([--with-libmicrohttpd@<:@=PREFIX@:>@], [Path to libmicrohttpd.])],
   [
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
       with_libmicrohttpd_cppflags="-I$withval/include"
       with_libmicrohttpd_ldflags="-L$withval/lib"
       with_libmicrohttpd="yes"
     fi
-    if test "x$withval" = "xno"
-    then
+    if test "x$withval" = "xno"; then
       with_libmicrohttpd="no (disabled on command line)"
     fi
   ],
   [withval="yes"]
 )
-if test "x$withval" = "xyes"
-then
-PKG_CHECK_MODULES([MICROHTTPD], [libmicrohttpd],
-  [with_libmicrohttpd="yes"],
-  [with_libmicrohttpd="no (pkg-config could not find libmicrohttpd)"]
-)
+if test "x$withval" = "xyes"; then
+  PKG_CHECK_MODULES([MICROHTTPD], [libmicrohttpd],
+    [with_libmicrohttpd="yes"],
+    [with_libmicrohttpd="no (pkg-config could not find libmicrohttpd)"]
+  )
 fi
 
-if test "x$MICROHTTPD_LIBS" = "x"
-then
+if test "x$MICROHTTPD_LIBS" = "x"; then
   MICROHTTPD_LIBS="-lmicrohttpd"
 fi
 
@@ -3195,18 +3261,18 @@ CPPFLAGS="$with_libmicrohttpd_cppflags $MICROHTTPD_CFLAGS"
 LDFLAGS="$with_libmicrohttpd_ldflags $LDFLAGS"
 LIBS="$LIBS $MICROHTTPD_LIBS"
 
-if test "x$with_libmicrohttpd" = "xyes"
-then
+if test "x$with_libmicrohttpd" = "xyes"; then
   AC_CHECK_HEADERS([microhttpd.h],
-                   [with_libmicrohttpd="yes"],
-                   [with_libmicrohttpd="no (<microhttpd.h> not found)"])
+   [with_libmicrohttpd="yes"],
+   [with_libmicrohttpd="no (<microhttpd.h> not found)"]
+  )
 fi
 
-if test "x$with_libmicrohttpd" = "xyes"
-then
+if test "x$with_libmicrohttpd" = "xyes"; then
   AC_CHECK_LIB([microhttpd], [MHD_start_daemon],
-               [with_libmicrohttpd="yes"],
-               [with_libmicrohttpd="no (libmicrohttpd not found)"])
+    [with_libmicrohttpd="yes"],
+    [with_libmicrohttpd="no (libmicrohttpd not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
@@ -3222,1158 +3288,1173 @@ AC_SUBST([BUILD_WITH_LIBMICROHTTPD_LIBS])
 # }}}
 
 # --with-libmodbus {{{
-with_libmodbus_config=""
-with_libmodbus_cflags=""
-with_libmodbus_libs=""
-AC_ARG_WITH(libmodbus, [AS_HELP_STRING([--with-libmodbus@<:@=PREFIX@:>@], [Path to the modbus library.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libmodbus="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libmodbus="use_pkgconfig"
-       else if test -d "$with_libmodbus/lib"
-       then
-               AC_MSG_NOTICE([Not checking for libmodbus: Manually configured])
-               with_libmodbus_cflags="-I$withval/include"
-               with_libmodbus_libs="-L$withval/lib -lmodbus"
-               with_libmodbus="yes"
-       fi; fi; fi
-],
-[with_libmodbus="use_pkgconfig"])
+AC_ARG_WITH([libmodbus],
+  [AS_HELP_STRING([--with-libmodbus@<:@=PREFIX@:>@], [Path to the modbus library.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libmodbus="no"
+    else if test "x$withval" = "xyes"; then
+      with_libmodbus="use_pkgconfig"
+    else if test -d "$with_libmodbus/lib"; then
+      AC_MSG_NOTICE([Not checking for libmodbus: Manually configured])
+      with_libmodbus_cflags="-I$withval/include"
+      with_libmodbus_libs="-L$withval/lib -lmodbus"
+      with_libmodbus="yes"
+    fi; fi; fi
+  ],
+  [with_libmodbus="use_pkgconfig"]
+)
 
 # configure using pkg-config
-if test "x$with_libmodbus" = "xuse_pkgconfig"
-then
-       AC_MSG_NOTICE([Checking for libmodbus using $PKG_CONFIG])
-       $PKG_CONFIG --exists 'libmodbus' 2>/dev/null
-       if test $? -ne 0
-       then
-               with_libmodbus="no (pkg-config doesn't know libmodbus)"
-       fi
-fi
-if test "x$with_libmodbus" = "xuse_pkgconfig"
-then
-       with_libmodbus_cflags="`$PKG_CONFIG --cflags 'libmodbus'`"
-       if test $? -ne 0
-       then
-               with_libmodbus="no ($PKG_CONFIG failed)"
-       fi
-       with_libmodbus_libs="`$PKG_CONFIG --libs 'libmodbus'`"
-       if test $? -ne 0
-       then
-               with_libmodbus="no ($PKG_CONFIG failed)"
-       fi
-fi
-if test "x$with_libmodbus" = "xuse_pkgconfig"
-then
-       with_libmodbus="yes"
+if test "x$with_libmodbus" = "xuse_pkgconfig"; then
+  AC_MSG_NOTICE([Checking for libmodbus using $PKG_CONFIG])
+  $PKG_CONFIG --exists 'libmodbus' 2>/dev/null
+  if test $? -ne 0; then
+    with_libmodbus="no (pkg-config doesn't know libmodbus)"
+  fi
 fi
 
-# with_libmodbus_cflags and with_libmodbus_libs are set up now, let's do
-# the actual checks.
-if test "x$with_libmodbus" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags"
+if test "x$with_libmodbus" = "xuse_pkgconfig"; then
+  with_libmodbus_cflags="`$PKG_CONFIG --cflags 'libmodbus'`"
+  if test $? -ne 0; then
+    with_libmodbus="no ($PKG_CONFIG failed)"
+  fi
 
-       AC_CHECK_HEADERS(modbus.h, [], [with_libmodbus="no (modbus.h not found)"])
+  with_libmodbus_libs="`$PKG_CONFIG --libs 'libmodbus'`"
+  if test $? -ne 0; then
+    with_libmodbus="no ($PKG_CONFIG failed)"
+  fi
+fi
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+if test "x$with_libmodbus" = "xuse_pkgconfig"; then
+  with_libmodbus="yes"
 fi
-if test "x$with_libmodbus" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
 
-       CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags"
-       LDFLAGS="$LDFLAGS $with_libmodbus_libs"
+if test "x$with_libmodbus" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags"
 
-       AC_CHECK_LIB(modbus, modbus_connect,
-                    [with_libmodbus="yes"],
-                    [with_libmodbus="no (symbol modbus_connect not found)"])
+  AC_CHECK_HEADERS([modbus.h],
+    [with_libmodbus="yes"],
+    [with_libmodbus="no (modbus.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libmodbus" = "xyes"
-then
-       BUILD_WITH_LIBMODBUS_CFLAGS="$with_libmodbus_cflags"
-       BUILD_WITH_LIBMODBUS_LIBS="$with_libmodbus_libs"
-       AC_SUBST(BUILD_WITH_LIBMODBUS_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMODBUS_LIBS)
+
+if test "x$with_libmodbus" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libmodbus_libs"
+
+  AC_CHECK_LIB([modbus], [modbus_connect],
+    [with_libmodbus="yes"],
+    [with_libmodbus="no (symbol modbus_connect not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+if test "x$with_libmodbus" = "xyes"; then
+  BUILD_WITH_LIBMODBUS_CFLAGS="$with_libmodbus_cflags"
+  BUILD_WITH_LIBMODBUS_LIBS="$with_libmodbus_libs"
 fi
+
+AC_SUBST([BUILD_WITH_LIBMODBUS_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBMODBUS_LIBS])
 # }}}
 
 # --with-libmongoc {{{
-AC_ARG_WITH(libmongoc, [AS_HELP_STRING([--with-libmongoc@<:@=PREFIX@:>@], [Path to libmongoc.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_libmongoc="yes"
- else if test "x$withval" = "xno"
- then
-        with_libmongoc="no"
- else
-        with_libmongoc="yes"
-        LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS -I$withval/include"
-        LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS -L$withval/lib"
- fi; fi
-],
-[with_libmongoc="yes"])
+AC_ARG_WITH([libmongoc],
+  [AS_HELP_STRING([--with-libmongoc@<:@=PREFIX@:>@], [Path to libmongoc.])],
+  [
+    if test "x$withval" = "xyes"; then
+      with_libmongoc="yes"
+    else if test "x$withval" = "xno"; then
+      with_libmongoc="no"
+    else
+      with_libmongoc="no"
+    fi; fi
+  ],
+  [with_libmongoc="yes"]
+)
 
-SAVE_CPPFLAGS="$CPPFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
+if test "x$with_libmongoc" = "xyes"; then
+  PKG_CHECK_MODULES([LIBMONGOC], [libmongoc-1.0],
+    [with_libmongoc="yes"],
+    [with_libmongoc="no (pkg-config could not find libmongoc)"]
+  )
+fi
 
-CPPFLAGS="$CPPFLAGS $LIBMONGOC_CPPFLAGS"
-LDFLAGS="$LDFLAGS $LIBMONGOC_LDFLAGS"
+if test "x$with_libmongoc" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
 
-if test "x$with_libmongoc" = "xyes"
-then
-       if test "x$LIBMONGOC_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libmongoc CPPFLAGS: $LIBMONGOC_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(mongo.h,
-       [with_libmongoc="yes"],
-       [with_libmongoc="no ('mongo.h' not found)"],
-[#if HAVE_STDINT_H
-# define MONGO_HAVE_STDINT 1
-#else
-# define MONGO_USE_LONG_LONG_INT 1
-#endif
-])
-fi
-if test "x$with_libmongoc" = "xyes"
-then
-       if test "x$LIBMONGOC_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([libmongoc LDFLAGS: $LIBMONGOC_LDFLAGS])
-       fi
-       AC_CHECK_LIB(mongoc, mongo_run_command,
-       [with_libmongoc="yes"],
-       [with_libmongoc="no (symbol 'mongo_run_command' not found)"])
-fi
+  CPPFLAGS="$CPPFLAGS $LIBMONGOC_CFLAGS"
 
-CPPFLAGS="$SAVE_CPPFLAGS"
-LDFLAGS="$SAVE_LDFLAGS"
+  if test "x$CPPFLAGS" != "x"; then
+    AC_MSG_NOTICE([libmongoc CPPFLAGS: $LIBMONGOC_CFLAGS])
+  fi
 
-if test "x$with_libmongoc" = "xyes"
-then
-       BUILD_WITH_LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS"
-       BUILD_WITH_LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBMONGOC_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMONGOC_LDFLAGS)
+  AC_CHECK_HEADERS([mongoc.h],
+    [with_libmongoc="yes"],
+    [with_libmongoc="no ('mongoc.h' not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBMONGOC, test "x$with_libmongoc" = "xyes")
-# }}}
 
-# --with-libmosquitto {{{
-with_libmosquitto_cppflags=""
-with_libmosquitto_ldflags=""
-AC_ARG_WITH(libmosquitto, [AS_HELP_STRING([--with-libmosquitto@<:@=PREFIX@:>@], [Path to libmosquitto.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libmosquitto_cppflags="-I$withval/include"
-               with_libmosquitto_ldflags="-L$withval/lib"
-               with_libmosquitto="yes"
-       else
-               with_libmosquitto="$withval"
-       fi
-],
-[
-       with_libmosquitto="yes"
-])
-if test "x$with_libmosquitto" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libmosquitto_cppflags"
+if test "x$with_libmongoc" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
 
-       AC_CHECK_HEADERS(mosquitto.h, [with_libmosquitto="yes"], [with_libmosquitto="no (mosquitto.h not found)"])
+  CPPFLAGS="$CPPFLAGS $LIBMONGOC_CFLAGS"
+  LDFLAGS="$LDFLAGS $LIBMONGOC_LDFLAGS"
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-fi
-if test "x$with_libmosquitto" = "xyes"
-then
-       SAVE_LDFLAGS="$LDFLAGS"
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       LDFLAGS="$LDFLAGS $with_libmosquitto_ldflags"
-       CPPFLAGS="$CPPFLAGS $with_libmosquitto_cppflags"
+  if test "x$LIBMONGOC_LDFLAGS" != "x"; then
+    AC_MSG_NOTICE([libmongoc LDFLAGS: $LIBMONGOC_LDFLAGS])
+  fi
 
-       AC_CHECK_LIB(mosquitto, mosquitto_connect, [with_libmosquitto="yes"], [with_libmosquitto="no (libmosquitto not found)"])
+  AC_CHECK_LIB([mongoc-1.0], [mongoc_init],
+    [with_libmongoc="yes"],
+    [with_libmongoc="no (symbol 'mongoc_init' not found)"]
+  )
 
-       LDFLAGS="$SAVE_LDFLAGS"
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libmosquitto" = "xyes"
-then
-       BUILD_WITH_LIBMOSQUITTO_CPPFLAGS="$with_libmosquitto_cppflags"
-       BUILD_WITH_LIBMOSQUITTO_LDFLAGS="$with_libmosquitto_ldflags"
-       BUILD_WITH_LIBMOSQUITTO_LIBS="-lmosquitto"
-       AC_SUBST(BUILD_WITH_LIBMOSQUITTO_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMOSQUITTO_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMOSQUITTO_LIBS)
+
+if test "x$with_libmongoc" = "xyes"; then
+  BUILD_WITH_LIBMONGOC_CFLAGS="$LIBMONGOC_CFLAGS"
+  BUILD_WITH_LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS"
 fi
+
+AC_SUBST([BUILD_WITH_LIBMONGOC_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBMONGOC_LDFLAGS])
 # }}}
 
-# --with-libmysql {{{
-with_mysql_config="mysql_config"
-with_mysql_cflags=""
-with_mysql_libs=""
-AC_ARG_WITH(libmysql, [AS_HELP_STRING([--with-libmysql@<:@=PREFIX@:>@], [Path to libmysql.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libmysql="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libmysql="yes"
-       else
-               if test -f "$withval" && test -x "$withval";
-               then
-                       with_mysql_config="$withval"
-               else if test -x "$withval/bin/mysql_config"
-               then
-                       with_mysql_config="$withval/bin/mysql_config"
-               fi; fi
-               with_libmysql="yes"
-       fi; fi
-],
-[
-       with_libmysql="yes"
-])
-if test "x$with_libmysql" = "xyes"
-then
-       with_mysql_cflags=`$with_mysql_config --include 2>/dev/null`
-       mysql_config_status=$?
-
-       if test $mysql_config_status -ne 0
-       then
-               with_libmysql="no ($with_mysql_config failed)"
-       else
-               SAVE_CPPFLAGS="$CPPFLAGS"
-               CPPFLAGS="$CPPFLAGS $with_mysql_cflags"
-
-               have_mysql_h="no"
-               have_mysql_mysql_h="no"
-               AC_CHECK_HEADERS(mysql.h, [have_mysql_h="yes"])
-
-               if test "x$have_mysql_h" = "xno"
-               then
-                       AC_CHECK_HEADERS(mysql/mysql.h, [have_mysql_mysql_h="yes"])
-               fi
-
-               if test "x$have_mysql_h$have_mysql_mysql_h" = "xnono"
-               then
-                       with_libmysql="no (mysql.h not found)"
-               fi
-
-               CPPFLAGS="$SAVE_CPPFLAGS"
-       fi
-fi
-if test "x$with_libmysql" = "xyes"
-then
-       with_mysql_libs=`$with_mysql_config --libs_r 2>/dev/null`
-       mysql_config_status=$?
-
-       if test $mysql_config_status -ne 0
-       then
-               with_libmysql="no ($with_mysql_config failed)"
-       else
-               SAVE_CPPFLAGS="$CPPFLAGS"
-               CPPFLAGS="$CPPFLAGS $with_mysql_cflags"
-               SAVE_LIBS="$LIBS"
-               LIBS="$with_mysql_libs"
-               AC_SEARCH_LIBS([mysql_get_server_version],
-                [],
-                [with_libmysql="yes"],
-                [with_libmysql="no (symbol 'mysql_get_server_version' not found)"],
-                [])
-               CPPFLAGS="$SAVE_CPPFLAGS"
-               LIBS="$SAVE_LIBS"
-       fi
-fi
-if test "x$with_libmysql" = "xyes"
-then
-       BUILD_WITH_LIBMYSQL_CFLAGS="$with_mysql_cflags"
-       BUILD_WITH_LIBMYSQL_LIBS="$with_mysql_libs"
-       AC_SUBST(BUILD_WITH_LIBMYSQL_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMYSQL_LIBS)
+# --with-libmosquitto {{{
+AC_ARG_WITH([libmosquitto],
+  [AS_HELP_STRING([--with-libmosquitto@<:@=PREFIX@:>@], [Path to libmosquitto.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libmosquitto_cppflags="-I$withval/include"
+      with_libmosquitto_ldflags="-L$withval/lib"
+      with_libmosquitto="yes"
+    else
+      with_libmosquitto="$withval"
+    fi
+  ],
+  [with_libmosquitto="yes"]
+)
+
+if test "x$with_libmosquitto" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libmosquitto_cppflags"
+
+  AC_CHECK_HEADERS([mosquitto.h],
+    [with_libmosquitto="yes"],
+    [with_libmosquitto="no (mosquitto.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
+fi
+
+if test "x$with_libmosquitto" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libmosquitto_ldflags"
+
+  AC_CHECK_LIB([mosquitto], [mosquitto_connect],
+    [with_libmosquitto="yes"],
+    [with_libmosquitto="no (libmosquitto not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBMYSQL, test "x$with_libmysql" = "xyes")
+
+if test "x$with_libmosquitto" = "xyes"; then
+  BUILD_WITH_LIBMOSQUITTO_CPPFLAGS="$with_libmosquitto_cppflags"
+  BUILD_WITH_LIBMOSQUITTO_LDFLAGS="$with_libmosquitto_ldflags"
+  BUILD_WITH_LIBMOSQUITTO_LIBS="-lmosquitto"
+fi
+
+AC_SUBST([BUILD_WITH_LIBMOSQUITTO_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBMOSQUITTO_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBMOSQUITTO_LIBS])
+# }}}
+
+# --with-libmysql {{{
+with_mysql_config="mysql_config"
+AC_ARG_WITH([libmysql],
+  [AS_HELP_STRING([--with-libmysql@<:@=PREFIX@:>@], [Path to libmysql.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libmysql="no"
+    else if test "x$withval" = "xyes"; then
+      with_libmysql="yes"
+    else
+      if test -f "$withval" && test -x "$withval"; then
+        with_mysql_config="$withval"
+      else if test -x "$withval/bin/mysql_config"; then
+        with_mysql_config="$withval/bin/mysql_config"
+      fi; fi
+      with_libmysql="yes"
+    fi; fi
+  ],
+  [with_libmysql="yes"]
+)
+
+if test "x$with_libmysql" = "xyes"; then
+  with_mysql_cflags=`$with_mysql_config --include 2>/dev/null`
+  if test $? -ne 0; then
+    with_libmysql="no ($with_mysql_config failed)"
+  else
+    SAVE_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $with_mysql_cflags"
+
+    AC_CHECK_HEADERS([mysql.h],
+      [have_mysql_h="yes"],
+      [have_mysql_h="no"]
+    )
+
+    if test "x$have_mysql_h" != "xyes"; then
+      AC_CHECK_HEADERS([mysql/mysql.h],
+        [have_mysql_mysql_h="yes"],
+        [],
+      )
+    fi
+
+    if test "x$have_mysql_h" != "xyes" && test "x$have_mysql_mysql_h" != "xyes"; then
+      with_libmysql="no (mysql.h not found)"
+    fi
+
+    CPPFLAGS="$SAVE_CPPFLAGS"
+  fi
+fi
+
+if test "x$with_libmysql" = "xyes"; then
+  with_mysql_libs=`$with_mysql_config --libs_r 2>/dev/null`
+  if test $? -ne 0; then
+    with_libmysql="no ($with_mysql_config failed)"
+  else
+    SAVE_LIBS="$LIBS"
+    LIBS="$with_mysql_libs"
+
+    AC_SEARCH_LIBS([mysql_get_server_version],
+      [],
+      [with_libmysql="yes"],
+      [with_libmysql="no (symbol 'mysql_get_server_version' not found in ${LIBS})"],
+      []
+    )
+    LIBS="$SAVE_LIBS"
+  fi
+fi
+
+if test "x$with_libmysql" = "xyes"; then
+  BUILD_WITH_LIBMYSQL_CFLAGS="$with_mysql_cflags"
+  BUILD_WITH_LIBMYSQL_LIBS="$with_mysql_libs"
+fi
+
+AC_SUBST([BUILD_WITH_LIBMYSQL_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBMYSQL_LIBS])
 # }}}
 
 # --with-libmnl {{{
-with_libmnl_cflags=""
-with_libmnl_libs=""
-AC_ARG_WITH(libmnl, [AS_HELP_STRING([--with-libmnl@<:@=PREFIX@:>@], [Path to libmnl.])],
-[
- echo "libmnl: withval = $withval"
- if test "x$withval" = "xyes"
- then
-        with_libmnl="yes"
- else if test "x$withval" = "xno"
- then
-        with_libmnl="no"
- else
-        if test -d "$withval/include"
-        then
-                with_libmnl_cflags="-I$withval/include"
-                with_libmnl_libs="-L$withval/lib -lmnl"
-                with_libmnl="yes"
-        else
-                AC_MSG_ERROR("no such directory: $withval/include")
-        fi
- fi; fi
-],
-[
- if test "x$ac_system" = "xLinux"
- then
-        with_libmnl="yes"
- else
-        with_libmnl="no (Linux only library)"
- fi
-])
-if test "x$with_libmnl" = "xyes"
-then
-       if $PKG_CONFIG --exists libmnl 2>/dev/null; then
-         with_libmnl_cflags="$with_libmnl_ldflags `$PKG_CONFIG --cflags libmnl`"
-         with_libmnl_libs="$with_libmnl_libs `$PKG_CONFIG --libs libmnl`"
-       fi
-
-       AC_CHECK_HEADERS(libmnl.h libmnl/libmnl.h,
-       [
-        with_libmnl="yes"
-        break
-       ], [],
-[#include <stdio.h>
-#include <sys/types.h>
-#include <asm/types.h>
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>])
-       AC_CHECK_HEADERS(linux/gen_stats.h linux/pkt_sched.h, [], [],
-[#include <stdio.h>
-#include <sys/types.h>
-#include <asm/types.h>
-#include <sys/socket.h>])
-
-        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[
-#include <stdio.h>
-#include <sys/types.h>
-#include <asm/types.h>
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-]],
-[[
-int retval = TCA_STATS2;
-return (retval);
-]]
-       )],
-       [AC_DEFINE([HAVE_TCA_STATS2], [1], [True if the enum-member TCA_STATS2 exists])])
-
-       AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[
-#include <stdio.h>
-#include <sys/types.h>
-#include <asm/types.h>
-#include <sys/socket.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-]],
-[[
-int retval = TCA_STATS;
-return (retval);
-]]
-       )],
-       [AC_DEFINE([HAVE_TCA_STATS], 1, [True if the enum-member TCA_STATS exists])])
-fi
-if test "x$with_libmnl" = "xyes"
-then
-       AC_CHECK_MEMBERS([struct rtnl_link_stats64.tx_window_errors],
-       [AC_DEFINE(HAVE_RTNL_LINK_STATS64, 1, [Define if struct rtnl_link_stats64 exists and is usable.])],
-       [],
-       [
-       #include <linux/if_link.h>
-       ])
-fi
-if test "x$with_libmnl" = "xyes"
-then
-       AC_CHECK_LIB(mnl, mnl_nlmsg_get_payload,
-                    [with_libmnl="yes"],
-                    [with_libmnl="no (symbol 'mnl_nlmsg_get_payload' not found)"],
-                    [$with_libmnl_libs])
+AC_ARG_WITH([libmnl],
+  [AS_HELP_STRING([--with-libmnl@<:@=PREFIX@:>@], [Path to libmnl.])],
+  [
+    if test "x$withval" = "xyes"; then
+      with_libmnl="yes"
+     else if test "x$withval" = "xno"; then
+       with_libmnl="no"
+     else
+       if test -d "$withval/include"; then
+         with_libmnl_cflags="-I$withval/include"
+         with_libmnl_libs="-L$withval/lib -lmnl"
+         with_libmnl="yes"
+       else
+         AC_MSG_ERROR("no such directory: $withval/include")
+       fi
+     fi; fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_libmnl="yes"
+    else
+      with_libmnl="no (Linux only library)"
+    fi
+  ]
+)
+
+if test "x$with_libmnl" = "xyes"; then
+  if $PKG_CONFIG --exists libmnl 2>/dev/null; then
+    with_libmnl_cflags="$with_libmnl_ldflags `$PKG_CONFIG --cflags libmnl`"
+    with_libmnl_libs="$with_libmnl_libs `$PKG_CONFIG --libs libmnl`"
+  fi
+
+  AC_CHECK_HEADERS([libmnl.h libmnl/libmnl.h],
+    [
+      with_libmnl="yes"
+      break
+    ],
+    [],
+    [[
+      #include <stdio.h>
+      #include <sys/types.h>
+      #include <asm/types.h>
+      #include <sys/socket.h>
+      #include <linux/netlink.h>
+      #include <linux/rtnetlink.h>]]
+  )
+
+  AC_CHECK_HEADERS([linux/gen_stats.h linux/pkt_sched.h],
+    [],
+    [],
+    [[
+      #include <stdio.h>
+      #include <sys/types.h>
+      #include <asm/types.h>
+      #include <sys/socket.h>
+    ]]
+  )
+
+  AC_COMPILE_IFELSE(
+    [
+      AC_LANG_PROGRAM(
+        [[
+          #include <stdio.h>
+          #include <sys/types.h>
+          #include <asm/types.h>
+          #include <sys/socket.h>
+          #include <linux/netlink.h>
+          #include <linux/rtnetlink.h>
+        ]],
+        [[
+          int retval = TCA_STATS2;
+          return retval;
+        ]]
+      )
+    ],
+    [AC_DEFINE([HAVE_TCA_STATS2], [1], [True if the enum-member TCA_STATS2 exists])]
+  )
+
+  AC_COMPILE_IFELSE(
+    [
+      AC_LANG_PROGRAM(
+        [[
+          #include <stdio.h>
+          #include <sys/types.h>
+          #include <asm/types.h>
+          #include <sys/socket.h>
+          #include <linux/netlink.h>
+          #include <linux/rtnetlink.h>
+        ]],
+        [[
+          int retval = TCA_STATS;
+          return retval;
+        ]]
+      )
+    ],
+    [AC_DEFINE([HAVE_TCA_STATS], 1, [True if the enum-member TCA_STATS exists])]
+  )
+
+  AC_CHECK_MEMBERS([struct rtnl_link_stats64.tx_window_errors],
+    [AC_DEFINE(HAVE_RTNL_LINK_STATS64, 1, [Define if struct rtnl_link_stats64 exists and is usable.])],
+    [],
+    [[#include <linux/if_link.h>]]
+  )
+
+  AC_CHECK_LIB([mnl], [mnl_nlmsg_get_payload],
+    [with_libmnl="yes"],
+    [with_libmnl="no (symbol 'mnl_nlmsg_get_payload' not found)"],
+    [$with_libmnl_libs]
+  )
 fi
-if test "x$with_libmnl" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBMNL, 1, [Define if libmnl is present and usable.])
-       BUILD_WITH_LIBMNL_CFLAGS="$with_libmnl_cflags"
-       BUILD_WITH_LIBMNL_LIBS="$with_libmnl_libs"
-       AC_SUBST(BUILD_WITH_LIBMNL_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBMNL_LIBS)
+
+if test "x$with_libmnl" = "xyes"; then
+  BUILD_WITH_LIBMNL_CFLAGS="$with_libmnl_cflags"
+  BUILD_WITH_LIBMNL_LIBS="$with_libmnl_libs"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBMNL, test "x$with_libmnl" = "xyes")
+AC_SUBST([BUILD_WITH_LIBMNL_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBMNL_LIBS])
 # }}}
 
 # --with-libnetapp {{{
 AC_ARG_VAR([LIBNETAPP_CPPFLAGS], [C preprocessor flags required to build with libnetapp])
 AC_ARG_VAR([LIBNETAPP_LDFLAGS],  [Linker flags required to build with libnetapp])
 AC_ARG_VAR([LIBNETAPP_LIBS],     [Other libraries required to link against libnetapp])
-LIBNETAPP_CPPFLAGS="$LIBNETAPP_CPPFLAGS"
-LIBNETAPP_LDFLAGS="$LIBNETAPP_LDFLAGS"
-LIBNETAPP_LIBS="$LIBNETAPP_LIBS"
-AC_ARG_WITH(libnetapp, [AS_HELP_STRING([--with-libnetapp@<:@=PREFIX@:>@], [Path to libnetapp.])],
-[
- if test -d "$withval"
- then
-        LIBNETAPP_CPPFLAGS="$LIBNETAPP_CPPFLAGS -I$withval/include"
-        LIBNETAPP_LDFLAGS="$LIBNETAPP_LDFLAGS -L$withval/lib"
-        with_libnetapp="yes"
- else
-        with_libnetapp="$withval"
- fi
-],
-[
- with_libnetapp="yes"
-])
+AC_ARG_WITH([libnetapp],
+  [AS_HELP_STRING([--with-libnetapp@<:@=PREFIX@:>@], [Path to libnetapp.])],
+  [
+   if test -d "$withval"; then
+     LIBNETAPP_CPPFLAGS="$LIBNETAPP_CPPFLAGS -I$withval/include"
+     LIBNETAPP_LDFLAGS="$LIBNETAPP_LDFLAGS -L$withval/lib"
+     with_libnetapp="yes"
+   else
+     with_libnetapp="$withval"
+   fi
+  ],
+  [with_libnetapp="yes"]
+)
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
 CPPFLAGS="$CPPFLAGS $LIBNETAPP_CPPFLAGS"
 LDFLAGS="$LDFLAGS $LIBNETAPP_LDFLAGS"
 
-if test "x$with_libnetapp" = "xyes"
-then
-       if test "x$LIBNETAPP_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([netapp CPPFLAGS: $LIBNETAPP_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(netapp_api.h,
-               [with_libnetapp="yes"],
-               [with_libnetapp="no (netapp_api.h not found)"])
+if test "x$with_libnetapp" = "xyes"; then
+  if test "x$LIBNETAPP_CPPFLAGS" != "x"; then
+    AC_MSG_NOTICE([netapp CPPFLAGS: $LIBNETAPP_CPPFLAGS])
+  fi
+  AC_CHECK_HEADERS([netapp_api.h],
+    [with_libnetapp="yes"],
+    [with_libnetapp="no (netapp_api.h not found)"]
+  )
 fi
 
-if test "x$with_libnetapp" = "xyes"
-then
-       if test "x$LIBNETAPP_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([netapp LDFLAGS: $LIBNETAPP_LDFLAGS])
-       fi
+if test "x$with_libnetapp" = "xyes"; then
+  if test "x$LIBNETAPP_LDFLAGS" != "x"; then
+    AC_MSG_NOTICE([netapp LDFLAGS: $LIBNETAPP_LDFLAGS])
+  fi
 
-       if test "x$LIBNETAPP_LIBS" = "x"
-       then
-               LIBNETAPP_LIBS="$PTHREAD_LIBS -lxml -ladt -lssl -lm -lcrypto -lz"
-       fi
-       AC_MSG_NOTICE([netapp LIBS: $LIBNETAPP_LIBS])
+  if test "x$LIBNETAPP_LIBS" = "x"; then
+    LIBNETAPP_LIBS="$PTHREAD_LIBS -lxml -ladt -lssl -lm -lcrypto -lz"
+  fi
+
+  AC_MSG_NOTICE([netapp LIBS: $LIBNETAPP_LIBS])
+
+  AC_CHECK_LIB([netapp], [na_server_invoke_elem],
+    [with_libnetapp="yes"],
+    [with_libnetapp="no (symbol na_server_invoke_elem not found)"],
+    [$LIBNETAPP_LIBS]
+  )
 
-       AC_CHECK_LIB(netapp, na_server_invoke_elem,
-               [with_libnetapp="yes"],
-               [with_libnetapp="no (symbol na_server_invoke_elem not found)"],
-               [$LIBNETAPP_LIBS])
-       LIBNETAPP_LIBS="-lnetapp $LIBNETAPP_LIBS"
+  LIBNETAPP_LIBS="-lnetapp $LIBNETAPP_LIBS"
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 
-if test "x$with_libnetapp" = "xyes"
-then
-       AC_DEFINE(HAVE_LIBNETAPP, 1, [Define to 1 if you have the netapp library (-lnetapp).])
-fi
-
-AC_SUBST(LIBNETAPP_CPPFLAGS)
-AC_SUBST(LIBNETAPP_LDFLAGS)
-AC_SUBST(LIBNETAPP_LIBS)
-AM_CONDITIONAL(BUILD_WITH_LIBNETAPP, test "x$with_libnetapp" = "xyes")
+AC_SUBST([LIBNETAPP_CPPFLAGS])
+AC_SUBST([LIBNETAPP_LDFLAGS])
+AC_SUBST([LIBNETAPP_LIBS])
 # }}}
 
 # --with-libnetsnmp {{{
-AC_ARG_WITH(libnetsnmp, [AS_HELP_STRING([--with-libnetsnmp@<:@=PREFIX@:>@], [Path to the Net-SNMPD library.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libnetsnmp="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libnetsnmp="yes"
-       else
-               with_libnetsnmp_cppflags="-I$withval/include"
-               with_libnetsnmp_ldflags="-I$withval/lib"
-               with_libnetsnmp="yes"
-       fi; fi
-],
-[with_libnetsnmp="yes"])
-if test "x$with_libnetsnmp" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libnetsnmp_cppflags"
+AC_ARG_WITH([libnetsnmp],
+  [AS_HELP_STRING([--with-libnetsnmp@<:@=PREFIX@:>@], [Path to libnetsnmp.])],
+  [
+    if test "x$withval" = "xno"; then
+     with_libnetsnmp="no"
+    else if test "x$withval" = "xyes"; then
+     with_libnetsnmp="yes"
+    else
+      with_libnetsnmp_cppflags="-I$withval/include"
+      with_libnetsnmp_ldflags="-I$withval/lib"
+      with_libnetsnmp="yes"
+    fi; fi
+  ],
+  [with_libnetsnmp="yes"]
+)
+
+if test "x$with_libnetsnmp" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libnetsnmp_cppflags"
 
-       AC_CHECK_HEADERS(net-snmp/net-snmp-config.h, [], [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"])
+  AC_CHECK_HEADERS([net-snmp/net-snmp-config.h],
+    [with_libnetsnmp="yes"],
+    [with_libnetsnmp="no (net-snmp/net-snmp-config.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  AC_CHECK_HEADERS([net-snmp/net-snmp-includes.h],
+    [with_libnetsnmp="yes"],
+    [with_libnetsnmp="no (net-snmp/net-snmp-includes.h not found)"],
+    [[
+      #if HAVE_NET_SNMP_NET_SNMP_CONFIG_H
+      # include <net-snmp/net-snmp-config.h>
+      #endif
+    ]]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libnetsnmp" = "xyes"
-then
-       SAVE_LDFLAGS="$LDFLAGS"
-       LDFLAGS="$LDFLAGS $with_libnetsnmp_ldflags"
 
-       AC_CHECK_LIB(netsnmp, init_snmp,
-               [with_libnetsnmp="yes"],
-               [with_libnetsnmp="no (libnetsnmp not found)"],
-               [$with_snmp_libs])
+if test "x$with_libnetsnmp" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libnetsnmp_ldflags"
+
+  AC_CHECK_LIB([netsnmp], [init_snmp],
+    [with_libnetsmp="yes"],
+    [with_libnetsnmp="no (libnetsnmp not found)"]
+  )
 
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libnetsnmp" = "xyes"
-then
-       BUILD_WITH_LIBNETSNMP_CPPFLAGS="$with_libnetsnmp_cppflags"
-       BUILD_WITH_LIBNETSNMP_LDFLAGS="$with_libnetsnmp_ldflags"
-       BUILD_WITH_LIBNETSNMP_LIBS="-lnetsnmp"
+
+if test "x$with_libnetsnmp" = "xyes"; then
+  BUILD_WITH_LIBNETSNMP_CPPFLAGS="$with_libnetsnmp_cppflags"
+  BUILD_WITH_LIBNETSNMP_LDFLAGS="$with_libnetsnmp_ldflags"
+  BUILD_WITH_LIBNETSNMP_LIBS="-lnetsnmp"
 fi
-AC_SUBST(BUILD_WITH_LIBNETSNMP_CPPFLAGS)
-AC_SUBST(BUILD_WITH_LIBNETSNMP_LDFLAGS)
-AC_SUBST(BUILD_WITH_LIBNETSNMP_LIBS)
+
+AC_SUBST([BUILD_WITH_LIBNETSNMP_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBNETSNMP_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBNETSNMP_LIBS])
 # }}}
 
-# --with-liboconfig {{{
-with_own_liboconfig="no"
-liboconfig_LDFLAGS="$LDFLAGS"
-liboconfig_CPPFLAGS="$CPPFLAGS"
-AC_ARG_WITH(liboconfig, [AS_HELP_STRING([--with-liboconfig@<:@=PREFIX@:>@], [Path to liboconfig.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               if test -d "$withval/lib"
-               then
-                       liboconfig_LDFLAGS="$LDFLAGS -L$withval/lib"
-               fi
-               if test -d "$withval/include"
-               then
-                       liboconfig_CPPFLAGS="$CPPFLAGS -I$withval/include"
-               fi
-       fi
-       if test "x$withval" = "xno"
-       then
-               AC_MSG_ERROR("liboconfig is required")
-       fi
-],
-[
-       with_liboconfig="yes"
-])
+# --with-libnetsmpagent {{{
+AC_ARG_WITH([libnetsnmpagent],
+  [AS_HELP_STRING([--with-libnetsnmpagent@<:@=PREFIX@:>@], [Path to libnetsnmpagent.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libnetsnmpagent="no"
+    else if test "x$withval" = "xyes"; then
+      with_libnetsnmpagent="yes"
+    else
+      with_libnetsnmpagent_cppflags="-I$withval/include"
+      with_libnetsnmpagent_ldflags="-I$withval/lib"
+      with_libnetsnmpagent="yes"
+    fi; fi
+  ],
+  [with_libnetsnmpagent="yes"]
+)
 
-save_LDFLAGS="$LDFLAGS"
-save_CPPFLAGS="$CPPFLAGS"
-LDFLAGS="$liboconfig_LDFLAGS"
-CPPFLAGS="$liboconfig_CPPFLAGS"
-AC_CHECK_LIB(oconfig, oconfig_parse_file,
-[
-       with_liboconfig="yes"
-       with_own_liboconfig="no"
-],
-[
-       with_liboconfig="yes"
-       with_own_liboconfig="yes"
-       LDFLAGS="$save_LDFLAGS"
-       CPPFLAGS="$save_CPPFLAGS"
-])
+if test "x$with_libnetsnmpagent" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libnetsnmpagent_cppflags"
 
-AM_CONDITIONAL(BUILD_WITH_OWN_LIBOCONFIG, test "x$with_own_liboconfig" = "xyes")
-if test "x$with_own_liboconfig" = "xyes"
-then
-       with_liboconfig="yes (shipped version)"
+  AC_CHECK_HEADERS([net-snmp/agent/net-snmp-agent-includes.h],
+    [],
+    [with_libnetsnmpagent="no (net-snmp/agent/net-snmp-agent-includes.h not found)"],
+    [[
+      #if HAVE_NET_SNMP_NET_SNMP_CONFIG_H
+      # include <net-snmp/net-snmp-config.h>
+      #endif
+      #if HAVE_NET_SNMP_NET_SNMP_INCLUDES_H
+      # include <net-snmp/net-snmp-includes.h>
+      #endif
+    ]]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
+
+if test "x$with_libnetsnmpagent" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libnetsnmpagent_ldflags"
+
+  # older versions of libnetsnmpagent fail to link
+  # against the helpers library, so do that explicitly
+  AC_CHECK_LIB([netsnmphelpers], [netsnmp_init_helpers],
+    [libnetsnmphelpers="-lnetsnmphelpers"],
+    [libnetsnmphelpers=""]
+  )
+
+  AC_CHECK_LIB([netsnmpagent], [init_agent],
+    [with_libnetsnmpagent="yes"],
+    [with_libnetsnmpagent="no (libnetsnmpagent not found)"],
+    [$libnetsnmphelpers]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+if test "x$with_libnetsnmpagent" = "xyes"; then
+  BUILD_WITH_LIBNETSNMPAGENT_LIBS="-lnetsnmpagent $libnetsnmphelpers"
+fi
+
+AC_SUBST([BUILD_WITH_LIBNETSNMPAGENT_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBNETSNMPAGENT_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBNETSNMPAGENT_LIBS])
 # }}}
 
 # --with-liboping {{{
-AC_ARG_WITH(liboping, [AS_HELP_STRING([--with-liboping@<:@=PREFIX@:>@], [Path to liboping.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_liboping="yes"
- else if test "x$withval" = "xno"
- then
-        with_liboping="no"
- else
-        with_liboping="yes"
-        LIBOPING_CPPFLAGS="$LIBOPING_CPPFLAGS -I$withval/include"
-        LIBOPING_LDFLAGS="$LIBOPING_LDFLAGS -L$withval/lib"
- fi; fi
-],
-[with_liboping="yes"])
+AC_ARG_WITH([liboping],
+  [AS_HELP_STRING([--with-liboping@<:@=PREFIX@:>@], [Path to liboping.])],
+  [
   if test "x$withval" = "xyes"; then
+      with_liboping="yes"
+    else if test "x$withval" = "xno"; then
+      with_liboping="no"
+    else
+      with_liboping="yes"
+      LIBOPING_CPPFLAGS="-I$withval/include"
+      LIBOPING_LDFLAGS="-L$withval/lib"
+    fi; fi
+  ],
+  [with_liboping="yes"]
+)
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
-
 CPPFLAGS="$CPPFLAGS $LIBOPING_CPPFLAGS"
 LDFLAGS="$LDFLAGS $LIBOPING_LDFLAGS"
 
-if test "x$with_liboping" = "xyes"
-then
-       if test "x$LIBOPING_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([liboping CPPFLAGS: $LIBOPING_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(oping.h,
-       [with_liboping="yes"],
-       [with_liboping="no (oping.h not found)"])
-fi
-if test "x$with_liboping" = "xyes"
-then
-       if test "x$LIBOPING_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([liboping LDFLAGS: $LIBOPING_LDFLAGS])
-       fi
-       AC_CHECK_LIB(oping, ping_construct,
-       [with_liboping="yes"],
-       [with_liboping="no (symbol 'ping_construct' not found)"])
+if test "x$with_liboping" = "xyes"; then
+  AC_CHECK_HEADERS([oping.h],
+    [with_liboping="yes"],
+    [with_liboping="no (oping.h not found)"]
+  )
+fi
+
+if test "x$with_liboping" = "xyes"; then
+  AC_CHECK_LIB([oping], [ping_construct],
+    [with_liboping="yes"],
+    [with_liboping="no (symbol 'ping_construct' not found)"]
+  )
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 
-if test "x$with_liboping" = "xyes"
-then
-       BUILD_WITH_LIBOPING_CPPFLAGS="$LIBOPING_CPPFLAGS"
-       BUILD_WITH_LIBOPING_LDFLAGS="$LIBOPING_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBOPING_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBOPING_LDFLAGS)
+if test "x$with_liboping" = "xyes"; then
+  BUILD_WITH_LIBOPING_CPPFLAGS="$LIBOPING_CPPFLAGS"
+  BUILD_WITH_LIBOPING_LDFLAGS="$LIBOPING_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBOPING, test "x$with_liboping" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBOPING_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBOPING_LDFLAGS])
 # }}}
 
 # --with-oracle {{{
-with_oracle_cppflags=""
-with_oracle_libs=""
-AC_ARG_WITH(oracle, [AS_HELP_STRING([--with-oracle@<:@=ORACLE_HOME@:>@], [Path to Oracle.])],
-[
-       if test "x$withval" = "xyes"
-       then
-               if test "x$ORACLE_HOME" = "x"
-               then
-                       AC_MSG_WARN([Use of the Oracle library has been forced, but the environment variable ORACLE_HOME is not set.])
-               fi
-               with_oracle="yes"
-       else if test "x$withval" = "xno"
-       then
-               with_oracle="no"
-       else
-               with_oracle="yes"
-               ORACLE_HOME="$withval"
-       fi; fi
-],
-[
-       if test "x$ORACLE_HOME" = "x"
-       then
-               with_oracle="no (ORACLE_HOME is not set)"
-       else
-               with_oracle="yes"
-       fi
-])
-if test "x$ORACLE_HOME" != "x"
-then
-       with_oracle_cppflags="-I$ORACLE_HOME/rdbms/public"
+AC_ARG_WITH([oracle],
+  [AS_HELP_STRING([--with-oracle@<:@=ORACLE_HOME@:>@], [Path to Oracle.])],
+  [
+    if test "x$withval" = "xyes"; then
+      if test "x$ORACLE_HOME" = "x"; then
+        AC_MSG_WARN([Use of the Oracle library has been forced, but the environment variable ORACLE_HOME is not set.])
+      fi
+      with_oracle="yes"
+    else if test "x$withval" = "xno"; then
+      with_oracle="no"
+    else
+      with_oracle="yes"
+      ORACLE_HOME="$withval"
+    fi; fi
+  ],
+  [
+    if test "x$ORACLE_HOME" = "x"; then
+      with_oracle="no (ORACLE_HOME is not set)"
+    else
+      with_oracle="yes"
+    fi
+  ]
+)
 
-       if test -e "$ORACLE_HOME/lib/ldflags"
-       then
-               with_oracle_libs=`cat "$ORACLE_HOME/lib/ldflags"`
-       fi
-       #with_oracle_libs="-L$ORACLE_HOME/lib $with_oracle_libs -lclntsh"
-       with_oracle_libs="-L$ORACLE_HOME/lib -lclntsh"
+if test "x$ORACLE_HOME" != "x"; then
+  with_oracle_cppflags="-I$ORACLE_HOME/rdbms/public"
+  if test -e "$ORACLE_HOME/lib/ldflags"; then
+    with_oracle_libs=`cat "$ORACLE_HOME/lib/ldflags"`
+  fi
+  with_oracle_libs="-L$ORACLE_HOME/lib -lclntsh"
 fi
-if test "x$with_oracle" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
 
-       AC_CHECK_HEADERS(oci.h, [with_oracle="yes"], [with_oracle="no (oci.h not found)"])
+if test "x$with_oracle" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
+
+  AC_CHECK_HEADERS([oci.h],
+    [with_oracle="yes"],
+    [with_oracle="no (oci.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_oracle" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LIBS="$LIBS"
-       CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
-       LIBS="$LIBS $with_oracle_libs"
 
-       AC_CHECK_FUNC(OCIEnvCreate, [with_oracle="yes"], [with_oracle="no (Symbol 'OCIEnvCreate' not found)"])
+if test "x$with_oracle" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LIBS="$LIBS"
+  CPPFLAGS="$CPPFLAGS $with_oracle_cppflags"
+  LIBS="$LIBS $with_oracle_libs"
+
+  AC_CHECK_FUNC([OCIEnvCreate],
+    [with_oracle="yes"],
+    [with_oracle="no (Symbol 'OCIEnvCreate' not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LIBS="$SAVE_LIBS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LIBS="$SAVE_LIBS"
 fi
-if test "x$with_oracle" = "xyes"
-then
-       BUILD_WITH_ORACLE_CPPFLAGS="$with_oracle_cppflags"
-       BUILD_WITH_ORACLE_LIBS="$with_oracle_libs"
-       AC_SUBST(BUILD_WITH_ORACLE_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_ORACLE_LIBS)
+
+if test "x$with_oracle" = "xyes"; then
+  BUILD_WITH_ORACLE_CPPFLAGS="$with_oracle_cppflags"
+  BUILD_WITH_ORACLE_LIBS="$with_oracle_libs"
 fi
+
+AC_SUBST([BUILD_WITH_ORACLE_CPPFLAGS])
+AC_SUBST([BUILD_WITH_ORACLE_LIBS])
 # }}}
 
 # --with-libowcapi {{{
-with_libowcapi_cppflags=""
-with_libowcapi_ldflags=""
-AC_ARG_WITH(libowcapi, [AS_HELP_STRING([--with-libowcapi@<:@=PREFIX@:>@], [Path to libowcapi.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libowcapi_cppflags="-I$withval/include"
-               with_libowcapi_ldflags="-L$withval/lib"
-               with_libowcapi="yes"
-       else
-               with_libowcapi="$withval"
-       fi
-],
-[
-       with_libowcapi="yes"
-])
-if test "x$with_libowcapi" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libowcapi_cppflags"
+AC_ARG_WITH([libowcapi],
+  [AS_HELP_STRING([--with-libowcapi@<:@=PREFIX@:>@], [Path to libowcapi.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libowcapi_cppflags="-I$withval/include"
+      with_libowcapi_ldflags="-L$withval/lib"
+      with_libowcapi="yes"
+    else
+      with_libowcapi="$withval"
+    fi
+  ],
+  [with_libowcapi="yes"]
+)
 
-       AC_CHECK_HEADERS(owcapi.h, [with_libowcapi="yes"], [with_libowcapi="no (owcapi.h not found)"])
+if test "x$with_libowcapi" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libowcapi_cppflags"
+
+  AC_CHECK_HEADERS([owcapi.h],
+    [with_libowcapi="yes"],
+    [with_libowcapi="no (owcapi.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libowcapi" = "xyes"
-then
-       SAVE_LDFLAGS="$LDFLAGS"
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       LDFLAGS="$LDFLAGS $with_libowcapi_ldflags"
-       CPPFLAGS="$with_libowcapi_cppflags"
 
-       AC_CHECK_LIB(owcapi, OW_get, [with_libowcapi="yes"], [with_libowcapi="no (libowcapi not found)"])
+if test "x$with_libowcapi" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libowcapi_ldflags"
+
+  AC_CHECK_LIB([owcapi], [OW_get],
+    [with_libowcapi="yes"],
+    [with_libowcapi="no (libowcapi not found)"]
+  )
 
-       LDFLAGS="$SAVE_LDFLAGS"
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libowcapi" = "xyes"
-then
-       BUILD_WITH_LIBOWCAPI_CPPFLAGS="$with_libowcapi_cppflags"
-       BUILD_WITH_LIBOWCAPI_LDFLAGS="$with_libowcapi_ldflags"
-       BUILD_WITH_LIBOWCAPI_LIBS="-lowcapi"
-       AC_SUBST(BUILD_WITH_LIBOWCAPI_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBOWCAPI_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBOWCAPI_LIBS)
+
+if test "x$with_libowcapi" = "xyes"; then
+  BUILD_WITH_LIBOWCAPI_CPPFLAGS="$with_libowcapi_cppflags"
+  BUILD_WITH_LIBOWCAPI_LDFLAGS="$with_libowcapi_ldflags"
+  BUILD_WITH_LIBOWCAPI_LIBS="-lowcapi"
 fi
+
+AC_SUBST([BUILD_WITH_LIBOWCAPI_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBOWCAPI_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBOWCAPI_LIBS])
 # }}}
 
 # --with-libpcap {{{
-AC_ARG_WITH(libpcap, [AS_HELP_STRING([--with-libpcap@<:@=PREFIX@:>@], [Path to libpcap.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               LDFLAGS="$LDFLAGS -L$withval/lib"
-               CPPFLAGS="$CPPFLAGS -I$withval/include"
-               with_libpcap="yes"
-       else
-               with_libpcap="$withval"
-       fi
-],
-[
-       with_libpcap="yes"
-])
-if test "x$with_libpcap" = "xyes"
-then
-       AC_CHECK_LIB(pcap, pcap_open_live,
-       [
-               AC_DEFINE(HAVE_LIBPCAP, 1, [Define to 1 if you have the pcap library (-lpcap).])
-       ], [with_libpcap="no (libpcap not found)"])
+AC_ARG_WITH([libpcap],
+  [AS_HELP_STRING([--with-libpcap@<:@=PREFIX@:>@], [Path to libpcap.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libpcap_cppflags="-I$withval/include"
+      with_libpcap_ldflags="$LDFLAGS -L$withval/lib"
+      with_libpcap="yes"
+    else
+      with_libpcap="$withval"
+    fi
+  ],
+  [with_libpcap="yes"]
+)
+
+if test "x$with_libpcap" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libpcap_cppflags"
+
+  AC_CHECK_HEADERS([pcap.h],
+    [with_libpcap="yes"],
+    [with_libpcap="no (pcap.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libpcap" = "xyes"
-then
-       AC_CHECK_HEADERS(pcap.h,,
-                        [with_libpcap="no (pcap.h not found)"])
+
+if test "x$with_libpcap" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libpcap_ldflags"
+
+  AC_CHECK_LIB([pcap], [pcap_open_live],
+    [with_libpcap="yes"],
+    [with_libpcap="no (libpcap not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libpcap" = "xyes"
-then
-       AC_CACHE_CHECK([whether libpcap has PCAP_ERROR_IFACE_NOT_UP],
-                      [c_cv_libpcap_have_pcap_error_iface_not_up],
-                      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <pcap.h>
-]]],
-[[[
-  int val = PCAP_ERROR_IFACE_NOT_UP;
-  return(val);
-]]]
-                      )],
-                      [c_cv_libpcap_have_pcap_error_iface_not_up="yes"],
-                      [c_cv_libpcap_have_pcap_error_iface_not_up="no"]))
+
+if test "x$with_libpcap" = "xyes"; then
+  AC_CACHE_CHECK([whether libpcap has PCAP_ERROR_IFACE_NOT_UP],
+    [c_cv_libpcap_have_pcap_error_iface_not_up],
+    [
+      AC_COMPILE_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[#include <pcap.h>]],
+            [[
+              int val = PCAP_ERROR_IFACE_NOT_UP;
+              return(val);
+            ]]
+          )
+        ],
+        [c_cv_libpcap_have_pcap_error_iface_not_up="yes"],
+        [c_cv_libpcap_have_pcap_error_iface_not_up="no"]
+      )
+    ]
+  )
 fi
-if test "x$c_cv_libpcap_have_pcap_error_iface_not_up" != "xyes"
-then
-               with_libpcap="no (pcap.h misses PCAP_ERROR_IFACE_NOT_UP)"
+
+if test "x$c_cv_libpcap_have_pcap_error_iface_not_up" != "xyes"; then
+  with_libpcap="no (pcap.h misses PCAP_ERROR_IFACE_NOT_UP)"
+fi
+
+if test "x$with_libpcap" = "xyes"; then
+  BUILD_WITH_LIBPCAP_CPPFLAGS="$with_libpcap_cppflags"
+  BUILD_WITH_LIBPCAP_LDFLAGS="$with_libpcap_ldflags"
+  BUILD_WITH_LIBPCAP_LIBS="-lpcap"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBPCAP, test "x$with_libpcap" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBPCAP_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBPCAP_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBPCAP_LIBS])
 # }}}
 
 # --with-libperl {{{
-perl_interpreter="perl"
-AC_ARG_WITH(libperl, [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
-[
-       if test -f "$withval" && test -x "$withval"
-       then
-               perl_interpreter="$withval"
-               with_libperl="yes"
-       else if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               LDFLAGS="$LDFLAGS -L$withval/lib"
-               CPPFLAGS="$CPPFLAGS -I$withval/include"
-               perl_interpreter="$withval/bin/perl"
-               with_libperl="yes"
-       else
-               with_libperl="$withval"
-       fi; fi
-],
-[
-       with_libperl="yes"
-])
+AC_ARG_WITH([libperl],
+  [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      LDFLAGS="$LDFLAGS -L$withval/lib"
+      CPPFLAGS="$CPPFLAGS -I$withval/include"
+      with_libperl="yes"
+    else
+      with_libperl="$withval"
+    fi
+  ],
+  [with_libperl="yes"]
+)
 
-AC_MSG_CHECKING([for perl])
-perl_interpreter=`which "$perl_interpreter" 2> /dev/null`
-if test -x "$perl_interpreter"
-then
-       AC_MSG_RESULT([yes ($perl_interpreter)])
-else
-       perl_interpreter=""
-       AC_MSG_RESULT([no])
-fi
+AC_ARG_VAR([PERL], [path to Perl interpreter])
+AC_PATH_PROG([PERL], [perl])
 
-AC_SUBST(PERL, "$perl_interpreter")
+if test "x$PERL" = "x"; then
+  with_libperl="no (no Perl interpreter found)"
+fi
 
-if test "x$with_libperl" = "xyes" \
-       && test -n "$perl_interpreter"
-then
+if test "x$with_libperl" = "xyes"; then
   SAVE_CFLAGS="$CFLAGS"
   SAVE_LIBS="$LIBS"
-dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string)
-  PERL_CFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e perl_inc`
-  PERL_LIBS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ldopts`
+  dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string)
+  PERL_CFLAGS=`ARCHFLAGS="" $PERL -MExtUtils::Embed -e perl_inc`
+  PERL_LIBS=`ARCHFLAGS="" $PERL -MExtUtils::Embed -e ldopts`
   CFLAGS="$CFLAGS $PERL_CFLAGS"
   LIBS="$LIBS $PERL_LIBS"
 
   AC_CACHE_CHECK([for libperl],
     [c_cv_have_libperl],
-    AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[[
-#define PERL_NO_GET_CONTEXT
-#include <EXTERN.h>
-#include <perl.h>
-#include <XSUB.h>
-]]],
-[[[
-       dTHX;
-       load_module (PERL_LOADMOD_NOIMPORT,
-                        newSVpv ("Collectd::Plugin::FooBar", 24),
-                        Nullsv);
-]]]
-      )],
-      [c_cv_have_libperl="yes"],
-      [c_cv_have_libperl="no"]
-    )
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #define PERL_NO_GET_CONTEXT
+              #include <EXTERN.h>
+              #include <perl.h>
+              #include <XSUB.h>
+            ]],
+            [[
+              dTHX;
+              load_module (PERL_LOADMOD_NOIMPORT,
+                newSVpv ("Collectd::Plugin::FooBar", 24),
+                Nullsv);
+            ]]
+          )
+        ],
+        [c_cv_have_libperl="yes"],
+        [c_cv_have_libperl="no"]
+      )
+    ]
   )
 
-  if test "x$c_cv_have_libperl" = "xyes"
-  then
-         AC_DEFINE(HAVE_LIBPERL, 1, [Define if libperl is present and usable.])
-         AC_SUBST(PERL_CFLAGS)
-         AC_SUBST(PERL_LIBS)
-  else
-         with_libperl="no"
+  CFLAGS="$SAVE_CFLAGS"
+  LIBS="$SAVE_LIBS"
+
+  if test "x$c_cv_have_libperl" = "xno"; then
+    with_libperl="no"
   fi
+fi
+
+if test "x$with_libperl" = "xyes"; then
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LIBS="$LIBS"
+  CFLAGS="$CFLAGS $PERL_CFLAGS"
+  LIBS="$LIBS $PERL_LIBS"
+
+  AC_CACHE_CHECK([if Perl supports ithreads],
+    [c_cv_have_perl_ithreads],
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <EXTERN.h>
+              #include <perl.h>
+              #include <XSUB.h>
+
+              #if !defined(USE_ITHREADS)
+              # error "Perl does not support ithreads!"
+              #endif /* !defined(USE_ITHREADS) */
+            ]],
+            []
+          )
+        ],
+        [c_cv_have_perl_ithreads="yes"],
+        [c_cv_have_perl_ithreads="no"]
+      )
+    ]
+  )
 
   CFLAGS="$SAVE_CFLAGS"
   LIBS="$SAVE_LIBS"
-else if test -z "$perl_interpreter"; then
-  with_libperl="no (no perl interpreter found)"
-  c_cv_have_libperl="no"
-fi; fi
-AM_CONDITIONAL(BUILD_WITH_LIBPERL, test "x$with_libperl" = "xyes")
+fi
 
-if test "x$with_libperl" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LIBS="$LIBS"
-       CFLAGS="$CFLAGS $PERL_CFLAGS"
-       LIBS="$LIBS $PERL_LIBS"
-
-       AC_CACHE_CHECK([if perl supports ithreads],
-               [c_cv_have_perl_ithreads],
-               AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <EXTERN.h>
-#include <perl.h>
-#include <XSUB.h>
+if test "x$with_libperl" = "xyes"; then
+  # trigger an error if Perl_load_module*() uses __attribute__nonnull__(3)
+  # (see issues #41 and #42)
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LIBS="$LIBS"
+  CFLAGS="$CFLAGS $PERL_CFLAGS -Wall -Werror"
+  LIBS="$LIBS $PERL_LIBS"
 
-#if !defined(USE_ITHREADS)
-# error "Perl does not support ithreads!"
-#endif /* !defined(USE_ITHREADS) */
-]]],
-[[[ ]]]
-                       )],
-                       [c_cv_have_perl_ithreads="yes"],
-                       [c_cv_have_perl_ithreads="no"]
-               )
-       )
+  AC_CACHE_CHECK([for broken Perl_load_module()],
+    [c_cv_have_broken_perl_load_module],
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #define PERL_NO_GET_CONTEXT
+              #include <EXTERN.h>
+              #include <perl.h>
+              #include <XSUB.h>
+            ]],
+            [[
+              dTHX;
+              load_module (PERL_LOADMOD_NOIMPORT,
+                newSVpv ("Collectd::Plugin::FooBar", 24),
+                Nullsv);
+            ]]
+          )
+        ],
+        [c_cv_have_broken_perl_load_module="no"],
+        [c_cv_have_broken_perl_load_module="yes"]
+      )
+    ]
+  )
+
+  CFLAGS="$SAVE_CFLAGS"
+  LIBS="$SAVE_LIBS"
+fi
+
+if test "x$c_cv_have_broken_perl_load_module" = "xyes"; then
+  PERL_CFLAGS="$PERL_CFLAGS -Wno-nonnull"
+fi
 
-       if test "x$c_cv_have_perl_ithreads" = "xyes"
-       then
-               AC_DEFINE(HAVE_PERL_ITHREADS, 1, [Define if Perl supports ithreads.])
-       fi
+if test "x$with_libperl" = "xyes"; then
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LIBS="$LIBS"
+  CFLAGS="$CFLAGS $PERL_CFLAGS"
+  LIBS="$LIBS $PERL_LIBS"
+
+  AC_CHECK_MEMBER(
+    [struct mgvtbl.svt_local],
+    [have_struct_mgvtbl_svt_local="yes"],
+    [have_struct_mgvtbl_svt_local="no"],
+    [[
+      #include <EXTERN.h>
+      #include <perl.h>
+      #include <XSUB.h>
+    ]]
+  )
 
-       CFLAGS="$SAVE_CFLAGS"
-       LIBS="$SAVE_LIBS"
+  if test "x$have_struct_mgvtbl_svt_local" = "xyes"; then
+    AC_DEFINE([HAVE_PERL_STRUCT_MGVTBL_SVT_LOCAL], [1], [Define if Perls struct mgvtbl has member svt_local.])
+  fi
+
+  CFLAGS="$SAVE_CFLAGS"
+  LIBS="$SAVE_LIBS"
 fi
+AC_SUBST([PERL_CFLAGS])
+AC_SUBST([PERL_LIBS])
+
+# }}}
+
+# --with-libpq {{{
+with_pg_config="pg_config"
+AC_ARG_WITH([libpq],
+  [AS_HELP_STRING([--with-libpq@<:@=PREFIX@:>@], [Path to libpq.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_libpq="$withval"
+    else
+      if test -f "$withval" && test -x "$withval"; then
+        with_pg_config="$withval"
+      else if test -x "$withval/bin/pg_config"; then
+        with_pg_config="$withval/bin/pg_config"
+      fi; fi
+      with_libpq="yes"
+    fi
+  ],
+  [with_libpq="yes"]
+)
+
+if test "x$with_libpq" = "xyes"; then
+  with_libpq_includedir=`$with_pg_config --includedir 2> /dev/null`
+  pg_config_status=$?
+
+  if test $pg_config_status -eq 0; then
+    if test -n "$with_libpq_includedir"; then
+      for dir in $with_libpq_includedir; do
+        with_libpq_cppflags="$with_libpq_cppflags -I$dir"
+      done
+    fi
+  else
+    AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
+  fi
 
-if test "x$with_libperl" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LIBS="$LIBS"
-       # trigger an error if Perl_load_module*() uses __attribute__nonnull__(3)
-       # (see issues #41 and #42)
-       CFLAGS="$CFLAGS $PERL_CFLAGS -Wall -Werror"
-       LIBS="$LIBS $PERL_LIBS"
-
-       AC_CACHE_CHECK([for broken Perl_load_module()],
-               [c_cv_have_broken_perl_load_module],
-               AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[[
-#define PERL_NO_GET_CONTEXT
-#include <EXTERN.h>
-#include <perl.h>
-#include <XSUB.h>
-]]],
-[[[
-                        dTHX;
-                        load_module (PERL_LOADMOD_NOIMPORT,
-                            newSVpv ("Collectd::Plugin::FooBar", 24),
-                            Nullsv);
-]]]
-                       )],
-                       [c_cv_have_broken_perl_load_module="no"],
-                       [c_cv_have_broken_perl_load_module="yes"]
-               )
-       )
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libpq_cppflags"
 
-       CFLAGS="$SAVE_CFLAGS"
-       LIBS="$SAVE_LIBS"
-fi
-AM_CONDITIONAL(HAVE_BROKEN_PERL_LOAD_MODULE,
-               test "x$c_cv_have_broken_perl_load_module" = "xyes")
+  AC_CHECK_HEADERS([libpq-fe.h],
+    [with_libpq="yes"],
+    [with_libpq="no (libpq-fe.h not found)"]
+  )
 
-if test "x$with_libperl" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LIBS="$LIBS"
-       CFLAGS="$CFLAGS $PERL_CFLAGS"
-       LIBS="$LIBS $PERL_LIBS"
-
-       AC_CHECK_MEMBER(
-               [struct mgvtbl.svt_local],
-               [have_struct_mgvtbl_svt_local="yes"],
-               [have_struct_mgvtbl_svt_local="no"],
-               [
-#include <EXTERN.h>
-#include <perl.h>
-#include <XSUB.h>
-               ])
-
-       if test "x$have_struct_mgvtbl_svt_local" = "xyes"
-       then
-               AC_DEFINE(HAVE_PERL_STRUCT_MGVTBL_SVT_LOCAL, 1,
-                                 [Define if Perl's struct mgvtbl has member svt_local.])
-       fi
-
-       CFLAGS="$SAVE_CFLAGS"
-       LIBS="$SAVE_LIBS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-# }}}
 
-# --with-libpq {{{
-with_pg_config="pg_config"
-with_libpq_includedir=""
-with_libpq_libdir=""
-with_libpq_cppflags=""
-with_libpq_ldflags=""
-AC_ARG_WITH(libpq, [AS_HELP_STRING([--with-libpq@<:@=PREFIX@:>@],
-       [Path to libpq.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libpq="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libpq="yes"
-       else
-               if test -f "$withval" && test -x "$withval";
-               then
-                       with_pg_config="$withval"
-               else if test -x "$withval/bin/pg_config"
-               then
-                       with_pg_config="$withval/bin/pg_config"
-               fi; fi
-               with_libpq="yes"
-       fi; fi
-],
-[
-       with_libpq="yes"
-])
-if test "x$with_libpq" = "xyes"
-then
-       with_libpq_includedir=`$with_pg_config --includedir 2> /dev/null`
-       pg_config_status=$?
+if test "x$with_libpq" = "xyes"; then
+  with_libpq_libdir=`$with_pg_config --libdir 2> /dev/null`
+  pg_config_status=$?
 
-       if test $pg_config_status -eq 0
-       then
-               if test -n "$with_libpq_includedir"; then
-                       for dir in $with_libpq_includedir; do
-                               with_libpq_cppflags="$with_libpq_cppflags -I$dir"
-                       done
-               fi
-       else
-               AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
-       fi
+  if test $pg_config_status -eq 0
+  then
+    if test -n "$with_libpq_libdir"; then
+      for dir in $with_libpq_libdir; do
+        with_libpq_ldflags="$with_libpq_ldflags -L$dir"
+      done
+    fi
+  else
+    AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
+  fi
 
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libpq_cppflags"
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libpq_ldflags"
 
-       AC_CHECK_HEADERS(libpq-fe.h, [],
-               [with_libpq="no (libpq-fe.h not found)"], [])
+  AC_CHECK_LIB([pq], [PQserverVersion],
+    [with_libpq="yes"],
+    [with_libpq="no (symbol 'PQserverVersion' not found)"])
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libpq" = "xyes"
-then
-       with_libpq_libdir=`$with_pg_config --libdir 2> /dev/null`
-       pg_config_status=$?
-
-       if test $pg_config_status -eq 0
-       then
-               if test -n "$with_libpq_libdir"; then
-                       for dir in $with_libpq_libdir; do
-                               with_libpq_ldflags="$with_libpq_ldflags -L$dir"
-                       done
-               fi
-       else
-               AC_MSG_WARN([$with_pg_config returned with status $pg_config_status])
-       fi
-
-       SAVE_LDFLAGS="$LDFLAGS"
-       LDFLAGS="$LDFLAGS $with_libpq_ldflags"
-
-       AC_CHECK_LIB(pq, PQconnectdb,
-               [with_libpq="yes"],
-               [with_libpq="no (symbol 'PQconnectdb' not found)"])
-
-       AC_CHECK_LIB(pq, PQserverVersion,
-               [with_libpq="yes"],
-               [with_libpq="no (symbol 'PQserverVersion' not found)"])
-
-       LDFLAGS="$SAVE_LDFLAGS"
-fi
-if test "x$with_libpq" = "xyes"
-then
-       BUILD_WITH_LIBPQ_CPPFLAGS="$with_libpq_cppflags"
-       BUILD_WITH_LIBPQ_LDFLAGS="$with_libpq_ldflags"
-       AC_SUBST(BUILD_WITH_LIBPQ_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBPQ_LDFLAGS)
+
+if test "x$with_libpq" = "xyes"; then
+  BUILD_WITH_LIBPQ_CPPFLAGS="$with_libpq_cppflags"
+  BUILD_WITH_LIBPQ_LDFLAGS="$with_libpq_ldflags"
+  BUILD_WITH_LIBPQ_LIBS="-lpq"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBPQ, test "x$with_libpq" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBPQ_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBPQ_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBPQ_LIBS])
 # }}}
 
 # --with-libpqos {{{
-with_libpqos_cppflags=""
-with_libpqos_ldflags=""
-AC_ARG_WITH(libpqos, [AS_HELP_STRING([--with-libpqos@<:@=PREFIX@:>@], [Path to libpqos.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libpqos_cppflags="-I$withval/include"
-               with_libpqos_ldflags="-L$withval/lib"
-               with_libpqos="yes"
-       else
-               with_libpqos="$withval"
-       fi
-],
-[
-       with_libpqos="yes"
-])
-if test "x$with_libpqos" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libpqos_cppflags"
+AC_ARG_WITH([libpqos],
+  [AS_HELP_STRING([--with-libpqos@<:@=PREFIX@:>@], [Path to libpqos.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libpqos_cppflags="-I$withval/include"
+      with_libpqos_ldflags="-L$withval/lib"
+      with_libpqos="yes"
+    else
+      with_libpqos="$withval"
+    fi
+  ],
+  [with_libpqos="yes"]
+)
 
-       AC_CHECK_HEADERS(pqos.h, [with_libpqos="yes"], [with_libpqos="no (pqos.h not found)"])
+if test "x$with_libpqos" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libpqos_cppflags"
+
+  AC_CHECK_HEADERS([pqos.h],
+    [with_libpqos="yes"],
+    [with_libpqos="no (pqos.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libpqos" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libpqos_cppflags"
-       LDFLAGS="$LDFLAGS $with_libpqos_ldflags"
 
-       AC_CHECK_LIB(pqos, pqos_init, [with_libpqos="yes"], [with_libpqos="no (Can't find libpqos)"])
+if test "x$with_libpqos" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libpqos_ldflags"
+
+  AC_CHECK_LIB([pqos], [pqos_init],
+    [with_libpqos="yes"],
+    [with_libpqos="no (Can't find libpqos)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libpqos" = "xyes"
-then
+
+if test "x$with_libpqos" = "xyes"; then
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $with_libpqos_cppflags"
-  AC_RUN_IFELSE([AC_LANG_PROGRAM(
-    [[#include <pqos.h>]],
-    [[return !(PQOS_VERSION >= 106)]])],
-    [with_libpqos="yes"], [with_libpqos="no (pqos library version 1.06 or higher is required)"])
+  AC_PREPROC_IFELSE(
+    [
+      AC_LANG_SOURCE(
+        [[
+          #include <pqos.h>
+          #if PQOS_VERSION < 106
+          #error "required PQOS version >= 1.06"
+          #endif
+        ]]
+      )
+    ],
+    [with_libpqos="yes"],
+    [with_libpqos="no (pqos library version 1.06 or higher is required)"]
+  )
+
   CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libpqos" = "xyes"
-then
-       BUILD_WITH_LIBPQOS_CPPFLAGS="$with_libpqos_cppflags"
-       BUILD_WITH_LIBPQOS_LDFLAGS="$with_libpqos_ldflags"
-       BUILD_WITH_LIBPQOS_LIBS="-lpqos"
-       AC_SUBST(BUILD_WITH_LIBPQOS_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBPQOS_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBPQOS_LIBS)
+
+if test "x$with_libpqos" = "xyes"; then
+  BUILD_WITH_LIBPQOS_CPPFLAGS="$with_libpqos_cppflags"
+  BUILD_WITH_LIBPQOS_LDFLAGS="$with_libpqos_ldflags"
+  BUILD_WITH_LIBPQOS_LIBS="-lpqos"
 fi
+
+AC_SUBST([BUILD_WITH_LIBPQOS_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBPQOS_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBPQOS_LIBS])
 # }}}
 
 # --with-libprotobuf {{{
 with_libprotobuf_cppflags=""
 with_libprotobuf_ldflags=""
-AC_ARG_WITH([libprotobuf], [AS_HELP_STRING([--with-libprotobuf@<:@=PREFIX@:>@], [Path to libprotobuf.])],
+AC_ARG_WITH([libprotobuf],
+  [AS_HELP_STRING([--with-libprotobuf@<:@=PREFIX@:>@], [Path to libprotobuf.])],
   [
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
       with_libprotobuf_cppflags="-I$withval/include"
       with_libprotobuf_ldflags="-L$withval/lib"
       with_libprotobuf="yes"
     fi
-    if test "x$withval" = "xno"
-    then
+    if test "x$withval" = "xno"; then
       with_libprotobuf="no (disabled on command line)"
     fi
   ],
   [withval="yes"]
 )
-if test "x$withval" = "xyes"
-then
-PKG_CHECK_MODULES([PROTOBUF], [protobuf],
-  [with_libprotobuf="yes"],
-  [with_libprotobuf="no (pkg-config could not find libprotobuf)"]
-)
+
+if test "x$withval" = "xyes"; then
+  PKG_CHECK_MODULES([PROTOBUF], [protobuf],
+    [with_libprotobuf="yes"],
+    [with_libprotobuf="no (pkg-config could not find libprotobuf)"]
+  )
 fi
 
-if test "x$withval" != "xno"
-then
+if test "x$withval" != "xno"; then
   SAVE_LDFLAGS="$LDFLAGS"
   SAVE_LIBS="$LIBS"
   LDFLAGS="$with_libprotobuf_ldflags"
@@ -4399,6 +4480,7 @@ then
   LDFLAGS="$SAVE_LDFLAGS"
   LIBS="$SAVE_LIBS"
 fi
+
 BUILD_WITH_LIBPROTOBUF_CPPFLAGS="$with_libprotobuf_cppflags $PROTOBUF_CFLAGS"
 BUILD_WITH_LIBPROTOBUF_LDFLAGS="$with_libprotobuf_ldflags"
 BUILD_WITH_LIBPROTOBUF_LIBS="$PROTOBUF_LIBS"
@@ -4407,34 +4489,46 @@ AC_SUBST([BUILD_WITH_LIBPROTOBUF_LDFLAGS])
 AC_SUBST([BUILD_WITH_LIBPROTOBUF_LIBS])
 # }}}
 
+AC_ARG_VAR([PROTOC], [path to the protoc binary])
+AC_PATH_PROG([PROTOC], [protoc])
+have_protoc3="no"
+if test "x$PROTOC" != "x"; then
+  AC_MSG_CHECKING([for protoc 3.0.0+])
+  if $PROTOC --version | $EGREP libprotoc.3 >/dev/null; then
+    protoc3="yes (`$PROTOC --version`)"
+    have_protoc3="yes"
+  else
+    protoc3="no (`$PROTOC --version`)"
+  fi
+  AC_MSG_RESULT([$protoc3])
+fi
+AM_CONDITIONAL([HAVE_PROTOC3], [test "x$have_protoc3" = "xyes"])
+
 # --with-libprotobuf-c {{{
-with_libprotobuf_c_cppflags=""
-with_libprotobuf_c_ldflags=""
-AC_ARG_WITH([libprotobuf-c], [AS_HELP_STRING([--with-libprotobuf-c@<:@=PREFIX@:>@], [Path to libprotobuf-c.])],
+AC_ARG_WITH([libprotobuf-c],
+  [AS_HELP_STRING([--with-libprotobuf-c@<:@=PREFIX@:>@], [Path to libprotobuf-c.])],
   [
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
       with_libprotobuf_c_cppflags="-I$withval/include"
       with_libprotobuf_c_ldflags="-L$withval/lib"
       with_libprotobuf_c="yes"
     fi
-    if test "x$withval" = "xno"
-    then
+
+    if test "x$withval" = "xno"; then
       with_libprotobuf_c="no (disabled on command line)"
     fi
   ],
   [withval="yes"]
 )
-if test "x$withval" = "xyes"
-then
-PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c],
-  [with_libprotobuf_c="yes"],
-  [with_libprotobuf_c="no (pkg-config could not find libprotobuf-c)"]
-)
+
+if test "x$withval" = "xyes"; then
+  PKG_CHECK_MODULES([PROTOBUF_C], [libprotobuf-c],
+    [with_libprotobuf_c="yes"],
+    [with_libprotobuf_c="no (pkg-config could not find libprotobuf-c)"]
+  )
 fi
 
-if test "x$withval" != "xno"
-then
+if test "x$withval" != "xno"; then
   SAVE_LDFLAGS="$LDFLAGS"
   SAVE_LIBS="$LIBS"
   LDFLAGS="$with_libprotobuf_c_ldflags"
@@ -4443,10 +4537,10 @@ then
     [
       SAVE_CPPFLAGS="$CPPFLAGS"
       CPPFLAGS="$with_libprotobuf_c_cppflags $PROTOBUF_C_CFLAGS"
-      if test "x$PROTOBUF_C_LIBS" = "x"
-      then
+      if test "x$PROTOBUF_C_LIBS" = "x"; then
         PROTOBUF_C_LIBS="-lprotobuf-c"
       fi
+
       AC_CHECK_HEADERS([protobuf-c/protobuf-c.h google/protobuf-c/protobuf-c.h],
         [
           with_libprotobuf_c="yes"
@@ -4454,6 +4548,7 @@ then
         ],
         [with_libprotobuf_c="no (<protobuf-c.h> not found)"]
       )
+
       CPPFLAGS="$SAVE_CPPFLAGS"
     ],
     [with_libprotobuf_c="no (libprotobuf-c not found)"]
@@ -4461,6 +4556,7 @@ then
   LDFLAGS="$SAVE_LDFLAGS"
   LIBS="$SAVE_LIBS"
 fi
+
 BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS="$with_libprotobuf_c_cppflags $PROTOBUF_C_CFLAGS"
 BUILD_WITH_LIBPROTOBUF_C_LDFLAGS="$with_libprotobuf_c_ldflags"
 BUILD_WITH_LIBPROTOBUF_C_LIBS="$PROTOBUF_C_LIBS"
@@ -4469,18 +4565,26 @@ AC_SUBST([BUILD_WITH_LIBPROTOBUF_C_LDFLAGS])
 AC_SUBST([BUILD_WITH_LIBPROTOBUF_C_LIBS])
 # }}}
 
+AC_ARG_VAR([PROTOC_C], [path to the protoc-c binary])
+AC_PATH_PROG([PROTOC_C], [protoc-c])
+if test "x$PROTOC_C" = "x"
+then
+  have_protoc_c="no (protoc-c compiler not found)"
+else
+  have_protoc_c="yes"
+fi
+
 # --with-libpython {{{
 AC_ARG_VAR([LIBPYTHON_CPPFLAGS], [Preprocessor flags for libpython])
 AC_ARG_VAR([LIBPYTHON_LDFLAGS], [Linker flags for libpython])
 AC_ARG_VAR([LIBPYTHON_LIBS], [Libraries for libpython])
 
 AC_ARG_WITH([libpython],
-  [AS_HELP_STRING([--with-libpython],
-    [if we should build with libpython @<:@default=yes@:>@])
-  ],
+  [AS_HELP_STRING([--with-libpython], [if we should build with libpython @<:@default=yes@:>@])],
   [with_libpython="$withval"],
   [with_libpython="check"]
 )
+
 if test "$with_libpython" != "no"; then
   if test "$LIBPYTHON_CPPFLAGS" = "" && test "$LIBPYTHON_LDFLAGS" = ""; then
     AC_ARG_VAR([PYTHON_CONFIG], [path to python-config])
@@ -4518,6 +4622,7 @@ if test "$with_libpython" != "xno"; then
   CPPFLAGS="$LIBPYTHON_CPPFLAGS $CPPFLAGS"
   LDFLAGS="$LIBPYTHON_LDFLAGS $LDFLAGS"
   LIBS="$LIBPYTHON_LIBS $LIBS"
+
   AC_CHECK_HEADERS([Python.h],
     [
       AC_MSG_CHECKING([for libpython])
@@ -4532,6 +4637,7 @@ if test "$with_libpython" != "xno"; then
     ],
     [with_libpython="no"]
   )
+
   CPPFLAGS="$SAVE_CPPFLAGS"
   LDFLAGS="$SAVE_LDFLAGS"
   LIBS="$SAVE_LIBS"
 # }}} --with-libpython
 
 # --with-librabbitmq {{{
-with_librabbitmq_cppflags=""
-with_librabbitmq_ldflags=""
-AC_ARG_WITH(librabbitmq, [AS_HELP_STRING([--with-librabbitmq@<:@=PREFIX@:>@], [Path to librabbitmq.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_librabbitmq_cppflags="-I$withval/include"
-               with_librabbitmq_ldflags="-L$withval/lib"
-               with_librabbitmq="yes"
-       else
-               with_librabbitmq="$withval"
-       fi
-],
-[
-       with_librabbitmq="yes"
-])
-SAVE_CPPFLAGS="$CPPFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
-CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
-LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
-if test "x$with_librabbitmq" = "xyes"
-then
-       AC_CHECK_HEADERS(amqp.h, [with_librabbitmq="yes"], [with_librabbitmq="no (amqp.h not found)"])
+AC_ARG_WITH([librabbitmq],
+  [AS_HELP_STRING([--with-librabbitmq@<:@=PREFIX@:>@], [Path to librabbitmq.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_librabbitmq_cppflags="-I$withval/include"
+      with_librabbitmq_ldflags="-L$withval/lib"
+      with_librabbitmq="yes"
+    else
+      with_librabbitmq="$withval"
+    fi
+  ],
+  [with_librabbitmq="yes"]
+)
+
+if test "x$with_librabbitmq" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
+
+  AC_CHECK_HEADERS([amqp.h],
+    [with_librabbitmq="yes"],
+    [with_librabbitmq="no (amqp.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_librabbitmq" = "xyes"
-then
-       # librabbitmq up to version 0.9.1 provides "library_errno", later
-       # versions use "library_error". The library does not provide a version
-       # macro :( Use "AC_CHECK_MEMBERS" (plural) for automatic defines.
-       AC_CHECK_MEMBERS([amqp_rpc_reply_t.library_errno],,,
-                        [
-#if HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-#if HAVE_STDIO_H
-# include <stdio.h>
-#endif
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#include <amqp.h>
-                         ])
+
+if test "x$with_librabbitmq" = "xyes"; then
+  # librabbitmq up to version 0.9.1 provides "library_errno", later
+  # versions use "library_error". The library does not provide a version
+  # macro :(.
+
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
+
+  AC_CHECK_MEMBERS([amqp_rpc_reply_t.library_errno],
+    [],
+    [],
+    [[
+      #include <stdlib.h>
+      #include <stdio.h>
+      #include <stdint.h>
+      #include <inttypes.h>
+      #include <amqp.h>
+    ]]
+  )
+  CPPFLAGS="$SAVE_CPPFLAGS"
+
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
+
+  AC_CHECK_LIB([rabbitmq], [amqp_basic_publish],
+    [with_librabbitmq="yes"],
+    [with_librabbitmq="no (Symbol 'amqp_basic_publish' not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_librabbitmq" = "xyes"
-then
-       AC_CHECK_LIB(rabbitmq, amqp_basic_publish, [with_librabbitmq="yes"], [with_librabbitmq="no (Symbol 'amqp_basic_publish' not found)"])
+
+if test "x$with_librabbitmq" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  SAVE_LIBS="$LIBS"
+  CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
+  LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
+  LIBS="-lrabbitmq"
+
+  AC_CHECK_HEADERS([amqp_tcp_socket.h amqp_socket.h])
+  AC_CHECK_FUNC([amqp_tcp_socket_new],
+    [
+      AC_DEFINE([HAVE_AMQP_TCP_SOCKET], [1],
+        [Define if librabbitmq provides the new TCP socket interface.])
+    ]
+  )
+
+  AC_CHECK_DECLS([amqp_socket_close],
+    [],
+    [],
+    [[
+      #include <amqp.h>
+      #ifdef HAVE_AMQP_TCP_SOCKET_H
+      # include <amqp_tcp_socket.h>
+      #endif
+      #ifdef HAVE_AMQP_SOCKET_H
+      # include <amqp_socket.h>
+      #endif
+    ]]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
+  LIBS="$SAVE_LIBS"
 fi
-if test "x$with_librabbitmq" = "xyes"
-then
-       BUILD_WITH_LIBRABBITMQ_CPPFLAGS="$with_librabbitmq_cppflags"
-       BUILD_WITH_LIBRABBITMQ_LDFLAGS="$with_librabbitmq_ldflags"
-       BUILD_WITH_LIBRABBITMQ_LIBS="-lrabbitmq"
-       AC_SUBST(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBRABBITMQ_LIBS)
-       AC_DEFINE(HAVE_LIBRABBITMQ, 1, [Define if librabbitmq is present and usable.])
+
+if test "x$with_librabbitmq" = "xyes"; then
+  BUILD_WITH_LIBRABBITMQ_CPPFLAGS="$with_librabbitmq_cppflags"
+  BUILD_WITH_LIBRABBITMQ_LDFLAGS="$with_librabbitmq_ldflags"
+  BUILD_WITH_LIBRABBITMQ_LIBS="-lrabbitmq"
 fi
-CPPFLAGS="$SAVE_CPPFLAGS"
-LDFLAGS="$SAVE_LDFLAGS"
-AM_CONDITIONAL(BUILD_WITH_LIBRABBITMQ, test "x$with_librabbitmq" = "xyes")
 
-with_amqp_tcp_socket="no"
-if test "x$with_librabbitmq" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       SAVE_LIBS="$LIBS"
-       CPPFLAGS="$CPPFLAGS $with_librabbitmq_cppflags"
-       LDFLAGS="$LDFLAGS $with_librabbitmq_ldflags"
-       LIBS="-lrabbitmq"
-
-       AC_CHECK_HEADERS(amqp_tcp_socket.h amqp_socket.h)
-       AC_CHECK_FUNC(amqp_tcp_socket_new, [with_amqp_tcp_socket="yes"], [with_amqp_tcp_socket="no"])
-       if test "x$with_amqp_tcp_socket" = "xyes"
-       then
-               AC_DEFINE(HAVE_AMQP_TCP_SOCKET, 1,
-                               [Define if librabbitmq provides the new TCP socket interface.])
-       fi
-
-       AC_CHECK_DECLS(amqp_socket_close,
-                               [amqp_socket_close_decl="yes"], [amqp_socket_close_decl="no"],
-                               [[
-#include <amqp.h>
-#ifdef HAVE_AMQP_TCP_SOCKET_H
-# include <amqp_tcp_socket.h>
-#endif
-#ifdef HAVE_AMQP_SOCKET_H
-# include <amqp_socket.h>
-#endif
-                               ]])
+AC_SUBST(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
+AC_SUBST(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
+AC_SUBST(BUILD_WITH_LIBRABBITMQ_LIBS)
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
-       LIBS="$SAVE_LIBS"
-fi
 # }}}
 
 # --with-librdkafka {{{
-AC_ARG_WITH(librdkafka, [AS_HELP_STRING([--with-librdkafka@<:@=PREFIX@:>@], [Path to librdkafka.])],
-[
-  if test "x$withval" != "xno" && test "x$withval" != "xyes"
-  then
-    with_librdkafka_cppflags="-I$withval/include"
-    with_librdkafka_ldflags="-L$withval/lib"
-    with_librdkafka_rpath="$withval/lib"
-    with_librdkafka="yes"
-  else
-    with_librdkafka="$withval"
-  fi
-],
-[
-  with_librdkafka="yes"
-])
-SAVE_CPPFLAGS="$CPPFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
+AC_ARG_WITH([librdkafka],
+  [AS_HELP_STRING([--with-librdkafka@<:@=PREFIX@:>@], [Path to librdkafka.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_librdkafka_cppflags="-I$withval/include"
+      with_librdkafka_ldflags="-L$withval/lib"
+      with_librdkafka_rpath="$withval/lib"
+      with_librdkafka="yes"
+    else
+      with_librdkafka="$withval"
+    fi
+  ],
+  [with_librdkafka="yes"]
+)
 
-CPPFLAGS="$CPPFLAGS $with_librdkafka_cppflags"
-LDFLAGS="$LDFLAGS $with_librdkafka_ldflags"
+if test "x$with_librdkafka" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_librdkafka_cppflags"
 
-if test "x$with_librdkafka" = "xyes"
-then
-       AC_CHECK_HEADERS(librdkafka/rdkafka.h, [with_librdkafka="yes"], [with_librdkafka="no (librdkafka/rdkafka.h not found)"])
+  AC_CHECK_HEADERS([librdkafka/rdkafka.h],
+    [with_librdkafka="yes"],
+    [with_librdkafka="no (librdkafka/rdkafka.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-if test "x$with_librdkafka" = "xyes"
-then
-       AC_CHECK_LIB(rdkafka, rd_kafka_new, [with_librdkafka="yes"], [with_librdkafka="no (Symbol 'rd_kafka_new' not found)"])
-  AC_CHECK_LIB(rdkafka, rd_kafka_conf_set_log_cb, [with_librdkafka_log_cb="yes"], [with_librdkafka_log_cb="no"])
-  AC_CHECK_LIB(rdkafka, rd_kafka_set_logger, [with_librdkafka_logger="yes"], [with_librdkafka_logger="no"])
+if test "x$with_librdkafka" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_librdkafka_ldflags"
+
+  AC_CHECK_LIB([rdkafka], [rd_kafka_new],
+    [with_librdkafka="yes"],
+    [with_librdkafka="no (Symbol 'rd_kafka_new' not found)"])
+
+  AC_CHECK_LIB([rdkafka], [rd_kafka_conf_set_log_cb],
+    [with_librdkafka_log_cb="yes"],
+    [with_librdkafka_log_cb="no"])
+
+  AC_CHECK_LIB([rdkafka], [rd_kafka_set_logger],
+    [with_librdkafka_logger="yes"],
+    [with_librdkafka_logger="no"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_librdkafka" = "xyes"
-then
-       BUILD_WITH_LIBRDKAFKA_CPPFLAGS="$with_librdkafka_cppflags"
-       BUILD_WITH_LIBRDKAFKA_LDFLAGS="$with_librdkafka_ldflags"
-       if test "x$with_librdkafka_rpath" != "x"
-       then
-               BUILD_WITH_LIBRDKAFKA_LIBS="-Wl,-rpath,$with_librdkafka_rpath -lrdkafka"
-       else
-               BUILD_WITH_LIBRDKAFKA_LIBS="-lrdkafka"
-       fi
-       AC_SUBST(BUILD_WITH_LIBRDKAFKA_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBRDKAFKA_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBRDKAFKA_LIBS)
-       AC_DEFINE(HAVE_LIBRDKAFKA, 1, [Define if librdkafka is present and usable.])
-  if test "x$with_librdkafka_log_cb" = "xyes"
-  then
-        AC_DEFINE(HAVE_LIBRDKAFKA_LOG_CB, 1, [Define if librdkafka log facility is present and usable.])
-  else if test "x$with_librdkafka_logger" = "xyes"
-  then
-        AC_DEFINE(HAVE_LIBRDKAFKA_LOGGER, 1, [Define if librdkafka log facility is present and usable.])
+
+if test "x$with_librdkafka" = "xyes"; then
+  BUILD_WITH_LIBRDKAFKA_CPPFLAGS="$with_librdkafka_cppflags"
+  BUILD_WITH_LIBRDKAFKA_LDFLAGS="$with_librdkafka_ldflags"
+
+  if test "x$with_librdkafka_rpath" != "x"; then
+    BUILD_WITH_LIBRDKAFKA_LIBS="-Wl,-rpath,$with_librdkafka_rpath -lrdkafka"
+  else
+    BUILD_WITH_LIBRDKAFKA_LIBS="-lrdkafka"
+  fi
+
+  if test "x$with_librdkafka_log_cb" = "xyes"; then
+    AC_DEFINE(HAVE_LIBRDKAFKA_LOG_CB, 1, [Define if librdkafka log facility is present and usable.])
+  else if test "x$with_librdkafka_logger" = "xyes"; then
+    AC_DEFINE(HAVE_LIBRDKAFKA_LOGGER, 1, [Define if librdkafka log facility is present and usable.])
   fi; fi
 fi
-CPPFLAGS="$SAVE_CPPFLAGS"
-LDFLAGS="$SAVE_LDFLAGS"
-AM_CONDITIONAL(BUILD_WITH_LIBRDKAFKA, test "x$with_librdkafka" = "xyes")
 
+AC_SUBST([BUILD_WITH_LIBRDKAFKA_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBRDKAFKA_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBRDKAFKA_LIBS])
 # }}}
 
 # --with-librouteros {{{
-AC_ARG_WITH(librouteros, [AS_HELP_STRING([--with-librouteros@<:@=PREFIX@:>@], [Path to librouteros.])],
-[
- if test "x$withval" = "xyes"
- then
-        with_librouteros="yes"
- else if test "x$withval" = "xno"
- then
-        with_librouteros="no"
- else
-        with_librouteros="yes"
-        LIBROUTEROS_CPPFLAGS="$LIBROUTEROS_CPPFLAGS -I$withval/include"
-        LIBROUTEROS_LDFLAGS="$LIBROUTEROS_LDFLAGS -L$withval/lib"
- fi; fi
-],
-[with_librouteros="yes"])
+AC_ARG_WITH([librouteros],
+  [AS_HELP_STRING([--with-librouteros@<:@=PREFIX@:>@], [Path to librouteros.])],
+  [
+    if test "x$withval" = "xyes" || test "x$withval" = "xno"; then
+      with_librouteros="$witval"
+    else
+      with_librouteros_cppflags="-I$withval/include"
+      with_librouteros_ldflags="-L$withval/lib"
+      with_librouteros="yes"
+   fi
+  ],
+  [with_librouteros="yes"]
+)
 
-SAVE_CPPFLAGS="$CPPFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
+if test "x$with_librouteros" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_librouteros_cppflags"
 
-CPPFLAGS="$CPPFLAGS $LIBROUTEROS_CPPFLAGS"
-LDFLAGS="$LDFLAGS $LIBROUTEROS_LDFLAGS"
+  AC_CHECK_HEADERS([routeros_api.h],
+    [with_librouteros="yes"],
+    [with_librouteros="no (routeros_api.h not found)"]
+  )
 
-if test "x$with_librouteros" = "xyes"
-then
-       if test "x$LIBROUTEROS_CPPFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([librouteros CPPFLAGS: $LIBROUTEROS_CPPFLAGS])
-       fi
-       AC_CHECK_HEADERS(routeros_api.h,
-       [with_librouteros="yes"],
-       [with_librouteros="no (routeros_api.h not found)"])
-fi
-if test "x$with_librouteros" = "xyes"
-then
-       if test "x$LIBROUTEROS_LDFLAGS" != "x"
-       then
-               AC_MSG_NOTICE([librouteros LDFLAGS: $LIBROUTEROS_LDFLAGS])
-       fi
-       AC_CHECK_LIB(routeros, ros_interface,
-       [with_librouteros="yes"],
-       [with_librouteros="no (symbol 'ros_interface' not found)"])
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-CPPFLAGS="$SAVE_CPPFLAGS"
-LDFLAGS="$SAVE_LDFLAGS"
+if test "x$with_librouteros" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_librouteros_ldflags"
 
-if test "x$with_librouteros" = "xyes"
-then
-       BUILD_WITH_LIBROUTEROS_CPPFLAGS="$LIBROUTEROS_CPPFLAGS"
-       BUILD_WITH_LIBROUTEROS_LDFLAGS="$LIBROUTEROS_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBROUTEROS_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBROUTEROS_LDFLAGS)
+  AC_CHECK_LIB([routeros], [ros_interface],
+    [with_librouteros="yes"],
+    [with_librouteros="no (symbol 'ros_interface' not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBROUTEROS, test "x$with_librouteros" = "xyes")
+
+if test "x$with_librouteros" = "xyes"; then
+  BUILD_WITH_LIBROUTEROS_CPPFLAGS="$with_librouteros_cppflags"
+  BUILD_WITH_LIBROUTEROS_LDFLAGS="$with_librouteros_ldflags"
+fi
+
+AC_SUBST([BUILD_WITH_LIBROUTEROS_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBROUTEROS_LDFLAGS])
 # }}}
 
 # --with-librrd {{{
-librrd_cflags=""
-librrd_ldflags=""
 librrd_threadsafe="no"
 librrd_rrdc_update="no"
-AC_ARG_WITH(librrd,
+AC_ARG_WITH([librrd],
   [AS_HELP_STRING([--with-librrd@<:@=PREFIX@:>@], [Path to rrdtool.])],
   [
-    if test "x$withval" != "xno" && test "x$withval" != "xyes"
-    then
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
       librrd_cflags="-I$withval/include"
       librrd_ldflags="-L$withval/lib"
       with_librrd="yes"
@@ -4777,8 +4885,7 @@ AC_ARG_WITH(librrd,
   [with_librrd="yes"]
 )
 
-if test "x$with_librrd" = "xyes"
-then
+if test "x$with_librrd" = "xyes"; then
   SAVE_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS $librrd_ldflags"
   PKG_CHECK_MODULES([RRD], [librrd >= 1.6.0],
@@ -4803,8 +4910,7 @@ then
   CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-if test "x$with_librrd" = "xyes" && test "x$librrd_threadsafe" = "xno"
-then
+if test "x$with_librrd" = "xyes" && test "x$librrd_threadsafe" = "xno"; then
   SAVE_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS $librrd_ldflags"
 
@@ -4822,8 +4928,7 @@ then
   LDFLAGS="$SAVE_LDFLAGS"
 fi
 
-if test "x$with_librrd" = "xyes" && test "x$librrd_threadsafe" = "xno"
-then
+if test "x$with_librrd" = "xyes" && test "x$librrd_threadsafe" = "xno"; then
   SAVE_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS $librrd_ldflags"
 
@@ -4840,82 +4945,78 @@ then
   LDFLAGS="$SAVE_LDFLAGS"
 fi
 
-if test "x$with_librrd" = "xyes"
-then
+if test "x$with_librrd" = "xyes"; then
   BUILD_WITH_LIBRRD_CFLAGS="$RRD_CFLAGS $librrd_cflags"
   BUILD_WITH_LIBRRD_LDFLAGS="$librrd_ldflags"
   BUILD_WITH_LIBRRD_LIBS="$RRD_LIBS"
-  AC_SUBST(BUILD_WITH_LIBRRD_CFLAGS)
-  AC_SUBST(BUILD_WITH_LIBRRD_LDFLAGS)
-  AC_SUBST(BUILD_WITH_LIBRRD_LIBS)
 fi
-if test "x$librrd_threadsafe" = "xyes"
-then
+
+if test "x$librrd_threadsafe" = "xyes"; then
   AC_DEFINE([HAVE_THREADSAFE_LIBRRD], [1],
     [Define to 1 if the rrd library is thread-safe]
   )
 fi
+
+AC_SUBST([BUILD_WITH_LIBRRD_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBRRD_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBRRD_LIBS])
 # }}}
 
 # --with-libsensors {{{
-with_sensors_cflags=""
-with_sensors_ldflags=""
-AC_ARG_WITH(libsensors, [AS_HELP_STRING([--with-libsensors@<:@=PREFIX@:>@], [Path to lm_sensors.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libsensors="no"
-       else
-               with_libsensors="yes"
-               if test "x$withval" != "xyes"
-               then
-                       with_sensors_cflags="-I$withval/include"
-                       with_sensors_ldflags="-L$withval/lib"
-                       with_libsensors="yes"
-               fi
-       fi
-],
-[
-       if test "x$ac_system" = "xLinux"
-       then
-               with_libsensors="yes"
-       else
-               with_libsensors="no (Linux only library)"
-       fi
-])
-if test "x$with_libsensors" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
+AC_ARG_WITH([libsensors],
+  [AS_HELP_STRING([--with-libsensors@<:@=PREFIX@:>@], [Path to lm_sensors.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_libsensors="$withval"
+    else
+      with_sensors_cppflags="-I$withval/include"
+      with_sensors_ldflags="-L$withval/lib"
+      with_libsensors="yes"
+    fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_libsensors="yes"
+    else
+      with_libsensors="no (Linux only library)"
+    fi
+  ]
+)
 
-       AC_CHECK_HEADERS(sensors/sensors.h, [], [with_libsensors="no (sensors/sensors.h not found)"])
+if test "x$with_libsensors" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_sensors_cppflags"
+
+  AC_CHECK_HEADERS([sensors/sensors.h],
+    [with_libsensors="yes"],
+    [with_libsensors="no (sensors/sensors.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libsensors" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_sensors_cflags"
-       LDFLAGS="$LDFLAGS $with_sensors_ldflags"
 
-       AC_CHECK_LIB(sensors, sensors_init,
-       [
-               AC_DEFINE(HAVE_LIBSENSORS, 1, [Define to 1 if you have the sensors library (-lsensors).])
-       ],
-       [with_libsensors="no (libsensors not found)"])
+if test "x$with_libsensors" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_sensors_ldflags"
+
+  AC_CHECK_LIB([sensors], [sensors_init],
+    [with_libsensors="yes"],
+    [with_libsensors="no (libsensors not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libsensors" = "xyes"
-then
-       BUILD_WITH_LIBSENSORS_CFLAGS="$with_sensors_cflags"
-       BUILD_WITH_LIBSENSORS_LDFLAGS="$with_sensors_ldflags"
-       AC_SUBST(BUILD_WITH_LIBSENSORS_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBSENSORS_LDFLAGS)
+
+if test "x$with_libsensors" = "xyes"; then
+  BUILD_WITH_LIBSENSORS_CPPFLAGS="$with_sensors_cppflags"
+  BUILD_WITH_LIBSENSORS_LDFLAGS="$with_sensors_ldflags"
+  BUILD_WITH_LIBSENSORS_LIBS="-lsensors"
 fi
-AM_CONDITIONAL(BUILD_WITH_LM_SENSORS, test "x$with_libsensors" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBSENSORS_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBSENSORS_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBSENSORS_LIBS])
+
 # }}}
 
 # libsigrok {{{
@@ -4928,35 +5029,29 @@ PKG_CHECK_MODULES([LIBSIGROK], [libsigrok < 0.4],
 # }}}
 
 # --with-libstatgrab {{{
-with_libstatgrab_cflags=""
-with_libstatgrab_ldflags=""
-AC_ARG_WITH(libstatgrab, [AS_HELP_STRING([--with-libstatgrab@<:@=PREFIX@:>@], [Path to libstatgrab.])],
-[
- if test "x$withval" != "xno" \
-   && test "x$withval" != "xyes"
- then
-   with_libstatgrab_cflags="-I$withval/include"
-   with_libstatgrab_ldflags="-L$withval/lib -lstatgrab"
-   with_libstatgrab="yes"
-   with_libstatgrab_pkg_config="no"
- else
-   with_libstatgrab="$withval"
-   with_libstatgrab_pkg_config="yes"
- fi
- ],
-[
- with_libstatgrab="yes"
- with_libstatgrab_pkg_config="yes"
-])
+AC_ARG_WITH([libstatgrab],
+  [AS_HELP_STRING([--with-libstatgrab@<:@=PREFIX@:>@], [Path to libstatgrab.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libstatgrab_cflags="-I$withval/include"
+      with_libstatgrab_ldflags="-L$withval/lib -lstatgrab"
+      with_libstatgrab="yes"
+      with_libstatgrab_pkg_config="no"
+    else
+      with_libstatgrab="$withval"
+      with_libstatgrab_pkg_config="yes"
+    fi
+  ],
+  [
+    with_libstatgrab="yes"
+    with_libstatgrab_pkg_config="yes"
+  ])
 
-if test "x$with_libstatgrab" = "xyes" \
-  && test "x$with_libstatgrab_pkg_config" = "xyes"
-then
+if test "x$with_libstatgrab" = "xyes" && test "x$with_libstatgrab_pkg_config" = "xyes"; then
   AC_MSG_CHECKING([pkg-config for libstatgrab])
   temp_result="found"
   $PKG_CONFIG --exists libstatgrab 2>/dev/null
-  if test "$?" != "0"
-  then
+  if test "$?" != "0"; then
     with_libstatgrab_pkg_config="no"
     with_libstatgrab="no (pkg-config doesn't know libstatgrab)"
     temp_result="not found"
@@ -4964,14 +5059,10 @@ then
   AC_MSG_RESULT([$temp_result])
 fi
 
-if test "x$with_libstatgrab" = "xyes" \
-  && test "x$with_libstatgrab_pkg_config" = "xyes" \
-  && test "x$with_libstatgrab_cflags" = "x"
-then
+if test "x$with_libstatgrab" = "xyes" && test "x$with_libstatgrab_pkg_config" = "xyes" && test "x$with_libstatgrab_cflags" = "x"; then
   AC_MSG_CHECKING([for libstatgrab CFLAGS])
   temp_result="`$PKG_CONFIG --cflags libstatgrab`"
-  if test "$?" = "0"
-  then
+  if test "$?" = "0"; then
     with_libstatgrab_cflags="$temp_result"
   else
     with_libstatgrab="no ($PKG_CONFIG --cflags libstatgrab failed)"
@@ -4980,10 +5071,7 @@ then
   AC_MSG_RESULT([$temp_result])
 fi
 
-if test "x$with_libstatgrab" = "xyes" \
-  && test "x$with_libstatgrab_pkg_config" = "xyes" \
-  && test "x$with_libstatgrab_ldflags" = "x"
-then
+if test "x$with_libstatgrab" = "xyes" && test "x$with_libstatgrab_pkg_config" = "xyes" && test "x$with_libstatgrab_ldflags" = "x"; then
   AC_MSG_CHECKING([for libstatgrab LDFLAGS])
   temp_result="`$PKG_CONFIG --libs libstatgrab`"
   if test "$?" = "0"
@@ -4996,36 +5084,31 @@ then
   AC_MSG_RESULT([$temp_result])
 fi
 
-if test "x$with_libstatgrab" = "xyes"
-then
+if test "x$with_libstatgrab" = "xyes"; then
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $with_libstatgrab_cflags"
 
-  AC_CHECK_HEADERS(statgrab.h,
-                  [with_libstatgrab="yes"],
-                  [with_libstatgrab="no (statgrab.h not found)"])
+  AC_CHECK_HEADERS([statgrab.h],
+    [with_libstatgrab="yes"],
+    [with_libstatgrab="no (statgrab.h not found)"]
+  )
 
   CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-if test "x$with_libstatgrab" = "xyes"
-then
-  SAVE_CFLAGS="$CFLAGS"
+if test "x$with_libstatgrab" = "xyes"; then
   SAVE_LDFLAGS="$LDFLAGS"
-
-  CFLAGS="$CFLAGS $with_libstatgrab_cflags"
   LDFLAGS="$LDFLAGS $with_libstatgrab_ldflags"
 
-  AC_CHECK_LIB(statgrab, sg_init,
-              [with_libstatgrab="yes"],
-              [with_libstatgrab="no (symbol sg_init not found)"])
+  AC_CHECK_LIB([statgrab], [sg_init],
+    [with_libstatgrab="yes"],
+    [with_libstatgrab="no (symbol sg_init not found)"]
+  )
 
-  CFLAGS="$SAVE_CFLAGS"
   LDFLAGS="$SAVE_LDFLAGS"
 fi
 
-if test "x$with_libstatgrab" = "xyes"
-then
+if test "x$with_libstatgrab" = "xyes"; then
   SAVE_CFLAGS="$CFLAGS"
   SAVE_LDFLAGS="$LDFLAGS"
   SAVE_LIBS="$LIBS"
@@ -5035,19 +5118,24 @@ then
   LIBS="-lstatgrab $LIBS"
 
   AC_CACHE_CHECK([if libstatgrab >= 0.90],
-          [c_cv_have_libstatgrab_0_90],
-          AC_LINK_IFELSE([AC_LANG_PROGRAM(
-[[[
-#include <stdio.h>
-#include <statgrab.h>
-]]],
-[[[
-      if (sg_init()) return 0;
-]]]
-    )],
-    [c_cv_have_libstatgrab_0_90="no"],
-    [c_cv_have_libstatgrab_0_90="yes"]
+    [c_cv_have_libstatgrab_0_90],
+    [
+      AC_LINK_IFELSE(
+        [
+          AC_LANG_PROGRAM(
+            [[
+              #include <stdio.h>
+              #include <statgrab.h>
+            ]],
+            [[
+              if (sg_init()) return 0;
+            ]]
           )
+        ],
+        [c_cv_have_libstatgrab_0_90="no"],
+        [c_cv_have_libstatgrab_0_90="yes"]
+      )
+    ]
   )
 
   CFLAGS="$SAVE_CFLAGS"
@@ -5055,832 +5143,796 @@ then
   LIBS="$SAVE_LIBS"
 fi
 
-AM_CONDITIONAL(BUILD_WITH_LIBSTATGRAB, test "x$with_libstatgrab" = "xyes")
-if test "x$with_libstatgrab" = "xyes"
-then
-  AC_DEFINE(HAVE_LIBSTATGRAB, 1, [Define to 1 if you have the 'statgrab' library (-lstatgrab)])
+AM_CONDITIONAL([BUILD_WITH_LIBSTATGRAB], [test "x$with_libstatgrab" = "xyes"])
+
+if test "x$with_libstatgrab" = "xyes"; then
+  AC_DEFINE([HAVE_LIBSTATGRAB], [1],
+    [Define to 1 if you have the 'statgrab' library (-lstatgrab)]
+  )
+
+  if test "x$c_cv_have_libstatgrab_0_90" = "xyes"; then
+    AC_DEFINE([HAVE_LIBSTATGRAB_0_90], [1],
+      [Define to 1 if libstatgrab version >= 0.90]
+    )
+  fi
+
   BUILD_WITH_LIBSTATGRAB_CFLAGS="$with_libstatgrab_cflags"
   BUILD_WITH_LIBSTATGRAB_LDFLAGS="$with_libstatgrab_ldflags"
-  AC_SUBST(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-  AC_SUBST(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-  if test "x$c_cv_have_libstatgrab_0_90" = "xyes"
-  then
-        AC_DEFINE(HAVE_LIBSTATGRAB_0_90, 1, [Define to 1 if libstatgrab version >= 0.90])
-  fi
+
 fi
+
+AC_SUBST([BUILD_WITH_LIBSTATGRAB_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBSTATGRAB_LDFLAGS])
 # }}}
 
 # --with-libtokyotyrant {{{
-with_libtokyotyrant_cppflags=""
-with_libtokyotyrant_ldflags=""
-with_libtokyotyrant_libs=""
-AC_ARG_WITH(libtokyotyrant, [AS_HELP_STRING([--with-libtokyotyrant@<:@=PREFIX@:>@], [Path to libtokyotyrant.])],
-[
-  if test "x$withval" = "xno"
-  then
-    with_libtokyotyrant="no"
-  else if test "x$withval" = "xyes"
-  then
-    with_libtokyotyrant="yes"
-  else
-    with_libtokyotyrant_cppflags="-I$withval/include"
-    with_libtokyotyrant_ldflags="-L$withval/include"
-    with_libtokyotyrant_libs="-ltokyotyrant"
-    with_libtokyotyrant="yes"
-  fi; fi
-],
-[
-  with_libtokyotyrant="yes"
-])
+AC_ARG_WITH([libtokyotyrant],
+  [AS_HELP_STRING([--with-libtokyotyrant@<:@=PREFIX@:>@], [Path to libtokyotyrant.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_libtokyotyrant="$withval"
+    else
+      with_libtokyotyrant_cppflags="-I$withval/include"
+      with_libtokyotyrant_ldflags="-L$withval/include"
+      with_libtokyotyrant_libs="-ltokyotyrant"
+      with_libtokyotyrant="yes"
+    fi
+  ],
+  [with_libtokyotyrant="yes"]
+)
 
-if test "x$with_libtokyotyrant" = "xyes"
-then
-  if $PKG_CONFIG --exists tokyotyrant
-  then
+if test "x$with_libtokyotyrant" = "xyes"; 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`"
   fi
 fi
 
-SAVE_CPPFLAGS="$CPPFLAGS"
-SAVE_LDFLAGS="$LDFLAGS"
-CPPFLAGS="$CPPFLAGS $with_libtokyotyrant_cppflags"
-LDFLAGS="$LDFLAGS $with_libtokyotyrant_ldflags"
+if test "x$with_libtokyotyrant" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libtokyotyrant_cppflags"
 
-if test "x$with_libtokyotyrant" = "xyes"
-then
-  AC_CHECK_HEADERS(tcrdb.h,
-  [
-          AC_DEFINE(HAVE_TCRDB_H, 1,
-                    [Define to 1 if you have the <tcrdb.h> header file.])
-  ], [with_libtokyotyrant="no (tcrdb.h not found)"])
-fi
+  AC_CHECK_HEADERS([tcrdb.h],
+    [with_libtokyotyrant="yes"],
+    [with_libtokyotyrant="no (tcrdb.h not found)"]
+  )
 
-if test "x$with_libtokyotyrant" = "xyes"
-then
-  AC_CHECK_LIB(tokyotyrant, tcrdbrnum,
-  [
-          AC_DEFINE(HAVE_LIBTOKYOTYRANT, 1,
-                    [Define to 1 if you have the tokyotyrant library (-ltokyotyrant).])
-  ],
-  [with_libtokyotyrant="no (symbol tcrdbrnum not found)"],
-  [$with_libtokyotyrant_libs])
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-CPPFLAGS="$SAVE_CPPFLAGS"
-LDFLAGS="$SAVE_LDFLAGS"
+if test "x$with_libtokyotyrant" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libtokyotyrant_ldflags"
 
-if test "x$with_libtokyotyrant" = "xyes"
-then
+  AC_CHECK_LIB([tokyotyrant], [tcrdbrnum],
+    [with_libtokyotyrant="yes"],
+    [with_libtokyotyrant="no (symbol tcrdbrnum not found)"],
+    [$with_libtokyotyrant_libs]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
+
+if test "x$with_libtokyotyrant" = "xyes"; then
   BUILD_WITH_LIBTOKYOTYRANT_CPPFLAGS="$with_libtokyotyrant_cppflags"
   BUILD_WITH_LIBTOKYOTYRANT_LDFLAGS="$with_libtokyotyrant_ldflags"
   BUILD_WITH_LIBTOKYOTYRANT_LIBS="$with_libtokyotyrant_libs"
-  AC_SUBST(BUILD_WITH_LIBTOKYOTYRANT_CPPFLAGS)
-  AC_SUBST(BUILD_WITH_LIBTOKYOTYRANT_LDFLAGS)
-  AC_SUBST(BUILD_WITH_LIBTOKYOTYRANT_LIBS)
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBTOKYOTYRANT, test "x$with_libtokyotyrant" = "xyes")
+AC_SUBST([BUILD_WITH_LIBTOKYOTYRANT_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBTOKYOTYRANT_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBTOKYOTYRANT_LIBS])
 # }}}
 
 # --with-libudev {{{
-with_libudev_cflags=""
-with_libudev_ldflags=""
-AC_ARG_WITH(libudev, [AS_HELP_STRING([--with-libudev@<:@=PREFIX@:>@], [Path to libudev.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libudev="no"
-       else
-               with_libudev="yes"
-               if test "x$withval" != "xyes"
-               then
-                       with_libudev_cflags="-I$withval/include"
-                       with_libudev_ldflags="-L$withval/lib"
-                       with_libudev="yes"
-               fi
-       fi
-],
-[
-       if test "x$ac_system" = "xLinux"
-       then
-               with_libudev="yes"
-       else
-               with_libudev="no (Linux only library)"
-       fi
-])
-if test "x$with_libudev" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libudev_cflags"
+AC_ARG_WITH([libudev],
+  [AS_HELP_STRING([--with-libudev@<:@=PREFIX@:>@], [Path to libudev.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_libudev="$withval"
+    else
+      with_libudev_cppflags="-I$withval/include"
+      with_libudev_ldflags="-L$withval/lib"
+      with_libudev="yes"
+    fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_libudev="yes"
+    else
+      with_libudev="no (Linux only library)"
+    fi
+  ]
+)
+
+if test "x$with_libudev" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libudev_cppflags"
 
-       AC_CHECK_HEADERS(libudev.h, [], [with_libudev="no (libudev.h not found)"])
+  AC_CHECK_HEADERS([libudev.h],
+    [with_libudev="yes"],
+    [with_libudev="no (libudev.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libudev" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libudev_cflags"
-       LDFLAGS="$LDFLAGS $with_libudev_ldflags"
 
-       AC_CHECK_LIB(udev, udev_new,
-       [
-               AC_DEFINE(HAVE_LIBUDEV, 1, [Define to 1 if you have the udev library (-ludev).])
-       ],
-       [with_libudev="no (libudev not found)"])
+if test "x$with_libudev" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libudev_ldflags"
+
+  AC_CHECK_LIB([udev], [udev_new],
+    [with_libudev="yes"],
+    [with_libudev="no (libudev not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libudev" = "xyes"
-then
-       BUILD_WITH_LIBUDEV_CFLAGS="$with_libudev_cflags"
-       BUILD_WITH_LIBUDEV_LDFLAGS="$with_libudev_ldflags"
-       BUILD_WITH_LIBUDEV_LIBS="-ludev"
-       AC_SUBST(BUILD_WITH_LIBUDEV_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBUDEV_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBUDEV_LIBS)
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBUDEV, test "x$with_libudev" = "xyes")
+
+if test "x$with_libudev" = "xyes"; then
+  BUILD_WITH_LIBUDEV_CPPFLAGS="$with_libudev_cppflags"
+  BUILD_WITH_LIBUDEV_LDFLAGS="$with_libudev_ldflags"
+  BUILD_WITH_LIBUDEV_LIBS="-ludev"
+fi
+
+AC_SUBST([BUILD_WITH_LIBUDEV_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBUDEV_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBUDEV_LIBS])
+
+AM_CONDITIONAL([BUILD_WITH_LIBUDEV], [test "x$with_libudev" = "xyes"])
 # }}}
 
 # --with-libupsclient {{{
 with_libupsclient_config=""
-with_libupsclient_cflags=""
-with_libupsclient_libs=""
-AC_ARG_WITH(libupsclient, [AS_HELP_STRING([--with-libupsclient@<:@=PREFIX@:>@], [Path to the upsclient library.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libupsclient="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libupsclient="use_pkgconfig"
-       else
-               if test -x "$withval"
-               then
-                       with_libupsclient_config="$withval"
-                       with_libupsclient="use_libupsclient_config"
-               else if test -x "$withval/bin/libupsclient-config"
-               then
-                       with_libupsclient_config="$withval/bin/libupsclient-config"
-                       with_libupsclient="use_libupsclient_config"
-               else
-                       AC_MSG_NOTICE([Not checking for libupsclient: Manually configured])
-                       with_libupsclient_cflags="-I$withval/include"
-                       with_libupsclient_libs="-L$withval/lib -lupsclient"
-                       with_libupsclient="yes"
-               fi; fi
-       fi; fi
-],
-[with_libupsclient="use_pkgconfig"])
+AC_ARG_WITH([libupsclient],
+  [AS_HELP_STRING([--with-libupsclient@<:@=PREFIX@:>@], [Path to the upsclient library.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libupsclient="no"
+    else if test "x$withval" = "xyes"; then
+      with_libupsclient="use_pkgconfig"
+    else
+      if test -x "$withval"; then
+        with_libupsclient_config="$withval"
+        with_libupsclient="use_libupsclient_config"
+      else if test -x "$withval/bin/libupsclient-config"; then
+        with_libupsclient_config="$withval/bin/libupsclient-config"
+        with_libupsclient="use_libupsclient_config"
+      else
+        AC_MSG_NOTICE([Not checking for libupsclient: Manually configured])
+        with_libupsclient_cflags="-I$withval/include"
+        with_libupsclient_libs="-L$withval/lib -lupsclient"
+        with_libupsclient="yes"
+      fi; fi
+    fi; fi
+  ],
+  [with_libupsclient="use_pkgconfig"]
+)
 
 # configure using libupsclient-config
-if test "x$with_libupsclient" = "xuse_libupsclient_config"
-then
-       AC_MSG_NOTICE([Checking for libupsclient using $with_libupsclient_config])
-       with_libupsclient_cflags="`$with_libupsclient_config --cflags`"
-       if test $? -ne 0
-       then
-               with_libupsclient="no ($with_libupsclient_config failed)"
-       fi
-       with_libupsclient_libs="`$with_libupsclient_config --libs`"
-       if test $? -ne 0
-       then
-               with_libupsclient="no ($with_libupsclient_config failed)"
-       fi
-fi
-if test "x$with_libupsclient" = "xuse_libupsclient_config"
-then
-       with_libupsclient="yes"
+if test "x$with_libupsclient" = "xuse_libupsclient_config"; then
+  with_libupsclient_cflags="`$with_libupsclient_config --cflags`"
+  if test $? -ne 0; then
+    with_libupsclient="no ($with_libupsclient_config failed)"
+  fi
+  with_libupsclient_libs="`$with_libupsclient_config --libs`"
+  if test $? -ne 0; then
+    with_libupsclient="no ($with_libupsclient_config failed)"
+  fi
+fi
+
+if test "x$with_libupsclient" = "xuse_libupsclient_config"; then
+  with_libupsclient="yes"
 fi
 
 # configure using pkg-config
-if test "x$with_libupsclient" = "xuse_pkgconfig"
-then
-       AC_MSG_NOTICE([Checking for libupsclient using $PKG_CONFIG])
-       $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
-       if test $? -ne 0
-       then
-               with_libupsclient="no (pkg-config doesn't know libupsclient)"
-       fi
-fi
-if test "x$with_libupsclient" = "xuse_pkgconfig"
-then
-       with_libupsclient_cflags="`$PKG_CONFIG --cflags 'libupsclient'`"
-       if test $? -ne 0
-       then
-               with_libupsclient="no ($PKG_CONFIG failed)"
-       fi
-       with_libupsclient_libs="`$PKG_CONFIG --libs 'libupsclient'`"
-       if test $? -ne 0
-       then
-               with_libupsclient="no ($PKG_CONFIG failed)"
-       fi
-fi
-if test "x$with_libupsclient" = "xuse_pkgconfig"
-then
-       with_libupsclient="yes"
+if test "x$with_libupsclient" = "xuse_pkgconfig"; then
+  AC_MSG_NOTICE([Checking for libupsclient using $PKG_CONFIG])
+  $PKG_CONFIG --exists 'libupsclient' 2>/dev/null
+  if test $? -ne 0; then
+    with_libupsclient="no (pkg-config doesn't know libupsclient)"
+  fi
 fi
 
-# with_libupsclient_cflags and with_libupsclient_libs are set up now, let's do
-# the actual checks.
-if test "x$with_libupsclient" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
+if test "x$with_libupsclient" = "xuse_pkgconfig"; then
+  with_libupsclient_cflags="`$PKG_CONFIG --cflags 'libupsclient'`"
+  if test $? -ne 0; then
+    with_libupsclient="no ($PKG_CONFIG failed)"
+  fi
+
+  with_libupsclient_libs="`$PKG_CONFIG --libs 'libupsclient'`"
+  if test $? -ne 0; then
+    with_libupsclient="no ($PKG_CONFIG failed)"
+  fi
+fi
+
+if test "x$with_libupsclient" = "xuse_pkgconfig"; then
+  with_libupsclient="yes"
+fi
 
-       AC_CHECK_HEADERS(upsclient.h, [], [with_libupsclient="no (upsclient.h not found)"])
+if test "x$with_libupsclient" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
+
+  AC_CHECK_HEADERS([upsclient.h],
+    [with_libupsclient="yes"],
+    [with_libupsclient="no (upsclient.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libupsclient" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
 
-       CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
-       LDFLAGS="$LDFLAGS $with_libupsclient_libs"
+if test "x$with_libupsclient" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libupsclient_libs"
+
+  AC_CHECK_LIB([upsclient], [upscli_connect],
+    [with_libupsclient="yes"],
+    [with_libupsclient="no (symbol upscli_connect not found)"]
+  )
 
-       AC_CHECK_LIB(upsclient, upscli_connect,
-                    [with_libupsclient="yes"],
-                    [with_libupsclient="no (symbol upscli_connect not found)"])
+  AC_CHECK_LIB([upsclient], [upscli_init],
+    [AC_DEFINE([HAVE_UPSCLI_INIT], [1], [Define when upscli_init() (since version 2-7) is available.])]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libupsclient" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
 
-       AC_CHECK_TYPES([UPSCONN_t, UPSCONN], [], [],
-[#include <stdlib.h>
-#include <stdio.h>
-#include <upsclient.h>])
+if test "x$with_libupsclient" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libupsclient_cflags"
+
+  AC_CHECK_TYPES([UPSCONN_t, UPSCONN],
+    [],
+    [],
+    [[
+      #include <stdlib.h>
+      #include <stdio.h>
+      #include <upsclient.h>
+    ]]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libupsclient" = "xyes"
-then
-       BUILD_WITH_LIBUPSCLIENT_CFLAGS="$with_libupsclient_cflags"
-       BUILD_WITH_LIBUPSCLIENT_LIBS="$with_libupsclient_libs"
-       AC_SUBST(BUILD_WITH_LIBUPSCLIENT_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBUPSCLIENT_LIBS)
+
+if test "x$with_libupsclient" = "xyes"; then
+  BUILD_WITH_LIBUPSCLIENT_CFLAGS="$with_libupsclient_cflags"
+  BUILD_WITH_LIBUPSCLIENT_LIBS="$with_libupsclient_libs"
 fi
+
+AC_SUBST([BUILD_WITH_LIBUPSCLIENT_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBUPSCLIENT_LIBS])
 # }}}
 
 # --with-libxenctrl {{{
-with_libxenctrl_cppflags=""
-with_libxenctrl_ldflags=""
-AC_ARG_WITH(libxenctrl, [AS_HELP_STRING([--with-libxenctrl@<:@=PREFIX@:>@], [Path to libxenctrl.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libxenctrl_cppflags="-I$withval/include"
-               with_libxenctrl_ldflags="-L$withval/lib"
-               with_libxenctrl="yes"
-       else
-               with_libxenctrl="$withval"
-       fi
-],
-[
-       with_libxenctrl="yes"
-])
-if test "x$with_libxenctrl" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libxenctrl_cppflags"
+AC_ARG_WITH([libxenctrl],
+  [AS_HELP_STRING([--with-libxenctrl@<:@=PREFIX@:>@], [Path to libxenctrl.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libxenctrl_cppflags="-I$withval/include"
+      with_libxenctrl_ldflags="-L$withval/lib"
+      with_libxenctrl="yes"
+    else
+      with_libxenctrl="$withval"
+    fi
+  ],
+  [with_libxenctrl="yes"]
+)
+
+if test "x$with_libxenctrl" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libxenctrl_cppflags"
 
-       AC_CHECK_HEADERS(xenctrl.h, [with_libxenctrl="yes"], [with_libxenctrl="no (xenctrl.h not found)"])
+  AC_CHECK_HEADERS([xenctrl.h],
+    [with_libxenctrl="yes"],
+    [with_libxenctrl="no (xenctrl.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libxenctrl" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libxenctrl_cppflags"
-       LDFLAGS="$LDFLAGS $with_libxenctrl_ldflags"
 
-       #Xen versions older than 3.4 has no xc_getcpuinfo()
-       AC_CHECK_LIB(xenctrl, xc_getcpuinfo, [with_libxenctrl="yes"], [with_libxenctrl="no (symbol 'xc_getcpuinfo' not found)"], [])
+if test "x$with_libxenctrl" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libxenctrl_ldflags"
+
+  #Xen versions older than 3.4 has no xc_getcpuinfo()
+  AC_CHECK_LIB([xenctrl], [xc_getcpuinfo],
+    [with_libxenctrl="yes"],
+    [with_libxenctrl="no (symbol 'xc_getcpuinfo' not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
-       LIBXENCTL_CPPFLAGS="$with_libxenctl_cppflags"
-       LIBXENCTL_LDFLAGS="$with_libxenctl_ldflags"
-       AC_SUBST(LIBXENCTL_CPPFLAGS)
-       AC_SUBST(LIBXENCTL_LDFLAGS)
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
+
+LIBXENCTL_CPPFLAGS="$with_libxenctl_cppflags"
+LIBXENCTL_LDFLAGS="$with_libxenctl_ldflags"
+AC_SUBST([LIBXENCTL_CPPFLAGS])
+AC_SUBST([LIBXENCTL_LDFLAGS])
 # }}}
 
 # --with-libxmms {{{
 with_xmms_config="xmms-config"
-with_xmms_cflags=""
-with_xmms_libs=""
-AC_ARG_WITH(libxmms, [AS_HELP_STRING([--with-libxmms@<:@=PREFIX@:>@], [Path to libxmms.])],
-[
-       if test "x$withval" != "xno" \
-               && test "x$withval" != "xyes"
-       then
-               if test -f "$withval" && test -x "$withval";
-               then
-                       with_xmms_config="$withval"
-               else if test -x "$withval/bin/xmms-config"
-               then
-                       with_xmms_config="$withval/bin/xmms-config"
-               fi; fi
-               with_libxmms="yes"
-       else if test "x$withval" = "xno"
-       then
-               with_libxmms="no"
-       else
-               with_libxmms="yes"
-       fi; fi
-],
-[
-       with_libxmms="yes"
-])
-if test "x$with_libxmms" = "xyes"
-then
-       with_xmms_cflags=`$with_xmms_config --cflags 2>/dev/null`
-       xmms_config_status=$?
+AC_ARG_WITH([libxmms],
+  [AS_HELP_STRING([--with-libxmms@<:@=PREFIX@:>@], [Path to libxmms.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_libxmms="$withval"
+    else
+      if test -f "$withval" && test -x "$withval"; then
+        with_xmms_config="$withval"
+      else if test -x "$withval/bin/xmms-config"; then
+        with_xmms_config="$withval/bin/xmms-config"
+      fi; fi
+      with_libxmms="yes"
+    fi
+  ],
+  [with_libxmms="yes"]
+)
 
-       if test $xmms_config_status -ne 0
-       then
-               with_libxmms="no"
-       fi
+if test "x$with_libxmms" = "xyes"; then
+  with_xmms_cflags=`$with_xmms_config --cflags 2>/dev/null`
+  if test $? -ne 0; then
+    with_libxmms="no"
+  fi
 fi
-if test "x$with_libxmms" = "xyes"
-then
-       with_xmms_libs=`$with_xmms_config --libs 2>/dev/null`
-       xmms_config_status=$?
 
-       if test $xmms_config_status -ne 0
-       then
-               with_libxmms="no"
-       fi
+if test "x$with_libxmms" = "xyes"; then
+  with_xmms_libs=`$with_xmms_config --libs 2>/dev/null`
+  if test $? -ne 0; then
+    with_libxmms="no"
+  fi
 fi
-if test "x$with_libxmms" = "xyes"
-then
-       AC_CHECK_LIB(xmms, xmms_remote_get_info,
-       [
-               BUILD_WITH_LIBXMMS_CFLAGS="$with_xmms_cflags"
-               BUILD_WITH_LIBXMMS_LIBS="$with_xmms_libs"
-               AC_SUBST(BUILD_WITH_LIBXMMS_CFLAGS)
-               AC_SUBST(BUILD_WITH_LIBXMMS_LIBS)
-       ],
-       [
-               with_libxmms="no"
-       ],
-       [$with_xmms_libs])
-fi
-with_libxmms_numeric=0
-if test "x$with_libxmms" = "xyes"
-then
-       with_libxmms_numeric=1
+
+if test "x$with_libxmms" = "xyes"; then
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$with_xmms_cflags"
+
+  AC_CHECK_HEADER([xmmsctrl.h],
+    [with_libxmms="yes"],
+    [with_libxmms="no"],
+  )
+
+  CFLAGS="$SAVE_CFLAGS"
+fi
+
+if test "x$with_libxmms" = "xyes"; then
+  SAVE_LIBS="$LIBS"
+  LIBS="$with_xmms_libs"
+
+  AC_CHECK_LIB([xmms], [xmms_remote_get_info],
+    [with_libxmss="yes"],
+    [with_libxmms="no"],
+    [$with_xmms_libs]
+
+  )
+
+  LIBS="$SAVE_LIBS"
 fi
-AC_DEFINE_UNQUOTED(HAVE_LIBXMMS, [$with_libxmms_numeric], [Define to 1 if you have the 'xmms' library (-lxmms).])
-AM_CONDITIONAL(BUILD_WITH_LIBXMMS, test "x$with_libxmms" = "xyes")
+
+BUILD_WITH_LIBXMMS_CFLAGS="$with_xmms_cflags"
+BUILD_WITH_LIBXMMS_LIBS="$with_xmms_libs"
+
+AC_SUBST([BUILD_WITH_LIBXMMS_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBXMMS_LIBS])
 # }}}
 
 # --with-libyajl {{{
-with_libyajl_cppflags=""
-with_libyajl_ldflags=""
-AC_ARG_WITH(libyajl, [AS_HELP_STRING([--with-libyajl@<:@=PREFIX@:>@], [Path to libyajl.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libyajl_cppflags="-I$withval/include"
-               with_libyajl_ldflags="-L$withval/lib"
-               with_libyajl="yes"
-       else
-               with_libyajl="$withval"
-       fi
-],
-[
-       with_libyajl="yes"
-])
-if test "x$with_libyajl" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libyajl_cppflags"
+AC_ARG_WITH([libyajl],
+  [AS_HELP_STRING([--with-libyajl@<:@=PREFIX@:>@], [Path to libyajl.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libyajl_cppflags="-I$withval/include"
+      with_libyajl_ldflags="-L$withval/lib"
+      with_libyajl="yes"
+    else
+      with_libyajl="$withval"
+    fi
+  ],
+  [with_libyajl="yes"]
+)
+
+if test "x$with_libyajl" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libyajl_cppflags"
+
+  AC_CHECK_HEADERS([yajl/yajl_parse.h],
+    [with_libyajl="yes"],
+    [with_libyajl="no (yajl/yajl_parse.h not found)"]
+  )
+
+  AC_CHECK_HEADERS([yajl/yajl_tree.h],
+    [with_libyajl2="yes"],
+    [with_libyajl2="no (yajl/yajl_tree.h not found)"]
+  )
 
-       AC_CHECK_HEADERS(yajl/yajl_parse.h, [with_libyajl="yes"], [with_libyajl="no (yajl/yajl_parse.h not found)"])
-       AC_CHECK_HEADERS(yajl/yajl_version.h)
+  AC_CHECK_HEADERS([yajl/yajl_version.h])
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libyajl" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libyajl_cppflags"
-       LDFLAGS="$LDFLAGS $with_libyajl_ldflags"
 
-       AC_CHECK_LIB(yajl, yajl_alloc, [with_libyajl="yes"], [with_libyajl="no (Symbol 'yajl_alloc' not found)"])
+if test "x$with_libyajl" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libyajl_ldflags"
+
+  AC_CHECK_LIB([yajl], [yajl_alloc],
+    [with_libyajl="yes"],
+    [with_libyajl="no (Symbol 'yajl_alloc' not found)"]
+  )
+
+  AC_CHECK_LIB([yajl], [yajl_tree_parse],
+    [with_libyajl2="yes"],
+    [with_libyajl2="no (Symbol 'yajl_tree_parse' not found)"]
+  )
+
+  LDFLAGS="$SAVE_LDFLAGS"
+fi
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+if test "x$with_libyajl" = "xyes"; then
+  BUILD_WITH_LIBYAJL_CPPFLAGS="$with_libyajl_cppflags"
+  BUILD_WITH_LIBYAJL_LDFLAGS="$with_libyajl_ldflags"
+  BUILD_WITH_LIBYAJL_LIBS="-lyajl"
+  AC_DEFINE([HAVE_LIBYAJL], [1], [Define if libyajl is present and usable.])
 fi
-if test "x$with_libyajl" = "xyes"
-then
-       BUILD_WITH_LIBYAJL_CPPFLAGS="$with_libyajl_cppflags"
-       BUILD_WITH_LIBYAJL_LDFLAGS="$with_libyajl_ldflags"
-       BUILD_WITH_LIBYAJL_LIBS="-lyajl"
-       AC_SUBST(BUILD_WITH_LIBYAJL_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBYAJL_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBYAJL_LIBS)
-       AC_DEFINE(HAVE_LIBYAJL, 1, [Define if libyajl is present and usable.])
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBYAJL, test "x$with_libyajl" = "xyes")
+
+AC_SUBST([BUILD_WITH_LIBYAJL_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBYAJL_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBYAJL_LIBS])
+
+AM_CONDITIONAL([BUILD_WITH_LIBYAJL], [test "x$with_libyajl" = "xyes"])
 # }}}
 
 # --with-mic {{{
-with_mic_cflags="-I/opt/intel/mic/sysmgmt/sdk/include"
-with_mic_ldpath="-L/opt/intel/mic/sysmgmt/sdk/lib/Linux"
-with_mic_libs=""
-AC_ARG_WITH(mic,[AS_HELP_STRING([--with-mic@<:@=PREFIX@:>@], [Path to Intel MIC Access API.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_mic="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_mic="yes"
-       else if test -d "$with_mic/lib"
-       then
-               AC_MSG_NOTICE([Not checking for Intel Mic: Manually configured])
-               with_mic_cflags="-I$withval/include"
-               with_mic_ldpath="-L$withval/lib/Linux"
-               with_mic_libs="$PTHREAD_LIBS -lMicAccessSDK -lscif"
-               with_mic="yes"
-       fi; fi; fi
-],
-[with_mic="yes"])
-if test "x$with_mic" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_mic_cflags"
-       AC_CHECK_HEADERS(MicAccessApi.h,[],[with_mic="no (MicAccessApi not found)"])
-       CPPFLAGS="$SAVE_CPPFLAGS"
+with_mic_cppflags="-I/opt/intel/mic/sysmgmt/sdk/include"
+with_mic_ldflags="-L/opt/intel/mic/sysmgmt/sdk/lib/Linux"
+with_mic_libs="-lMicAccessSDK -scif"
+AC_ARG_WITH([mic],
+  [AS_HELP_STRING([--with-mic@<:@=PREFIX@:>@], [Path to Intel MIC Access API.])],
+  [
+    if test "x$withval" = "xno" || test "x$withval" = "xyes"; then
+      with_mic="$withval"
+    else if test -d "$with_mic/lib"; then
+      with_mic_cppflags="-I$withval/include"
+      with_mic_ldflags="-L$withval/lib/Linux"
+      with_mic="yes"
+    fi; fi
+  ],
+  [with_mic="yes"]
+)
+
+if test "x$with_mic" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_mic_cppflags"
+
+  AC_CHECK_HEADERS([MicAccessApi.h],
+    [with_mic="yes"],
+    [with_mic="no (MicAccessApi not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_mic" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
 
-       CPPFLAGS="$CPPFLAGS $with_mic_cflags"
-       LDFLAGS="$LDFLAGS $with_mic_ldpath"
+if test "x$with_mic" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_mic_ldflags"
 
-       AC_CHECK_LIB(MicAccessSDK, MicInitAPI,
-                       [with_mic_ldpath="$with_mic_ldpath"
-                       with_mic_libs="$PTHREAD_LIBS -lMicAccessSDK -lscif"],
-                       [with_mic="no (symbol MicInitAPI not found)"],[$PTHREAD_LIBS -lscif])
+  AC_CHECK_LIB([MicAccessSDK], [MicInitAPI],
+    [with_mic="yes"],
+    [with_mic="no (symbol MicInitAPI not found)"],
+    [$PTHREAD_LIBS -lscif]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
 
-if test "x$with_mic" = "xyes"
-then
-       BUILD_WITH_MIC_CPPFLAGS="$with_mic_cflags"
-       BUILD_WITH_MIC_LIBPATH="$with_mic_ldpath"
-       BUILD_WITH_MIC_LDADD="$with_mic_libs"
-       AC_SUBST(BUILD_WITH_MIC_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_MIC_LIBPATH)
-       AC_SUBST(BUILD_WITH_MIC_LDADD)
+if test "x$with_mic" = "xyes"; then
+  BUILD_WITH_MIC_CPPFLAGS="$with_mic_cppflags"
+  BUILD_WITH_MIC_LDFLAGS="$with_mic_ldflags"
+  BUILD_WITH_MIC_LIBS="$with_mic_libs"
 fi
+AC_SUBST([BUILD_WITH_MIC_CPPFLAGS])
+AC_SUBST([BUILD_WITH_MIC_LDFLAGS])
+AC_SUBST([BUILD_WITH_MIC_LIBS])
 #}}}
 
 # --with-libvarnish {{{
-with_libvarnish_cppflags=""
-with_libvarnish_cflags=""
-with_libvarnish_libs=""
-AC_ARG_WITH(libvarnish, [AS_HELP_STRING([--with-libvarnish@<:@=PREFIX@:>@], [Path to libvarnish.])],
-[
-       if test "x$withval" = "xno"
-       then
-               with_libvarnish="no"
-       else if test "x$withval" = "xyes"
-       then
-               with_libvarnish="use_pkgconfig"
-       else if test -d "$with_libvarnish/lib"
-       then
-               AC_MSG_NOTICE([Not checking for libvarnish: Manually configured])
-               with_libvarnish_cflags="-I$withval/include"
-               with_libvarnish_libs="-L$withval/lib -lvarnishapi"
-               with_libvarnish="yes"
-       fi; fi; fi
-],
-[with_libvarnish="use_pkgconfig"])
+AC_ARG_WITH([libvarnish],
+  [AS_HELP_STRING([--with-libvarnish@<:@=PREFIX@:>@], [Path to libvarnish.])],
+  [
+    if test "x$withval" = "xno"; then
+      with_libvarnish="no"
+    else if test "x$withval" = "xyes"; then
+      with_libvarnish="use_pkgconfig"
+    else if test -d "$with_libvarnish/lib"; then
+      with_libvarnish_cflags="-I$withval/include"
+      with_libvarnish_libs="-L$withval/lib -lvarnishapi"
+      with_libvarnish="yes"
+    fi; fi; fi
+  ],
+  [with_libvarnish="use_pkgconfig"]
+)
 
 # configure using pkg-config
-if test "x$with_libvarnish" = "xuse_pkgconfig"
-then
-       AC_MSG_NOTICE([Checking for varnishapi using $PKG_CONFIG])
-       $PKG_CONFIG --exists 'varnishapi' 2>/dev/null
-       if test $? -ne 0
-       then
-               with_libvarnish="no (pkg-config doesn't know varnishapi)"
-       fi
-fi
-if test "x$with_libvarnish" = "xuse_pkgconfig"
-then
-       with_libvarnish_cflags="`$PKG_CONFIG --cflags 'varnishapi'`"
-       if test $? -ne 0
-       then
-               with_libvarnish="no ($PKG_CONFIG failed)"
-       fi
-       with_libvarnish_libs="`$PKG_CONFIG --libs 'varnishapi'`"
-       if test $? -ne 0
-       then
-               with_libvarnish="no ($PKG_CONFIG failed)"
-       fi
-fi
-if test "x$with_libvarnish" = "xuse_pkgconfig"
-then
-       with_libvarnish="yes"
+if test "x$with_libvarnish" = "xuse_pkgconfig"; then
+  $PKG_CONFIG --exists 'varnishapi' 2>/dev/null
+  if test $? -ne 0; then
+    with_libvarnish="no (pkg-config doesn't know varnishapi)"
+  fi
 fi
 
-# with_libvarnish_cflags and with_libvarnish_libs are set up now, let's do
-# the actual checks.
-if test "x$with_libvarnish" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
+if test "x$with_libvarnish" = "xuse_pkgconfig"; then
+  with_libvarnish_cflags="`$PKG_CONFIG --cflags 'varnishapi'`"
+  if test $? -ne 0; then
+    with_libvarnish="no ($PKG_CONFIG failed)"
+  fi
 
-       CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
+  with_libvarnish_libs="`$PKG_CONFIG --libs 'varnishapi'`"
+  if test $? -ne 0; then
+    with_libvarnish="no ($PKG_CONFIG failed)"
+  fi
+fi
+if test "x$with_libvarnish" = "xuse_pkgconfig"; then
+  with_libvarnish="yes"
+fi
 
-       AC_CHECK_HEADERS(vapi/vsc.h,
-               [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
-               [AC_CHECK_HEADERS(vsc.h,
-                       [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
-                       [AC_CHECK_HEADERS(varnishapi.h,
-                               [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
-                               [with_libvarnish="no (found none of the varnish header files)"])])])
+if test "x$with_libvarnish" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
+
+  AC_CHECK_HEADERS([vapi/vsc.h],
+    [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
+    [
+      AC_CHECK_HEADERS([vsc.h],
+        [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support]) ],
+        [
+          AC_CHECK_HEADERS([varnishapi.h],
+            [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
+            [with_libvarnish="no (found none of the varnish header files)"]
+          )
+        ]
+      )
+    ]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libvarnish" = "xyes"
-then
-       BUILD_WITH_LIBVARNISH_CFLAGS="$with_libvarnish_cflags"
-       BUILD_WITH_LIBVARNISH_LIBS="$with_libvarnish_libs"
-       AC_SUBST(BUILD_WITH_LIBVARNISH_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBVARNISH_LIBS)
+
+if test "x$with_libvarnish" = "xyes"; then
+  BUILD_WITH_LIBVARNISH_CFLAGS="$with_libvarnish_cflags"
+  BUILD_WITH_LIBVARNISH_LIBS="$with_libvarnish_libs"
 fi
+
+AC_SUBST([BUILD_WITH_LIBVARNISH_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBVARNISH_LIBS])
 # }}}
 
 # pkg-config --exists 'libxml-2.0'; pkg-config --exists libvirt {{{
-with_libxml2="no (pkg-config isn't available)"
-with_libxml2_cflags=""
-with_libxml2_ldflags=""
-with_libvirt="no (pkg-config isn't available)"
-with_libvirt_cflags=""
-with_libvirt_ldflags=""
 $PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null
-if test "$?" = "0"
-then
-       with_libxml2="yes"
+if test $? -eq 0; then
+  with_libxml2="yes"
 else
-       with_libxml2="no (pkg-config doesn't know libxml-2.0)"
+  with_libxml2="no (pkg-config doesn't know libxml-2.0)"
 fi
 
 $PKG_CONFIG --exists libvirt 2>/dev/null
-if test "$?" = "0"
-then
-       with_libvirt="yes"
+if test $? = 0; then
+  with_libvirt="yes"
 else
-       with_libvirt="no (pkg-config doesn't know libvirt)"
+  with_libvirt="no (pkg-config doesn't know libvirt)"
 fi
-if test "x$with_libxml2" = "xyes"
-then
-       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`"
-       if test $? -ne 0
-       then
-               with_libxml2="no"
-       fi
-fi
-if test "x$with_libxml2" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libxml2_cflags"
 
-       AC_CHECK_HEADERS(libxml/parser.h, [],
-                     [with_libxml2="no (libxml/parser.h not found)"])
+if test "x$with_libxml2" = "xyes"; then
+  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`"
+  if test $? -ne 0; then
+    with_libxml2="no"
+  fi
+fi
+
+if test "x$with_libxml2" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libxml2_cflags"
+
+  AC_CHECK_HEADERS([libxml/parser.h],
+    [with_libxml2="yes"],
+    [with_libxml2="no (libxml/parser.h not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libxml2" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
 
-       CFLAGS="$CFLAGS $with_libxml2_cflags"
-       LDFLAGS="$LDFLAGS $with_libxml2_ldflags"
+if test "x$with_libxml2" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libxml2_ldflags"
 
-       AC_CHECK_LIB(xml2, xmlXPathEval,
-                    [with_libxml2="yes"],
-                    [with_libxml2="no (symbol xmlXPathEval not found)"])
+  AC_CHECK_LIB([xml2], [xmlXPathEval],
+    [with_libxml2="yes"],
+    [with_libxml2="no (symbol xmlXPathEval not found)"]
+  )
 
-       CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-dnl Add the right compiler flags and libraries.
+
 if test "x$with_libxml2" = "xyes"; then
-       BUILD_WITH_LIBXML2_CFLAGS="$with_libxml2_cflags"
-       BUILD_WITH_LIBXML2_LIBS="$with_libxml2_ldflags"
-       AC_SUBST(BUILD_WITH_LIBXML2_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBXML2_LIBS)
+  BUILD_WITH_LIBXML2_CFLAGS="$with_libxml2_cflags"
+  BUILD_WITH_LIBXML2_LIBS="$with_libxml2_ldflags"
 fi
-if test "x$with_libvirt" = "xyes"
-then
-       with_libvirt_cflags="`$PKG_CONFIG --cflags libvirt`"
-       if test $? -ne 0
-       then
-               with_libvirt="no"
-       fi
-       with_libvirt_ldflags="`$PKG_CONFIG --libs libvirt`"
-       if test $? -ne 0
-       then
-               with_libvirt="no"
-       fi
-fi
-if test "x$with_libvirt" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libvirt_cflags"
 
-       AC_CHECK_HEADERS(libvirt/libvirt.h, [],
-                     [with_libvirt="no (libvirt/libvirt.h not found)"])
+AC_SUBST([BUILD_WITH_LIBXML2_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBXML2_LIBS])
+
+if test "x$with_libvirt" = "xyes"; then
+  with_libvirt_cflags="`$PKG_CONFIG --cflags libvirt`"
+  if test $? -ne 0; then
+    with_libvirt="no"
+  fi
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  with_libvirt_ldflags="`$PKG_CONFIG --libs libvirt`"
+  if test $? -ne 0; then
+    with_libvirt="no"
+  fi
+fi
+
+if test "x$with_libvirt" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libvirt_cflags"
+
+  AC_CHECK_HEADERS([libvirt/libvirt.h],
+    [with_libvirt="yes"],
+    [with_libvirt="no (libvirt/libvirt.h not found)"]
+  )
+
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libvirt" = "xyes"
-then
-       SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
 
-       CFLAGS="$CFLAGS $with_libvirt_cflags"
-       LDFLAGS="$LDFLAGS $with_libvirt_ldflags"
+if test "x$with_libvirt" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libvirt_ldflags"
 
-       AC_CHECK_LIB(virt, virDomainBlockStats,
-                    [with_libvirt="yes"],
-                    [with_libvirt="no (symbol virDomainBlockStats not found)"])
+  AC_CHECK_LIB([virt], [virDomainBlockStats],
+    [with_libvirt="yes"],
+    [with_libvirt="no (symbol virDomainBlockStats not found)"]
+  )
 
-       CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-dnl Add the right compiler flags and libraries.
+
 if test "x$with_libvirt" = "xyes"; then
-       BUILD_WITH_LIBVIRT_CFLAGS="$with_libvirt_cflags"
-       BUILD_WITH_LIBVIRT_LIBS="$with_libvirt_ldflags"
-       AC_SUBST(BUILD_WITH_LIBVIRT_CFLAGS)
-       AC_SUBST(BUILD_WITH_LIBVIRT_LIBS)
+  BUILD_WITH_LIBVIRT_CFLAGS="$with_libvirt_cflags"
+  BUILD_WITH_LIBVIRT_LIBS="$with_libvirt_ldflags"
 fi
+
+AC_SUBST([BUILD_WITH_LIBVIRT_CFLAGS])
+AC_SUBST([BUILD_WITH_LIBVIRT_LIBS])
 # }}}
 
 # $PKG_CONFIG --exists OpenIPMIpthread {{{
 with_libopenipmipthread="yes"
-with_libopenipmipthread_cflags=""
-with_libopenipmipthread_libs=""
+AC_MSG_CHECKING([for libOpenIPMIpthread])
+$PKG_CONFIG --exists OpenIPMIpthread 2>/dev/null
+if test $? -ne 0; then
+  with_libopenipmipthread="no (pkg-config doesn't know OpenIPMIpthread)"
+fi
+AC_MSG_RESULT([$with_libopenipmipthread])
+
+if test "x$with_libopenipmipthread" = "xyes"; then
+  AC_MSG_CHECKING([for libOpenIPMIpthread CFLAGS])
+  temp_result="`$PKG_CONFIG --cflags OpenIPMIpthread`"
+  if test $? -eq 0; then
+    with_libopenipmipthread_cflags="$temp_result"
+  else
+    with_libopenipmipthread="no ($PKG_CONFIG --cflags OpenIPMIpthread failed)"
+    temp_result="$PKG_CONFIG --cflags OpenIPMIpthread failed"
+  fi
+  AC_MSG_RESULT([$temp_result])
+fi
 
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       AC_MSG_CHECKING([for libOpenIPMIpthread])
-       $PKG_CONFIG --exists OpenIPMIpthread 2>/dev/null
-       if test "$?" != "0"
-       then
-               with_libopenipmipthread="no (pkg-config doesn't know OpenIPMIpthread)"
-       fi
-       AC_MSG_RESULT([$with_libopenipmipthread])
+if test "x$with_libopenipmipthread" = "xyes"; then
+  AC_MSG_CHECKING([for libOpenIPMIpthread LDFLAGS])
+  temp_result="`$PKG_CONFIG --libs OpenIPMIpthread`"
+  if test $? -eq 0; then
+    with_libopenipmipthread_ldflags="$temp_result"
+  else
+    with_libopenipmipthread="no ($PKG_CONFIG --libs OpenIPMIpthread failed)"
+    temp_result="$PKG_CONFIG --libs OpenIPMIpthread failed"
+  fi
+  AC_MSG_RESULT([$temp_result])
 fi
 
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       AC_MSG_CHECKING([for libOpenIPMIpthread CFLAGS])
-       temp_result="`$PKG_CONFIG --cflags OpenIPMIpthread`"
-       if test "$?" = "0"
-       then
-               with_libopenipmipthread_cflags="$temp_result"
-       else
-               with_libopenipmipthread="no ($PKG_CONFIG --cflags OpenIPMIpthread failed)"
-               temp_result="$PKG_CONFIG --cflags OpenIPMIpthread failed"
-       fi
-       AC_MSG_RESULT([$temp_result])
-fi
-
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       AC_MSG_CHECKING([for libOpenIPMIpthread LDFLAGS])
-       temp_result="`$PKG_CONFIG --libs OpenIPMIpthread`"
-       if test "$?" = "0"
-       then
-               with_libopenipmipthread_ldflags="$temp_result"
-       else
-               with_libopenipmipthread="no ($PKG_CONFIG --libs OpenIPMIpthread failed)"
-               temp_result="$PKG_CONFIG --libs OpenIPMIpthread failed"
-       fi
-       AC_MSG_RESULT([$temp_result])
-fi
-
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libopenipmipthread_cflags"
-
-       AC_CHECK_HEADERS(OpenIPMI/ipmi_smi.h,
-                        [with_libopenipmipthread="yes"],
-                        [with_libopenipmipthread="no (OpenIPMI/ipmi_smi.h not found)"],
-[#include <OpenIPMI/ipmiif.h>
-#include <OpenIPMI/ipmi_err.h>
-#include <OpenIPMI/ipmi_posix.h>
-#include <OpenIPMI/ipmi_conn.h>
-])
+if test "x$with_libopenipmipthread" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libopenipmipthread_cflags"
+
+  AC_CHECK_HEADERS([OpenIPMI/ipmi_smi.h],
+    [with_libopenipmipthread="yes"],
+    [with_libopenipmipthread="no (OpenIPMI/ipmi_smi.h not found)"],
+    [[
+      #include <OpenIPMI/ipmiif.h>
+      #include <OpenIPMI/ipmi_err.h>
+      #include <OpenIPMI/ipmi_posix.h>
+      #include <OpenIPMI/ipmi_conn.h>
+    ]]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
 
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       BUILD_WITH_OPENIPMI_CFLAGS="$with_libopenipmipthread_cflags"
-       BUILD_WITH_OPENIPMI_LIBS="$with_libopenipmipthread_ldflags"
-       AC_SUBST(BUILD_WITH_OPENIPMI_CFLAGS)
-       AC_SUBST(BUILD_WITH_OPENIPMI_LIBS)
+if test "x$with_libopenipmipthread" = "xyes"; then
+  BUILD_WITH_OPENIPMI_CFLAGS="$with_libopenipmipthread_cflags"
+  BUILD_WITH_OPENIPMI_LIBS="$with_libopenipmipthread_ldflags"
 fi
+
+AC_SUBST([BUILD_WITH_OPENIPMI_CFLAGS])
+AC_SUBST([BUILD_WITH_OPENIPMI_LIBS])
 # }}}
 
 # --with-libatasmart {{{
-with_libatasmart_cppflags=""
-with_libatasmart_ldflags=""
-AC_ARG_WITH(libatasmart, [AS_HELP_STRING([--with-libatasmart@<:@=PREFIX@:>@], [Path to libatasmart.])],
-[
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               with_libatasmart_cppflags="-I$withval/include"
-               with_libatasmart_ldflags="-L$withval/lib"
-               with_libatasmart="yes"
-       else
-               with_libatasmart="$withval"
-       fi
-],
-[
-       if test "x$ac_system" = "xLinux"
-       then
-               with_libatasmart="yes"
-       else
-               with_libatasmart="no (Linux only library)"
-       fi
-])
-if test "x$with_libatasmart" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libatasmart_cppflags"
+AC_ARG_WITH([libatasmart],
+  [AS_HELP_STRING([--with-libatasmart@<:@=PREFIX@:>@], [Path to libatasmart.])],
+  [
+    if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+      with_libatasmart_cppflags="-I$withval/include"
+      with_libatasmart_ldflags="-L$withval/lib"
+      with_libatasmart="yes"
+    else
+      with_libatasmart="$withval"
+    fi
+  ],
+  [
+    if test "x$ac_system" = "xLinux"; then
+      with_libatasmart="yes"
+    else
+      with_libatasmart="no (Linux only library)"
+    fi
+  ]
+)
+
+if test "x$with_libatasmart" = "xyes"; then
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $with_libatasmart_cppflags"
 
-       AC_CHECK_HEADERS(atasmart.h, [with_libatasmart="yes"], [with_libatasmart="no (atasmart.h not found)"])
+  AC_CHECK_HEADERS([atasmart.h],
+    [with_libatasmart="yes"],
+    [with_libatasmart="no (atasmart.h not found)"])
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
+  CPPFLAGS="$SAVE_CPPFLAGS"
 fi
-if test "x$with_libatasmart" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libatasmart_cppflags"
-       LDFLAGS="$LDFLAGS $with_libatasmart_ldflags"
 
-       AC_CHECK_LIB(atasmart, sk_disk_open, [with_libatasmart="yes"], [with_libatasmart="no (Symbol 'sk_disk_open' not found)"])
+if test "x$with_libatasmart" = "xyes"; then
+  SAVE_LDFLAGS="$LDFLAGS"
+  LDFLAGS="$LDFLAGS $with_libatasmart_ldflags"
+
+  AC_CHECK_LIB([atasmart], [sk_disk_open],
+    [with_libatasmart="yes"],
+    [with_libatasmart="no (Symbol 'sk_disk_open' not found)"]
+  )
 
-       CPPFLAGS="$SAVE_CPPFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
 fi
-if test "x$with_libatasmart" = "xyes"
-then
-       BUILD_WITH_LIBATASMART_CPPFLAGS="$with_libatasmart_cppflags"
-       BUILD_WITH_LIBATASMART_LDFLAGS="$with_libatasmart_ldflags"
-       BUILD_WITH_LIBATASMART_LIBS="-latasmart"
-       AC_SUBST(BUILD_WITH_LIBATASMART_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBATASMART_LDFLAGS)
-       AC_SUBST(BUILD_WITH_LIBATASMART_LIBS)
-       AC_DEFINE(HAVE_LIBATASMART, 1, [Define if libatasmart is present and usable.])
-fi
-AM_CONDITIONAL(BUILD_WITH_LIBATASMART, test "x$with_libatasmart" = "xyes")
+
+if test "x$with_libatasmart" = "xyes"; then
+  BUILD_WITH_LIBATASMART_CPPFLAGS="$with_libatasmart_cppflags"
+  BUILD_WITH_LIBATASMART_LDFLAGS="$with_libatasmart_ldflags"
+  BUILD_WITH_LIBATASMART_LIBS="-latasmart"
+fi
+
+AC_SUBST([BUILD_WITH_LIBATASMART_CPPFLAGS])
+AC_SUBST([BUILD_WITH_LIBATASMART_LDFLAGS])
+AC_SUBST([BUILD_WITH_LIBATASMART_LIBS])
 # }}}
 
 PKG_CHECK_MODULES([LIBNOTIFY], [libnotify],
-               [with_libnotify="yes"],
-               [with_libnotify="no (pkg-config doesn't know libnotify)"]
+  [with_libnotify="yes"],
+  [with_libnotify="no (pkg-config doesn't know libnotify)"]
 )
 
 PKG_CHECK_MODULES([LIBRIEMANN_CLIENT], [riemann-client >= 1.6.0],
  [with_libriemann_client="yes"],
- [with_libriemann_client="no (pkg-config doesn't know libriemann-client)"])
+ [with_libriemann_client="no (pkg-config doesn't know libriemann-client)"]
+)
 
 # Check for enabled/disabled features
 #
@@ -5888,61 +5940,59 @@ PKG_CHECK_MODULES([LIBRIEMANN_CLIENT], [riemann-client >= 1.6.0],
 # AC_COLLECTD(name, enable/disable, info-text, feature/module)
 # ------------------------------------------------------------
 dnl
-m4_define([my_toupper], [m4_translit([$1], m4_defn([m4_cr_letters]), m4_defn([m4_cr_LETTERS]))])
+m4_define([my_toupper],[m4_translit([$1], m4_defn([m4_cr_letters]), m4_defn([m4_cr_LETTERS]))])
 dnl
 AC_DEFUN(
-       [AC_COLLECTD],
-       [
-       m4_if([$1], [], [AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 1st argument must not be empty])])dnl
-       m4_if(
-               [$2],
-               [enable],
-               [dnl
-               m4_define([EnDis],[disabled])dnl
-               m4_define([YesNo],[no])dnl
-               ],dnl
-               [m4_if(
-                       [$2],
-                       [disable],
-                       [dnl
-                       m4_define([EnDis],[enabled])dnl
-                       m4_define([YesNo],[yes])dnl
-                       ],
-                       [dnl
-                       AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 2nd argument must be either enable or disable])dnl
-                       ]dnl
-               )]dnl
-       )dnl
-       m4_if([$3], [feature], [],
-               [m4_if(
-                       [$3], [module], [],
-                       [dnl
-                       AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 3rd argument must be either feature or disable])dnl
-                       ]dnl
-               )]dnl
-       )dnl
-       AC_ARG_ENABLE(
-               [$1],
-               AS_HELP_STRING([--$2-$1], [$2 $4 (EnDis by def)]),
-               [],
-               enable_$1='[YesNo]'dnl
-       )# AC_ARG_ENABLE
-if test "x$enable_$1" = "xno"
-then
-       collectd_$1=0
-else
-       if test "x$enable_$1" = "xyes"
-       then
-               collectd_$1=1
-       else
-               AC_MSG_NOTICE([please specify either --enable-$1 or --disable-$1; enabling $1.])
-               collectd_$1=1
-               enable_$1='yes'
-       fi
-fi
-       AC_DEFINE_UNQUOTED([COLLECT_]my_toupper([$1]), [$collectd_$1], [wether or not to enable $3 $4])
-       AM_CONDITIONAL([BUILD_]my_toupper([$3])[_]my_toupper([$1]), [test "x$enable_$1" = "xyes"])dnl
-       ]dnl
+  [AC_COLLECTD],
+  [
+  m4_if([$1], [], [AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 1st argument must not be empty])])dnl
+  m4_if(
+    [$2],
+    [enable],
+    [dnl
+    m4_define([EnDis],[disabled])dnl
+    m4_define([YesNo],[no])dnl
+    ],dnl
+    [m4_if(
+      [$2],
+      [disable],
+      [dnl
+      m4_define([EnDis],[enabled])dnl
+      m4_define([YesNo],[yes])dnl
+      ],
+      [dnl
+      AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 2nd argument must be either enable or disable])dnl
+      ]dnl
+    )]dnl
+  )dnl
+  m4_if([$3], [feature], [],
+    [m4_if(
+      [$3], [module], [],
+      [dnl
+      AC_FATAL([AC_COLLECTD([$1], [$2], [$3], [$4]): 3rd argument must be either feature or disable])dnl
+      ]dnl
+    )]dnl
+  )dnl
+  AC_ARG_ENABLE(
+    [$1],
+    AS_HELP_STRING([--$2-$1], [$2 $4 (EnDis by def)]),
+    [],
+    enable_$1='[YesNo]'dnl
+  )# AC_ARG_ENABLE
+  if test "x$enable_$1" = "xno"; then
+    collectd_$1=0
+  else
+    if test "x$enable_$1" = "xyes"; then
+      collectd_$1=1
+    else
+      AC_MSG_NOTICE([please specify either --enable-$1 or --disable-$1; enabling $1.])
+      collectd_$1=1
+      enable_$1='yes'
+    fi
+  fi
+  AC_DEFINE_UNQUOTED([COLLECT_]my_toupper([$1]), [$collectd_$1], [whether or not to enable $3 $4])
+  AM_CONDITIONAL([BUILD_]my_toupper([$3])[_]my_toupper([$1]), [test "x$enable_$1" = "xyes"])dnl
+  ]dnl
 )# AC_COLLECTD(name, enable/disable, info-text, feature/module)
 
 # AC_PLUGIN(name, default, info)
@@ -5953,47 +6003,42 @@ AC_DEFUN(
   [
     enable_plugin="no"
     force="no"
-    AC_ARG_ENABLE([$1], AS_HELP_STRING([--enable-$1],[$3]),
-    [
-     if test "x$enableval" = "xyes"
-     then
-            enable_plugin="yes"
-     else if test "x$enableval" = "xforce"
-     then
-            enable_plugin="yes"
-            force="yes"
-     else
-            enable_plugin="no (disabled on command line)"
-     fi; fi
-    ],
-    [
-        if test "x$enable_all_plugins" = "xauto"
-        then
-            if test "x$2" = "xyes"
-            then
-                    enable_plugin="yes"
-            else
-                    enable_plugin="$2"
-            fi
-        else
-            enable_plugin="$enable_all_plugins"
-        fi
-    ])
-    if test "x$enable_plugin" = "xyes"
-    then
-           if test "x$2" = "xyes" || test "x$force" = "xyes"
-           then
-                   AC_DEFINE([HAVE_PLUGIN_]my_toupper([$1]), 1, [Define to 1 if the $1 plugin is enabled.])
-                   if test "x$2" != "xyes"
-                   then
-                           dependency_warning="yes"
-                   fi
-           else # User passed "yes" but dependency checking yielded "no" => Dependency problem.
-                   dependency_error="yes"
-                   enable_plugin="$2 (dependency error)"
-           fi
+    AC_ARG_ENABLE([$1],
+      [AS_HELP_STRING([--enable-$1],[$3])],
+      [
+        if test "x$enableval" = "xyes"; then
+          enable_plugin="yes"
+        else if test "x$enableval" = "xforce"; then
+          enable_plugin="yes"
+          force="yes"
+        else
+          enable_plugin="no (disabled on command line)"
+        fi; fi
+      ],
+      [
+        if test "x$enable_all_plugins" = "xauto"; then
+          if test "x$2" = "xyes"; then
+            enable_plugin="yes"
+          else
+            enable_plugin="$2"
+          fi
+        else
+          enable_plugin="$enable_all_plugins"
+        fi
+      ]
+    )
+    if test "x$enable_plugin" = "xyes"; then
+      if test "x$2" = "xyes" || test "x$force" = "xyes"; then
+        AC_DEFINE([HAVE_PLUGIN_]my_toupper([$1]), 1, [Define to 1 if the $1 plugin is enabled.])
+        if test "x$2" != "xyes"; then
+          dependency_warning="yes"
+        fi
+      else # User passed "yes" but dependency checking yielded "no" => Dependency problem.
+        dependency_error="yes"
+        enable_plugin="$2 (dependency error)"
+      fi
     fi
-    AM_CONDITIONAL([BUILD_PLUGIN_]my_toupper([$1]), test "x$enable_plugin" = "xyes")
+    AM_CONDITIONAL([BUILD_PLUGIN_]my_toupper([$1]), [test "x$enable_plugin" = "xyes"])
     enable_$1="$enable_plugin"
   ]
 )# AC_PLUGIN(name, default, info)
@@ -6025,6 +6070,7 @@ plugin_curl_xml="no"
 plugin_df="no"
 plugin_disk="no"
 plugin_drbd="no"
+plugin_dpdkevents="no"
 plugin_dpdkstat="no"
 plugin_entropy="no"
 plugin_ethstat="no"
@@ -6035,15 +6081,19 @@ plugin_grpc="no"
 plugin_hugepages="no"
 plugin_intel_rdt="no"
 plugin_interface="no"
+plugin_ipc="no"
 plugin_ipmi="no"
 plugin_ipvs="no"
 plugin_irq="no"
 plugin_load="no"
 plugin_log_logstash="no"
+plugin_mcelog="no"
 plugin_memory="no"
 plugin_multimeter="no"
 plugin_nfs="no"
 plugin_numa="no"
+plugin_ovs_events="no"
+plugin_ovs_stats="no"
 plugin_perl="no"
 plugin_pinba="no"
 plugin_processes="no"
@@ -6070,374 +6120,310 @@ plugin_zone="no"
 plugin_zookeeper="no"
 
 # Linux
-if test "x$ac_system" = "xLinux"
-then
-       plugin_battery="yes"
-       plugin_cgroups="yes"
-       plugin_conntrack="yes"
-       plugin_contextswitch="yes"
-       plugin_cpu="yes"
-       plugin_cpufreq="yes"
-       plugin_disk="yes"
-       plugin_drbd="yes"
-       plugin_entropy="yes"
-       plugin_fhcount="yes"
-       plugin_fscache="yes"
-       plugin_hugepages="yes"
-       plugin_interface="yes"
-       plugin_ipc="yes"
-       plugin_irq="yes"
-       plugin_load="yes"
-       plugin_lvm="yes"
-       plugin_memory="yes"
-       plugin_nfs="yes"
-       plugin_numa="yes"
-       plugin_processes="yes"
-       plugin_protocols="yes"
-       plugin_serial="yes"
-       plugin_swap="yes"
-       plugin_tcpconns="yes"
-       plugin_thermal="yes"
-       plugin_uptime="yes"
-       plugin_vmem="yes"
-       plugin_vserver="yes"
-       plugin_wireless="yes"
-       plugin_zfs_arc="yes"
-
-       if test "x$have_linux_ip_vs_h" = "xyes" || test "x$have_net_ip_vs_h" = "xyes" || test "x$have_ip_vs_h" = "xyes"
-       then
-               plugin_ipvs="yes"
-       fi
-       if test "x$c_cv_have_usable_asm_msrindex_h" = "xyes" && test "x$have_cpuid_h" = "xyes"
-       then
-               plugin_turbostat="yes"
-       fi
-       
-       if test "x$c_cv_have_clock_boottime_monotonic" = "xyes"
-       then
-               plugin_cpusleep="yes"
-       fi
-fi
-
-if test "x$ac_system" = "xOpenBSD"
-then
-       plugin_tcpconns="yes"
+if test "x$ac_system" = "xLinux"; then
+  plugin_battery="yes"
+  plugin_cgroups="yes"
+  plugin_conntrack="yes"
+  plugin_contextswitch="yes"
+  plugin_cpu="yes"
+  plugin_cpufreq="yes"
+  plugin_disk="yes"
+  plugin_drbd="yes"
+  plugin_entropy="yes"
+  plugin_fhcount="yes"
+  plugin_fscache="yes"
+  plugin_hugepages="yes"
+  plugin_interface="yes"
+  plugin_ipc="yes"
+  plugin_irq="yes"
+  plugin_load="yes"
+  plugin_lvm="yes"
+  plugin_mcelog="yes"
+  plugin_memory="yes"
+  plugin_nfs="yes"
+  plugin_numa="yes"
+  plugin_processes="yes"
+  plugin_protocols="yes"
+  plugin_serial="yes"
+  plugin_swap="yes"
+  plugin_tcpconns="yes"
+  plugin_thermal="yes"
+  plugin_uptime="yes"
+  plugin_vmem="yes"
+  plugin_vserver="yes"
+  plugin_wireless="yes"
+  plugin_zfs_arc="yes"
+
+  if test "x$ac_cv_header_linux_ip_vs_h" = "xyes"; then
+    plugin_ipvs="yes"
+  fi
+
+  if test "x$c_cv_have_usable_asm_msrindex_h" = "xyes" && test "x$have_cpuid_h" = "xyes"; then
+    plugin_turbostat="yes"
+  fi
+
+  if test "x$c_cv_have_clock_boottime_monotonic" = "xyes"; then
+    plugin_cpusleep="yes"
+  fi
+
+  if test "x$with_libyajl" = "xyes" && test "x$with_libyajl2" = "xyes"; then
+    plugin_ovs_events="yes"
+    plugin_ovs_stats="yes"
+  fi
 fi
 
-if test "x$ac_system" = "xNetBSD"
-then
-       plugin_disk="yes"
-       plugin_entropy="yes"
-       plugin_irq="yes"
-       plugin_processes="yes"
+if test "x$ac_system" = "xOpenBSD"; then
+  plugin_tcpconns="yes"
+fi
+
+if test "x$ac_system" = "xNetBSD"; then
+  plugin_disk="yes"
+  plugin_entropy="yes"
+  plugin_irq="yes"
+  plugin_processes="yes"
 fi
 
 # Mac OS X devices
-if test "x$with_libiokit" = "xyes"
-then
-       plugin_battery="yes"
-       plugin_disk="yes"
+if test "x$with_libiokit" = "xyes"; then
+  plugin_battery="yes"
+  plugin_disk="yes"
 fi
 
 # AIX
 
-if test "x$ac_system" = "xAIX"
-then
-       plugin_ipc="yes"
-       plugin_tcpconns="yes"
+if test "x$ac_system" = "xAIX"; then
+  plugin_ipc="yes"
+  plugin_tcpconns="yes"
 fi
 
 # FreeBSD
 
-if test "x$ac_system" = "xFreeBSD"
-then
-       plugin_disk="yes"
-       plugin_zfs_arc="yes"
+if test "x$ac_system" = "xFreeBSD"; then
+  plugin_disk="yes"
+  plugin_zfs_arc="yes"
 fi
 
 
-if test "x$with_perfstat" = "xyes"
-then
-       plugin_contextswitch="yes"
-       plugin_cpu="yes"
-       plugin_disk="yes"
-       plugin_interface="yes"
-       plugin_load="yes"
-       plugin_memory="yes"
-       plugin_swap="yes"
-       plugin_uptime="yes"
+if test "x$with_perfstat" = "xyes"; then
+  plugin_contextswitch="yes"
+  plugin_cpu="yes"
+  plugin_disk="yes"
+  plugin_interface="yes"
+  plugin_load="yes"
+  plugin_memory="yes"
+  plugin_swap="yes"
+  plugin_uptime="yes"
 fi
 
-if test "x$with_procinfo" = "xyes"
-then
-       plugin_processes="yes"
+if test "x$with_procinfo" = "xyes"; then
+  plugin_processes="yes"
 fi
 
 # Solaris
-if test "x$with_kstat" = "xyes"
-then
-       plugin_nfs="yes"
-       plugin_processes="yes"
-       plugin_uptime="yes"
-       plugin_zfs_arc="yes"
-       plugin_zone="yes"
-fi
-
-if test "x$with_devinfo$with_kstat" = "xyesyes"
-then
-       plugin_cpu="yes"
-       plugin_disk="yes"
-       plugin_interface="yes"
-       plugin_memory="yes"
-       plugin_tape="yes"
+if test "x$with_kstat" = "xyes"; then
+  plugin_nfs="yes"
+  plugin_processes="yes"
+  plugin_uptime="yes"
+  plugin_zfs_arc="yes"
+  plugin_zone="yes"
 fi
 
-# libi2c-dev
-if test "x$ac_system" = "xLinux"
-then
-AC_CHECK_DECL(i2c_smbus_read_i2c_block_data,
-       [with_libi2c="yes"],
-       [with_libi2c="no (symbol i2c_smbus_read_i2c_block_data not found - have you installed libi2c-dev ?)"],
-       [[#include <stdlib.h>
-       #include <linux/i2c-dev.h>]])
-else
-       with_libi2c="no (Linux only)"
+if test "x$with_devinfo" = "xyes" && test "x$with_kstat" = "xyes"; then
+  plugin_cpu="yes"
+  plugin_disk="yes"
+  plugin_interface="yes"
+  plugin_memory="yes"
+  plugin_tape="yes"
 fi
 
-if test "x$with_libi2c" = "xyes"
-then
-       plugin_barometer="yes"
+if test "x$with_libi2c" = "xyes"; then
+  plugin_barometer="yes"
 fi
 
 
 # libstatgrab
-if test "x$with_libstatgrab" = "xyes"
-then
-       plugin_cpu="yes"
-       plugin_disk="yes"
-       plugin_interface="yes"
-       plugin_load="yes"
-       plugin_memory="yes"
-       plugin_swap="yes"
-       plugin_users="yes"
+if test "x$with_libstatgrab" = "xyes"; then
+  plugin_cpu="yes"
+  plugin_disk="yes"
+  plugin_interface="yes"
+  plugin_load="yes"
+  plugin_memory="yes"
+  plugin_swap="yes"
+  plugin_users="yes"
+fi
+
+if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"; then
+  plugin_ascent="yes"
+  if test "x$have_strptime" = "xyes"; then
+    plugin_bind="yes"
+  fi
 fi
 
-if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"
-then
-       plugin_ascent="yes"
-       if test "x$have_strptime" = "xyes"
-       then
-               plugin_bind="yes"
-       fi
+if test "x$with_libopenipmipthread" = "xyes"; then
+  plugin_ipmi="yes"
 fi
 
-if test "x$with_libopenipmipthread" = "xyes"
-then
-       plugin_ipmi="yes"
+if test "x$with_libcurl" = "xyes" && test "x$with_libyajl" = "xyes"; then
+  plugin_curl_json="yes"
 fi
 
-if test "x$with_libcurl" = "xyes" && test "x$with_libyajl" = "xyes"
-then
-       plugin_curl_json="yes"
+if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"; then
+  plugin_curl_xml="yes"
 fi
 
-if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"
-then
-       plugin_curl_xml="yes"
+if test "x$with_libyajl" = "xyes"; then
+  plugin_ceph="yes"
 fi
 
-if test "x$with_libyajl" = "xyes"
-then
-       plugin_ceph="yes"
+if test "x$have_processor_info" = "xyes"; then
+  plugin_cpu="yes"
 fi
 
-if test "x$have_processor_info" = "xyes"
-then
-       plugin_cpu="yes"
+if test "x$have_sysctl" = "xyes"; then
+  plugin_cpu="yes"
+  plugin_memory="yes"
+  plugin_uptime="yes"
+  if test "x$ac_system" = "xDarwin"; then
+    plugin_swap="yes"
+  fi
 fi
-if test "x$have_sysctl" = "xyes"
-then
-       plugin_cpu="yes"
-       plugin_memory="yes"
-       plugin_uptime="yes"
-       if test "x$ac_system" = "xDarwin"
-       then
-               plugin_swap="yes"
-       fi
-fi
-if test "x$have_sysctlbyname" = "xyes"
-then
-       plugin_contextswitch="yes"
-       plugin_cpu="yes"
-       plugin_memory="yes"
-       plugin_tcpconns="yes"
+
+if test "x$have_sysctlbyname" = "xyes"; then
+  plugin_contextswitch="yes"
+  plugin_cpu="yes"
+  plugin_memory="yes"
+  plugin_tcpconns="yes"
 fi
 
-# Df plugin: Check if we know how to determine mount points first.
-#if test "x$have_listmntent" = "xyes"; then
-#      plugin_df="yes"
-#fi
-if test "x$have_getvfsstat" = "xyes" || test "x$have_getfsstat" = "xyes"
-then
-       plugin_df="yes"
+if test "x$have_getvfsstat" = "xyes" || test "x$have_getfsstat" = "xyes"; then
+  plugin_df="yes"
 fi
-if test "x$c_cv_have_two_getmntent" = "xyes" || test "x$have_getmntent" = "xgen" || test "x$have_getmntent" = "xsun"
-then
-       plugin_df="yes"
+
+if test "x$c_cv_have_two_getmntent" = "xyes" || test "x$have_getmntent" = "xgen" || test "x$have_getmntent" = "xsun"; then
+  plugin_df="yes"
 fi
-#if test "x$have_getmntent" = "xseq"
-#then
-#      plugin_df="yes"
-#fi
-if test "x$c_cv_have_one_getmntent" = "xyes"
-then
-       plugin_df="yes"
+
+if test "x$c_cv_have_one_getmntent" = "xyes"; then
+  plugin_df="yes"
 fi
 
-if test "x$c_cv_have_getmntent_r" = "xyes"
-then
-       plugin_df="yes"
+if test "x$c_cv_have_getmntent_r" = "xyes"; then
+  plugin_df="yes"
 fi
 
-# Df plugin: Check if we have either `statfs' or `statvfs' second.
-if test "x$plugin_df" = "xyes"
-then
-       plugin_df="no"
-       if test "x$have_statfs" = "xyes"
-       then
-               plugin_df="yes"
-       fi
-       if test "x$have_statvfs" = "xyes"
-       then
-               plugin_df="yes"
-       fi
-fi
-
-if test "x$have_linux_sockios_h$have_linux_ethtool_h" = "xyesyes"
-then
-       plugin_ethstat="yes"
+if test "x$plugin_df" = "xyes"; then
+  plugin_df="no"
+  if test "x$have_statfs" = "xyes"; then
+    plugin_df="yes"
+  fi
+
+  if test "x$have_statvfs" = "xyes"; then
+    plugin_df="yes"
+  fi
 fi
 
-if test "x$with_libgrpcpp" = "xyes" && test "x$with_libprotobuf" = "xyes" && test "x$have_protoc3" = "xyes" && test "x$GRPC_CPP_PLUGIN" != "x"
-then
-       plugin_grpc="yes"
+if test "x$have_linux_sockios_h" = "xyes" && test "x$have_linux_ethtool_h" = "xyes"; then
+  plugin_ethstat="yes"
 fi
 
-if test "x$have_getifaddrs" = "xyes"
-then
-       plugin_interface="yes"
+if test "x$with_libgps" = "xyes"; then
+  plugin_gps="yes"
 fi
 
-if test "x$with_libgps" = "xyes"
-then
-       plugin_gps="yes"
+if test "x$with_libgrpcpp" = "xyes" && test "x$with_libprotobuf" = "xyes" && test "x$have_protoc3" = "xyes" && test "x$GRPC_CPP_PLUGIN" != "x"; then
+  plugin_grpc="yes"
 fi
 
-if test "x$have_getloadavg" = "xyes"
-then
-       plugin_load="yes"
+if test "x$have_getifaddrs" = "xyes"; then
+  plugin_interface="yes"
 fi
 
-if test "x$with_libyajl" = "xyes"
-then
-       plugin_log_logstash="yes"
+if test "x$have_getloadavg" = "xyes"; then
+  plugin_load="yes"
 fi
 
-if test "x$c_cv_have_libperl$c_cv_have_perl_ithreads" = "xyesyes"
-then
-       plugin_perl="yes"
+if test "x$with_libyajl" = "xyes"; then
+  plugin_log_logstash="yes"
 fi
 
-if test "x$have_protoc_c" = "xyes" && test "x$with_libprotobuf_c" = "xyes"
-then
-       plugin_pinba="yes"
-       if test "x$with_libmicrohttpd" = "xyes"
-       then
-               plugin_write_prometheus="yes"
-       fi
+if test "x$with_libperl" = "xyes" && test "x$c_cv_have_perl_ithreads" = "xyes"; then
+  plugin_perl="yes"
+fi
+
+if test "x$have_protoc_c" = "xyes" && test "x$with_libprotobuf_c" = "xyes"; then
+  plugin_pinba="yes"
+  if test "x$with_libmicrohttpd" = "xyes"; then
+    plugin_write_prometheus="yes"
+  fi
 fi
 
 # Mac OS X memory interface
-if test "x$have_host_statistics" = "xyes"
-then
-       plugin_memory="yes"
+if test "x$have_host_statistics" = "xyes"; then
+  plugin_memory="yes"
 fi
 
-if test "x$have_termios_h" = "xyes"
-then
-       if test "x$ac_system" != "xAIX"
-       then
-               plugin_multimeter="yes"
-       fi
-       plugin_ted="yes"
+if test "x$have_termios_h" = "xyes"; then
+  if test "x$ac_system" != "xAIX"; then
+    plugin_multimeter="yes"
+  fi
+  plugin_ted="yes"
 fi
 
-if test "x$have_thread_info" = "xyes"
-then
-       plugin_processes="yes"
+if test "x$have_thread_info" = "xyes"; then
+  plugin_processes="yes"
 fi
 
-if test "x$with_kvm_getprocs" = "xyes" && test "x$have_struct_kinfo_proc_freebsd" = "xyes"
-then
-       plugin_processes="yes"
+if test "x$with_kvm_getprocs" = "xyes" && test "x$have_struct_kinfo_proc_freebsd" = "xyes"; then
+  plugin_processes="yes"
 fi
 
-if test "x$with_kvm_getprocs" = "xyes" && test "x$have_struct_kinfo_proc_openbsd" = "xyes"
-then
-       plugin_processes="yes"
+if test "x$with_kvm_getprocs" = "xyes" && test "x$have_struct_kinfo_proc_openbsd" = "xyes"; then
+  plugin_processes="yes"
 fi
 
-if test "x$with_libpython" != "xno"
-then
-       plugin_python="yes"
+if test "x$with_libpython" != "xno"; then
+  plugin_python="yes"
 fi
 
-if test "x$with_libatasmart" = "xyes" && test "x$with_libudev" = "xyes"
-then
-       plugin_smart="yes"
+if test "x$with_libatasmart" = "xyes" && test "x$with_libudev" = "xyes"; then
+  plugin_smart="yes"
 fi
 
-if test "x$with_kvm_getswapinfo" = "xyes"
-then
-       plugin_swap="yes"
+if test "x$with_kvm_getswapinfo" = "xyes"; then
+  plugin_swap="yes"
 fi
 
-if test "x$have_swapctl" = "xyes" && test "x$c_cv_have_swapctl_two_args" = "xyes"
-then
-       plugin_swap="yes"
+if test "x$have_swapctl" = "xyes" && test "x$c_cv_have_swapctl_two_args" = "xyes"; then
+  plugin_swap="yes"
 fi
 
-if test "x$have_swapctl" = "xyes" && test "x$c_cv_have_swapctl_three_args" = "xyes"
-then
-       plugin_swap="yes"
+if test "x$have_swapctl" = "xyes" && test "x$c_cv_have_swapctl_three_args" = "xyes"; then
+  plugin_swap="yes"
 fi
 
-if test "x$with_kvm_openfiles$with_kvm_nlist" = "xyesyes"
-then
-       plugin_tcpconns="yes"
+if test "x$with_kvm_openfiles = "xyes" && $with_kvm_nlist" = "xyes"; then
+  plugin_tcpconns="yes"
 fi
 
-if test "x$have_getutent" = "xyes"
-then
-       plugin_users="yes"
+if test "x$have_getutent" = "xyes"; then
+  plugin_users="yes"
 fi
-if test "x$have_getutxent" = "xyes"
-then
-       plugin_users="yes"
+
+if test "x$have_getutxent" = "xyes"; then
+  plugin_users="yes"
 fi
 
-if test "x$with_libxml2" = "xyes" && test "x$with_libvirt" = "xyes"
-then
-       plugin_virt="yes"
+if test "x$with_libxml2" = "xyes" && test "x$with_libvirt" = "xyes"; then
+  plugin_virt="yes"
 fi
 
-if test "x$with_libxenctrl" = "xyes"
-then
+if test "x$with_libxenctrl" = "xyes"; then
   plugin_xencpu="yes"
 fi
 
 if test "x$with_libdpdk" = "xyes"
 then
+  plugin_dpdkevents="$dpdk_keepalive"
   plugin_dpdkstat="yes"
 fi
 
@@ -6445,19 +6431,18 @@ m4_divert_once([HELP_ENABLE], [
 collectd plugins:])
 
 AC_ARG_ENABLE([all-plugins],
-               AS_HELP_STRING([--enable-all-plugins],[enable all plugins (auto by def)]),
-               [
-                if test "x$enableval" = "xyes"
-                then
-                        enable_all_plugins="yes"
-                else if test "x$enableval" = "xauto"
-                then
-                        enable_all_plugins="auto"
-                else
-                        enable_all_plugins="no"
-                fi; fi
-               ],
-               [enable_all_plugins="auto"])
+  [AS_HELP_STRING([--enable-all-plugins], [enable all plugins @<:@default=yes@:>@])],
+  [
+     if test "x$enableval" = "xyes"; then
+       enable_all_plugins="yes"
+     else if test "x$enableval" = "xauto"; then
+       enable_all_plugins="auto"
+     else
+       enable_all_plugins="no"
+     fi; fi
+  ],
+  [enable_all_plugins="auto"]
+)
 
 m4_divert_once([HELP_ENABLE], [])
 
@@ -6487,7 +6472,8 @@ AC_PLUGIN([dbi],                 [$with_libdbi],            [General database st
 AC_PLUGIN([df],                  [$plugin_df],              [Filesystem usage statistics])
 AC_PLUGIN([disk],                [$plugin_disk],            [Disk usage statistics])
 AC_PLUGIN([dns],                 [$with_libpcap],           [DNS traffic analysis])
-AC_PLUGIN([dpdkstat],            [$plugin_dpdkstat],        [Stats & Status from DPDK])
+AC_PLUGIN([dpdkevents],          [$plugin_dpdkevents],      [Events from DPDK])
+AC_PLUGIN([dpdkstat],            [$plugin_dpdkstat],        [Stats from DPDK])
 AC_PLUGIN([drbd],                [$plugin_drbd],            [DRBD statistics])
 AC_PLUGIN([email],               [yes],                     [EMail statistics])
 AC_PLUGIN([entropy],             [$plugin_entropy],         [Entropy statistics])
@@ -6522,6 +6508,7 @@ AC_PLUGIN([match_regex],         [yes],                     [The regex match])
 AC_PLUGIN([match_timediff],      [yes],                     [The timediff match])
 AC_PLUGIN([match_value],         [yes],                     [The value match])
 AC_PLUGIN([mbmon],               [yes],                     [Query mbmond])
+AC_PLUGIN([mcelog],              [$plugin_mcelog],          [Machine Check Exceptions notifications])
 AC_PLUGIN([md],                  [$have_linux_raid_md_u_h], [md (Linux software RAID) devices])
 AC_PLUGIN([memcachec],           [$with_libmemcached],      [memcachec statistics])
 AC_PLUGIN([memcached],           [yes],                     [memcached statistics])
@@ -6547,6 +6534,8 @@ AC_PLUGIN([onewire],             [$with_libowcapi],         [OneWire sensor stat
 AC_PLUGIN([openldap],            [$with_libldap],           [OpenLDAP statistics])
 AC_PLUGIN([openvpn],             [yes],                     [OpenVPN client statistics])
 AC_PLUGIN([oracle],              [$with_oracle],            [Oracle plugin])
+AC_PLUGIN([ovs_events],          [$plugin_ovs_events],      [OVS events plugin])
+AC_PLUGIN([ovs_stats],           [$plugin_ovs_stats],       [OVS statistics plugin])
 AC_PLUGIN([perl],                [$plugin_perl],            [Embed a Perl interpreter])
 AC_PLUGIN([pf],                  [$have_net_pfvar_h],       [BSD packet filter (PF) statistics])
 # FIXME: Check for libevent, too.
@@ -6566,6 +6555,7 @@ AC_PLUGIN([serial],              [$plugin_serial],          [serial port traffic
 AC_PLUGIN([sigrok],              [$with_libsigrok],         [sigrok acquisition sources])
 AC_PLUGIN([smart],               [$plugin_smart],           [SMART statistics])
 AC_PLUGIN([snmp],                [$with_libnetsnmp],        [SNMP querying plugin])
+AC_PLUGIN([snmp_agent],          [$with_libnetsnmpagent],   [SNMP agent plugin])
 AC_PLUGIN([statsd],              [yes],                     [StatsD plugin])
 AC_PLUGIN([swap],                [$plugin_swap],            [Swap usage statistics])
 AC_PLUGIN([syslog],              [$have_syslog],            [Syslog logging plugin])
@@ -6618,45 +6608,40 @@ LOAD_PLUGIN_LOG_LOGSTASH=""
 
 AC_MSG_CHECKING([which default log plugin to load])
 default_log_plugin="none"
-if test "x$enable_syslog" = "xyes"
-then
-       default_log_plugin="syslog"
+if test "x$enable_syslog" = "xyes"; then
+  default_log_plugin="syslog"
 else
-       LOAD_PLUGIN_SYSLOG="##"
+  LOAD_PLUGIN_SYSLOG="##"
 fi
 
-if test "x$enable_logfile" = "xyes"
-then
-       if test "x$default_log_plugin" = "xnone"
-       then
-               default_log_plugin="logfile"
-       else
-               LOAD_PLUGIN_LOGFILE="#"
-       fi
+if test "x$enable_logfile" = "xyes"; then
+  if test "x$default_log_plugin" = "xnone"; then
+    default_log_plugin="logfile"
+  else
+    LOAD_PLUGIN_LOGFILE="#"
+  fi
 else
-       LOAD_PLUGIN_LOGFILE="##"
+  LOAD_PLUGIN_LOGFILE="##"
 fi
 
-if test "x$enable_log_logstash" = "xyes"
-then
+if test "x$enable_log_logstash" = "xyes"; then
   LOAD_PLUGIN_LOG_LOGSTASH="#"
 else
   LOAD_PLUGIN_LOG_LOGSTASH="##"
 fi
 
-
 AC_MSG_RESULT([$default_log_plugin])
 
-AC_SUBST(LOAD_PLUGIN_SYSLOG)
-AC_SUBST(LOAD_PLUGIN_LOGFILE)
-AC_SUBST(LOAD_PLUGIN_LOG_LOGSTASH)
+AC_SUBST([LOAD_PLUGIN_SYSLOG])
+AC_SUBST([LOAD_PLUGIN_LOGFILE])
+AC_SUBST([LOAD_PLUGIN_LOG_LOGSTASH])
 
-DEFAULT_LOG_LEVEL="info"
-if test "x$enable_debug" = "xyes"
-then
-       DEFAULT_LOG_LEVEL="debug"
+if test "x$enable_debug" = "xyes"; then
+  DEFAULT_LOG_LEVEL="debug"
+else
+  DEFAULT_LOG_LEVEL="info"
 fi
-AC_SUBST(DEFAULT_LOG_LEVEL)
+AC_SUBST([DEFAULT_LOG_LEVEL])
 
 # Load only one of rrdtool, network, csv in the default config.
 LOAD_PLUGIN_RRDTOOL=""
@@ -6665,94 +6650,74 @@ LOAD_PLUGIN_CSV=""
 
 AC_MSG_CHECKING([which default write plugin to load])
 default_write_plugin="none"
-if test "x$enable_rrdtool" = "xyes"
-then
-       default_write_plugin="rrdtool"
+if test "x$enable_rrdtool" = "xyes"; then
+  default_write_plugin="rrdtool"
 else
-       LOAD_PLUGIN_RRDTOOL="##"
+  LOAD_PLUGIN_RRDTOOL="##"
 fi
 
-if test "x$enable_network" = "xyes"
-then
-       if test "x$default_write_plugin" = "xnone"
-       then
-               default_write_plugin="network"
-       else
-               LOAD_PLUGIN_NETWORK="#"
-       fi
+if test "x$enable_network" = "xyes"; then
+  if test "x$default_write_plugin" = "xnone"; then
+    default_write_plugin="network"
+  else
+    LOAD_PLUGIN_NETWORK="#"
+  fi
 else
-       LOAD_PLUGIN_NETWORK="##"
+  LOAD_PLUGIN_NETWORK="##"
 fi
 
-if test "x$enable_csv" = "xyes"
-then
-       if test "x$default_write_plugin" = "xnone"
-       then
-               default_write_plugin="csv"
-       else
-               LOAD_PLUGIN_CSV="#"
-       fi
+if test "x$enable_csv" = "xyes"; then
+  if test "x$default_write_plugin" = "xnone"; then
+    default_write_plugin="csv"
+  else
+    LOAD_PLUGIN_CSV="#"
+  fi
 else
-       LOAD_PLUGIN_CSV="##"
+  LOAD_PLUGIN_CSV="##"
 fi
 AC_MSG_RESULT([$default_write_plugin])
 
-AC_SUBST(LOAD_PLUGIN_RRDTOOL)
-AC_SUBST(LOAD_PLUGIN_NETWORK)
-AC_SUBST(LOAD_PLUGIN_CSV)
-
-dnl ip_vs.h
-if test "x$ac_system" = "xLinux" \
-       && test "x$have_linux_ip_vs_h$have_net_ip_vs_h$have_ip_vs_h" = "xnonono"
-then
-       enable_ipvs="$enable_ipvs (ip_vs.h not found)"
-fi
-
-if test "x$ip_vs_h_needs_kernel_cflags" = "xyes"
-then
-       enable_ipvs="$enable_ipvs (needs $KERNEL_CFLAGS)"
-fi
+AC_SUBST([LOAD_PLUGIN_RRDTOOL])
+AC_SUBST([LOAD_PLUGIN_NETWORK])
+AC_SUBST([LOAD_PLUGIN_CSV])
 
 dnl Perl bindings
 PERL_BINDINGS_OPTIONS="PREFIX=${prefix}"
 AC_ARG_WITH(perl-bindings, [AS_HELP_STRING([--with-perl-bindings@<:@=OPTIONS@:>@], [Options passed to "perl Makefile.PL".])],
 [
-       if test "x$withval" != "xno" && test "x$withval" != "xyes"
-       then
-               PERL_BINDINGS_OPTIONS="$withval"
-               with_perl_bindings="yes"
-       else
-               with_perl_bindings="$withval"
-       fi
+  if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+    PERL_BINDINGS_OPTIONS="$withval"
+    with_perl_bindings="yes"
+  else
+    with_perl_bindings="$withval"
+  fi
 ],
 [
-       if test -n "$perl_interpreter"
-       then
-               with_perl_bindings="yes"
-       else
-               with_perl_bindings="no (no perl interpreter found)"
-       fi
+  if test "x$PERL" != "x"; then
+    with_perl_bindings="yes"
+  else
+    with_perl_bindings="no (no perl interpreter found)"
+  fi
 ])
 
-if test "x$with_perl_bindings" = "xyes"
-then
-       AC_MSG_CHECKING([for the ExtUtils::MakeMaker module])
-       if $PERL -MExtUtils::MakeMaker -e '' 2>/dev/null; then
-               AC_MSG_RESULT([yes])
-       else
-               AC_MSG_RESULT([no])
-               with_perl_bindings="no (ExtUtils::MakeMaker not found)"
-       fi
+if test "x$with_perl_bindings" = "xyes"; then
+  AC_MSG_CHECKING([for the ExtUtils::MakeMaker module])
+  if $PERL -MExtUtils::MakeMaker -e '' 2>/dev/null; then
+    AC_MSG_RESULT([yes])
+  else
+    AC_MSG_RESULT([no])
+    with_perl_bindings="no (ExtUtils::MakeMaker not found)"
+  fi
 fi
 
-if test "x$with_perl_bindings" = "xyes"
-then
-       PERL_BINDINGS="perl"
+if test "x$with_perl_bindings" = "xyes"; then
+  PERL_BINDINGS="perl"
 else
-       PERL_BINDINGS=""
+  PERL_BINDINGS=""
 fi
-AC_SUBST(PERL_BINDINGS)
-AC_SUBST(PERL_BINDINGS_OPTIONS)
+
+AC_SUBST([PERL_BINDINGS])
+AC_SUBST([PERL_BINDINGS_OPTIONS])
 
 dnl libcollectdclient
 LCC_VERSION_MAJOR=`echo $PACKAGE_VERSION | cut -d'.' -f1`
@@ -6763,55 +6728,55 @@ LCC_VERSION_EXTRA=`echo $PACKAGE_VERSION | cut -d'.' -f4-`
 
 LCC_VERSION_STRING="$LCC_VERSION_MAJOR.$LCC_VERSION_MINOR.$LCC_VERSION_PATCH"
 
-AC_SUBST(LCC_VERSION_MAJOR)
-AC_SUBST(LCC_VERSION_MINOR)
-AC_SUBST(LCC_VERSION_PATCH)
-AC_SUBST(LCC_VERSION_EXTRA)
-AC_SUBST(LCC_VERSION_STRING)
+AC_SUBST([LCC_VERSION_MAJOR])
+AC_SUBST([LCC_VERSION_MINOR])
+AC_SUBST([LCC_VERSION_PATCH])
+AC_SUBST([LCC_VERSION_EXTRA])
+AC_SUBST([LCC_VERSION_STRING])
 
-AC_CONFIG_FILES(src/libcollectdclient/collectd/lcc_features.h)
+AC_CONFIG_FILES([src/libcollectdclient/collectd/lcc_features.h])
 
 AM_CFLAGS="-Wall"
 AM_CXXFLAGS="-Wall"
-if test "x$enable_werror" != "xno"
-then
-        AM_CFLAGS="$AM_CFLAGS -Werror"
-        AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
+if test "x$enable_werror" != "xno"; then
+  AM_CFLAGS="$AM_CFLAGS -Werror"
+  AM_CXXFLAGS="$AM_CXXFLAGS -Werror"
 fi
+
 AC_SUBST([AM_CFLAGS])
 AC_SUBST([AM_CXXFLAGS])
 
-AC_CONFIG_FILES([Makefile proto/Makefile src/Makefile src/daemon/Makefile src/collectd.conf src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile bindings/Makefile bindings/java/Makefile])
+AC_CONFIG_FILES([ \
+  Makefile \
+  src/collectd.conf \
+  src/libcollectdclient/libcollectdclient.pc \
+])
+
 AC_OUTPUT
 
-if test "x$with_librrd" = "xyes" \
-       && test "x$librrd_threadsafe" != "xyes"
-then
-       with_librrd="yes (warning: librrd is not thread-safe)"
+if test "x$with_librrd" = "xyes" && test "x$librrd_threadsafe" != "xyes"; then
+  with_librrd="yes (warning: librrd is not thread-safe)"
 fi
 
-if test "x$with_libperl" = "xyes"
-then
-       with_libperl="yes (version `$perl_interpreter -MConfig -e 'print $Config{version};'`)"
+if test "x$with_libperl" = "xyes"; then
+  with_libperl="yes (version `$PERL -MConfig -e 'print $Config{version};'`)"
 else
-       enable_perl="no (needs libperl)"
+  enable_perl="no (needs libperl)"
 fi
 
-if test "x$enable_perl" = "xno" && test "x$c_cv_have_perl_ithreads" = "xno"
-then
-       enable_perl="no (libperl doesn't support ithreads)"
+if test "x$enable_perl" = "xno" && test "x$c_cv_have_perl_ithreads" = "xno"; then
+  enable_perl="no (libperl doesn't support ithreads)"
 fi
 
-if test "x$with_perl_bindings" = "xyes" \
-       && test "x$PERL_BINDINGS_OPTIONS" != "x"
-then
-       with_perl_bindings="yes ($PERL_BINDINGS_OPTIONS)"
+if test "x$with_perl_bindings" = "xyes" && test "x$PERL_BINDINGS_OPTIONS" != "x"; then
+  with_perl_bindings="yes ($PERL_BINDINGS_OPTIONS)"
 fi
 
 AC_MSG_RESULT()
 AC_MSG_RESULT([Configuration:])
 AC_MSG_RESULT([  Build:])
 AC_MSG_RESULT([    Platform  . . . . . . $ac_system])
+AC_MSG_RESULT([    Compiler vendor . . . $ax_cv_c_compiler_vendor])
 AC_MSG_RESULT([    CC  . . . . . . . . . $CC])
 AC_MSG_RESULT([    CFLAGS  . . . . . . . $AM_CFLAGS $CFLAGS])
 AC_MSG_RESULT([    CXXFLAGS  . . . . . . $AM_CXXFLAGS $CXXFLAGS])
@@ -6836,7 +6801,6 @@ AC_MSG_RESULT([    libganglia  . . . . . $with_libganglia])
 AC_MSG_RESULT([    libgcrypt . . . . . . $with_libgcrypt])
 AC_MSG_RESULT([    libgps  . . . . . . . $with_libgps])
 AC_MSG_RESULT([    libgrpc++ . . . . . . $with_libgrpcpp])
-AC_MSG_RESULT([    libhal  . . . . . . . $with_libhal])
 AC_MSG_RESULT([    libhiredis  . . . . . $with_libhiredis])
 AC_MSG_RESULT([    libi2c-dev  . . . . . $with_libi2c])
 AC_MSG_RESULT([    libiokit  . . . . . . $with_libiokit])
@@ -6856,8 +6820,8 @@ AC_MSG_RESULT([    libmosquitto  . . . . $with_libmosquitto])
 AC_MSG_RESULT([    libmysql  . . . . . . $with_libmysql])
 AC_MSG_RESULT([    libnetapp . . . . . . $with_libnetapp])
 AC_MSG_RESULT([    libnetsnmp  . . . . . $with_libnetsnmp])
+AC_MSG_RESULT([    libnetsnmpagent . . . $with_libnetsnmpagent])
 AC_MSG_RESULT([    libnotify . . . . . . $with_libnotify])
-AC_MSG_RESULT([    liboconfig  . . . . . $with_liboconfig])
 AC_MSG_RESULT([    libopenipmi . . . . . $with_libopenipmipthread])
 AC_MSG_RESULT([    liboping  . . . . . . $with_liboping])
 AC_MSG_RESULT([    libowcapi . . . . . . $with_libowcapi])
@@ -6924,6 +6888,7 @@ AC_MSG_RESULT([    dbi . . . . . . . . . $enable_dbi])
 AC_MSG_RESULT([    df  . . . . . . . . . $enable_df])
 AC_MSG_RESULT([    disk  . . . . . . . . $enable_disk])
 AC_MSG_RESULT([    dns . . . . . . . . . $enable_dns])
+AC_MSG_RESULT([    dpdkevents. . . . . . $enable_dpdkevents])
 AC_MSG_RESULT([    dpdkstat  . . . . . . $enable_dpdkstat])
 AC_MSG_RESULT([    drbd  . . . . . . . . $enable_drbd])
 AC_MSG_RESULT([    email . . . . . . . . $enable_email])
@@ -6938,7 +6903,7 @@ AC_MSG_RESULT([    gps . . . . . . . . . $enable_gps])
 AC_MSG_RESULT([    grpc  . . . . . . . . $enable_grpc])
 AC_MSG_RESULT([    hddtemp . . . . . . . $enable_hddtemp])
 AC_MSG_RESULT([    hugepages . . . . . . $enable_hugepages])
-AC_MSG_RESULT([    intel_rdt. . . . .  . $enable_intel_rdt])
+AC_MSG_RESULT([    intel_rdt . . . . . . $enable_intel_rdt])
 AC_MSG_RESULT([    interface . . . . . . $enable_interface])
 AC_MSG_RESULT([    ipc . . . . . . . . . $enable_ipc])
 AC_MSG_RESULT([    ipmi  . . . . . . . . $enable_ipmi])
@@ -6959,6 +6924,7 @@ AC_MSG_RESULT([    match_regex . . . . . $enable_match_regex])
 AC_MSG_RESULT([    match_timediff  . . . $enable_match_timediff])
 AC_MSG_RESULT([    match_value . . . . . $enable_match_value])
 AC_MSG_RESULT([    mbmon . . . . . . . . $enable_mbmon])
+AC_MSG_RESULT([    mcelog  . . . . . . . $enable_mcelog])
 AC_MSG_RESULT([    md  . . . . . . . . . $enable_md])
 AC_MSG_RESULT([    memcachec . . . . . . $enable_memcachec])
 AC_MSG_RESULT([    memcached . . . . . . $enable_memcached])
@@ -6984,6 +6950,8 @@ AC_MSG_RESULT([    onewire . . . . . . . $enable_onewire])
 AC_MSG_RESULT([    openldap  . . . . . . $enable_openldap])
 AC_MSG_RESULT([    openvpn . . . . . . . $enable_openvpn])
 AC_MSG_RESULT([    oracle  . . . . . . . $enable_oracle])
+AC_MSG_RESULT([    ovs_events  . . . . . $enable_ovs_events])
+AC_MSG_RESULT([    ovs_stats . . . . . . $enable_ovs_stats])
 AC_MSG_RESULT([    perl  . . . . . . . . $enable_perl])
 AC_MSG_RESULT([    pf  . . . . . . . . . $enable_pf])
 AC_MSG_RESULT([    pinba . . . . . . . . $enable_pinba])
@@ -7002,6 +6970,7 @@ AC_MSG_RESULT([    serial  . . . . . . . $enable_serial])
 AC_MSG_RESULT([    sigrok  . . . . . . . $enable_sigrok])
 AC_MSG_RESULT([    smart . . . . . . . . $enable_smart])
 AC_MSG_RESULT([    snmp  . . . . . . . . $enable_snmp])
+AC_MSG_RESULT([    snmp_agent  . . . . . $enable_snmp_agent])
 AC_MSG_RESULT([    statsd  . . . . . . . $enable_statsd])
 AC_MSG_RESULT([    swap  . . . . . . . . $enable_swap])
 AC_MSG_RESULT([    syslog  . . . . . . . $enable_syslog])
@@ -7048,11 +7017,11 @@ AC_MSG_RESULT([    zookeeper . . . . . . $enable_zookeeper])
 AC_MSG_RESULT()
 
 if test "x$dependency_error" = "xyes"; then
-       AC_MSG_ERROR("Some plugins are missing dependencies - see the summary above for details")
+  AC_MSG_ERROR("Some plugins are missing dependencies - see the summary above for details")
 fi
 
 if test "x$dependency_warning" = "xyes"; then
-       AC_MSG_WARN("Some plugins seem to have missing dependencies but have been enabled forcibly - see the summary above for details")
+  AC_MSG_WARN("Some plugins seem to have missing dependencies but have been enabled forcibly - see the summary above for details")
 fi
 
-# vim: set fdm=marker :
+# vim: set fdm=marker sw=2 sts=2 ts=2 et :
index 5f401f0..6e2ea19 100644 (file)
@@ -49,6 +49,21 @@ should look something like this:
   datadir: "/var/lib/collectd/rrd/"
   libdir: "/usr/lib/collectd/"
 
+docker/
+-------
+Sample docker setup using an LD_PRELOAD wrapper to redirect system calls
+accessing /proc and /sys to prefixed bind-mounts inside the container.
+
+Drop your collectd configuration snippets in the
+contrib/docker/collectd.conf.d/ directory, and build an image including them:
+ $ docker build -t my_collectd ./contrib/docker/
+
+Then run it with the required bind-mounts:
+ $ docker run -it --rm \
+    -v /proc:/rootfs/proc:ro -v /sys:/rootfs/sys:ro \
+    --name collectd my_collectd
+ $ docker exec -it collectd collectdctl listval
+
 exec-munin.px
 -------------
   Script to be used with the exec-plugin (see collectd-exec(5) for details)
diff --git a/contrib/docker/50docker-apt-conf b/contrib/docker/50docker-apt-conf
new file mode 100644 (file)
index 0000000..3f898b3
--- /dev/null
@@ -0,0 +1,4 @@
+APT::Install-Recommends "0";
+APT::Install-Suggests "0";
+APT::Get::Assume-Yes "1";
+APT::Get::AutomaticRemove "1";
diff --git a/contrib/docker/Dockerfile b/contrib/docker/Dockerfile
new file mode 100644 (file)
index 0000000..a691f2e
--- /dev/null
@@ -0,0 +1,24 @@
+FROM debian:stable
+
+ENV DEBIAN_FRONTEND noninteractive
+COPY 50docker-apt-conf /etc/apt/apt.conf.d/
+
+COPY rootfs_prefix/ /usr/src/rootfs_prefix/
+
+RUN apt-get update \
+ && apt-get upgrade \
+ && apt-get install \
+    collectd-core \
+    collectd-utils \
+    build-essential \
+ && make -C /usr/src/rootfs_prefix/ \
+ && apt-get --purge remove build-essential \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY collectd.conf /etc/collectd/collectd.conf
+COPY collectd.conf.d /etc/collectd/collectd.conf.d
+
+ENV LD_PRELOAD /usr/src/rootfs_prefix/rootfs_prefix.so
+
+CMD [ "/usr/sbin/collectd", "-f"]
diff --git a/contrib/docker/collectd.conf b/contrib/docker/collectd.conf
new file mode 100644 (file)
index 0000000..bbcd079
--- /dev/null
@@ -0,0 +1,16 @@
+LoadPlugin logfile
+<Plugin logfile>
+       LogLevel "info"
+       File STDOUT
+       Timestamp true
+       PrintSeverity true
+</Plugin>
+
+LoadPlugin unixsock
+<Plugin unixsock>
+        SocketGroup "nogroup"
+</Plugin>
+
+<Include "/etc/collectd/collectd.conf.d">
+        Filter "*.conf"
+</Include>
diff --git a/contrib/docker/collectd.conf.d/sample.conf b/contrib/docker/collectd.conf.d/sample.conf
new file mode 100644 (file)
index 0000000..cbd7ce1
--- /dev/null
@@ -0,0 +1,4 @@
+LoadPlugin cpu
+LoadPlugin memory
+LoadPlugin disk
+LoadPlugin df
diff --git a/contrib/docker/rootfs_prefix/.gitignore b/contrib/docker/rootfs_prefix/.gitignore
new file mode 100644 (file)
index 0000000..c95ccf8
--- /dev/null
@@ -0,0 +1 @@
+rootprefix.so
diff --git a/contrib/docker/rootfs_prefix/Makefile b/contrib/docker/rootfs_prefix/Makefile
new file mode 100644 (file)
index 0000000..f26bebd
--- /dev/null
@@ -0,0 +1,2 @@
+rootfs_prefix.so: rootfs_prefix.c
+       $(CC) -Wall -Werror -fPIC -shared -o rootfs_prefix.so rootfs_prefix.c -ldl
diff --git a/contrib/docker/rootfs_prefix/rootfs_prefix.c b/contrib/docker/rootfs_prefix/rootfs_prefix.c
new file mode 100644 (file)
index 0000000..2b83151
--- /dev/null
@@ -0,0 +1,58 @@
+#define _GNU_SOURCE
+
+#include <dirent.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <error.h>
+#include <stdio.h>
+#include <string.h>
+
+#define PREFIX "/rootfs"
+#define BUFSIZE 256
+
+const char *add_prefix(const char *orig, char *prefixed) {
+  if ((strncmp(orig, "/proc", strlen("/proc")) != 0) &&
+      (strncmp(orig, "/sys", strlen("/sys")) != 0))
+    return orig;
+
+  int status = snprintf(prefixed, BUFSIZE, "%s%s", PREFIX, orig);
+  if (status < 1) {
+    error(status, errno, "adding '%s' prefix to file path failed: '%s' -> '%s'",
+          PREFIX, orig, prefixed);
+    return orig;
+  } else if ((unsigned int)status >= BUFSIZE) {
+    error(status, ENAMETOOLONG,
+          "'%s' got truncated when adding '%s' prefix: '%s'", orig, PREFIX,
+          prefixed);
+    return orig;
+  } else {
+    return (const char *)prefixed;
+  }
+}
+
+FILE *fopen(const char *path, const char *mode) {
+  char filename[BUFSIZE] = "\0";
+
+  FILE *(*original_fopen)(const char *, const char *);
+  original_fopen = dlsym(RTLD_NEXT, "fopen");
+
+  return (*original_fopen)(add_prefix(path, filename), mode);
+}
+
+DIR *opendir(const char *name) {
+  char filename[BUFSIZE] = "\0";
+
+  DIR *(*original_opendir)(const char *);
+  original_opendir = dlsym(RTLD_NEXT, "opendir");
+
+  return (*original_opendir)(add_prefix(name, filename));
+}
+
+int *open(const char *pathname, int flags) {
+  char filename[BUFSIZE] = "\0";
+
+  int *(*original_open)(const char *, int);
+  original_open = dlsym(RTLD_NEXT, "open");
+
+  return (*original_open)(add_prefix(pathname, filename), flags);
+}
index 1cf2e31..b36e2a2 100644 (file)
@@ -88,6 +88,7 @@
 %define with_lvm 0%{!?_without_lvm:1}
 %define with_madwifi 0%{!?_without_madwifi:1}
 %define with_mbmon 0%{!?_without_mbmon:1}
+%define with_mcelog 0%{!?_without_mcelog:1}
 %define with_md 0%{!?_without_md:1}
 %define with_memcachec 0%{!?_without_memcachec:1}
 %define with_memcached 0%{!?_without_memcached:1}
 %define with_olsrd 0%{!?_without_olsrd:1}
 %define with_openldap 0%{!?_without_openldap:1}
 %define with_openvpn 0%{!?_without_openvpn:1}
+%define with_ovs_events 0%{!?_without_ovs_events:1}
+%define with_ovs_stats 0%{!?_without_ovs_stats:1}
 %define with_perl 0%{!?_without_perl:1}
 %define with_pinba 0%{!?_without_pinba:1}
 %define with_ping 0%{!?_without_ping:1}
 %define with_serial 0%{!?_without_serial:1}
 %define with_smart 0%{!?_without_smart:1}
 %define with_snmp 0%{!?_without_snmp:1}
+%define with_snmp_agent 0%{!?_without_snmp_agent:1}
 %define with_statsd 0%{!?_without_statsd:1}
 %define with_swap 0%{!?_without_swap:1}
 %define with_syslog 0%{!?_without_syslog:1}
 %define with_aquaero 0%{!?_without_aquaero:0}
 # plugin barometer disabled, requires a libi2c
 %define with_barometer 0%{!?_without_barometer:0}
-# plugin grpc disabled, requires protobuf-compiler >= 3.0
-%define with_grpc 0%{!?_without_grpc:0}
+# plugin dpdkevents disabled, requires libdpdk
+%define with_dpdkevents 0%{!?_without_dpdkevents:0}
 # plugin dpdkstat disabled, requires libdpdk
 %define with_dpdkstat 0%{!?_without_dpdkstat:0}
+# plugin grpc disabled, requires protobuf-compiler >= 3.0
+%define with_grpc 0%{!?_without_grpc:0}
 # plugin lpar disabled, requires AIX
 %define with_lpar 0%{!?_without_lpar:0}
 # plugin intel_rdt disabled, requires intel-cmt-cat
 %define with_cpusleep 0
 %define with_gps 0
 %define with_mqtt 0
+%define with_ovs_events 0
+%define with_ovs_stats 0
 %define with_redis 0
 %define with_rrdcached 0
 %define with_write_redis 0
 Summary:       Statistics collection and monitoring daemon
 Name:          collectd
 Version:       5.7.1
-Release:       3%{?dist}
+Release:       6%{?dist}
 URL:           https://collectd.org
 Source:                https://collectd.org/files/%{name}-%{version}.tar.bz2
 License:       GPLv2
 Group:         System Environment/Daemons
 BuildRoot:     %{_tmppath}/%{name}-%{version}-root
-BuildRequires: libgcrypt-devel, kernel-headers, libtool-ltdl-devel, libcap-devel, which
+BuildRequires: libgcrypt-devel, kernel-headers, libcap-devel, which
 Vendor:                collectd development team <collectd@verplant.org>
 
 %if 0%{?fedora} || 0%{?rhel} >= 7
@@ -540,6 +548,16 @@ This plugin collects size of “Logical Volumes” (LV) and “Volume Groups”
 of Linux' “Logical Volume Manager” (LVM).
 %endif
 
+%if %{with_mcelog}
+%package mcelog
+Summary:       Mcelog plugin for collectd
+Group:         System Environment/Daemons
+Requires:      %{name}%{?_isa} = %{version}-%{release}
+%description mcelog
+This plugin monitors machine check exceptions reported by mcelog and generates
+appropriate notifications when machine check exceptions are detected.
+%endif
+
 %if %{with_memcachec}
 %package memcachec
 Summary:       Memcachec plugin for collectd
@@ -655,6 +673,29 @@ BuildRequires: openldap-devel
 This plugin reads monitoring information from OpenLDAP's cn=Monitor subtree.
 %endif
 
+%if %{with_ovs_events}
+%package ovs_events
+Summary:       Open vSwitch events plugin for collectd
+Group:         System Environment/Daemons
+Requires:      %{name}%{?_isa} = %{version}-%{release}
+BuildRequires: yajl-devel
+%description ovs_events
+This plugin monitors the link status of Open vSwitch (OVS) connected
+interfaces, dispatches the values to collectd and sends notifications
+whenever a link state change occurs in the OVS database.
+%endif
+
+%if %{with_ovs_stats}
+%package ovs_stats
+Summary:       Open vSwitch statistics plugin for collectd
+Group:         System Environment/Daemons
+Requires:      %{name}%{?_isa} = %{version}-%{release}
+BuildRequires: yajl-devel
+%description ovs_stats
+This plugin collects statictics of OVS connected bridges and
+interfaces.
+%endif
+
 %if %{with_perl}
 %package perl
 Summary:       Perl plugin for collectd
@@ -793,6 +834,16 @@ BuildRequires:     net-snmp-devel
 This plugin for collectd allows querying of network equipment using SNMP.
 %endif
 
+%if %{with_snmp_agent}
+%package snmp_agent
+Summary:       SNMP AgentX plugin for collectd
+Group:         System Environment/Daemons
+Requires:      %{name}%{?_isa} = %{version}-%{release}
+BuildRequires: net-snmp-devel
+%description snmp_agent
+This plugin for collectd to support AgentX integration.
+%endif
+
 %if %{with_varnish}
 %package varnish
 Summary:       Varnish plugin for collectd
@@ -1101,6 +1152,12 @@ Collectd utilities
 %define _with_drbd --disable-drbd
 %endif
 
+%if %{with_dpdkevents}
+%define _with_dpdkevents --enable-dpdkevents
+%else
+%define _with_dpdkevents --disable-dpdkevents
+%endif
+
 %if %{with_dpdkstat}
 %define _with_dpdkstat --enable-dpdkstat
 %else
@@ -1281,6 +1338,12 @@ Collectd utilities
 %define _with_mbmon --disable-mbmon
 %endif
 
+%if %{with_mcelog}
+%define _with_mcelog --enable-mcelog
+%else
+%define _with_mbmon --disable-mcelog
+%endif
+
 %if %{with_md}
 %define _with_md --enable-md
 %else
@@ -1431,6 +1494,18 @@ Collectd utilities
 %define _with_oracle --disable-oracle
 %endif
 
+%if %{with_ovs_events}
+%define _with_ovs_events --enable-ovs_events
+%else
+%define _with_ovs_events --disable-ovs_events
+%endif
+
+%if %{with_ovs_stats}
+%define _with_ovs_stats --enable-ovs_stats
+%else
+%define _with_ovs_stats --disable-ovs_stats
+%endif
+
 %if %{with_perl}
 %define _with_perl --enable-perl --with-perl-bindings="INSTALLDIRS=vendor"
 %else
@@ -1544,6 +1619,12 @@ Collectd utilities
 %define _with_snmp --disable-snmp
 %endif
 
+%if %{with_snmp_agent}
+%define _with_snmp_agent --enable-snmp_agent
+%else
+%define _with_snmp_agent --disable-snmp_agent
+%endif
+
 %if %{with_statsd}
 %define _with_statsd --enable-statsd
 %else
@@ -1769,7 +1850,6 @@ Collectd utilities
 %configure CFLAGS="%{optflags} -DLT_LAZY_OR_NOW=\"RTLD_LAZY|RTLD_GLOBAL\"" \
        %{?_python_config} \
        --disable-static \
-       --without-included-ltdl \
        --enable-all-plugins=yes \
        --enable-match_empty_counter \
        --enable-match_hashed \
@@ -1808,6 +1888,7 @@ Collectd utilities
        %{?_with_disk} \
        %{?_with_dns} \
        %{?_with_drbd} \
+       %{?_with_dpdkevents} \
        %{?_with_dpdkstat} \
        %{?_with_email} \
        %{?_with_entropy} \
@@ -1837,6 +1918,7 @@ Collectd utilities
        %{?_with_lvm} \
        %{?_with_madwifi} \
        %{?_with_mbmon} \
+       %{?_with_mcelog} \
        %{?_with_md} \
        %{?_with_memcachec} \
        %{?_with_memcached} \
@@ -1862,6 +1944,8 @@ Collectd utilities
        %{?_with_openldap} \
        %{?_with_openvpn} \
        %{?_with_oracle} \
+       %{?_with_ovs_events} \
+       %{?_with_ovs_stats} \
        %{?_with_perl} \
        %{?_with_pf} \
        %{?_with_pinba} \
@@ -1880,6 +1964,7 @@ Collectd utilities
        %{?_with_sigrok} \
        %{?_with_smart} \
        %{?_with_snmp} \
+       %{?_with_snmp_agent} \
        %{?_with_statsd} \
        %{?_with_swap} \
        %{?_with_syslog} \
@@ -2088,9 +2173,6 @@ fi
 %if %{with_drbd}
 %{_libdir}/%{name}/drbd.so
 %endif
-%if %{with_dpdkstat}
-%{_libdir}/%{name}/dpdkstat.so
-%endif
 %if %{with_ethstat}
 %{_libdir}/%{name}/ethstat.so
 %endif
@@ -2136,6 +2218,9 @@ fi
 %if %{with_mbmon}
 %{_libdir}/%{name}/mbmon.so
 %endif
+%if %{with_mcelog}
+%{_libdir}/%{name}/mcelog.so
+%endif
 %if %{with_md}
 %{_libdir}/%{name}/md.so
 %endif
@@ -2346,6 +2431,16 @@ fi
 %{_libdir}/%{name}/dbi.so
 %endif
 
+%if %{with_dpdkevents}
+%files dpdkevents
+%{_libdir}/%{name}/dpdkevents.so
+%endif
+
+%if %{with_dpdkstat}
+%files dpdkstat
+%{_libdir}/%{name}/dpdkstat.so
+%endif
+
 %if %{with_email}
 %files email
 %{_libdir}/%{name}/email.so
@@ -2470,6 +2565,16 @@ fi
 %{_libdir}/%{name}/openldap.so
 %endif
 
+%if %{with_ovs_events}
+%files ovs_events
+%{_libdir}/%{name}/ovs_events.so
+%endif
+
+%if %{with_ovs_stats}
+%files ovs_stats
+%{_libdir}/%{name}/ovs_stats.so
+%endif
+
 %if %{with_perl}
 %files perl
 %{perl_vendorlib}/Collectd.pm
@@ -2537,6 +2642,11 @@ fi
 %{_libdir}/%{name}/snmp.so
 %endif
 
+%if %{with_snmp_agent}
+%files snmp_agent
+%{_libdir}/%{name}/snmp_agent.so
+%endif
+
 %if %{with_varnish}
 %files varnish
 %{_libdir}/%{name}/varnish.so
@@ -2589,9 +2699,18 @@ fi
 %doc contrib/
 
 %changelog
-* Sun Mar 05 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-2
+* Sun Mar 05 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-6
+- Move recently added plugins to subpackages
+
+* Sun Mar 05 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-5
+- Add new ovs_stats plugin
+
+* Sun Mar 05 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-4
 - Don't enable XFS support on RHEL6, it is missing for i386
 
+* Sun Mar 05 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-3
+- Add dpdkevents plugin, disabled by default
+
 * Wed Feb 22 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-2
 - Enable XFS support in df plugin
 - Fix bogus date in changelog
@@ -2599,6 +2718,12 @@ fi
 * Sun Jan 01 2017 Marc Fournier <marc.fournier@camptocamp.com> - 5.7.1-1
 - New upstream version
 
+* Sat Dec 31 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-4
+- Add new ovs_events plugin
+
+* Sat Dec 31 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-3
+- Add new mcelog plugin
+
 * Tue Nov 29 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-2
 - Disable redis plugin on RHEL 6, hiredis has been retired from EPEL6
 
index 7bc15d7..853363d 100644 (file)
@@ -18,6 +18,7 @@ ProtectHome=true
 #   ceph            CAP_DAC_OVERRIDE
 #   dns             CAP_NET_RAW
 #   exec            CAP_SETUID CAP_SETGID
+#   intel_rdt       CAP_SYS_RAWIO
 #   iptables        CAP_NET_ADMIN
 #   ping            CAP_NET_RAW
 #   smart           CAP_SYS_RAWIO
@@ -31,7 +32,7 @@ CapabilityBoundingSet=
 
 NoNewPrivileges=true
 
-# Tell systemd it will receive a notification from collectd over it's control
+# Tell systemd it will receive a notification from collectd over its control
 # socket once the daemon is ready. See systemd.service(5) for more details.
 Type=notify
 
index 8991a61..96f1eb9 100644 (file)
@@ -148,34 +148,6 @@ instruction set manually:
 
      *  Run `ldconfig` to update the shared library cache.
 
-### Static library
-
-To build static DPDK library for use with collectd:
-
- *  To configure DPDK to build the combined static library `libdpdk.a` ensure
-    that `CONFIG_RTE_BUILD_SHARED_LIB` is set to “n” in `config/common_base` in
-    your DPDK as follows:
-
-        #
-        # Compile to share library
-        #
-        CONFIG_RTE_BUILD_SHARED_LIB=n
-
- *  Prepare the configuration for the appropriate target as specified at:
-    http://dpdk.org/doc/guides/linux_gsg/build_dpdk.html.
-
-    For example:
-
-        make config T=x86_64-native-linuxapp-gcc
-
- *  Build the target using `-fPIC`:
-
-        make EXTRA_CFLAGS=-fPIC -j
-
- *  Install DPDK to `/usr`:
-
-        sudo make install prefix=/usr
-
 ## Build collectd with DPDK
 
 **Note:** DPDK 16.04 is the minimum version and currently supported version of
@@ -199,33 +171,32 @@ implications.
 See also: http://dpdk.org/doc/guides/prog_guide/multi_proc_support.html
 
  *  Generate the build script as specified below. (i.e. run `build.sh`).
- *  Configure collectd with the DPDK shared library:
-
-        ./configure --with-libdpdk=/usr
+ *  Configure collectd with the DPDK shared library. If DPDK is installed in
+    custom installation path you can specify headers include path using
+    LIBDPDK_CPPFLAGS variable and libraries path with LIBDPDK_LDFLAGS.
+    Example:
 
-### Build with the static DPDK library
+        ./configure
 
-To configure collectd with the DPDK static library:
+        or for custom DPKD installation:
 
- *  Run *configure* with the following CFLAGS:
+        ./configure LIBDPDK_CPPFLAGS="-I/home/joe/include/dpdk" LIBDPDK_LDFLAGS="-L/home/joe/usr/lib"
 
-        ./configure --with-libdpdk=/usr CFLAGS=" -lpthread -Wl,--whole-archive -Wl,-ldpdk -Wl,-lm -Wl,-lrt -Wl,-lpcap -Wl,-ldl -Wl,--no-whole-archive"
-
- *  Make sure that dpdk and dpdkstat are enabled in the *configure* output.
+ *  Make sure that libdpdk and dpdkstat are enabled in the *configure* output.
 
     Expected output:
 
         Libraries:
         ...
         libdpdk  . . . . . . . . yes
-        
+
         Modules:
         ...
         dpdkstat . . . . . . .yes
 
  *  Build collectd:
 
-        make -j && make -j install.
+    make -j && make -j install
 
     **Note:** As mentioned above, if you are building on Ubuntu 14.04 with
     GCC <= 4.8.X, you need to use:
@@ -237,6 +208,12 @@ To configure collectd with the DPDK static library:
  *  The same PCI device configuration should be passed to the primary process as
     the secondary process uses the same port indexes as the primary.
  *  A blacklist / whitelist of NICs isn't supported yet.
+ *  Plugin initialization time depends on read interval. It requires 5 read
+    cycles to set up internal buffers and states. During that time no statistics
+    are submitted.
+ *  If number of DPDK ports is increased while plugin is running, internal
+    buffers are resized. That requires 3 read cycles and no port statistics
+    are submitted in that time.
 
 ## License
 
diff --git a/docs/README.virt.md b/docs/README.virt.md
new file mode 100644 (file)
index 0000000..a80e9ea
--- /dev/null
@@ -0,0 +1,240 @@
+Inside the virt plugin
+======================
+
+Originally written: 20161111
+
+Last updated: 20161124
+
+This document will explain the new domain tag support introduced
+in the virt plugin, and will provide one important use case for this feature.
+In the reminder of this document, we consider
+
+* libvirt <= 2.0.0
+* QEMU <= 2.6.0
+
+
+Domain tags and domains partitioning across virt reader instances
+-----------------------------------------------------------------
+
+The virt plugin gained the `Instances` option. It allows to start
+more than one reader instance, so the the libvirt domains could be queried
+by more than one reader thread.
+The default value for `Instances` is `1`.
+With default settings, the plugin will behave in a fully transparent,
+backward compatible way.
+It is recommended to set this value to one multiple of the
+daemon `ReadThreads` value.
+
+Each reader instance will query only a subset of the libvirt domain.
+The subset is identified as follows:
+
+1. Each virt reader instance is named `virt-$NUM`, where `NUM` is
+   the progressive order of instances. If you configure `Instances 3`
+   you will have `virt-0`, `virt-1`, `virt-2`. Please note: the `virt-0`
+   instance is special, and will always be available.
+2. Each virt reader instance will iterate over all the libvirt active domains,
+   and will look for one `tag` attribute (see below) in the domain metadata section.
+3. Each virt reader instance will take care *only* of the libvirt domains whose
+   tag matches with its own
+4. The special `virt-0` instance will take care of all the libvirt domains with
+   no tags, or with tags which are not in the set \[virt-0 ... virt-$NUM\]
+
+Collectd will just use the domain tags, but never enforces or requires them.
+It is up to an external entity, like a software management system,
+to attach and manage the tags to the domain.
+
+Please note that unless you have such tag-aware management sofware,
+it most likely make no sense to enable more than one reader instance on your
+setup.
+
+
+Libvirt tag metadata format
+----------------------------
+
+This is the snipped to be added to libvirt domains:
+
+    <ovirtmap:tag xmlns:ovirtmap="http://ovirt.org/ovirtmap/tag/1.0">
+      $TAG
+    </ovirtmap:tag>
+
+it must be included in the <metadata> section.
+
+Check the `src/virt_test.c` file for really minimal example of libvirt domains.
+
+
+Examples
+--------
+
+### Example one: 10 libvirt domains named "domain-A" ... "domain-J", virt plugin with instances=5, using 5 different tags
+
+
+    libvirt domain name -    tag    - read instance - reason
+    domain-A                virt-0         0          tag match
+    domain-B                virt-1         1          tag match
+    domain-C                virt-2         2          tag match
+    domain-D                virt-3         3          tag match
+    domain-E                virt-4         4          tag match
+    domain-F                virt-0         0          tag match
+    domain-G                virt-1         1          tag match
+    domain-H                virt-2         2          tag match
+    domain-I                virt-3         3          tag match
+    domain-J                virt-4         4          tag match
+
+
+  Because the domain where properly tagged, all the read instances have even load. Please note that the the virt plugin
+  knows nothing, and should know nothing, about *how* the libvirt domain are tagged. This is entirely up to the
+  management system.
+
+
+Example two: 10 libvirt domains named "domain-A" ... "domain-J", virt plugin with instances=3, using 5 different tags
+
+
+    libvirt domain name -    tag    - read instance - reason
+    domain-A                virt-0         0          tag match
+    domain-B                virt-1         1          tag match
+    domain-C                virt-2         2          tag match
+    domain-D                virt-3         0          adopted by instance #0
+    domain-E                virt-4         0          adopted by instance #0
+    domain-F                virt-0         0          rag match
+    domain-G                virt-1         1          tag match
+    domain-H                virt-2         2          tag match
+    domain-I                virt-3         0          adopted by instance #0
+    domain-J                virt-4         0          adopted by instance #0
+
+
+  In this case we have uneven load, but no domain is ignored.
+
+
+### Example three: 10 libvirt domains named "domain-A" ... "domain-J", virt plugin with instances=5, using 3 different tags
+
+
+    libvirt domain name -    tag    - read instance - reason
+    domain-A                virt-0         0          tag match
+    domain-B                virt-1         1          tag match
+    domain-C                virt-2         2          tag match
+    domain-D                virt-0         0          tag match
+    domain-E                virt-1         1          tag match
+    domain-F                virt-2         2          tag match
+    domain-G                virt-0         0          tag match
+    domain-H                virt-1         1          tag match
+    domain-I                virt-2         2          tag match
+    domain-J                virt-0         0          tag match
+
+
+  Once again we have uneven load and two idle read instances, but besides that no domain is left unmonitored
+
+
+### Example four: 10 libvirt domains named "domain-A" ... "domain-J", virt plugin with instances=5, partial tagging
+
+
+    libvirt domain name -    tag    - read instance - reason
+    domain-A                virt-0         0          tag match
+    domain-B                virt-1         1          tag match
+    domain-C                virt-2         2          tag match
+    domain-D                virt-0         0          tag match
+    domain-E                               0          adopted by instance #0
+    domain-F                               0          adopted by instance #0
+    domain-G                               0          adopted by instance #0
+    domain-H                               0          adopted by instance #0
+    domain-I                               0          adopted by instance #0
+    domain-J                               0          adopted by instance #0
+
+
+The lack of tags causes uneven load, but no domain are unmonitored.
+
+
+Possible extensions - custom tag format
+---------------------------------------
+
+The aformentioned approach relies on fixed tag format, `virt-$N`. The algorithm works fine with any tag, which
+is just one string, compared for equality. However, using custom strings for tags creates the need for a mapping
+between tags and the read instances.
+This mapping needs to be updated as long as domain are created or destroyed, and the virt plugin needs to be
+notified of the changes.
+
+This adds a significant amount of complexity, with little gain with respect to the fixed schema adopted initially.
+For this reason, the introdution of dynamic, custom mapping was not implemented.
+
+
+Dealing with datacenters: libvirt, qemu, shared storage
+-------------------------------------------------------
+
+When used in a datacenter, QEMU is most often configured to use shared storage. This is
+the default configuration of datacenter management solutions like [oVirt](http://www.ovirt.org).
+The actual shared storage could be implemented on top of NFS for small installations, or most likely
+ISCSI or Fiber Channel. The key takeaway is that the storage is accessed over the network,
+not using e.g. the SATA or PCI bus of any given host, so any network issue could cause
+one or more storage operations to delay, or to be lost entirely.
+
+In that case, the userspace process that requested the operation can end up in the D state,
+and become unresponsive, and unkillable.
+
+
+Dealing with unresponsive domains
+---------------------------------
+
+All the above considered, one robust management or monitoring application must deal with the fact that
+the libvirt API can block for a long time, or forever. This is not an issue or a bug of one specific
+API, but it is rather a byproduct of how libvirt and QEMU interact.
+
+Whenever we query more than one VM, we should take care to avoid that one blocked VM prevent other,
+well behaving VMs to be queried. We don't want one rogue VM to disrupt well-behaving VMs.
+Unfortunately, any way we enumerate VMs, either implicitely, using the libvirt bulk stats API,
+or explicitely, listing all libvirt domains and query each one in turn, we may unpredictably encounter
+one unresponsive VM.
+
+There are many possible approaches to deal with this issue. The virt plugin supports
+a simple but effective approach partitioning the domains, as follows.
+
+1. The virt plugin always register one or more `read` callbacks. The `zero` read callback is guaranteed to
+   be always present, so it performs special duties (more details later)
+   Each callback will be named 'virt-$N', where `N` ranges from 0 (zero) to M-1, where M is the number of instances configured.
+   `M` equals to `5` by default, because this is the same default number of threads in the libvirt worker pool.
+2. Each of the read callbacks queries libvirt for the list of all the active domains, and retrieves the libvirt domain metadata.
+   Both of those operations are safe wrt domain blocked in I/O (they affect only the libvirtd daemon).
+3. Each of the read callbacks extracts the `tag` from the domain metadata using a well-known format (see below).
+   Each of the read callbacks discards any domain which has no tag, or whose tag doesn't match with the read callback tag.
+3.a. The read callback tag equals to the read callback name, thus `virt-$N`. Remember that `virt-0` is guaranteed to be
+     always present.
+3.b. Since the `virt-0` reader is always present, it will take care of domains with no tag, or with unrecognized tag.
+     One unrecognized tag is any tag which has not the scheme `virt-$N`.
+4. Each read callback only samples the subset of domains with matching tag. The `virt-0` reader will possibly do more,
+   but worst case the load will be unbalanced, no domain will be left unsampled.
+
+To make this approach work, some entity must attach the tags to the libvirt domains, in such a way that all
+the domains which run on a given host and insist on the same network-based storage share the same tag.
+This minimizes the disruption, because when using the shared storage, if one domain becomes unresponsive because
+of unavailable storage, the most likely thing to happen is that others domain using the same storage will soon become
+unavailable; should the box run other libvirt domains using other network-based storage, they could be monitored
+safely.
+
+In case of [oVirt](http://www.ovirt.org), the aforementioned tagging is performed by the host agent.
+
+Please note that this approach is ineffective if the host completely lose network access to the storage network.
+In this case, however, no recovery is possible and no damage limitation is possible.
+
+Lastly, please note that if the virt plugin is configured with instances=1, it behaves exactly like before.
+
+
+Addendum: high level overview: libvirt client, libvirt daemon, qemu
+--------------------------------------------------------------------
+
+Let's review how the client application (collectd + virt plugin), the libvirtd daemon and the
+QEMU processes interact with each other.
+
+The libvirt daemon talks to QEMU using the JSON QMP protcol over one unix domain socket.
+The details of the protocol are not important now, but the key part is that the protocol
+is a simple request/response, meaning that libvirtd must serialize all the interactions
+with the QEMU monitor, and must protects its endpoint with a lock.
+No out of order request/responses are possible (e.g. no pipelining or async replies).
+This means that if for any reason one QMP request could not be completed, any other caller
+trying to access the QEMU monitor will block until the blocked caller returns.
+
+To retrieve some key informations, most notably about the block device state or the balloon
+device state, the libvirtd daemon *must* use the QMP protocol.
+
+The QEMU core, including the handling of the QMP protocol, is single-threaded.
+All the above combined make it possible for a client to block forever waiting for one QMP
+request, if QEMU itself is blocked. The most likely cause of block is I/O, and this is especially
+true considering how QEMU is used in a datacenter.
+
diff --git a/m4/.gitignore b/m4/.gitignore
new file mode 100644 (file)
index 0000000..f935021
--- /dev/null
@@ -0,0 +1 @@
+!.gitignore
diff --git a/m4/ax_compare_version.m4 b/m4/ax_compare_version.m4
new file mode 100644 (file)
index 0000000..9c8e208
--- /dev/null
@@ -0,0 +1,177 @@
+# ===========================================================================
+#    https://www.gnu.org/software/autoconf-archive/ax_compare_version.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+#
+# DESCRIPTION
+#
+#   This macro compares two version strings. Due to the various number of
+#   minor-version numbers that can exist, and the fact that string
+#   comparisons are not compatible with numeric comparisons, this is not
+#   necessarily trivial to do in a autoconf script. This macro makes doing
+#   these comparisons easy.
+#
+#   The six basic comparisons are available, as well as checking equality
+#   limited to a certain number of minor-version levels.
+#
+#   The operator OP determines what type of comparison to do, and can be one
+#   of:
+#
+#    eq  - equal (test A == B)
+#    ne  - not equal (test A != B)
+#    le  - less than or equal (test A <= B)
+#    ge  - greater than or equal (test A >= B)
+#    lt  - less than (test A < B)
+#    gt  - greater than (test A > B)
+#
+#   Additionally, the eq and ne operator can have a number after it to limit
+#   the test to that number of minor versions.
+#
+#    eq0 - equal up to the length of the shorter version
+#    ne0 - not equal up to the length of the shorter version
+#    eqN - equal up to N sub-version levels
+#    neN - not equal up to N sub-version levels
+#
+#   When the condition is true, shell commands ACTION-IF-TRUE are run,
+#   otherwise shell commands ACTION-IF-FALSE are run. The environment
+#   variable 'ax_compare_version' is always set to either 'true' or 'false'
+#   as well.
+#
+#   Examples:
+#
+#     AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8])
+#     AX_COMPARE_VERSION([3.15],[lt],[3.15.8])
+#
+#   would both be true.
+#
+#     AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8])
+#     AX_COMPARE_VERSION([3.15],[gt],[3.15.8])
+#
+#   would both be false.
+#
+#     AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8])
+#
+#   would be true because it is only comparing two minor versions.
+#
+#     AX_COMPARE_VERSION([3.15.7],[eq0],[3.15])
+#
+#   would be true because it is only comparing the lesser number of minor
+#   versions of the two values.
+#
+#   Note: The characters that separate the version numbers do not matter. An
+#   empty string is the same as version 0. OP is evaluated by autoconf, not
+#   configure, so must be a string, not a variable.
+#
+#   The author would like to acknowledge Guido Draheim whose advice about
+#   the m4_case and m4_ifvaln functions make this macro only include the
+#   portions necessary to perform the specific comparison specified by the
+#   OP argument in the final configure script.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 12
+
+dnl #########################################################################
+AC_DEFUN([AX_COMPARE_VERSION], [
+  AC_REQUIRE([AC_PROG_AWK])
+
+  # Used to indicate true or false condition
+  ax_compare_version=false
+
+  # Convert the two version strings to be compared into a format that
+  # allows a simple string comparison.  The end result is that a version
+  # string of the form 1.12.5-r617 will be converted to the form
+  # 0001001200050617.  In other words, each number is zero padded to four
+  # digits, and non digits are removed.
+  AS_VAR_PUSHDEF([A],[ax_compare_version_A])
+  A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
+                     -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/[[^0-9]]//g'`
+
+  AS_VAR_PUSHDEF([B],[ax_compare_version_B])
+  B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \
+                     -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \
+                     -e 's/[[^0-9]]//g'`
+
+  dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary
+  dnl # then the first line is used to determine if the condition is true.
+  dnl # The sed right after the echo is to remove any indented white space.
+  m4_case(m4_tolower($2),
+  [lt],[
+    ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"`
+  ],
+  [gt],[
+    ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"`
+  ],
+  [le],[
+    ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"`
+  ],
+  [ge],[
+    ax_compare_version=`echo "x$A
+x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"`
+  ],[
+    dnl Split the operator from the subversion count if present.
+    m4_bmatch(m4_substr($2,2),
+    [0],[
+      # A count of zero means use the length of the shorter version.
+      # Determine the number of characters in A and B.
+      ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'`
+      ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'`
+
+      # Set A to no more than B's length and B to no more than A's length.
+      A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"`
+      B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"`
+    ],
+    [[0-9]+],[
+      # A count greater than zero means use only that many subversions
+      A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
+      B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"`
+    ],
+    [.+],[
+      AC_WARNING(
+        [illegal OP numeric parameter: $2])
+    ],[])
+
+    # Pad zeros at end of numbers to make same length.
+    ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`"
+    B="$B`echo $A | sed 's/./0/g'`"
+    A="$ax_compare_version_tmp_A"
+
+    # Check for equality or inequality as necessary.
+    m4_case(m4_tolower(m4_substr($2,0,2)),
+    [eq],[
+      test "x$A" = "x$B" && ax_compare_version=true
+    ],
+    [ne],[
+      test "x$A" != "x$B" && ax_compare_version=true
+    ],[
+      AC_WARNING([illegal OP parameter: $2])
+    ])
+  ])
+
+  AS_VAR_POPDEF([A])dnl
+  AS_VAR_POPDEF([B])dnl
+
+  dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE.
+  if test "$ax_compare_version" = "true" ; then
+    m4_ifvaln([$4],[$4],[:])dnl
+    m4_ifvaln([$5],[else $5])dnl
+  fi
+]) dnl AX_COMPARE_VERSION
diff --git a/m4/ax_compiler_vendor.m4 b/m4/ax_compiler_vendor.m4
new file mode 100644 (file)
index 0000000..ee24c12
--- /dev/null
@@ -0,0 +1,87 @@
+# ===========================================================================
+#    http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_COMPILER_VENDOR
+#
+# DESCRIPTION
+#
+#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
+#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
+#   watcom, etc. The vendor is returned in the cache variable
+#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 15
+
+AC_DEFUN([AX_COMPILER_VENDOR],
+[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+  dnl Please add if possible support to ax_compiler_version.m4
+  [# note: don't check for gcc first since some other compilers define __GNUC__
+  vendors="intel:     __ICC,__ECC,__INTEL_COMPILER
+           ibm:       __xlc__,__xlC__,__IBMC__,__IBMCPP__
+           pathscale: __PATHCC__,__PATHSCALE__
+           clang:     __clang__
+           cray:      _CRAYC
+           fujitsu:   __FUJITSU
+           gnu:       __GNUC__
+           sun:       __SUNPRO_C,__SUNPRO_CC
+           hp:        __HP_cc,__HP_aCC
+           dec:       __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
+           borland:   __BORLANDC__,__CODEGEARC__,__TURBOC__
+           comeau:    __COMO__
+           kai:       __KCC
+           lcc:       __LCC__
+           sgi:       __sgi,sgi
+           microsoft: _MSC_VER
+           metrowerks: __MWERKS__
+           watcom:    __WATCOMC__
+           portland:  __PGI
+           tcc:       __TINYC__
+           unknown:   UNKNOWN"
+  for ventest in $vendors; do
+    case $ventest in
+      *:) vendor=$ventest; continue ;;
+      *)  vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
+    esac
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
+      #if !($vencpp)
+        thisisanerror;
+      #endif
+    ])], [break])
+  done
+  ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1`
+ ])
+])
diff --git a/proto/Makefile.am b/proto/Makefile.am
deleted file mode 100644 (file)
index 62d3bed..0000000
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST = collectd.proto types.proto prometheus.proto
diff --git a/src/Makefile.am b/src/Makefile.am
deleted file mode 100644 (file)
index 11bc17d..0000000
+++ /dev/null
@@ -1,1521 +0,0 @@
-SUBDIRS = libcollectdclient
-if BUILD_WITH_OWN_LIBOCONFIG
-SUBDIRS += liboconfig
-endif
-SUBDIRS += daemon
-
-PLUGIN_LDFLAGS = -module -avoid-version -export-symbols-regex '\<module_register\>'
-
-AM_CPPFLAGS = -I$(srcdir)/daemon
-AM_CPPFLAGS += -DPREFIX='"${prefix}"'
-AM_CPPFLAGS += -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"'
-AM_CPPFLAGS += -DLOCALSTATEDIR='"${localstatedir}"'
-AM_CPPFLAGS += -DPKGLOCALSTATEDIR='"${localstatedir}/lib/${PACKAGE_NAME}"'
-if BUILD_FEATURE_DAEMON
-AM_CPPFLAGS += -DPIDFILE='"${localstatedir}/run/${PACKAGE_NAME}.pid"'
-endif
-AM_CPPFLAGS += -DPLUGINDIR='"${pkglibdir}"'
-AM_CPPFLAGS += -DPKGDATADIR='"${pkgdatadir}"'
-
-LOG_COMPILER = env VALGRIND="@VALGRIND@" $(abs_top_srcdir)/testwrapper.sh
-
-V_PROTOC = $(v_protoc_@AM_V@)
-v_protoc_ = $(v_protoc_@AM_DEFAULT_V@)
-v_protoc_0 = @echo "  PROTOC  " $@;
-
-noinst_LTLIBRARIES =
-check_PROGRAMS =
-TESTS =
-
-noinst_LTLIBRARIES += libformat_graphite.la
-libformat_graphite_la_SOURCES  = utils_format_graphite.c utils_format_graphite.h
-libformat_graphite_la_CPPFLAGS = $(AM_CPPFLAGS)
-libformat_graphite_la_LDFLAGS  = $(AM_LDFLAGS)
-check_PROGRAMS += test_format_graphite
-TESTS += test_format_graphite
-test_format_graphite_SOURCES = utils_format_graphite_test.c testing.h
-test_format_graphite_LDADD = libformat_graphite.la daemon/libmetadata.la daemon/libplugin_mock.la -lm
-
-noinst_LTLIBRARIES += libformat_json.la
-libformat_json_la_SOURCES   = utils_format_json.c utils_format_json.h
-libformat_json_la_CPPFLAGS  = $(AM_CPPFLAGS)
-libformat_json_la_LDFLAGS   = $(AM_LDFLAGS)
-libformat_json_la_LIBADD    =
-if BUILD_WITH_LIBYAJL
-libformat_json_la_CPPFLAGS += $(BUILD_WITH_LIBYAJL_CPPFLAGS)
-libformat_json_la_LDFLAGS  += $(BUILD_WITH_LIBYAJL_LDFLAGS)
-libformat_json_la_LIBADD   += $(BUILD_WITH_LIBYAJL_LIBS)
-check_PROGRAMS += test_format_json
-TESTS += test_format_json
-test_format_json_SOURCES = utils_format_json_test.c testing.h
-test_format_json_LDADD = libformat_json.la daemon/libmetadata.la daemon/libplugin_mock.la -lm
-endif
-
-noinst_LTLIBRARIES += liblatency.la
-liblatency_la_SOURCES = utils_latency.c utils_latency.h utils_latency_config.c utils_latency_config.h
-liblatency_la_LIBADD = daemon/libcommon.la -lm
-check_PROGRAMS += test_utils_latency
-TESTS += test_utils_latency
-test_utils_latency_SOURCES = utils_latency_test.c testing.h
-test_utils_latency_LDADD = liblatency.la daemon/libplugin_mock.la -lm
-
-noinst_LTLIBRARIES += libcmds.la
-libcmds_la_SOURCES = utils_cmds.c utils_cmds.h \
-                     utils_cmd_flush.c utils_cmd_flush.h \
-                     utils_cmd_getthreshold.c utils_cmd_getthreshold.h \
-                     utils_cmd_getval.c utils_cmd_getval.h \
-                     utils_cmd_listval.c utils_cmd_listval.h \
-                     utils_cmd_putnotif.c utils_cmd_putnotif.h \
-                     utils_cmd_putval.c utils_cmd_putval.h \
-                     utils_parse_option.c utils_parse_option.h
-libcmds_la_LIBADD = daemon/libcommon.la daemon/libmetadata.la -lm
-check_PROGRAMS += test_utils_cmds
-TESTS += test_utils_cmds
-test_utils_cmds_SOURCES = utils_cmds_test.c testing.h
-test_utils_cmds_LDADD = libcmds.la \
-                        daemon/libplugin_mock.la
-
-noinst_LTLIBRARIES += liblookup.la
-liblookup_la_SOURCES = utils_vl_lookup.c utils_vl_lookup.h
-liblookup_la_LIBADD = daemon/libavltree.la
-check_PROGRAMS += test_utils_vl_lookup
-TESTS += test_utils_vl_lookup
-test_utils_vl_lookup_SOURCES = utils_vl_lookup_test.c testing.h
-test_utils_vl_lookup_LDADD = liblookup.la daemon/libplugin_mock.la
-if BUILD_WITH_LIBKSTAT
-test_utils_vl_lookup_LDADD += -lkstat
-endif
-
-noinst_LTLIBRARIES += libmount.la
-libmount_la_SOURCES = utils_mount.c utils_mount.h
-check_PROGRAMS += test_utils_mount
-TESTS += test_utils_mount
-test_utils_mount_SOURCES = utils_mount_test.c testing.h
-test_utils_mount_LDADD = libmount.la daemon/libplugin_mock.la
-if BUILD_WITH_LIBKSTAT
-test_utils_mount_LDADD += -lkstat
-endif
-
-sbin_PROGRAMS = collectdmon
-bin_PROGRAMS = collectd-nagios collectdctl collectd-tg
-
-collectdmon_SOURCES = collectdmon.c
-
-collectd_nagios_SOURCES = collectd-nagios.c
-collectd_nagios_CPPFLAGS = $(AM_CPPFLAGS) \
-       -I$(top_srcdir)/src/libcollectdclient/collectd \
-       -I$(top_builddir)/src/libcollectdclient/collectd
-collectd_nagios_LDADD = libcollectdclient/libcollectdclient.la
-if BUILD_WITH_LIBSOCKET
-collectd_nagios_LDADD += -lsocket
-endif
-if BUILD_AIX
-collectd_nagios_LDADD += -lm
-endif
-
-
-collectdctl_SOURCES = collectdctl.c
-collectdctl_CPPFLAGS = $(AM_CPPFLAGS) \
-       -I$(top_srcdir)/src/libcollectdclient/collectd \
-       -I$(top_builddir)/src/libcollectdclient/collectd
-collectdctl_LDADD = libcollectdclient/libcollectdclient.la
-if BUILD_WITH_LIBSOCKET
-collectdctl_LDADD += -lsocket
-endif
-if BUILD_AIX
-collectdctl_LDADD += -lm
-endif
-
-
-collectd_tg_SOURCES = collectd-tg.c
-collectd_tg_CPPFLAGS = $(AM_CPPFLAGS) \
-       -I$(top_srcdir)/src/libcollectdclient/collectd \
-       -I$(top_builddir)/src/libcollectdclient/collectd
-collectd_tg_LDADD = \
-       $(PTHREAD_LIBS) \
-       daemon/libheap.la \
-       libcollectdclient/libcollectdclient.la
-if BUILD_WITH_LIBSOCKET
-collectd_tg_LDADD += -lsocket
-endif
-if BUILD_WITH_LIBRT
-collectd_tg_LDADD += -lrt
-endif
-if BUILD_AIX
-collectd_tg_LDADD += -lm
-endif
-
-
-pkglib_LTLIBRARIES =
-
-BUILT_SOURCES =
-CLEANFILES =
-
-if HAVE_PROTOC3
-if HAVE_GRPC_CPP
-BUILT_SOURCES += collectd.grpc.pb.cc collectd.pb.cc types.pb.cc
-CLEANFILES += collectd.grpc.pb.cc collectd.pb.cc types.pb.cc \
-               collectd.grpc.pb.h collectd.pb.h types.pb.h
-
-collectd.grpc.pb.cc: $(top_srcdir)/proto/collectd.proto $(top_srcdir)/proto/types.proto
-       $(V_PROTOC)@PROTOC@ -I$(top_srcdir)/proto \
-               --grpc_out=$(builddir) --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN) $<
-
-collectd.pb.cc: $(top_srcdir)/proto/collectd.proto $(top_srcdir)/proto/types.proto
-       $(V_PROTOC)@PROTOC@ -I$(top_srcdir)/proto --cpp_out=$(builddir) $<
-
-types.pb.cc: $(top_srcdir)/proto/types.proto
-       $(V_PROTOC)@PROTOC@ -I$(top_srcdir)/proto --cpp_out=$(builddir) $<
-endif
-endif
-
-if BUILD_PLUGIN_AGGREGATION
-pkglib_LTLIBRARIES += aggregation.la
-aggregation_la_SOURCES = aggregation.c \
-                         utils_vl_lookup.c utils_vl_lookup.h
-aggregation_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-aggregation_la_LIBADD = -lm
-endif
-
-if BUILD_PLUGIN_AMQP
-pkglib_LTLIBRARIES += amqp.la
-amqp_la_SOURCES = amqp.c
-amqp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRABBITMQ_LDFLAGS)
-amqp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRABBITMQ_CPPFLAGS)
-amqp_la_LIBADD = $(BUILD_WITH_LIBRABBITMQ_LIBS) \
-                 libcmds.la libformat_graphite.la libformat_json.la
-endif
-
-if BUILD_PLUGIN_APACHE
-pkglib_LTLIBRARIES += apache.la
-apache_la_SOURCES = apache.c
-apache_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-apache_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
-apache_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
-endif
-
-
-if BUILD_PLUGIN_APCUPS
-pkglib_LTLIBRARIES += apcups.la
-apcups_la_SOURCES = apcups.c
-apcups_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-apcups_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-apcups_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_APPLE_SENSORS
-pkglib_LTLIBRARIES += apple_sensors.la
-apple_sensors_la_SOURCES = apple_sensors.c
-apple_sensors_la_LDFLAGS = $(PLUGIN_LDFLAGS) -framework IOKit
-endif
-
-if BUILD_PLUGIN_AQUAERO
-pkglib_LTLIBRARIES += aquaero.la
-aquaero_la_SOURCES = aquaero.c
-aquaero_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBAQUAERO5_CFLAGS)
-aquaero_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBAQUAERO5_LDFLAGS)
-aquaero_la_LIBADD = -laquaero5
-endif
-
-if BUILD_PLUGIN_ASCENT
-pkglib_LTLIBRARIES += ascent.la
-ascent_la_SOURCES = ascent.c
-ascent_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-ascent_la_CFLAGS = $(AM_CFLAGS) \
-               $(BUILD_WITH_LIBCURL_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
-ascent_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
-endif
-
-if BUILD_PLUGIN_BAROMETER
-pkglib_LTLIBRARIES += barometer.la
-barometer_la_SOURCES = barometer.c
-barometer_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-barometer_la_LIBADD = -lm
-endif
-
-if BUILD_PLUGIN_BATTERY
-pkglib_LTLIBRARIES += battery.la
-battery_la_SOURCES = battery.c battery_statefs.c
-battery_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-if BUILD_WITH_LIBIOKIT
-battery_la_LDFLAGS += -framework IOKit
-endif
-endif
-
-if BUILD_PLUGIN_BIND
-pkglib_LTLIBRARIES += bind.la
-bind_la_SOURCES = bind.c
-bind_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-bind_la_CFLAGS = $(AM_CFLAGS) \
-                $(BUILD_WITH_LIBCURL_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
-bind_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
-endif
-
-if BUILD_PLUGIN_CEPH
-pkglib_LTLIBRARIES += ceph.la
-ceph_la_SOURCES = ceph.c
-ceph_la_CFLAGS = $(AM_CFLAGS)
-ceph_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
-ceph_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
-ceph_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
-endif
-
-if BUILD_PLUGIN_CGROUPS
-pkglib_LTLIBRARIES += cgroups.la
-cgroups_la_SOURCES = cgroups.c
-cgroups_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-cgroups_la_LIBADD = libmount.la
-endif
-
-if BUILD_PLUGIN_CHRONY
-pkglib_LTLIBRARIES += chrony.la
-chrony_la_SOURCES = chrony.c
-chrony_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-chrony_la_LIBADD = -lm
-endif
-
-if BUILD_PLUGIN_CONNTRACK
-pkglib_LTLIBRARIES += conntrack.la
-conntrack_la_SOURCES = conntrack.c
-conntrack_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_CONTEXTSWITCH
-pkglib_LTLIBRARIES += contextswitch.la
-contextswitch_la_SOURCES = contextswitch.c
-contextswitch_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-contextswitch_la_LIBADD =
-if BUILD_WITH_PERFSTAT
-contextswitch_la_LIBADD += -lperfstat
-endif
-endif
-
-if BUILD_PLUGIN_CPU
-pkglib_LTLIBRARIES += cpu.la
-cpu_la_SOURCES = cpu.c
-cpu_la_CFLAGS = $(AM_CFLAGS)
-cpu_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-cpu_la_LIBADD =
-if BUILD_WITH_LIBKSTAT
-cpu_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-cpu_la_LIBADD += -ldevinfo
-endif
-if BUILD_WITH_LIBSTATGRAB
-cpu_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-cpu_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-if BUILD_WITH_PERFSTAT
-cpu_la_LIBADD += -lperfstat
-endif
-endif
-
-if BUILD_PLUGIN_CPUFREQ
-pkglib_LTLIBRARIES += cpufreq.la
-cpufreq_la_SOURCES = cpufreq.c
-cpufreq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_CPUSLEEP
-pkglib_LTLIBRARIES += cpusleep.la
-cpusleep_la_SOURCES = cpusleep.c
-cpusleep_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_CSV
-pkglib_LTLIBRARIES += csv.la
-csv_la_SOURCES = csv.c
-csv_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_CURL
-pkglib_LTLIBRARIES += curl.la
-curl_la_SOURCES = curl.c \
-                  utils_curl_stats.c utils_curl_stats.h \
-                  utils_match.c utils_match.h
-curl_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-curl_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
-curl_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) liblatency.la
-endif
-
-if BUILD_PLUGIN_CURL_JSON
-pkglib_LTLIBRARIES += curl_json.la
-curl_json_la_SOURCES = curl_json.c \
-                 utils_curl_stats.c utils_curl_stats.h
-curl_json_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
-curl_json_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
-curl_json_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
-curl_json_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBYAJL_LIBS)
-endif
-
-if BUILD_PLUGIN_CURL_XML
-pkglib_LTLIBRARIES += curl_xml.la
-curl_xml_la_SOURCES = curl_xml.c \
-                 utils_curl_stats.c utils_curl_stats.h
-curl_xml_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-curl_xml_la_CFLAGS = $(AM_CFLAGS) \
-               $(BUILD_WITH_LIBCURL_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
-curl_xml_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
-endif
-
-if BUILD_PLUGIN_DBI
-pkglib_LTLIBRARIES += dbi.la
-dbi_la_SOURCES = dbi.c \
-                utils_db_query.c utils_db_query.h
-dbi_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBDBI_CPPFLAGS)
-dbi_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBDBI_LDFLAGS)
-dbi_la_LIBADD = $(BUILD_WITH_LIBDBI_LIBS)
-endif
-
-if BUILD_PLUGIN_DF
-pkglib_LTLIBRARIES += df.la
-df_la_SOURCES = df.c
-df_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-df_la_LIBADD = libmount.la
-endif
-
-if BUILD_PLUGIN_DISK
-pkglib_LTLIBRARIES += disk.la
-disk_la_SOURCES = disk.c
-disk_la_CFLAGS = $(AM_CFLAGS)
-disk_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-disk_la_LIBADD =
-if BUILD_WITH_LIBKSTAT
-disk_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-disk_la_LIBADD += -ldevinfo
-endif
-if BUILD_WITH_LIBIOKIT
-disk_la_LDFLAGS += -framework IOKit
-endif
-if BUILD_WITH_LIBSTATGRAB
-disk_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-disk_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-if BUILD_WITH_LIBUDEV
-disk_la_CFLAGS += $(BUILD_WITH_LIBUDEV_CFLAGS)
-disk_la_LDFLAGS += $(BUILD_WITH_LIBUDEV_LDFLAGS)
-disk_la_LIBADD += $(BUILD_WITH_LIBUDEV_LIBS)
-endif
-if BUILD_FREEBSD
-disk_la_LIBADD += -ldevstat -lgeom
-endif
-if BUILD_WITH_PERFSTAT
-disk_la_LIBADD += -lperfstat
-endif
-endif
-
-if BUILD_PLUGIN_DNS
-pkglib_LTLIBRARIES += dns.la
-dns_la_SOURCES = dns.c utils_dns.c utils_dns.h
-dns_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-dns_la_LIBADD = -lpcap
-endif
-
-if BUILD_PLUGIN_DPDKSTAT
-pkglib_LTLIBRARIES += dpdkstat.la
-dpdkstat_la_SOURCES = dpdkstat.c
-dpdkstat_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBDPDK_CPPFLAGS)
-dpdkstat_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBDPDK_LDFLAGS)
-dpdkstat_la_LIBADD = -ldpdk
-endif
-
-if BUILD_PLUGIN_DRBD
-pkglib_LTLIBRARIES += drbd.la
-drbd_la_SOURCES = drbd.c
-drbd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_EMAIL
-pkglib_LTLIBRARIES += email.la
-email_la_SOURCES = email.c
-email_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_ENTROPY
-pkglib_LTLIBRARIES += entropy.la
-entropy_la_SOURCES = entropy.c
-entropy_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_EXEC
-pkglib_LTLIBRARIES += exec.la
-exec_la_SOURCES = exec.c
-exec_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-exec_la_LIBADD = libcmds.la
-endif
-
-if BUILD_PLUGIN_ETHSTAT
-pkglib_LTLIBRARIES += ethstat.la
-ethstat_la_SOURCES = ethstat.c
-ethstat_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_FHCOUNT
-pkglib_LTLIBRARIES += fhcount.la
-fhcount_la_SOURCES = fhcount.c
-fhcount_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_FILECOUNT
-pkglib_LTLIBRARIES += filecount.la
-filecount_la_SOURCES = filecount.c
-filecount_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_GMOND
-pkglib_LTLIBRARIES += gmond.la
-gmond_la_SOURCES = gmond.c
-gmond_la_CPPFLAGS = $(AM_CPPFLAGS) $(GANGLIA_CPPFLAGS)
-gmond_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(GANGLIA_LDFLAGS)
-gmond_la_LIBADD = $(GANGLIA_LIBS)
-endif
-
-if BUILD_PLUGIN_GPS
-pkglib_LTLIBRARIES += gps.la
-gps_la_SOURCES = gps.c
-gps_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBGPS_CFLAGS)
-gps_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGPS_LDFLAGS)
-gps_la_LIBADD = -lpthread $(BUILD_WITH_LIBGPS_LIBS)
-endif
-
-if BUILD_PLUGIN_GRPC
-pkglib_LTLIBRARIES += grpc.la
-grpc_la_SOURCES = grpc.cc
-nodist_grpc_la_SOURCES = collectd.grpc.pb.cc collectd.pb.cc types.pb.cc
-grpc_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBGRPCPP_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_CPPFLAGS)
-grpc_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGRPCPP_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_LDFLAGS)
-grpc_la_LIBADD = $(BUILD_WITH_LIBGRPCPP_LIBS) $(BUILD_WITH_LIBPROTOBUF_LIBS)
-endif
-
-if BUILD_PLUGIN_HDDTEMP
-pkglib_LTLIBRARIES += hddtemp.la
-hddtemp_la_SOURCES = hddtemp.c
-hddtemp_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-hddtemp_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-hddtemp_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_HUGEPAGES
-pkglib_LTLIBRARIES += hugepages.la
-hugepages_la_SOURCES = hugepages.c
-hugepages_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_INTERFACE
-pkglib_LTLIBRARIES += interface.la
-interface_la_SOURCES = interface.c
-interface_la_CFLAGS = $(AM_CFLAGS)
-interface_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-interface_la_LIBADD =
-if BUILD_WITH_LIBSTATGRAB
-interface_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-interface_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-else
-if BUILD_WITH_LIBKSTAT
-interface_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-interface_la_LIBADD += -ldevinfo
-endif # BUILD_WITH_LIBDEVINFO
-endif # !BUILD_WITH_LIBSTATGRAB
-if BUILD_WITH_PERFSTAT
-interface_la_LIBADD += -lperfstat
-endif
-endif # BUILD_PLUGIN_INTERFACE
-
-if BUILD_PLUGIN_IPC
-pkglib_LTLIBRARIES += ipc.la
-ipc_la_SOURCES = ipc.c
-ipc_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_IPTABLES
-pkglib_LTLIBRARIES += iptables.la
-iptables_la_SOURCES = iptables.c
-iptables_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBIPTC_CPPFLAGS)
-iptables_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-iptables_la_LIBADD = $(BUILD_WITH_LIBIPTC_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_IPMI
-pkglib_LTLIBRARIES += ipmi.la
-ipmi_la_SOURCES = ipmi.c
-ipmi_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_OPENIPMI_CFLAGS)
-ipmi_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-ipmi_la_LIBADD = $(BUILD_WITH_OPENIPMI_LIBS)
-endif
-
-if BUILD_PLUGIN_IPVS
-pkglib_LTLIBRARIES += ipvs.la
-ipvs_la_SOURCES = ipvs.c
-ipvs_la_CFLAGS = $(AM_CFLAGS)
-if IP_VS_H_NEEDS_KERNEL_CFLAGS
-ipvs_la_CFLAGS += $(KERNEL_CFLAGS)
-endif
-ipvs_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_IRQ
-pkglib_LTLIBRARIES += irq.la
-irq_la_SOURCES = irq.c
-irq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_JAVA
-pkglib_LTLIBRARIES += java.la
-java_la_SOURCES = java.c
-java_la_CPPFLAGS = $(AM_CPPFLAGS) $(JAVA_CPPFLAGS)
-java_la_CFLAGS = $(AM_CFLAGS) $(JAVA_CFLAGS)
-java_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(JAVA_LDFLAGS)
-java_la_LIBADD = $(JAVA_LIBS)
-endif
-
-if BUILD_PLUGIN_LOAD
-pkglib_LTLIBRARIES += load.la
-load_la_SOURCES = load.c
-load_la_CFLAGS = $(AM_CFLAGS)
-load_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-load_la_LIBADD =
-if BUILD_WITH_LIBSTATGRAB
-load_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-load_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif # BUILD_WITH_LIBSTATGRAB
-if BUILD_WITH_PERFSTAT
-load_la_LIBADD += -lperfstat
-endif
-endif # BUILD_PLUGIN_LOAD
-
-if BUILD_PLUGIN_LOGFILE
-pkglib_LTLIBRARIES += logfile.la
-logfile_la_SOURCES = logfile.c
-logfile_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_LOG_LOGSTASH
-pkglib_LTLIBRARIES += log_logstash.la
-log_logstash_la_SOURCES = log_logstash.c
-log_logstash_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
-log_logstash_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
-log_logstash_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
-endif
-
-if BUILD_PLUGIN_LPAR
-pkglib_LTLIBRARIES += lpar.la
-lpar_la_SOURCES = lpar.c
-lpar_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-lpar_la_LIBADD = -lperfstat
-endif
-
-if BUILD_PLUGIN_LUA
-pkglib_LTLIBRARIES += lua.la
-lua_la_SOURCES = lua.c \
-                utils_lua.c utils_lua.h
-lua_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBLUA_CFLAGS)
-lua_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-lua_la_LIBADD = $(BUILD_WITH_LIBLUA_LIBS)
-endif
-
-if BUILD_PLUGIN_LVM
-pkglib_LTLIBRARIES += lvm.la
-lvm_la_SOURCES = lvm.c
-lvm_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBLVM2APP_CPPFLAGS)
-lvm_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBLVM2APP_LDFLAGS)
-lvm_la_LIBADD = $(BUILD_WITH_LIBLVM2APP_LIBS)
-endif
-
-if BUILD_PLUGIN_MADWIFI
-pkglib_LTLIBRARIES += madwifi.la
-madwifi_la_SOURCES = madwifi.c madwifi.h
-madwifi_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MATCH_EMPTY_COUNTER
-pkglib_LTLIBRARIES += match_empty_counter.la
-match_empty_counter_la_SOURCES = match_empty_counter.c
-match_empty_counter_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MATCH_HASHED
-pkglib_LTLIBRARIES += match_hashed.la
-match_hashed_la_SOURCES = match_hashed.c
-match_hashed_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MATCH_REGEX
-pkglib_LTLIBRARIES += match_regex.la
-match_regex_la_SOURCES = match_regex.c
-match_regex_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MATCH_TIMEDIFF
-pkglib_LTLIBRARIES += match_timediff.la
-match_timediff_la_SOURCES = match_timediff.c
-match_timediff_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MATCH_VALUE
-pkglib_LTLIBRARIES += match_value.la
-match_value_la_SOURCES = match_value.c
-match_value_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MBMON
-pkglib_LTLIBRARIES += mbmon.la
-mbmon_la_SOURCES = mbmon.c
-mbmon_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-mbmon_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-mbmon_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_MD
-pkglib_LTLIBRARIES += md.la
-md_la_SOURCES = md.c
-md_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MEMCACHEC
-pkglib_LTLIBRARIES += memcachec.la
-memcachec_la_SOURCES = memcachec.c \
-                       utils_match.c utils_match.h
-memcachec_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMEMCACHED_LDFLAGS)
-memcachec_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMEMCACHED_CPPFLAGS)
-memcachec_la_LIBADD = $(BUILD_WITH_LIBMEMCACHED_LIBS) liblatency.la
-endif
-
-if BUILD_PLUGIN_MEMCACHED
-pkglib_LTLIBRARIES += memcached.la
-memcached_la_SOURCES = memcached.c
-memcached_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-memcached_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-memcached_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_MEMORY
-pkglib_LTLIBRARIES += memory.la
-memory_la_SOURCES = memory.c
-memory_la_CFLAGS = $(AM_CFLAGS)
-memory_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-memory_la_LIBADD =
-if BUILD_WITH_LIBKSTAT
-memory_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-memory_la_LIBADD += -ldevinfo
-endif
-if BUILD_WITH_LIBSTATGRAB
-memory_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-memory_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-if BUILD_WITH_PERFSTAT
-memory_la_LIBADD += -lperfstat
-endif
-endif
-
-if BUILD_PLUGIN_MIC
-pkglib_LTLIBRARIES += mic.la
-mic_la_SOURCES = mic.c
-mic_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_MIC_LIBPATH)
-mic_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_MIC_CPPFLAGS)
-mic_la_LIBADD = $(BUILD_WITH_MIC_LDADD)
-endif
-
-if BUILD_PLUGIN_MODBUS
-pkglib_LTLIBRARIES += modbus.la
-modbus_la_SOURCES = modbus.c
-modbus_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-modbus_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMODBUS_CFLAGS)
-modbus_la_LIBADD = $(BUILD_WITH_LIBMODBUS_LIBS)
-endif
-
-if BUILD_PLUGIN_MQTT
-pkglib_LTLIBRARIES += mqtt.la
-mqtt_la_SOURCES = mqtt.c
-mqtt_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMOSQUITTO_CPPFLAGS)
-mqtt_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMOSQUITTO_LDFLAGS)
-mqtt_la_LIBADD = $(BUILD_WITH_LIBMOSQUITTO_LIBS)
-endif
-
-if BUILD_PLUGIN_MULTIMETER
-pkglib_LTLIBRARIES += multimeter.la
-multimeter_la_SOURCES = multimeter.c
-multimeter_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_MYSQL
-pkglib_LTLIBRARIES += mysql.la
-mysql_la_SOURCES = mysql.c
-mysql_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMYSQL_CFLAGS)
-mysql_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-mysql_la_LIBADD = $(BUILD_WITH_LIBMYSQL_LIBS)
-endif
-
-if BUILD_PLUGIN_NETAPP
-pkglib_LTLIBRARIES += netapp.la
-netapp_la_SOURCES = netapp.c
-netapp_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBNETAPP_CPPFLAGS)
-netapp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBNETAPP_LDFLAGS)
-netapp_la_LIBADD = $(LIBNETAPP_LIBS)
-endif
-
-if BUILD_PLUGIN_NETLINK
-pkglib_LTLIBRARIES += netlink.la
-netlink_la_SOURCES = netlink.c
-netlink_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-netlink_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBMNL_CFLAGS)
-netlink_la_LIBADD = $(BUILD_WITH_LIBMNL_LIBS)
-endif
-
-if BUILD_PLUGIN_NETWORK
-pkglib_LTLIBRARIES += network.la
-network_la_SOURCES = network.c network.h \
-                    utils_fbhash.c utils_fbhash.h
-network_la_CPPFLAGS = $(AM_CPPFLAGS)
-network_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-network_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-network_la_LIBADD += -lsocket
-endif
-if BUILD_WITH_LIBGCRYPT
-network_la_CPPFLAGS += $(GCRYPT_CPPFLAGS)
-network_la_LDFLAGS += $(GCRYPT_LDFLAGS)
-network_la_LIBADD += $(GCRYPT_LIBS)
-endif
-endif
-
-if BUILD_PLUGIN_NFS
-pkglib_LTLIBRARIES += nfs.la
-nfs_la_SOURCES = nfs.c
-nfs_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_FSCACHE
-pkglib_LTLIBRARIES += fscache.la
-fscache_la_SOURCES = fscache.c
-fscache_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_NGINX
-pkglib_LTLIBRARIES += nginx.la
-nginx_la_SOURCES = nginx.c
-nginx_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
-nginx_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-nginx_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS)
-endif
-
-if BUILD_PLUGIN_NOTIFY_DESKTOP
-pkglib_LTLIBRARIES += notify_desktop.la
-notify_desktop_la_SOURCES = notify_desktop.c
-notify_desktop_la_CFLAGS = $(AM_CFLAGS) $(LIBNOTIFY_CFLAGS)
-notify_desktop_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-notify_desktop_la_LIBADD = $(LIBNOTIFY_LIBS)
-endif
-
-if BUILD_PLUGIN_NOTIFY_EMAIL
-pkglib_LTLIBRARIES += notify_email.la
-notify_email_la_SOURCES = notify_email.c
-notify_email_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-notify_email_la_LIBADD = -lesmtp
-endif
-
-if BUILD_PLUGIN_NOTIFY_NAGIOS
-pkglib_LTLIBRARIES += notify_nagios.la
-notify_nagios_la_SOURCES = notify_nagios.c
-notify_nagios_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_NTPD
-pkglib_LTLIBRARIES += ntpd.la
-ntpd_la_SOURCES = ntpd.c
-ntpd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-ntpd_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-ntpd_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_NUMA
-pkglib_LTLIBRARIES += numa.la
-numa_la_SOURCES = numa.c
-numa_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_NUT
-pkglib_LTLIBRARIES += nut.la
-nut_la_SOURCES = nut.c
-nut_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBUPSCLIENT_CFLAGS)
-nut_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-nut_la_LIBADD = $(BUILD_WITH_LIBUPSCLIENT_LIBS)
-endif
-
-if BUILD_PLUGIN_OLSRD
-pkglib_LTLIBRARIES += olsrd.la
-olsrd_la_SOURCES = olsrd.c
-olsrd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-olsrd_la_LIBADD =
-if BUILD_WITH_LIBSOCKET
-olsrd_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_ONEWIRE
-pkglib_LTLIBRARIES += onewire.la
-onewire_la_SOURCES = onewire.c
-onewire_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBOWCAPI_CPPFLAGS)
-onewire_la_LIBADD = $(BUILD_WITH_LIBOWCAPI_LIBS)
-onewire_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBOWCAPI_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_OPENLDAP
-pkglib_LTLIBRARIES += openldap.la
-openldap_la_SOURCES = openldap.c
-openldap_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBLDAP_CPPFLAGS)
-openldap_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBLDAP_LDFLAGS)
-openldap_la_LIBADD = -lldap
-endif
-
-if BUILD_PLUGIN_OPENVPN
-pkglib_LTLIBRARIES += openvpn.la
-openvpn_la_SOURCES = openvpn.c
-openvpn_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_ORACLE
-pkglib_LTLIBRARIES += oracle.la
-oracle_la_SOURCES = oracle.c \
-       utils_db_query.c utils_db_query.h
-oracle_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_ORACLE_CPPFLAGS)
-oracle_la_LIBADD = $(BUILD_WITH_ORACLE_LIBS)
-oracle_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_PERL
-pkglib_LTLIBRARIES += perl.la
-perl_la_SOURCES = perl.c
-# Despite C99 providing the "bool" type thru stdbool.h, Perl defines its own
-# version of that type if HAS_BOOL is not defined... *sigh*
-perl_la_CPPFLAGS = $(AM_CPPFLAGS) -DHAS_BOOL=1
-# Despite off_t being 64 bit wide on 64 bit platforms, Perl insist on using
-# off64_t which is only exposed when _LARGEFILE64_SOURCE is defined... *sigh*
-# On older platforms we also need _REENTRANT. _GNU_SOURCE sets both of these.
-perl_la_CPPFLAGS += -D_GNU_SOURCE
-perl_la_CFLAGS  = $(AM_CFLAGS) \
-               $(PERL_CFLAGS) \
-               -DXS_VERSION=\"$(VERSION)\" -DVERSION=\"$(VERSION)\"
-# Work-around for issues #41 and #42 - Perl 5.10 incorrectly introduced
-# __attribute__nonnull__(3) for Perl_load_module().
-if HAVE_BROKEN_PERL_LOAD_MODULE
-perl_la_CFLAGS += -Wno-nonnull
-endif
-perl_la_LDFLAGS = $(PLUGIN_LDFLAGS) \
-               $(PERL_LDFLAGS)
-perl_la_LIBADD = $(PERL_LIBS)
-endif
-
-if BUILD_PLUGIN_PF
-pkglib_LTLIBRARIES += pf.la
-pf_la_SOURCES = pf.c
-pf_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_PINBA
-pkglib_LTLIBRARIES += pinba.la
-pinba_la_SOURCES = pinba.c
-nodist_pinba_la_SOURCES = pinba.pb-c.c pinba.pb-c.h
-pinba_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS)
-pinba_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_LDFLAGS)
-pinba_la_LIBADD = $(BUILD_WITH_LIBPROTOBUF_C_LIBS)
-endif
-
-if BUILD_PLUGIN_PING
-pkglib_LTLIBRARIES += ping.la
-ping_la_SOURCES = ping.c
-ping_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBOPING_CPPFLAGS)
-ping_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBOPING_LDFLAGS)
-ping_la_LIBADD = -loping -lm
-endif
-
-if BUILD_PLUGIN_POSTGRESQL
-pkglib_LTLIBRARIES += postgresql.la
-postgresql_la_SOURCES = postgresql.c \
-                utils_db_query.c utils_db_query.h
-postgresql_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPQ_CPPFLAGS)
-postgresql_la_LDFLAGS = $(PLUGIN_LDFLAGS) \
-               $(BUILD_WITH_LIBPQ_LDFLAGS)
-postgresql_la_LIBADD = -lpq
-endif
-
-if BUILD_PLUGIN_POWERDNS
-pkglib_LTLIBRARIES += powerdns.la
-powerdns_la_SOURCES = powerdns.c
-powerdns_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_PYTHON
-pkglib_LTLIBRARIES += python.la
-python_la_SOURCES = python.c pyconfig.c pyvalues.c cpython.h
-python_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBPYTHON_CPPFLAGS)
-if COMPILER_IS_GCC
-python_la_CPPFLAGS += -fno-strict-aliasing -Wno-strict-aliasing
-endif
-python_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBPYTHON_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_PROCESSES
-pkglib_LTLIBRARIES += processes.la
-processes_la_SOURCES = processes.c
-processes_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-processes_la_LIBADD =
-if BUILD_WITH_LIBKVM_GETPROCS
-processes_la_LIBADD += -lkvm
-endif
-endif
-
-if BUILD_PLUGIN_PROTOCOLS
-pkglib_LTLIBRARIES += protocols.la
-protocols_la_SOURCES = protocols.c
-protocols_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_INTEL_RDT
-pkglib_LTLIBRARIES += intel_rdt.la
-intel_rdt_la_SOURCES = intel_rdt.c
-intel_rdt_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPQOS_LDFLAGS)
-intel_rdt_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBPQOS_CPPFLAGS)
-intel_rdt_la_LIBADD = $(BUILD_WITH_LIBPQOS_LIBS)
-endif
-
-if BUILD_PLUGIN_REDIS
-pkglib_LTLIBRARIES += redis.la
-redis_la_SOURCES = redis.c
-redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
-redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
-redis_la_LIBADD = -lhiredis
-endif
-
-if BUILD_PLUGIN_ROUTEROS
-pkglib_LTLIBRARIES += routeros.la
-routeros_la_SOURCES = routeros.c
-routeros_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBROUTEROS_CPPFLAGS)
-routeros_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBROUTEROS_LDFLAGS)
-routeros_la_LIBADD = -lrouteros
-endif
-
-if BUILD_PLUGIN_RRDCACHED
-pkglib_LTLIBRARIES += rrdcached.la
-rrdcached_la_SOURCES = rrdcached.c utils_rrdcreate.c utils_rrdcreate.h
-rrdcached_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRRD_LDFLAGS)
-rrdcached_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBRRD_CFLAGS)
-rrdcached_la_LIBADD = $(BUILD_WITH_LIBRRD_LIBS)
-endif
-
-if BUILD_PLUGIN_RRDTOOL
-pkglib_LTLIBRARIES += rrdtool.la
-rrdtool_la_SOURCES = rrdtool.c utils_rrdcreate.c utils_rrdcreate.h
-rrdtool_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRRD_LDFLAGS)
-rrdtool_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBRRD_CFLAGS)
-rrdtool_la_LIBADD = $(BUILD_WITH_LIBRRD_LIBS)
-endif
-
-if BUILD_PLUGIN_SENSORS
-pkglib_LTLIBRARIES += sensors.la
-sensors_la_SOURCES = sensors.c
-sensors_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBSENSORS_CFLAGS)
-sensors_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBSENSORS_LDFLAGS)
-sensors_la_LIBADD = -lsensors
-endif
-
-if BUILD_PLUGIN_SERIAL
-pkglib_LTLIBRARIES += serial.la
-serial_la_SOURCES = serial.c
-serial_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_SIGROK
-pkglib_LTLIBRARIES += sigrok.la
-sigrok_la_SOURCES = sigrok.c
-sigrok_la_CFLAGS = $(AM_CFLAGS) $(LIBSIGROK_CFLAGS)
-sigrok_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-sigrok_la_LIBADD = $(LIBSIGROK_LIBS)
-endif
-
-if BUILD_PLUGIN_SMART
-if BUILD_WITH_LIBUDEV
-pkglib_LTLIBRARIES += smart.la
-smart_la_SOURCES = smart.c
-smart_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBATASMART_CPPFLAGS) $(BUILD_WITH_LIBUDEV_CFLAGS)
-smart_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBATASMART_LDFLAGS) $(BUILD_WITH_LIBUDEV_LDFLAGS)
-smart_la_LIBADD = $(BUILD_WITH_LIBATASMART_LIBS) $(BUILD_WITH_LIBUDEV_LIBS)
-endif
-endif
-
-if BUILD_PLUGIN_SNMP
-pkglib_LTLIBRARIES += snmp.la
-snmp_la_SOURCES = snmp.c
-snmp_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBNETSNMP_CPPFLAGS)
-snmp_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBNETSNMP_LDFLAGS)
-snmp_la_LIBADD = $(BUILD_WITH_LIBNETSNMP_LIBS)
-endif
-
-if BUILD_PLUGIN_STATSD
-pkglib_LTLIBRARIES += statsd.la
-statsd_la_SOURCES = statsd.c
-statsd_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-statsd_la_LIBADD = liblatency.la
-endif
-
-if BUILD_PLUGIN_SWAP
-pkglib_LTLIBRARIES += swap.la
-swap_la_SOURCES = swap.c
-swap_la_CFLAGS = $(AM_CFLAGS)
-swap_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-swap_la_LIBADD =
-if BUILD_WITH_LIBKSTAT
-swap_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-swap_la_LIBADD += -ldevinfo
-endif
-if BUILD_WITH_LIBKVM_GETSWAPINFO
-swap_la_LIBADD += -lkvm
-endif
-if BUILD_WITH_LIBSTATGRAB
-swap_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-swap_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-if BUILD_WITH_PERFSTAT
-swap_la_LIBADD += -lperfstat
-endif
-
-endif
-
-if BUILD_PLUGIN_SYSLOG
-pkglib_LTLIBRARIES += syslog.la
-syslog_la_SOURCES = syslog.c
-syslog_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TABLE
-pkglib_LTLIBRARIES += table.la
-table_la_SOURCES = table.c
-table_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TAIL
-pkglib_LTLIBRARIES += tail.la
-tail_la_SOURCES = tail.c \
-                  utils_match.c utils_match.h \
-                  utils_tail.c utils_tail.h \
-                  utils_tail_match.c utils_tail_match.h
-tail_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-tail_la_LIBADD = liblatency.la
-endif
-
-if BUILD_PLUGIN_TAIL_CSV
-pkglib_LTLIBRARIES += tail_csv.la
-tail_csv_la_SOURCES = tail_csv.c \
-                      utils_tail.c utils_tail.h
-tail_csv_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TAPE
-pkglib_LTLIBRARIES += tape.la
-tape_la_SOURCES = tape.c
-tape_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-tape_la_LIBADD = -lkstat -ldevinfo
-endif
-
-if BUILD_PLUGIN_TARGET_NOTIFICATION
-pkglib_LTLIBRARIES += target_notification.la
-target_notification_la_SOURCES = target_notification.c
-target_notification_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TARGET_REPLACE
-pkglib_LTLIBRARIES += target_replace.la
-target_replace_la_SOURCES = target_replace.c
-target_replace_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TARGET_SCALE
-pkglib_LTLIBRARIES += target_scale.la
-target_scale_la_SOURCES = target_scale.c
-target_scale_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TARGET_SET
-pkglib_LTLIBRARIES += target_set.la
-target_set_la_SOURCES = target_set.c
-target_set_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TARGET_V5UPGRADE
-pkglib_LTLIBRARIES += target_v5upgrade.la
-target_v5upgrade_la_SOURCES = target_v5upgrade.c
-target_v5upgrade_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TCPCONNS
-pkglib_LTLIBRARIES += tcpconns.la
-tcpconns_la_SOURCES = tcpconns.c
-tcpconns_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-tcpconns_la_LIBADD =
-if BUILD_WITH_LIBKVM_NLIST
-tcpconns_la_LIBADD += -lkvm
-endif
-endif
-
-if BUILD_PLUGIN_TEAMSPEAK2
-pkglib_LTLIBRARIES += teamspeak2.la
-teamspeak2_la_SOURCES = teamspeak2.c
-teamspeak2_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TED
-pkglib_LTLIBRARIES += ted.la
-ted_la_SOURCES = ted.c
-ted_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_THERMAL
-pkglib_LTLIBRARIES += thermal.la
-thermal_la_SOURCES = thermal.c
-thermal_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_THRESHOLD
-pkglib_LTLIBRARIES += threshold.la
-threshold_la_SOURCES = threshold.c
-threshold_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_TOKYOTYRANT
-pkglib_LTLIBRARIES += tokyotyrant.la
-tokyotyrant_la_SOURCES = tokyotyrant.c
-tokyotyrant_la_CPPFLAGS  = $(AM_CPPFLAGS) $(BUILD_WITH_LIBTOKYOTYRANT_CPPFLAGS)
-tokyotyrant_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBTOKYOTYRANT_LDFLAGS)
-tokyotyrant_la_LIBADD  = $(BUILD_WITH_LIBTOKYOTYRANT_LIBS)
-if BUILD_WITH_LIBSOCKET
-tokyotyrant_la_LIBADD += -lsocket
-endif
-endif
-
-if BUILD_PLUGIN_TURBOSTAT
-pkglib_LTLIBRARIES += turbostat.la
-turbostat_la_SOURCES = turbostat.c
-turbostat_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_UNIXSOCK
-pkglib_LTLIBRARIES += unixsock.la
-unixsock_la_SOURCES = unixsock.c
-unixsock_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-unixsock_la_LIBADD =  libcmds.la
-endif
-
-if BUILD_PLUGIN_UPTIME
-pkglib_LTLIBRARIES += uptime.la
-uptime_la_SOURCES = uptime.c
-uptime_la_CFLAGS = $(AM_CFLAGS)
-uptime_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-uptime_la_LIBADD =
-if BUILD_WITH_LIBKSTAT
-uptime_la_LIBADD += -lkstat
-endif
-if BUILD_WITH_PERFSTAT
-uptime_la_LIBADD += -lperfstat
-endif
-endif
-
-if BUILD_PLUGIN_USERS
-pkglib_LTLIBRARIES += users.la
-users_la_SOURCES = users.c
-users_la_CFLAGS = $(AM_CFLAGS)
-users_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-users_la_LIBADD =
-if BUILD_WITH_LIBSTATGRAB
-users_la_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-users_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-endif
-
-if BUILD_PLUGIN_UUID
-pkglib_LTLIBRARIES += uuid.la
-uuid_la_SOURCES = uuid.c
-uuid_la_CFLAGS  = $(AM_CFLAGS) $(BUILD_WITH_LIBHAL_CFLAGS)
-uuid_la_LIBADD  = $(BUILD_WITH_LIBHAL_LIBS)
-uuid_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_VARNISH
-pkglib_LTLIBRARIES += varnish.la
-varnish_la_SOURCES = varnish.c
-varnish_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-varnish_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBVARNISH_CFLAGS)
-varnish_la_LIBADD = $(BUILD_WITH_LIBVARNISH_LIBS)
-endif
-
-if BUILD_PLUGIN_VIRT
-pkglib_LTLIBRARIES += virt.la
-virt_la_SOURCES = virt.c
-virt_la_CFLAGS = $(AM_CFLAGS) \
-               $(BUILD_WITH_LIBVIRT_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
-virt_la_LIBADD = $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
-virt_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_VMEM
-pkglib_LTLIBRARIES += vmem.la
-vmem_la_SOURCES = vmem.c
-vmem_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_VSERVER
-pkglib_LTLIBRARIES += vserver.la
-vserver_la_SOURCES = vserver.c
-vserver_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_WIRELESS
-pkglib_LTLIBRARIES += wireless.la
-wireless_la_SOURCES = wireless.c
-wireless_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_WRITE_GRAPHITE
-pkglib_LTLIBRARIES += write_graphite.la
-write_graphite_la_SOURCES = write_graphite.c
-write_graphite_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-write_graphite_la_LIBADD = libformat_graphite.la
-endif
-
-if BUILD_PLUGIN_WRITE_HTTP
-pkglib_LTLIBRARIES += write_http.la
-write_http_la_SOURCES = write_http.c \
-                       utils_format_kairosdb.c utils_format_kairosdb.h
-write_http_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-write_http_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS)
-write_http_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) libformat_json.la
-endif
-
-if BUILD_PLUGIN_WRITE_KAFKA
-pkglib_LTLIBRARIES += write_kafka.la
-write_kafka_la_SOURCES = write_kafka.c \
-                         utils_crc32.c utils_crc32.h
-write_kafka_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBRDKAFKA_CPPFLAGS)
-write_kafka_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRDKAFKA_LDFLAGS)
-write_kafka_la_LIBADD = $(BUILD_WITH_LIBRDKAFKA_LIBS) \
-                        libcmds.la libformat_graphite.la libformat_json.la
-endif
-
-if BUILD_PLUGIN_WRITE_LOG
-pkglib_LTLIBRARIES += write_log.la
-write_log_la_SOURCES = write_log.c
-write_log_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-write_log_la_LIBADD = libformat_graphite.la libformat_json.la
-endif
-
-if BUILD_PLUGIN_WRITE_MONGODB
-pkglib_LTLIBRARIES += write_mongodb.la
-write_mongodb_la_SOURCES = write_mongodb.c
-write_mongodb_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMONGOC_CPPFLAGS)
-write_mongodb_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMONGOC_LDFLAGS)
-write_mongodb_la_LIBADD = -lmongoc
-endif
-
-if BUILD_PLUGIN_WRITE_PROMETHEUS
-pkglib_LTLIBRARIES += write_prometheus.la
-write_prometheus_la_SOURCES = write_prometheus.c
-nodist_write_prometheus_la_SOURCES = prometheus.pb-c.c prometheus.pb-c.h
-write_prometheus_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_CPPFLAGS) $(BUILD_WITH_LIBMICROHTTPD_CPPFLAGS)
-write_prometheus_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPROTOBUF_C_LDFLAGS) $(BUILD_WITH_LIBMICROHTTPD_LDFLAGS)
-write_prometheus_la_LIBADD = $(BUILD_WITH_LIBPROTOBUF_C_LIBS) $(BUILD_WITH_LIBMICROHTTPD_LIBS)
-endif
-
-if BUILD_PLUGIN_WRITE_REDIS
-pkglib_LTLIBRARIES += write_redis.la
-write_redis_la_SOURCES = write_redis.c
-write_redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
-write_redis_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
-write_redis_la_LIBADD = -lhiredis
-endif
-
-if BUILD_PLUGIN_WRITE_RIEMANN
-pkglib_LTLIBRARIES += write_riemann.la
-write_riemann_la_SOURCES = write_riemann.c write_riemann_threshold.c write_riemann_threshold.h
-write_riemann_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBRIEMANN_CLIENT_LIBS)
-write_riemann_la_CFLAGS = $(AM_CFLAGS) $(LIBRIEMANN_CLIENT_CFLAGS)
-endif
-
-if BUILD_PLUGIN_WRITE_SENSU
-pkglib_LTLIBRARIES += write_sensu.la
-write_sensu_la_SOURCES = write_sensu.c
-write_sensu_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_WRITE_TSDB
-pkglib_LTLIBRARIES += write_tsdb.la
-write_tsdb_la_SOURCES = write_tsdb.c
-write_tsdb_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-if BUILD_PLUGIN_XENCPU
-pkglib_LTLIBRARIES += xencpu.la
-xencpu_la_SOURCES = xencpu.c
-xencpu_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBXENCTL_CPPFLAGS)
-xencpu_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(LIBXENCTL_LDFLAGS)
-xencpu_la_LIBADD = -lxenctrl
-endif
-
-if BUILD_PLUGIN_XMMS
-pkglib_LTLIBRARIES += xmms.la
-xmms_la_SOURCES = xmms.c
-xmms_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBXMMS_CFLAGS)
-xmms_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-xmms_la_LIBADD = $(BUILD_WITH_LIBXMMS_LIBS)
-endif
-
-if BUILD_PLUGIN_ZFS_ARC
-pkglib_LTLIBRARIES += zfs_arc.la
-zfs_arc_la_SOURCES = zfs_arc.c
-zfs_arc_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-if BUILD_FREEBSD
-zfs_arc_la_LIBADD = -lm
-endif
-if BUILD_SOLARIS
-zfs_arc_la_LIBADD = -lkstat
-endif
-endif
-
-if BUILD_PLUGIN_ZOOKEEPER
-pkglib_LTLIBRARIES += zookeeper.la
-zookeeper_la_SOURCES = zookeeper.c
-zookeeper_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-BUILT_SOURCES += $(dist_man_MANS)
-
-if BUILD_PLUGIN_ZONE
-pkglib_LTLIBRARIES += zone.la
-zone_la_SOURCES = zone.c
-zone_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-endif
-
-dist_man_MANS = collectd.1 \
-               collectd.conf.5 \
-               collectd-email.5 \
-               collectd-exec.5 \
-               collectdctl.1 \
-               collectd-java.5 \
-               collectd-lua.5 \
-               collectdmon.1 \
-               collectd-nagios.1 \
-               collectd-perl.5 \
-               collectd-python.5 \
-               collectd-snmp.5 \
-               collectd-tg.1 \
-               collectd-threshold.5 \
-               collectd-unixsock.5 \
-               types.db.5
-
-EXTRA_DIST =   collectd.conf.pod \
-               collectd-email.pod \
-               collectd-exec.pod \
-               collectdctl.pod \
-               collectd-java.pod \
-               collectd-lua.pod \
-               collectdmon.pod \
-               collectd-nagios.pod \
-               collectd-perl.pod \
-               collectd-python.pod \
-               collectd.pod \
-               collectd-snmp.pod \
-               collectd-tg.pod \
-               collectd-threshold.pod \
-               collectd-unixsock.pod \
-               postgresql_default.conf \
-               types.db \
-               types.db.pod \
-               valgrind.FreeBSD.suppress
-
-AM_V_POD2MAN_C = $(am__v_POD2MAN_C_@AM_V@)
-am__v_POD2MAN_C_ = $(am__v_POD2MAN_C_@AM_DEFAULT_V@)
-am__v_POD2MAN_C_0 = @echo "  POD2MAN " $@;
-am__v_POD2MAN_C_1 =
-
-.pod.1:
-       $(AM_V_POD2MAN_C)pod2man --release=$(VERSION) --center=$(PACKAGE) $< \
-               >.pod2man.tmp.$$$$ 2>/dev/null && mv -f .pod2man.tmp.$$$$ $@ || true
-       @if grep '\<POD ERRORS\>' $@ >/dev/null 2>&1; \
-       then \
-               echo "$@ has some POD errors!"; false; \
-       fi
-
-.pod.5:
-       $(AM_V_POD2MAN_C)pod2man --section=5 --release=$(VERSION) --center=$(PACKAGE) $< \
-               >.pod2man.tmp.$$$$ 2>/dev/null && mv -f .pod2man.tmp.$$$$ $@ || true
-       @if grep '\<POD ERRORS\>' $@ >/dev/null 2>&1; \
-       then \
-               echo "$@ has some POD errors!"; false; \
-       fi
-
-AM_V_PROTOC_C = $(am__v_PROTOC_C_@AM_V@)
-am__v_PROTOC_C_ = $(am__v_PROTOC_C_@AM_DEFAULT_V@)
-am__v_PROTOC_C_0 = @echo "  PROTOC-C" $@;
-am__v_PROTOC_C_1 =
-
-# Protocol buffer for the "pinba" plugin.
-EXTRA_DIST += pinba.proto
-if BUILD_PLUGIN_PINBA
-CLEANFILES += pinba.pb-c.c pinba.pb-c.h
-BUILT_SOURCES += pinba.pb-c.c pinba.pb-c.h
-
-pinba.pb-c.c pinba.pb-c.h: pinba.proto
-       $(AM_V_PROTOC_C)$(PROTOC_C) -I$(srcdir) --c_out . $(srcdir)/pinba.proto
-endif
-
-# Protocol buffer for the "write_prometheus" plugin.
-if BUILD_PLUGIN_WRITE_PROMETHEUS
-CLEANFILES += prometheus.pb-c.c prometheus.pb-c.h
-BUILT_SOURCES += prometheus.pb-c.c prometheus.pb-c.h
-
-prometheus.pb-c.c prometheus.pb-c.h: $(top_srcdir)/proto/prometheus.proto
-       $(AM_V_PROTOC_C)$(PROTOC_C) -I$(top_srcdir)/proto --c_out=$(builddir) $(top_srcdir)/proto/prometheus.proto
-endif
-
-install-exec-hook:
-       $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
-       if test -e $(DESTDIR)$(sysconfdir)/collectd.conf; \
-       then \
-               $(INSTALL) -m 0640 collectd.conf $(DESTDIR)$(sysconfdir)/collectd.conf.pkg-orig; \
-       else \
-               $(INSTALL) -m 0640 collectd.conf $(DESTDIR)$(sysconfdir)/collectd.conf; \
-       fi; \
-       $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
-       $(INSTALL) -m 0644 $(srcdir)/types.db $(DESTDIR)$(pkgdatadir)/types.db;
-       $(INSTALL) -m 0644 $(srcdir)/postgresql_default.conf \
-               $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
-
-uninstall-hook:
-       rm -f $(DESTDIR)$(pkgdatadir)/types.db;
-       rm -f $(DESTDIR)$(sysconfdir)/collectd.conf
-       rm -f $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
-
-if BUILD_PLUGIN_CEPH
-test_plugin_ceph_SOURCES = ceph_test.c
-test_plugin_ceph_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
-test_plugin_ceph_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
-test_plugin_ceph_LDADD = daemon/libplugin_mock.la $(BUILD_WITH_LIBYAJL_LIBS)
-check_PROGRAMS += test_plugin_ceph
-TESTS += test_plugin_ceph
-endif
index 4e20d0c..ffee1cd 100644 (file)
@@ -93,16 +93,16 @@ static _Bool agg_is_regex(char const *str) /* {{{ */
   size_t len;
 
   if (str == NULL)
-    return (0);
+    return 0;
 
   len = strlen(str);
   if (len < 3)
-    return (0);
+    return 0;
 
   if ((str[0] == '/') && (str[len - 1] == '/'))
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* }}} _Bool agg_is_regex */
 
 static void agg_destroy(aggregation_t *agg) /* {{{ */
@@ -222,7 +222,7 @@ static int agg_instance_create_name(agg_instance_t *inst, /* {{{ */
 
 #undef COPY_FIELD
 
-  return (0);
+  return 0;
 } /* }}} int agg_instance_create_name */
 
 /* Create a new aggregation instance. */
@@ -236,7 +236,7 @@ static agg_instance_t *agg_instance_create(data_set_t const *ds, /* {{{ */
   inst = calloc(1, sizeof(*inst));
   if (inst == NULL) {
     ERROR("aggregation plugin: calloc() failed.");
-    return (NULL);
+    return NULL;
   }
   pthread_mutex_init(&inst->lock, /* attr = */ NULL);
 
@@ -256,7 +256,7 @@ static agg_instance_t *agg_instance_create(data_set_t const *ds, /* {{{ */
         agg_instance_destroy(inst);                                            \
         free(inst);                                                            \
         ERROR("aggregation plugin: calloc() failed.");                         \
-        return (NULL);                                                         \
+        return NULL;                                                           \
       }                                                                        \
     }                                                                          \
   } while (0)
@@ -275,7 +275,7 @@ static agg_instance_t *agg_instance_create(data_set_t const *ds, /* {{{ */
   agg_instance_list_head = inst;
   pthread_mutex_unlock(&agg_instance_list_lock);
 
-  return (inst);
+  return inst;
 } /* }}} agg_instance_t *agg_instance_create */
 
 /* Update the num, sum, min, max, ... fields of the aggregation instance, if
@@ -291,7 +291,7 @@ static int agg_instance_update(agg_instance_t *inst, /* {{{ */
           "data source. This is currently not supported by this plugin. "
           "Sorry.",
           ds->type);
-    return (EINVAL);
+    return EINVAL;
   }
 
   rate = uc_get_rate(ds, vl);
@@ -300,12 +300,12 @@ static int agg_instance_update(agg_instance_t *inst, /* {{{ */
     FORMAT_VL(ident, sizeof(ident), vl);
     ERROR("aggregation plugin: Unable to read the current rate of \"%s\".",
           ident);
-    return (ENOENT);
+    return ENOENT;
   }
 
   if (isnan(rate[0])) {
     sfree(rate);
-    return (0);
+    return 0;
   }
 
   pthread_mutex_lock(&inst->lock);
@@ -322,7 +322,7 @@ static int agg_instance_update(agg_instance_t *inst, /* {{{ */
   pthread_mutex_unlock(&inst->lock);
 
   sfree(rate);
-  return (0);
+  return 0;
 } /* }}} int agg_instance_update */
 
 static int agg_instance_read_func(agg_instance_t *inst, /* {{{ */
@@ -345,10 +345,10 @@ static int agg_instance_read_func(agg_instance_t *inst, /* {{{ */
      * COUNTER or a DERIVE, it will return EAGAIN. Catch this and handle
      * gracefully. */
     if (status == EAGAIN)
-      return (0);
+      return 0;
 
     WARNING("aggregation plugin: rate_to_value failed with status %i.", status);
-    return (-1);
+    return -1;
   }
 
   vl->values = &v;
@@ -359,7 +359,7 @@ static int agg_instance_read_func(agg_instance_t *inst, /* {{{ */
   vl->values = NULL;
   vl->values_len = 0;
 
-  return (0);
+  return 0;
 } /* }}} int agg_instance_read_func */
 
 static int agg_instance_read(agg_instance_t *inst, cdtime_t t) /* {{{ */
@@ -376,7 +376,7 @@ static int agg_instance_read(agg_instance_t *inst, cdtime_t t) /* {{{ */
   vl.meta = meta_data_create();
   if (vl.meta == NULL) {
     ERROR("aggregation plugin: meta_data_create failed.");
-    return (-1);
+    return -1;
   }
   meta_data_add_boolean(vl.meta, "aggregation:created", 1);
 
@@ -422,7 +422,7 @@ static int agg_instance_read(agg_instance_t *inst, cdtime_t t) /* {{{ */
   meta_data_destroy(vl.meta);
   vl.meta = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int agg_instance_read */
 
 /* lookup_class_callback_t for utils_vl_lookup */
@@ -430,7 +430,7 @@ static void *agg_lookup_class_callback(/* {{{ */
                                        data_set_t const *ds,
                                        value_list_t const *vl,
                                        void *user_class) {
-  return (agg_instance_create(ds, vl, (aggregation_t *)user_class));
+  return agg_instance_create(ds, vl, (aggregation_t *)user_class);
 } /* }}} void *agg_class_callback */
 
 /* lookup_obj_callback_t for utils_vl_lookup */
@@ -438,7 +438,7 @@ static int agg_lookup_obj_callback(data_set_t const *ds, /* {{{ */
                                    value_list_t const *vl,
                                    __attribute__((unused)) void *user_class,
                                    void *user_obj) {
-  return (agg_instance_update((agg_instance_t *)user_obj, ds, vl));
+  return agg_instance_update((agg_instance_t *)user_obj, ds, vl);
 } /* }}} int agg_lookup_obj_callback */
 
 /* lookup_free_class_callback_t for utils_vl_lookup */
@@ -501,7 +501,7 @@ static int agg_config_handle_group_by(oconfig_item_t const *ci, /* {{{ */
               value);
   } /* for (ci->values) */
 
-  return (0);
+  return 0;
 } /* }}} int agg_config_handle_group_by */
 
 static int agg_config_aggregation(oconfig_item_t *ci) /* {{{ */
@@ -513,7 +513,7 @@ static int agg_config_aggregation(oconfig_item_t *ci) /* {{{ */
   agg = calloc(1, sizeof(*agg));
   if (agg == NULL) {
     ERROR("aggregation plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(agg->ident.host, "/.*/", sizeof(agg->ident.host));
@@ -636,14 +636,14 @@ static int agg_config_aggregation(oconfig_item_t *ci) /* {{{ */
   if (!is_valid) /* {{{ */
   {
     sfree(agg);
-    return (-1);
+    return -1;
   } /* }}} */
 
   status = lookup_add(lookup, &agg->ident, agg->group_by, agg);
   if (status != 0) {
     ERROR("aggregation plugin: lookup_add failed with status %i.", status);
     sfree(agg);
-    return (-1);
+    return -1;
   }
 
   DEBUG("aggregation plugin: Successfully added aggregation: "
@@ -651,7 +651,7 @@ static int agg_config_aggregation(oconfig_item_t *ci) /* {{{ */
         "Type \"%s\", TypeInstance \"%s\")",
         agg->ident.host, agg->ident.plugin, agg->ident.plugin_instance,
         agg->ident.type, agg->ident.type_instance);
-  return (0);
+  return 0;
 } /* }}} int agg_config_aggregation */
 
 static int agg_config(oconfig_item_t *ci) /* {{{ */
@@ -665,7 +665,7 @@ static int agg_config(oconfig_item_t *ci) /* {{{ */
     if (lookup == NULL) {
       pthread_mutex_unlock(&agg_instance_list_lock);
       ERROR("aggregation plugin: lookup_create failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -682,7 +682,7 @@ static int agg_config(oconfig_item_t *ci) /* {{{ */
 
   pthread_mutex_unlock(&agg_instance_list_lock);
 
-  return (0);
+  return 0;
 } /* }}} int agg_config */
 
 static int agg_read(void) /* {{{ */
@@ -703,7 +703,7 @@ static int agg_read(void) /* {{{ */
    * Therefore we need to handle this case separately. */
   if (agg_instance_list_head == NULL) {
     pthread_mutex_unlock(&agg_instance_list_lock);
-    return (0);
+    return 0;
   }
 
   for (agg_instance_t *this = agg_instance_list_head; this != NULL;
@@ -721,7 +721,7 @@ static int agg_read(void) /* {{{ */
 
   pthread_mutex_unlock(&agg_instance_list_lock);
 
-  return ((success > 0) ? 0 : -1);
+  return (success > 0) ? 0 : -1;
 } /* }}} int agg_read */
 
 static int agg_write(data_set_t const *ds, value_list_t const *vl, /* {{{ */
@@ -734,7 +734,7 @@ static int agg_write(data_set_t const *ds, value_list_t const *vl, /* {{{ */
   (void)meta_data_get_boolean(vl->meta, "aggregation:created",
                               &created_by_aggregation);
   if (created_by_aggregation)
-    return (0);
+    return 0;
 
   if (lookup == NULL)
     status = ENOENT;
@@ -744,7 +744,7 @@ static int agg_write(data_set_t const *ds, value_list_t const *vl, /* {{{ */
       status = 0;
   }
 
-  return (status);
+  return status;
 } /* }}} int agg_write */
 
 void module_register(void) {
@@ -752,5 +752,3 @@ void module_register(void) {
   plugin_register_read("aggregation", agg_read);
   plugin_register_write("aggregation", agg_write, /* user_data = */ NULL);
 }
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index c54a1e0..1adc627 100644 (file)
@@ -164,16 +164,16 @@ static char *camqp_bytes_cstring(amqp_bytes_t *in) /* {{{ */
   char *ret;
 
   if ((in == NULL) || (in->bytes == NULL))
-    return (NULL);
+    return NULL;
 
   ret = malloc(in->len + 1);
   if (ret == NULL)
-    return (NULL);
+    return NULL;
 
   memcpy(ret, in->bytes, in->len);
   ret[in->len] = 0;
 
-  return (ret);
+  return ret;
 } /* }}} char *camqp_bytes_cstring */
 
 static _Bool camqp_is_error(camqp_config_t *conf) /* {{{ */
@@ -182,9 +182,9 @@ static _Bool camqp_is_error(camqp_config_t *conf) /* {{{ */
 
   r = amqp_get_rpc_reply(conf->connection);
   if (r.reply_type == AMQP_RESPONSE_NORMAL)
-    return (0);
+    return 0;
 
-  return (1);
+  return 1;
 } /* }}} _Bool camqp_is_error */
 
 static char *camqp_strerror(camqp_config_t *conf, /* {{{ */
@@ -204,10 +204,10 @@ static char *camqp_strerror(camqp_config_t *conf, /* {{{ */
   case AMQP_RESPONSE_LIBRARY_EXCEPTION:
 #if HAVE_AMQP_RPC_REPLY_T_LIBRARY_ERRNO
     if (r.library_errno)
-      return (sstrerror(r.library_errno, buffer, buffer_size));
+      return sstrerror(r.library_errno, buffer, buffer_size);
 #else
     if (r.library_error)
-      return (sstrerror(r.library_error, buffer, buffer_size));
+      return sstrerror(r.library_error, buffer, buffer_size);
 #endif
     else
       sstrncpy(buffer, "End of stream", buffer_size);
@@ -236,7 +236,7 @@ static char *camqp_strerror(camqp_config_t *conf, /* {{{ */
     ssnprintf(buffer, buffer_size, "Unknown reply type %i", (int)r.reply_type);
   }
 
-  return (buffer);
+  return buffer;
 } /* }}} char *camqp_strerror */
 
 #if HAVE_AMQP_RPC_REPLY_T_LIBRARY_ERRNO
@@ -245,7 +245,7 @@ static int camqp_create_exchange(camqp_config_t *conf) /* {{{ */
   amqp_exchange_declare_ok_t *ed_ret;
 
   if (conf->exchange_type == NULL)
-    return (0);
+    return 0;
 
   ed_ret = amqp_exchange_declare(
       conf->connection,
@@ -261,14 +261,14 @@ static int camqp_create_exchange(camqp_config_t *conf) /* {{{ */
     ERROR("amqp plugin: amqp_exchange_declare failed: %s",
           camqp_strerror(conf, errbuf, sizeof(errbuf)));
     camqp_close_connection(conf);
-    return (-1);
+    return -1;
   }
 
   INFO("amqp plugin: Successfully created exchange \"%s\" "
        "with type \"%s\".",
        conf->exchange, conf->exchange_type);
 
-  return (0);
+  return 0;
 } /* }}} int camqp_create_exchange */
 #else
 static int camqp_create_exchange(camqp_config_t *conf) /* {{{ */
@@ -278,7 +278,7 @@ static int camqp_create_exchange(camqp_config_t *conf) /* {{{ */
   struct amqp_table_entry_t_ argument_table_entries[1];
 
   if (conf->exchange_type == NULL)
-    return (0);
+    return 0;
 
   /* Valid arguments: "auto_delete", "internal" */
   argument_table.num_entries = STATIC_ARRAY_SIZE(argument_table_entries);
@@ -304,14 +304,14 @@ static int camqp_create_exchange(camqp_config_t *conf) /* {{{ */
     ERROR("amqp plugin: amqp_exchange_declare failed: %s",
           camqp_strerror(conf, errbuf, sizeof(errbuf)));
     camqp_close_connection(conf);
-    return (-1);
+    return -1;
   }
 
   INFO("amqp plugin: Successfully created exchange \"%s\" "
        "with type \"%s\".",
        conf->exchange, conf->exchange_type);
 
-  return (0);
+  return 0;
 } /* }}} int camqp_create_exchange */
 #endif
 
@@ -333,7 +333,7 @@ static int camqp_setup_queue(camqp_config_t *conf) /* {{{ */
   if (qd_ret == NULL) {
     ERROR("amqp plugin: amqp_queue_declare failed.");
     camqp_close_connection(conf);
-    return (-1);
+    return -1;
   }
 
   if (conf->queue == NULL) {
@@ -341,7 +341,7 @@ static int camqp_setup_queue(camqp_config_t *conf) /* {{{ */
     if (conf->queue == NULL) {
       ERROR("amqp plugin: camqp_bytes_cstring failed.");
       camqp_close_connection(conf);
-      return (-1);
+      return -1;
     }
 
     INFO("amqp plugin: Created queue \"%s\".", conf->queue);
@@ -367,7 +367,7 @@ static int camqp_setup_queue(camqp_config_t *conf) /* {{{ */
       ERROR("amqp plugin: amqp_queue_bind failed: %s",
             camqp_strerror(conf, errbuf, sizeof(errbuf)));
       camqp_close_connection(conf);
-      return (-1);
+      return -1;
     }
 
     DEBUG("amqp plugin: Successfully bound queue \"%s\" to exchange \"%s\".",
@@ -388,10 +388,10 @@ static int camqp_setup_queue(camqp_config_t *conf) /* {{{ */
     ERROR("amqp plugin: amqp_basic_consume failed: %s",
           camqp_strerror(conf, errbuf, sizeof(errbuf)));
     camqp_close_connection(conf);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int camqp_setup_queue */
 
 static int camqp_connect(camqp_config_t *conf) /* {{{ */
@@ -407,14 +407,14 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
 #endif
 
   if (conf->connection != NULL)
-    return (0);
+    return 0;
 
   time_t now = time(NULL);
   if (now < (last_connect_time + conf->connection_retry_delay)) {
     DEBUG("amqp plugin: skipping connection retry, "
           "ConnectionRetryDelay: %d",
           conf->connection_retry_delay);
-    return (1);
+    return 1;
   } else {
     DEBUG("amqp plugin: retrying connection");
     last_connect_time = now;
@@ -423,7 +423,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
   conf->connection = amqp_new_connection();
   if (conf->connection == NULL) {
     ERROR("amqp plugin: amqp_new_connection failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
 #ifdef HAVE_AMQP_TCP_SOCKET
@@ -436,7 +436,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
     ERROR("amqp plugin: amqp_tcp_socket_new failed.");
     amqp_destroy_connection(conf->connection);
     conf->connection = NULL;
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   status = amqp_socket_open(socket, CONF(conf, host), conf->port);
@@ -447,7 +447,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
           sstrerror(status, errbuf, sizeof(errbuf)));
     amqp_destroy_connection(conf->connection);
     conf->connection = NULL;
-    return (status);
+    return status;
   }
 #else /* HAVE_AMQP_TCP_SOCKET */
 #define CLOSE_SOCKET() close(sockfd)
@@ -460,7 +460,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
           sstrerror(status, errbuf, sizeof(errbuf)));
     amqp_destroy_connection(conf->connection);
     conf->connection = NULL;
-    return (status);
+    return status;
   }
   amqp_set_sockfd(conf->connection, sockfd);
 #endif
@@ -477,7 +477,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
     amqp_destroy_connection(conf->connection);
     CLOSE_SOCKET();
     conf->connection = NULL;
-    return (1);
+    return 1;
   }
 
   amqp_channel_open(conf->connection, /* channel = */ 1);
@@ -489,7 +489,7 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
     amqp_destroy_connection(conf->connection);
     CLOSE_SOCKET();
     conf->connection = NULL;
-    return (1);
+    return 1;
   }
 
   INFO("amqp plugin: Successfully opened connection to vhost \"%s\" "
@@ -498,11 +498,11 @@ static int camqp_connect(camqp_config_t *conf) /* {{{ */
 
   status = camqp_create_exchange(conf);
   if (status != 0)
-    return (status);
+    return status;
 
   if (!conf->publish)
-    return (camqp_setup_queue(conf));
-  return (0);
+    return camqp_setup_queue(conf);
+  return 0;
 } /* }}} int camqp_connect */
 
 static int camqp_shutdown(void) /* {{{ */
@@ -524,7 +524,7 @@ static int camqp_shutdown(void) /* {{{ */
 
   DEBUG("amqp plugin: All subscriber threads exited.");
 
-  return (0);
+  return 0;
 } /* }}} int camqp_shutdown */
 
 /*
@@ -550,17 +550,17 @@ static int camqp_read_body(camqp_config_t *conf, /* {{{ */
       ERROR("amqp plugin: amqp_simple_wait_frame failed: %s",
             sstrerror(status, errbuf, sizeof(errbuf)));
       camqp_close_connection(conf);
-      return (status);
+      return status;
     }
 
     if (frame.frame_type != AMQP_FRAME_BODY) {
       NOTICE("amqp plugin: Unexpected frame type: %#" PRIx8, frame.frame_type);
-      return (-1);
+      return -1;
     }
 
     if ((body_size - received) < frame.payload.body_fragment.len) {
       WARNING("amqp plugin: Body is larger than indicated by header.");
-      return (-1);
+      return -1;
     }
 
     memcpy(body_ptr, frame.payload.body_fragment.bytes,
@@ -573,19 +573,19 @@ static int camqp_read_body(camqp_config_t *conf, /* {{{ */
     status = cmd_handle_putval(stderr, body);
     if (status != 0)
       ERROR("amqp plugin: cmd_handle_putval failed with status %i.", status);
-    return (status);
+    return status;
   } else if (strcasecmp("application/json", content_type) == 0) {
     ERROR("amqp plugin: camqp_read_body: Parsing JSON data has not "
           "been implemented yet. FIXME!");
-    return (0);
+    return 0;
   } else {
     ERROR("amqp plugin: camqp_read_body: Unknown content type \"%s\".",
           content_type);
-    return (EINVAL);
+    return EINVAL;
   }
 
   /* not reached */
-  return (0);
+  return 0;
 } /* }}} int camqp_read_body */
 
 static int camqp_read_header(camqp_config_t *conf) /* {{{ */
@@ -602,26 +602,26 @@ static int camqp_read_header(camqp_config_t *conf) /* {{{ */
     ERROR("amqp plugin: amqp_simple_wait_frame failed: %s",
           sstrerror(status, errbuf, sizeof(errbuf)));
     camqp_close_connection(conf);
-    return (status);
+    return status;
   }
 
   if (frame.frame_type != AMQP_FRAME_HEADER) {
     NOTICE("amqp plugin: Unexpected frame type: %#" PRIx8, frame.frame_type);
-    return (-1);
+    return -1;
   }
 
   properties = frame.payload.properties.decoded;
   content_type = camqp_bytes_cstring(&properties->content_type);
   if (content_type == NULL) {
     ERROR("amqp plugin: Unable to determine content type.");
-    return (-1);
+    return -1;
   }
 
   status = camqp_read_body(conf, (size_t)frame.payload.properties.body_size,
                            content_type);
 
   sfree(content_type);
-  return (status);
+  return status;
 } /* }}} int camqp_read_header */
 
 static void *camqp_subscribe_thread(void *user_data) /* {{{ */
@@ -671,7 +671,7 @@ static void *camqp_subscribe_thread(void *user_data) /* {{{ */
 
   camqp_config_free(conf);
   pthread_exit(NULL);
-  return (NULL);
+  return NULL;
 } /* }}} void *camqp_subscribe_thread */
 
 static int camqp_subscribe_init(camqp_config_t *conf) /* {{{ */
@@ -684,7 +684,7 @@ static int camqp_subscribe_init(camqp_config_t *conf) /* {{{ */
   if (tmp == NULL) {
     ERROR("amqp plugin: realloc failed.");
     sfree(subscriber_threads);
-    return (ENOMEM);
+    return ENOMEM;
   }
   subscriber_threads = tmp;
   tmp = subscriber_threads + subscriber_threads_num;
@@ -696,12 +696,12 @@ static int camqp_subscribe_init(camqp_config_t *conf) /* {{{ */
     char errbuf[1024];
     ERROR("amqp plugin: pthread_create failed: %s",
           sstrerror(status, errbuf, sizeof(errbuf)));
-    return (status);
+    return status;
   }
 
   subscriber_threads_num++;
 
-  return (0);
+  return 0;
 } /* }}} int camqp_subscribe_init */
 
 /*
@@ -714,7 +714,7 @@ static int camqp_write_locked(camqp_config_t *conf, /* {{{ */
 
   status = camqp_connect(conf);
   if (status != 0)
-    return (status);
+    return status;
 
   amqp_basic_properties_t props = {._flags = AMQP_BASIC_CONTENT_TYPE_FLAG |
                                              AMQP_BASIC_DELIVERY_MODE_FLAG |
@@ -742,7 +742,7 @@ static int camqp_write_locked(camqp_config_t *conf, /* {{{ */
     camqp_close_connection(conf);
   }
 
-  return (status);
+  return status;
 } /* }}} int camqp_write_locked */
 
 static int camqp_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
@@ -753,7 +753,7 @@ static int camqp_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   int status;
 
   if ((ds == NULL) || (vl == NULL) || (conf == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (conf->routing_key != NULL) {
     sstrncpy(routing_key, conf->routing_key, sizeof(routing_key));
@@ -776,7 +776,7 @@ static int camqp_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
     status = cmd_create_putval(buffer, sizeof(buffer), ds, vl);
     if (status != 0) {
       ERROR("amqp plugin: cmd_create_putval failed with status %i.", status);
-      return (status);
+      return status;
     }
   } else if (conf->format == CAMQP_FORMAT_JSON) {
     size_t bfree = sizeof(buffer);
@@ -791,18 +791,18 @@ static int camqp_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
                         conf->postfix, conf->escape_char, conf->graphite_flags);
     if (status != 0) {
       ERROR("amqp plugin: format_graphite failed with status %i.", status);
-      return (status);
+      return status;
     }
   } else {
     ERROR("amqp plugin: Invalid format (%i).", conf->format);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_lock(&conf->lock);
   status = camqp_write_locked(conf, buffer, routing_key);
   pthread_mutex_unlock(&conf->lock);
 
-  return (status);
+  return status;
 } /* }}} int camqp_write */
 
 /*
@@ -816,7 +816,7 @@ static int camqp_config_set_format(oconfig_item_t *ci, /* {{{ */
   string = NULL;
   status = cf_util_get_string(ci, &string);
   if (status != 0)
-    return (status);
+    return status;
 
   assert(string != NULL);
   if (strcasecmp("Command", string) == 0)
@@ -831,7 +831,7 @@ static int camqp_config_set_format(oconfig_item_t *ci, /* {{{ */
 
   free(string);
 
-  return (0);
+  return 0;
 } /* }}} int config_set_string */
 
 static int camqp_config_connection(oconfig_item_t *ci, /* {{{ */
@@ -842,7 +842,7 @@ static int camqp_config_connection(oconfig_item_t *ci, /* {{{ */
   conf = calloc(1, sizeof(*conf));
   if (conf == NULL) {
     ERROR("amqp plugin: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   /* Initialize "conf" {{{ */
@@ -879,7 +879,7 @@ static int camqp_config_connection(oconfig_item_t *ci, /* {{{ */
   status = cf_util_get_string(ci, &conf->name);
   if (status != 0) {
     sfree(conf);
-    return (status);
+    return status;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -970,7 +970,7 @@ static int camqp_config_connection(oconfig_item_t *ci, /* {{{ */
 
   if (status != 0) {
     camqp_config_free(conf);
-    return (status);
+    return status;
   }
 
   if (conf->exchange != NULL) {
@@ -988,17 +988,17 @@ static int camqp_config_connection(oconfig_item_t *ci, /* {{{ */
                              });
     if (status != 0) {
       camqp_config_free(conf);
-      return (status);
+      return status;
     }
   } else {
     status = camqp_subscribe_init(conf);
     if (status != 0) {
       camqp_config_free(conf);
-      return (status);
+      return status;
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int camqp_config_connection */
 
 static int camqp_config(oconfig_item_t *ci) /* {{{ */
@@ -1015,12 +1015,10 @@ static int camqp_config(oconfig_item_t *ci) /* {{{ */
               child->key);
   } /* for (ci->children_num) */
 
-  return (0);
+  return 0;
 } /* }}} int camqp_config */
 
 void module_register(void) {
   plugin_register_complex_config("amqp", camqp_config);
   plugin_register_shutdown("amqp", camqp_shutdown);
 } /* void module_register */
-
-/* vim: set sw=4 sts=4 et fdm=marker : */
index eaef61b..e2f75c1 100644 (file)
@@ -89,11 +89,11 @@ static size_t apache_curl_callback(void *buf, size_t size, size_t nmemb,
   if (st == NULL) {
     ERROR("apache plugin: apache_curl_callback: "
           "user_data pointer is NULL.");
-    return (0);
+    return 0;
   }
 
   if (len == 0)
-    return (len);
+    return len;
 
   if ((st->apache_buffer_fill + len) >= st->apache_buffer_size) {
     char *temp;
@@ -101,7 +101,7 @@ static size_t apache_curl_callback(void *buf, size_t size, size_t nmemb,
     temp = realloc(st->apache_buffer, st->apache_buffer_fill + len + 1);
     if (temp == NULL) {
       ERROR("apache plugin: realloc failed.");
-      return (0);
+      return 0;
     }
     st->apache_buffer = temp;
     st->apache_buffer_size = st->apache_buffer_fill + len + 1;
@@ -111,7 +111,7 @@ static size_t apache_curl_callback(void *buf, size_t size, size_t nmemb,
   st->apache_buffer_fill += len;
   st->apache_buffer[st->apache_buffer_fill] = 0;
 
-  return (len);
+  return len;
 } /* int apache_curl_callback */
 
 static size_t apache_header_callback(void *buf, size_t size, size_t nmemb,
@@ -123,15 +123,15 @@ static size_t apache_header_callback(void *buf, size_t size, size_t nmemb,
   if (st == NULL) {
     ERROR("apache plugin: apache_header_callback: "
           "user_data pointer is NULL.");
-    return (0);
+    return 0;
   }
 
   if (len == 0)
-    return (len);
+    return len;
 
   /* look for the Server header */
   if (strncasecmp(buf, "Server: ", strlen("Server: ")) != 0)
-    return (len);
+    return len;
 
   if (strstr(buf, "Apache") != NULL)
     st->server_type = APACHE;
@@ -146,7 +146,7 @@ static size_t apache_header_callback(void *buf, size_t size, size_t nmemb,
     NOTICE("apache plugin: Unknown server software: %s", hdr);
   }
 
-  return (len);
+  return len;
 } /* apache_header_callback */
 
 /* Configuration handling functiions
@@ -164,7 +164,7 @@ static int config_add(oconfig_item_t *ci) {
   st = calloc(1, sizeof(*st));
   if (st == NULL) {
     ERROR("apache plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   st->timeout = -1;
@@ -172,7 +172,7 @@ static int config_add(oconfig_item_t *ci) {
   status = cf_util_get_string(ci, &st->name);
   if (status != 0) {
     sfree(st);
-    return (status);
+    return status;
   }
   assert(st->name != NULL);
 
@@ -234,10 +234,10 @@ static int config_add(oconfig_item_t *ci) {
 
   if (status != 0) {
     apache_free(st);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int config_add */
 
 static int config(oconfig_item_t *ci) {
@@ -256,7 +256,7 @@ static int config(oconfig_item_t *ci) {
               child->key);
   } /* for (ci->children) */
 
-  return (status);
+  return status;
 } /* int config */
 
 /* initialize curl for each host */
@@ -272,7 +272,7 @@ static int init_host(apache_t *st) /* {{{ */
 
   if ((st->curl = curl_easy_init()) == NULL) {
     ERROR("apache plugin: init_host: `curl_easy_init' failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(st->curl, CURLOPT_NOSIGNAL, 1L);
@@ -321,7 +321,7 @@ static int init_host(apache_t *st) /* {{{ */
             "truncated.");
       curl_easy_cleanup(st->curl);
       st->curl = NULL;
-      return (-1);
+      return -1;
     }
 
     curl_easy_setopt(st->curl, CURLOPT_USERPWD, credentials);
@@ -347,7 +347,7 @@ static int init_host(apache_t *st) /* {{{ */
                      (long)CDTIME_T_TO_MS(plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int init_host */
 
 static void submit_value(const char *type, const char *type_instance,
@@ -505,14 +505,14 @@ static int apache_read_host(user_data_t *user_data) /* {{{ */
   if (st->curl == NULL) {
     status = init_host(st);
     if (status != 0)
-      return (-1);
+      return -1;
   }
   assert(st->curl != NULL);
 
   st->apache_buffer_fill = 0;
   if (curl_easy_perform(st->curl) != CURLE_OK) {
     ERROR("apache: curl_easy_perform failed: %s", st->apache_curl_error);
-    return (-1);
+    return -1;
   }
 
   /* fallback - server_type to apache if not set at this time */
@@ -558,7 +558,7 @@ static int apache_read_host(user_data_t *user_data) /* {{{ */
 
   st->apache_buffer_fill = 0;
 
-  return (0);
+  return 0;
 } /* }}} int apache_read_host */
 
 static int apache_init(void) /* {{{ */
@@ -566,12 +566,10 @@ 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);
+  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 : */
index 3b8b03c..7c6a47c 100644 (file)
@@ -85,22 +85,22 @@ static int net_shutdown(int *fd) {
   uint16_t packet_size = 0;
 
   if ((fd == NULL) || (*fd < 0))
-    return (EINVAL);
+    return EINVAL;
 
   (void)swrite(*fd, (void *)&packet_size, sizeof(packet_size));
   close(*fd);
   *fd = -1;
 
-  return (0);
+  return 0;
 } /* int net_shutdown */
 
 /* Close the network connection */
 static int apcups_shutdown(void) {
   if (global_sockfd < 0)
-    return (0);
+    return 0;
 
   net_shutdown(&global_sockfd);
-  return (0);
+  return 0;
 } /* int apcups_shutdown */
 
 /*
@@ -123,7 +123,7 @@ static int net_open(char const *node, char const *service) {
     INFO("apcups plugin: getaddrinfo failed: %s",
          (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                 : gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   /* Create socket */
@@ -138,7 +138,7 @@ static int net_open(char const *node, char const *service) {
   if (sd < 0) {
     DEBUG("apcups plugin: Unable to open a socket");
     freeaddrinfo(ai_return);
-    return (-1);
+    return -1;
   }
 
   status = connect(sd, ai_list->ai_addr, ai_list->ai_addrlen);
@@ -151,12 +151,12 @@ static int net_open(char const *node, char const *service) {
     INFO("apcups plugin: connect failed: %s",
          sstrerror(errno, errbuf, sizeof(errbuf)));
     close(sd);
-    return (-1);
+    return -1;
   }
 
   DEBUG("apcups plugin: Done opening a socket %i", sd);
 
-  return (sd);
+  return sd;
 } /* int net_open */
 
 /*
@@ -175,7 +175,7 @@ static int net_recv(int *sockfd, char *buf, int buflen) {
   if (sread(*sockfd, (void *)&packet_size, sizeof(packet_size)) != 0) {
     close(*sockfd);
     *sockfd = -1;
-    return (-1);
+    return -1;
   }
 
   packet_size = ntohs(packet_size);
@@ -185,20 +185,20 @@ static int net_recv(int *sockfd, char *buf, int buflen) {
           packet_size, buflen);
     close(*sockfd);
     *sockfd = -1;
-    return (-2);
+    return -2;
   }
 
   if (packet_size == 0)
-    return (0);
+    return 0;
 
   /* now read the actual data */
   if (sread(*sockfd, (void *)buf, packet_size) != 0) {
     close(*sockfd);
     *sockfd = -1;
-    return (-1);
+    return -1;
   }
 
-  return ((int)packet_size);
+  return (int)packet_size;
 } /* static int net_recv (int *sockfd, char *buf, int buflen) */
 
 /*
@@ -220,17 +220,17 @@ static int net_send(int *sockfd, const char *buff, int len) {
   if (swrite(*sockfd, (void *)&packet_size, sizeof(packet_size)) != 0) {
     close(*sockfd);
     *sockfd = -1;
-    return (-1);
+    return -1;
   }
 
   /* send data packet */
   if (swrite(*sockfd, (void *)buff, len) != 0) {
     close(*sockfd);
     *sockfd = -1;
-    return (-2);
+    return -2;
   }
 
-  return (0);
+  return 0;
 }
 
 /* Get and print status from apcupsd NIS server */
@@ -240,7 +240,7 @@ static int apc_query_server(char const *node, char const *service,
   char recvline[1024];
   char *tokptr;
   char *toksaveptr;
-  _Bool retry = 1;
+  int try = 0;
   int status;
 
 #if APCMAIN
@@ -250,32 +250,32 @@ static int apc_query_server(char const *node, char const *service,
 #define PRINT_VALUE(name, val) /**/
 #endif
 
-  while (retry) {
+  while (1) {
     if (global_sockfd < 0) {
       global_sockfd = net_open(node, service);
       if (global_sockfd < 0) {
         ERROR("apcups plugin: Connecting to the "
               "apcupsd failed.");
-        return (-1);
+        return -1;
       }
     }
 
     status = net_send(&global_sockfd, "status", strlen("status"));
     if (status != 0) {
-      /* net_send is closing the socket on error. */
+      /* net_send closes the socket on error. */
       assert(global_sockfd < 0);
-      if (retry) {
-        retry = 0;
+      if (try == 0) {
+        try++;
         count_retries++;
         continue;
       }
 
       ERROR("apcups plugin: Writing to the socket failed.");
-      return (-1);
+      return -1;
     }
 
     break;
-  } /* while (retry) */
+  } /* while (1) */
 
   /* When collectd's collection interval is larger than apcupsd's
    * timeout, we would have to retry / re-connect each iteration. Try to
@@ -344,10 +344,10 @@ static int apc_query_server(char const *node, char const *service,
     char errbuf[1024];
     ERROR("apcups plugin: Reading from socket failed: %s",
           sstrerror(status, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static int apcups_config(oconfig_item_t *ci) {
@@ -380,7 +380,7 @@ static int apcups_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 } /* int apcups_config */
 
 static void apc_submit_generic(const char *type, const char *type_inst,
@@ -428,12 +428,12 @@ static int apcups_read(void) {
     DEBUG("apcups plugin: apc_query_server (\"%s\", \"%s\") = %d",
           conf_node == NULL ? APCUPS_DEFAULT_NODE : conf_node, conf_service,
           status);
-    return (status);
+    return status;
   }
 
   apc_submit(&apcups_detail);
 
-  return (0);
+  return 0;
 } /* apcups_read */
 
 void module_register(void) {
index 2f8cccd..f78c3da 100644 (file)
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
 #if HAVE_MACH_MACH_TYPES_H
 #include <mach/mach_types.h>
 #endif
@@ -69,10 +65,10 @@ static int as_init(void) {
   if (status != kIOReturnSuccess) {
     ERROR("IOMasterPort failed: %s", mach_error_string(status));
     io_master_port = MACH_PORT_NULL;
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void as_submit(const char *type, const char *type_instance, double val) {
@@ -99,13 +95,13 @@ static int as_read(void) {
   int value_int;
   double value_double;
   if (!io_master_port || (io_master_port == MACH_PORT_NULL))
-    return (-1);
+    return -1;
 
   status = IOServiceGetMatchingServices(
       io_master_port, IOServiceNameMatching("IOHWSensor"), &iterator);
   if (status != kIOReturnSuccess) {
     ERROR("IOServiceGetMatchingServices failed: %s", mach_error_string(status));
-    return (-1);
+    return -1;
   }
 
   while ((io_obj = IOIteratorNext(iterator))) {
@@ -188,7 +184,7 @@ static int as_read(void) {
 
   IOObjectRelease(iterator);
 
-  return (0);
+  return 0;
 } /* int as_read */
 
 void module_register(void) {
index 4a78f68..7783561 100644 (file)
@@ -43,12 +43,12 @@ static int aquaero_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 static int aquaero_shutdown(void) {
   libaquaero5_exit();
-  return (0);
+  return 0;
 } /* int aquaero_shutdown */
 
 static void aquaero_submit(const char *type, const char *type_instance,
@@ -98,7 +98,7 @@ static int aquaero_read(void) {
     ERROR("aquaero plugin: Failed to poll device \"%s\": %s (%s)",
           conf_device ? conf_device : "default", err_msg,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (libaquaero5_getsettings(conf_device, &aq_sett, &err_msg) < 0) {
@@ -107,7 +107,7 @@ static int aquaero_read(void) {
           "for device \"%s\": %s (%s)",
           conf_device ? conf_device : "default", err_msg,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* CPU Temperature sensor */
@@ -153,7 +153,7 @@ static int aquaero_read(void) {
   /* Liquid level */
   aquaero_submit_array("percent", "waterlevel", aq_data.level, AQ5_NUM_LEVEL);
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -161,5 +161,3 @@ void module_register(void) {
   plugin_register_read("aquaero", aquaero_read);
   plugin_register_shutdown("aquaero", aquaero_shutdown);
 } /* void module_register */
-
-/* vim: set sw=8 sts=8 noet : */
index 840fe8b..16f9104 100644 (file)
@@ -125,7 +125,7 @@ static int ascent_submit_gauge(const char *plugin_instance, /* {{{ */
     sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
 
   plugin_dispatch_values(&vl);
-  return (0);
+  return 0;
 } /* }}} int ascent_submit_gauge */
 
 static size_t ascent_curl_callback(void *buf, size_t size,
@@ -134,7 +134,7 @@ static size_t ascent_curl_callback(void *buf, size_t size,
   size_t len = size * nmemb;
 
   if (len == 0)
-    return (len);
+    return len;
 
   if ((ascent_buffer_fill + len) >= ascent_buffer_size) {
     char *temp;
@@ -142,7 +142,7 @@ static size_t ascent_curl_callback(void *buf, size_t size,
     temp = realloc(ascent_buffer, ascent_buffer_fill + len + 1);
     if (temp == NULL) {
       ERROR("ascent plugin: realloc failed.");
-      return (0);
+      return 0;
     }
     ascent_buffer = temp;
     ascent_buffer_size = ascent_buffer_fill + len + 1;
@@ -152,7 +152,7 @@ static size_t ascent_curl_callback(void *buf, size_t size,
   ascent_buffer_fill += len;
   ascent_buffer[ascent_buffer_fill] = 0;
 
-  return (len);
+  return len;
 } /* }}} size_t ascent_curl_callback */
 
 static int ascent_submit_players(player_stats_t *ps) /* {{{ */
@@ -187,7 +187,7 @@ static int ascent_submit_players(player_stats_t *ps) /* {{{ */
     value = ((double)ps->latency_sum) / (1000.0 * ((double)ps->latency_num));
   ascent_submit_gauge(NULL, "latency", "average", value);
 
-  return (0);
+  return 0;
 } /* }}} int ascent_submit_players */
 
 static int ascent_account_player(player_stats_t *ps, /* {{{ */
@@ -226,7 +226,7 @@ static int ascent_account_player(player_stats_t *ps, /* {{{ */
     ps->latency_num++;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ascent_account_player */
 
 static int ascent_xml_submit_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
@@ -240,7 +240,7 @@ static int ascent_xml_submit_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
   if (str_ptr == NULL) {
     ERROR(
         "ascent plugin: ascent_xml_submit_gauge: xmlNodeListGetString failed.");
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp("N/A", str_ptr) == 0)
@@ -251,12 +251,12 @@ static int ascent_xml_submit_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
     if (str_ptr == end_ptr) {
       xmlFree(str_ptr);
       ERROR("ascent plugin: ascent_xml_submit_gauge: strtod failed.");
-      return (-1);
+      return -1;
     }
   }
   xmlFree(str_ptr);
 
-  return (ascent_submit_gauge(plugin_instance, type, type_instance, value));
+  return ascent_submit_gauge(plugin_instance, type, type_instance, value);
 } /* }}} int ascent_xml_submit_gauge */
 
 static int ascent_xml_read_int(xmlDoc *doc, xmlNode *node, /* {{{ */
@@ -267,7 +267,7 @@ static int ascent_xml_read_int(xmlDoc *doc, xmlNode *node, /* {{{ */
   str_ptr = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
   if (str_ptr == NULL) {
     ERROR("ascent plugin: ascent_xml_read_int: xmlNodeListGetString failed.");
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp("N/A", str_ptr) == 0)
@@ -278,13 +278,13 @@ static int ascent_xml_read_int(xmlDoc *doc, xmlNode *node, /* {{{ */
     if (str_ptr == end_ptr) {
       xmlFree(str_ptr);
       ERROR("ascent plugin: ascent_xml_read_int: strtol failed.");
-      return (-1);
+      return -1;
     }
   }
   xmlFree(str_ptr);
 
   *ret_value = value;
-  return (0);
+  return 0;
 } /* }}} int ascent_xml_read_int */
 
 static int ascent_xml_sessions_plr(xmlDoc *doc, xmlNode *node, /* {{{ */
@@ -317,7 +317,7 @@ static int ascent_xml_sessions_plr(xmlDoc *doc, xmlNode *node, /* {{{ */
     }
   } /* for (child) */
 
-  return (0);
+  return 0;
 } /* }}} int ascent_xml_sessions_plr */
 
 static int ascent_xml_sessions(xmlDoc *doc, xmlNode *node) /* {{{ */
@@ -343,7 +343,7 @@ static int ascent_xml_sessions(xmlDoc *doc, xmlNode *node) /* {{{ */
 
   ascent_submit_players(&ps);
 
-  return (0);
+  return 0;
 } /* }}} int ascent_xml_sessions */
 
 static int ascent_xml_status(xmlDoc *doc, xmlNode *node) /* {{{ */
@@ -380,7 +380,7 @@ static int ascent_xml_status(xmlDoc *doc, xmlNode *node) /* {{{ */
     }
   } /* for (child) */
 
-  return (0);
+  return 0;
 } /* }}} int ascent_xml_status */
 
 static int ascent_xml(const char *data) /* {{{ */
@@ -398,20 +398,20 @@ static int ascent_xml(const char *data) /* {{{ */
 #endif
   if (doc == NULL) {
     ERROR("ascent plugin: xmlParseMemory failed.");
-    return (-1);
+    return -1;
   }
 
   cur = xmlDocGetRootElement(doc);
   if (cur == NULL) {
     ERROR("ascent plugin: XML document is empty.");
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   }
 
   if (xmlStrcmp((const xmlChar *)"serverpage", cur->name) != 0) {
     ERROR("ascent plugin: XML root element is not \"serverpage\".");
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   }
 
   for (xmlNode *child = cur->xmlChildrenNode; child != NULL;
@@ -433,7 +433,7 @@ static int ascent_xml(const char *data) /* {{{ */
   } /* for (child) */
 
   xmlFreeDoc(doc);
-  return (0);
+  return 0;
 } /* }}} int ascent_xml */
 
 static int config_set(char **var, const char *value) /* {{{ */
@@ -444,29 +444,29 @@ static int config_set(char **var, const char *value) /* {{{ */
   }
 
   if ((*var = strdup(value)) == NULL)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* }}} int config_set */
 
 static int ascent_config(const char *key, const char *value) /* {{{ */
 {
   if (strcasecmp(key, "URL") == 0)
-    return (config_set(&url, value));
+    return config_set(&url, value);
   else if (strcasecmp(key, "User") == 0)
-    return (config_set(&user, value));
+    return config_set(&user, value);
   else if (strcasecmp(key, "Password") == 0)
-    return (config_set(&pass, value));
+    return config_set(&pass, value);
   else if (strcasecmp(key, "VerifyPeer") == 0)
-    return (config_set(&verify_peer, value));
+    return config_set(&verify_peer, value);
   else if (strcasecmp(key, "VerifyHost") == 0)
-    return (config_set(&verify_host, value));
+    return config_set(&verify_host, value);
   else if (strcasecmp(key, "CACert") == 0)
-    return (config_set(&cacert, value));
+    return config_set(&cacert, value);
   else if (strcasecmp(key, "Timeout") == 0)
-    return (config_set(&timeout, value));
+    return config_set(&timeout, value);
   else
-    return (-1);
+    return -1;
 } /* }}} int ascent_config */
 
 static int ascent_init(void) /* {{{ */
@@ -474,7 +474,7 @@ static int ascent_init(void) /* {{{ */
   if (url == NULL) {
     WARNING("ascent plugin: ascent_init: No URL configured, "
             "returning an error.");
-    return (-1);
+    return -1;
   }
 
   if (curl != NULL) {
@@ -483,7 +483,7 @@ static int ascent_init(void) /* {{{ */
 
   if ((curl = curl_easy_init()) == NULL) {
     ERROR("ascent plugin: ascent_init: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
@@ -504,7 +504,7 @@ static int ascent_init(void) /* {{{ */
     if ((status < 0) || ((size_t)status >= sizeof(credentials))) {
       ERROR("ascent plugin: ascent_init: Returning an error because the "
             "credentials have been truncated.");
-      return (-1);
+      return -1;
     }
 
     curl_easy_setopt(curl, CURLOPT_USERPWD, credentials);
@@ -536,7 +536,7 @@ static int ascent_init(void) /* {{{ */
                      (long)CDTIME_T_TO_MS(plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int ascent_init */
 
 static int ascent_read(void) /* {{{ */
@@ -545,25 +545,25 @@ static int ascent_read(void) /* {{{ */
 
   if (curl == NULL) {
     ERROR("ascent plugin: I don't have a CURL object.");
-    return (-1);
+    return -1;
   }
 
   if (url == NULL) {
     ERROR("ascent plugin: No URL has been configured.");
-    return (-1);
+    return -1;
   }
 
   ascent_buffer_fill = 0;
   if (curl_easy_perform(curl) != CURLE_OK) {
     ERROR("ascent plugin: curl_easy_perform failed: %s", ascent_curl_error);
-    return (-1);
+    return -1;
   }
 
   status = ascent_xml(ascent_buffer);
   if (status != 0)
-    return (-1);
+    return -1;
   else
-    return (0);
+    return 0;
 } /* }}} int ascent_read */
 
 void module_register(void) {
@@ -571,5 +571,3 @@ void module_register(void) {
   plugin_register_init("ascent", ascent_init);
   plugin_register_read("ascent", ascent_read);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 et fdm=marker : */
index 78e96b2..5a0b089 100644 (file)
@@ -147,13 +147,13 @@ static double dict_get_double(CFDictionaryRef dict,
                                       kCFStringEncodingASCII);
   if (key_obj == NULL) {
     DEBUG("CFStringCreateWithCString (%s) failed.\n", key_string);
-    return (NAN);
+    return NAN;
   }
 
   if ((val_obj = CFDictionaryGetValue(dict, key_obj)) == NULL) {
     DEBUG("CFDictionaryGetValue (%s) failed.", key_string);
     CFRelease(key_obj);
-    return (NAN);
+    return NAN;
   }
   CFRelease(key_obj);
 
@@ -166,10 +166,10 @@ static double dict_get_double(CFDictionaryRef dict,
     }
   } else {
     DEBUG("CFGetTypeID (val_obj) = %i", (int)CFGetTypeID(val_obj));
-    return (NAN);
+    return NAN;
   }
 
-  return (val_double);
+  return val_double;
 } /* }}} double dict_get_double */
 
 #if HAVE_IOKIT_PS_IOPOWERSOURCES_H
@@ -334,7 +334,7 @@ static int battery_read(void) /* {{{ */
   if (!isnan(voltage))
     battery_submit("0", "voltage", voltage);
 
-  return (0);
+  return 0;
 } /* }}} int battery_read */
 /* #endif HAVE_IOKIT_IOKITLIB_H || HAVE_IOKIT_PS_IOPOWERSOURCES_H */
 
@@ -371,9 +371,9 @@ static int sysfs_file_to_gauge(char const *dir, /* {{{ */
   status =
       sysfs_file_to_buffer(dir, power_supply, basename, buffer, sizeof(buffer));
   if (status != 0)
-    return (status);
+    return status;
 
-  return (strtogauge(buffer, ret_value));
+  return strtogauge(buffer, ret_value);
 } /* }}} sysfs_file_to_gauge */
 
 static int read_sysfs_capacity(char const *dir, /* {{{ */
@@ -387,21 +387,21 @@ static int read_sysfs_capacity(char const *dir, /* {{{ */
   status =
       sysfs_file_to_gauge(dir, power_supply, "energy_now", &capacity_charged);
   if (status != 0)
-    return (status);
+    return status;
 
   status =
       sysfs_file_to_gauge(dir, power_supply, "energy_full", &capacity_full);
   if (status != 0)
-    return (status);
+    return status;
 
   status = sysfs_file_to_gauge(dir, power_supply, "energy_full_design",
                                &capacity_design);
   if (status != 0)
-    return (status);
+    return status;
 
   submit_capacity(plugin_instance, capacity_charged * SYSFS_FACTOR,
                   capacity_full * SYSFS_FACTOR, capacity_design * SYSFS_FACTOR);
-  return (0);
+  return 0;
 } /* }}} int read_sysfs_capacity */
 
 static int read_sysfs_callback(char const *dir, /* {{{ */
@@ -418,9 +418,9 @@ static int read_sysfs_callback(char const *dir, /* {{{ */
   status =
       sysfs_file_to_buffer(dir, power_supply, "type", buffer, sizeof(buffer));
   if (status != 0)
-    return (0);
+    return 0;
   if (strcasecmp("Battery", buffer) != 0)
-    return (0);
+    return 0;
 
   (void)sysfs_file_to_buffer(dir, power_supply, "status", buffer,
                              sizeof(buffer));
@@ -451,7 +451,7 @@ static int read_sysfs_callback(char const *dir, /* {{{ */
   if (sysfs_file_to_gauge(dir, power_supply, "voltage_now", &v) == 0)
     battery_submit(plugin_instance, "voltage", v * SYSFS_FACTOR);
 
-  return (0);
+  return 0;
 } /* }}} int read_sysfs_callback */
 
 static int read_sysfs(void) /* {{{ */
@@ -460,12 +460,12 @@ static int read_sysfs(void) /* {{{ */
   int battery_counter = 0;
 
   if (access(SYSFS_PATH, R_OK) != 0)
-    return (ENOENT);
+    return ENOENT;
 
   status = walk_directory(SYSFS_PATH, read_sysfs_callback,
                           /* user_data = */ &battery_counter,
                           /* include hidden */ 0);
-  return (status);
+  return status;
 } /* }}} int read_sysfs */
 
 static int read_acpi_full_capacity(char const *dir, /* {{{ */
@@ -482,7 +482,7 @@ static int read_acpi_full_capacity(char const *dir, /* {{{ */
   ssnprintf(filename, sizeof(filename), "%s/%s/info", dir, power_supply);
   fh = fopen(filename, "r");
   if (fh == NULL)
-    return (errno);
+    return errno;
 
   /* last full capacity:      40090 mWh */
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -511,7 +511,7 @@ static int read_acpi_full_capacity(char const *dir, /* {{{ */
   }
 
   fclose(fh);
-  return (0);
+  return 0;
 } /* }}} int read_acpi_full_capacity */
 
 static int read_acpi_callback(char const *dir, /* {{{ */
@@ -536,9 +536,9 @@ static int read_acpi_callback(char const *dir, /* {{{ */
   fh = fopen(filename, "r");
   if (fh == NULL) {
     if ((errno == EAGAIN) || (errno == EINTR) || (errno == ENOENT))
-      return (0);
+      return 0;
     else
-      return (errno);
+      return errno;
   }
 
   /*
@@ -617,12 +617,12 @@ static int read_acpi(void) /* {{{ */
   int battery_counter = 0;
 
   if (access(PROC_ACPI_PATH, R_OK) != 0)
-    return (ENOENT);
+    return ENOENT;
 
   status = walk_directory(PROC_ACPI_PATH, read_acpi_callback,
                           /* user_data = */ &battery_counter,
                           /* include hidden */ 0);
-  return (status);
+  return status;
 } /* }}} int read_acpi */
 
 static int read_pmu(void) /* {{{ */
@@ -654,7 +654,7 @@ static int read_pmu(void) /* {{{ */
       else if ((errno == EAGAIN) || (errno == EINTR))
         continue;
       else
-        return (errno);
+        return errno;
     }
 
     while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -682,8 +682,8 @@ static int read_pmu(void) /* {{{ */
   }
 
   if (i == 0)
-    return (ENOENT);
-  return (0);
+    return ENOENT;
+  return 0;
 } /* }}} int read_pmu */
 
 static int battery_read(void) /* {{{ */
@@ -696,20 +696,20 @@ static int battery_read(void) /* {{{ */
   DEBUG("battery plugin: Trying sysfs ...");
   status = read_sysfs();
   if (status == 0)
-    return (0);
+    return 0;
 
   DEBUG("battery plugin: Trying acpi ...");
   status = read_acpi();
   if (status == 0)
-    return (0);
+    return 0;
 
   DEBUG("battery plugin: Trying pmu ...");
   status = read_pmu();
   if (status == 0)
-    return (0);
+    return 0;
 
   ERROR("battery plugin: All available input methods failed.");
-  return (-1);
+  return -1;
 } /* }}} int battery_read */
 #endif /* KERNEL_LINUX */
 
@@ -729,7 +729,7 @@ static int battery_config(oconfig_item_t *ci) {
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int battery_config */
 
 void module_register(void) {
index 4b9baf4..149512b 100644 (file)
@@ -87,9 +87,9 @@ int battery_read_statefs(void) {
   }
 
   struct {
-    char *path;
-    char *type;
-    char *type_instance;
+    const char *path;
+    const char *type;
+    const char *type_instance;
     gauge_t factor;
   } metrics[] = {
       {STATEFS_ROOT "Current", "current", NULL, 1e-6},        // from uA to A
@@ -115,8 +115,8 @@ int battery_read_statefs(void) {
   if (success == 0) {
     ERROR("battery plugin: statefs backend: none of the statistics are "
           "available");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
index 2e7c49d..b7308ad 100644 (file)
@@ -271,7 +271,7 @@ static size_t bind_curl_callback(void *buf, size_t size, /* {{{ */
   size_t len = size * nmemb;
 
   if (len == 0)
-    return (len);
+    return len;
 
   if ((bind_buffer_fill + len) >= bind_buffer_size) {
     char *temp;
@@ -279,7 +279,7 @@ static size_t bind_curl_callback(void *buf, size_t size, /* {{{ */
     temp = realloc(bind_buffer, bind_buffer_fill + len + 1);
     if (temp == NULL) {
       ERROR("bind plugin: realloc failed.");
-      return (0);
+      return 0;
     }
     bind_buffer = temp;
     bind_buffer_size = bind_buffer_fill + len + 1;
@@ -289,7 +289,7 @@ static size_t bind_curl_callback(void *buf, size_t size, /* {{{ */
   bind_buffer_fill += len;
   bind_buffer[bind_buffer_fill] = 0;
 
-  return (len);
+  return len;
 } /* }}} size_t bind_curl_callback */
 
 /*
@@ -301,7 +301,7 @@ static int bind_xml_table_callback(const char *name, value_t value, /* {{{ */
   translation_table_ptr_t *table = (translation_table_ptr_t *)user_data;
 
   if (table == NULL)
-    return (-1);
+    return -1;
 
   for (size_t i = 0; i < table->table_length; i++) {
     if (strcmp(table->table[i].xml_name, name) != 0)
@@ -312,7 +312,7 @@ static int bind_xml_table_callback(const char *name, value_t value, /* {{{ */
     break;
   }
 
-  return (0);
+  return 0;
 } /* }}} int bind_xml_table_callback */
 
 /*
@@ -325,12 +325,12 @@ static int bind_xml_list_callback(const char *name, /* {{{ */
   list_info_ptr_t *list_info = (list_info_ptr_t *)user_data;
 
   if (list_info == NULL)
-    return (-1);
+    return -1;
 
   submit(current_time, list_info->plugin_instance, list_info->type,
          /* type instance = */ name, value);
 
-  return (0);
+  return 0;
 } /* }}} int bind_xml_list_callback */
 
 static int bind_xml_read_derive(xmlDoc *doc, xmlNode *node, /* {{{ */
@@ -342,7 +342,7 @@ static int bind_xml_read_derive(xmlDoc *doc, xmlNode *node, /* {{{ */
   str_ptr = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
   if (str_ptr == NULL) {
     ERROR("bind plugin: bind_xml_read_derive: xmlNodeListGetString failed.");
-    return (-1);
+    return -1;
   }
 
   status = parse_value(str_ptr, &value, DS_TYPE_DERIVE);
@@ -350,12 +350,12 @@ static int bind_xml_read_derive(xmlDoc *doc, xmlNode *node, /* {{{ */
     ERROR("bind plugin: Parsing string \"%s\" to derive value failed.",
           str_ptr);
     xmlFree(str_ptr);
-    return (-1);
+    return -1;
   }
 
   xmlFree(str_ptr);
   *ret_value = value.derive;
-  return (0);
+  return 0;
 } /* }}} int bind_xml_read_derive */
 
 static int bind_xml_read_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
@@ -366,7 +366,7 @@ static int bind_xml_read_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
   str_ptr = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
   if (str_ptr == NULL) {
     ERROR("bind plugin: bind_xml_read_gauge: xmlNodeListGetString failed.");
-    return (-1);
+    return -1;
   }
 
   errno = 0;
@@ -379,11 +379,11 @@ static int bind_xml_read_gauge(xmlDoc *doc, xmlNode *node, /* {{{ */
       ERROR("bind plugin: bind_xml_read_gauge: strtod failed with overflow.");
     else
       ERROR("bind plugin: bind_xml_read_gauge: strtod failed.");
-    return (-1);
+    return -1;
   }
 
   *ret_value = (gauge_t)value;
-  return (0);
+  return 0;
 } /* }}} int bind_xml_read_gauge */
 
 static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
@@ -399,12 +399,12 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
   if (xpathObj == NULL) {
     ERROR("bind plugin: Unable to evaluate XPath expression `%s'.",
           xpath_expression);
-    return (-1);
+    return -1;
   }
 
   if ((xpathObj->nodesetval == NULL) || (xpathObj->nodesetval->nodeNr < 1)) {
     xmlXPathFreeObject(xpathObj);
-    return (-1);
+    return -1;
   }
 
   if (xpathObj->nodesetval->nodeNr != 1) {
@@ -419,14 +419,14 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
     ERROR("bind plugin: bind_xml_read_timestamp: "
           "node->xmlChildrenNode == NULL");
     xmlXPathFreeObject(xpathObj);
-    return (-1);
+    return -1;
   }
 
   str_ptr = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
   if (str_ptr == NULL) {
     ERROR("bind plugin: bind_xml_read_timestamp: xmlNodeListGetString failed.");
     xmlXPathFreeObject(xpathObj);
-    return (-1);
+    return -1;
   }
 
   tmp = strptime(str_ptr, "%Y-%m-%dT%T", &tm);
@@ -434,7 +434,7 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
   if (tmp == NULL) {
     ERROR("bind plugin: bind_xml_read_timestamp: strptime failed.");
     xmlXPathFreeObject(xpathObj);
-    return (-1);
+    return -1;
   }
 
 #if HAVE_TIMEGM
@@ -443,7 +443,7 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
     char errbuf[1024];
     ERROR("bind plugin: timegm() failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   *ret_value = t;
 #else
@@ -452,7 +452,7 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
     char errbuf[1024];
     ERROR("bind plugin: mktime() failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   /* mktime assumes that tm is local time. Luckily, it also sets timezone to
    * the offset used for the conversion, and we undo the conversion to convert
@@ -461,7 +461,7 @@ static int bind_xml_read_timestamp(const char *xpath_expression, /* {{{ */
 #endif
 
   xmlXPathFreeObject(xpathObj);
-  return (0);
+  return 0;
 } /* }}} int bind_xml_read_timestamp */
 
 /*
@@ -485,7 +485,7 @@ static int bind_parse_generic_name_value(const char *xpath_expression, /* {{{ */
   if (xpathObj == NULL) {
     ERROR("bind plugin: Unable to evaluate XPath expression `%s'.",
           xpath_expression);
-    return (-1);
+    return -1;
   }
 
   num_entries = 0;
@@ -540,7 +540,7 @@ static int bind_parse_generic_name_value(const char *xpath_expression, /* {{{ */
 
   xmlXPathFreeObject(xpathObj);
 
-  return (0);
+  return 0;
 } /* }}} int bind_parse_generic_name_value */
 
 /*
@@ -566,7 +566,7 @@ static int bind_parse_generic_value_list(const char *xpath_expression, /* {{{ */
   if (xpathObj == NULL) {
     ERROR("bind plugin: Unable to evaluate XPath expression `%s'.",
           xpath_expression);
-    return (-1);
+    return -1;
   }
 
   num_entries = 0;
@@ -603,7 +603,7 @@ static int bind_parse_generic_value_list(const char *xpath_expression, /* {{{ */
 
   xmlXPathFreeObject(xpathObj);
 
-  return (0);
+  return 0;
 } /* }}} int bind_parse_generic_value_list */
 
 /*
@@ -628,7 +628,7 @@ static int bind_parse_generic_name_attr_value_list(
   if (xpathObj == NULL) {
     ERROR("bind plugin: Unable to evaluate XPath expression `%s'.",
           xpath_expression);
-    return (-1);
+    return -1;
   }
 
   num_entries = 0;
@@ -675,7 +675,7 @@ static int bind_parse_generic_name_attr_value_list(
 
   xmlXPathFreeObject(xpathObj);
 
-  return (0);
+  return 0;
 } /* }}} int bind_parse_generic_name_attr_value_list */
 
 static int bind_xml_stats_handle_zone(int version, xmlDoc *doc, /* {{{ */
@@ -698,7 +698,7 @@ static int bind_xml_stats_handle_zone(int version, xmlDoc *doc, /* {{{ */
     path_obj = xmlXPathEvalExpression(BAD_CAST "name", path_ctx);
     if (path_obj == NULL) {
       ERROR("bind plugin: xmlXPathEvalExpression failed.");
-      return (-1);
+      return -1;
     }
 
     for (int i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr);
@@ -713,7 +713,7 @@ static int bind_xml_stats_handle_zone(int version, xmlDoc *doc, /* {{{ */
 
   if (zone_name == NULL) {
     ERROR("bind plugin: Could not determine zone name.");
-    return (-1);
+    return -1;
   }
 
   for (j = 0; j < view->zones_num; j++) {
@@ -725,7 +725,7 @@ static int bind_xml_stats_handle_zone(int version, xmlDoc *doc, /* {{{ */
   zone_name = NULL;
 
   if (j >= view->zones_num)
-    return (0);
+    return 0;
 
   zone_name = view->zones[j];
 
@@ -761,7 +761,7 @@ static int bind_xml_stats_handle_zone(int version, xmlDoc *doc, /* {{{ */
     }
   } /* }}} */
 
-  return (0);
+  return 0;
 } /* }}} int bind_xml_stats_handle_zone */
 
 static int bind_xml_stats_search_zones(int version, xmlDoc *doc, /* {{{ */
@@ -773,14 +773,14 @@ static int bind_xml_stats_search_zones(int version, xmlDoc *doc, /* {{{ */
   zone_path_context = xmlXPathNewContext(doc);
   if (zone_path_context == NULL) {
     ERROR("bind plugin: xmlXPathNewContext failed.");
-    return (-1);
+    return -1;
   }
 
   zone_nodes = xmlXPathEvalExpression(BAD_CAST "zones/zone", path_ctx);
   if (zone_nodes == NULL) {
     ERROR("bind plugin: Cannot find any <view> tags.");
     xmlXPathFreeContext(zone_path_context);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < zone_nodes->nodesetval->nodeNr; i++) {
@@ -795,7 +795,7 @@ static int bind_xml_stats_search_zones(int version, xmlDoc *doc, /* {{{ */
 
   xmlXPathFreeObject(zone_nodes);
   xmlXPathFreeContext(zone_path_context);
-  return (0);
+  return 0;
 } /* }}} int bind_xml_stats_search_zones */
 
 static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
@@ -810,7 +810,7 @@ static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
 
     if (view_name == NULL) {
       ERROR("bind plugin: Could not determine view name.");
-      return (-1);
+      return -1;
     }
 
     for (j = 0; j < views_num; j++) {
@@ -825,7 +825,7 @@ static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
     path_obj = xmlXPathEvalExpression(BAD_CAST "name", path_ctx);
     if (path_obj == NULL) {
       ERROR("bind plugin: xmlXPathEvalExpression failed.");
-      return (-1);
+      return -1;
     }
 
     for (int i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr);
@@ -839,7 +839,7 @@ static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
     if (view_name == NULL) {
       ERROR("bind plugin: Could not determine view name.");
       xmlXPathFreeObject(path_obj);
-      return (-1);
+      return -1;
     }
 
     for (j = 0; j < views_num; j++) {
@@ -855,7 +855,7 @@ static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
   }
 
   if (j >= views_num)
-    return (0);
+    return 0;
 
   view = views + j;
 
@@ -927,7 +927,7 @@ static int bind_xml_stats_handle_view(int version, xmlDoc *doc, /* {{{ */
     bind_xml_stats_search_zones(version, doc, path_ctx, node, view,
                                 current_time);
 
-  return (0);
+  return 0;
 } /* }}} int bind_xml_stats_handle_view */
 
 static int bind_xml_stats_search_views(int version, xmlDoc *doc, /* {{{ */
@@ -940,14 +940,14 @@ static int bind_xml_stats_search_views(int version, xmlDoc *doc, /* {{{ */
   view_path_context = xmlXPathNewContext(doc);
   if (view_path_context == NULL) {
     ERROR("bind plugin: xmlXPathNewContext failed.");
-    return (-1);
+    return -1;
   }
 
   view_nodes = xmlXPathEvalExpression(BAD_CAST "views/view", xpathCtx);
   if (view_nodes == NULL) {
     ERROR("bind plugin: Cannot find any <view> tags.");
     xmlXPathFreeContext(view_path_context);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < view_nodes->nodesetval->nodeNr; i++) {
@@ -964,7 +964,7 @@ static int bind_xml_stats_search_views(int version, xmlDoc *doc, /* {{{ */
 
   xmlXPathFreeObject(view_nodes);
   xmlXPathFreeContext(view_path_context);
-  return (0);
+  return 0;
 } /* }}} int bind_xml_stats_search_views */
 
 static void bind_xml_stats_v3(xmlDoc *doc, /* {{{ */
@@ -1267,7 +1267,7 @@ static int bind_xml_stats(int version, xmlDoc *doc, /* {{{ */
                                    &current_time);
   if (status != 0) {
     ERROR("bind plugin: Reading `server/current-time' failed.");
-    return (-1);
+    return -1;
   }
   DEBUG("bind plugin: Current server time is %i.", (int)current_time);
 
@@ -1316,14 +1316,14 @@ static int bind_xml(const char *data) /* {{{ */
   doc = xmlParseMemory(data, strlen(data));
   if (doc == NULL) {
     ERROR("bind plugin: xmlParseMemory failed.");
-    return (-1);
+    return -1;
   }
 
   xpathCtx = xmlXPathNewContext(doc);
   if (xpathCtx == NULL) {
     ERROR("bind plugin: xmlXPathNewContext failed.");
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   }
 
   //
@@ -1375,7 +1375,7 @@ static int bind_xml(const char *data) /* {{{ */
     xmlXPathFreeContext(xpathCtx);
     xmlFreeDoc(doc);
 
-    return (ret);
+    return ret;
   }
 
   //
@@ -1387,13 +1387,13 @@ static int bind_xml(const char *data) /* {{{ */
     ERROR("bind plugin: Cannot find the <statistics> tag.");
     xmlXPathFreeContext(xpathCtx);
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   } else if (xpathObj->nodesetval == NULL) {
     ERROR("bind plugin: xmlXPathEvalExpression failed.");
     xmlXPathFreeObject(xpathObj);
     xmlXPathFreeContext(xpathCtx);
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < xpathObj->nodesetval->nodeNr; i++) {
@@ -1441,7 +1441,7 @@ static int bind_xml(const char *data) /* {{{ */
   xmlXPathFreeContext(xpathCtx);
   xmlFreeDoc(doc);
 
-  return (ret);
+  return ret;
 } /* }}} int bind_xml */
 
 static int bind_config_set_bool(const char *name, int *var, /* {{{ */
@@ -1450,7 +1450,7 @@ static int bind_config_set_bool(const char *name, int *var, /* {{{ */
     WARNING("bind plugin: The `%s' option needs "
             "exactly one boolean argument.",
             name);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.boolean)
@@ -1467,24 +1467,24 @@ static int bind_config_add_view_zone(cb_view_t *view, /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("bind plugin: The `Zone' option needs "
             "exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   tmp = realloc(view->zones, sizeof(char *) * (view->zones_num + 1));
   if (tmp == NULL) {
     ERROR("bind plugin: realloc failed.");
-    return (-1);
+    return -1;
   }
   view->zones = tmp;
 
   view->zones[view->zones_num] = strdup(ci->values[0].value.string);
   if (view->zones[view->zones_num] == NULL) {
     ERROR("bind plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
   view->zones_num++;
 
-  return (0);
+  return 0;
 } /* }}} int bind_config_add_view_zone */
 
 static int bind_config_add_view(oconfig_item_t *ci) /* {{{ */
@@ -1493,13 +1493,13 @@ static int bind_config_add_view(oconfig_item_t *ci) /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("bind plugin: `View' blocks need exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   tmp = realloc(views, sizeof(*views) * (views_num + 1));
   if (tmp == NULL) {
     ERROR("bind plugin: realloc failed.");
-    return (-1);
+    return -1;
   }
   views = tmp;
   tmp = views + views_num;
@@ -1515,7 +1515,7 @@ static int bind_config_add_view(oconfig_item_t *ci) /* {{{ */
   if (tmp->name == NULL) {
     ERROR("bind plugin: strdup failed.");
     sfree(views);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -1537,7 +1537,7 @@ static int bind_config_add_view(oconfig_item_t *ci) /* {{{ */
   } /* for (i = 0; i < ci->children_num; i++) */
 
   views_num++;
-  return (0);
+  return 0;
 } /* }}} int bind_config_add_view */
 
 static int bind_config(oconfig_item_t *ci) /* {{{ */
@@ -1550,7 +1550,7 @@ static int bind_config(oconfig_item_t *ci) /* {{{ */
           (child->values[0].type != OCONFIG_TYPE_STRING)) {
         WARNING("bind plugin: The `Url' option needs "
                 "exactly one string argument.");
-        return (-1);
+        return -1;
       }
 
       sfree(url);
@@ -1580,18 +1580,18 @@ static int bind_config(oconfig_item_t *ci) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int bind_config */
 
 static int bind_init(void) /* {{{ */
 {
   if (curl != NULL)
-    return (0);
+    return 0;
 
   curl = curl_easy_init();
   if (curl == NULL) {
     ERROR("bind plugin: bind_init: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
@@ -1607,7 +1607,7 @@ static int bind_init(void) /* {{{ */
                                                         plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int bind_init */
 
 static int bind_read(void) /* {{{ */
@@ -1616,20 +1616,20 @@ static int bind_read(void) /* {{{ */
 
   if (curl == NULL) {
     ERROR("bind plugin: I don't have a CURL object.");
-    return (-1);
+    return -1;
   }
 
   bind_buffer_fill = 0;
   if (curl_easy_perform(curl) != CURLE_OK) {
     ERROR("bind plugin: curl_easy_perform failed: %s", bind_curl_error);
-    return (-1);
+    return -1;
   }
 
   status = bind_xml(bind_buffer);
   if (status != 0)
-    return (-1);
+    return -1;
   else
-    return (0);
+    return 0;
 } /* }}} int bind_read */
 
 static int bind_shutdown(void) /* {{{ */
@@ -1639,7 +1639,7 @@ static int bind_shutdown(void) /* {{{ */
     curl = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int bind_shutdown */
 
 void module_register(void) {
@@ -1648,5 +1648,3 @@ void module_register(void) {
   plugin_register_read("bind", bind_read);
   plugin_register_shutdown("bind", bind_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 et fdm=marker : */
index 4e435b3..c2284cb 100644 (file)
@@ -634,7 +634,7 @@ static int cc_add_daemon_config(oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("ceph plugin: `Daemon' blocks need exactly one string "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   ret = cc_handle_str(ci, cd.name, DATA_MAX_NAME_LEN);
@@ -1446,4 +1446,3 @@ void module_register(void) {
   plugin_register_read("ceph", ceph_read);
   plugin_register_shutdown("ceph", ceph_shutdown);
 }
-/* vim: set sw=4 sts=4 et : */
index 3da4098..2f65b50 100644 (file)
@@ -187,5 +187,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index 3f7d4f4..9cb7cf9 100644 (file)
@@ -61,19 +61,19 @@ static int read_cpuacct_procs(const char *dirname, char const *cgroup_name,
   FILE *fh;
 
   if (ignorelist_match(il_cgroup, cgroup_name))
-    return (0);
+    return 0;
 
   ssnprintf(abs_path, sizeof(abs_path), "%s/%s", dirname, cgroup_name);
 
   status = lstat(abs_path, &statbuf);
   if (status != 0) {
     ERROR("cgroups plugin: stat (\"%s\") failed.", abs_path);
-    return (-1);
+    return -1;
   }
 
   /* We are only interested in directories, so skip everything else. */
   if (!S_ISDIR(statbuf.st_mode))
-    return (0);
+    return 0;
 
   ssnprintf(abs_path, sizeof(abs_path), "%s/%s/cpuacct.stat", dirname,
             cgroup_name);
@@ -82,7 +82,7 @@ static int read_cpuacct_procs(const char *dirname, char const *cgroup_name,
     char errbuf[1024];
     ERROR("cgroups plugin: fopen (\"%s\") failed: %s", abs_path,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buf, sizeof(buf), fh) != NULL) {
@@ -124,7 +124,7 @@ static int read_cpuacct_procs(const char *dirname, char const *cgroup_name,
   }
 
   fclose(fh);
-  return (0);
+  return 0;
 } /* int read_cpuacct_procs */
 
 /*
@@ -143,24 +143,24 @@ static int read_cpuacct_root(const char *dirname, const char *filename,
   status = lstat(abs_path, &statbuf);
   if (status != 0) {
     ERROR("cgroups plugin: stat (%s) failed.", abs_path);
-    return (-1);
+    return -1;
   }
 
   if (S_ISDIR(statbuf.st_mode)) {
     status = walk_directory(abs_path, read_cpuacct_procs,
                             /* user_data = */ NULL,
                             /* include_hidden = */ 0);
-    return (status);
+    return status;
   }
 
-  return (0);
+  return 0;
 }
 
 static int cgroups_init(void) {
   if (il_cgroup == NULL)
     il_cgroup = ignorelist_create(1);
 
-  return (0);
+  return 0;
 }
 
 static int cgroups_config(const char *key, const char *value) {
@@ -168,17 +168,17 @@ static int cgroups_config(const char *key, const char *value) {
 
   if (strcasecmp(key, "CGroup") == 0) {
     if (ignorelist_add(il_cgroup, value))
-      return (1);
-    return (0);
+      return 1;
+    return 0;
   } else if (strcasecmp(key, "IgnoreSelected") == 0) {
     if (IS_TRUE(value))
       ignorelist_set_invert(il_cgroup, 0);
     else
       ignorelist_set_invert(il_cgroup, 1);
-    return (0);
+    return 0;
   }
 
-  return (-1);
+  return -1;
 }
 
 static int cgroups_read(void) {
@@ -187,7 +187,7 @@ static int cgroups_read(void) {
 
   if (cu_mount_getlist(&mnt_list) == NULL) {
     ERROR("cgroups plugin: cu_mount_getlist failed.");
-    return (-1);
+    return -1;
   }
 
   for (cu_mount_t *mnt_ptr = mnt_list; mnt_ptr != NULL;
@@ -212,10 +212,10 @@ static int cgroups_read(void) {
   if (!cgroup_found) {
     WARNING("cgroups plugin: Unable to find cgroup "
             "mount-point with the \"cpuacct\" option.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int cgroup_read */
 
 void module_register(void) {
index 11310b1..a5e85a8 100644 (file)
@@ -77,6 +77,7 @@ static uint32_t g_chrony_seq_is_initialized;
 #define IPADDR_INET4 1
 #define IPADDR_INET6 2
 #define IPV6_STR_MAX_SIZE (8 * 4 + 7 + 1)
+#define MODE_REFCLOCK 2
 
 typedef enum { PKT_TYPE_CMD_REQUEST = 1, PKT_TYPE_CMD_REPLY = 2 } ePacketType;
 
@@ -185,13 +186,11 @@ typedef struct ATTRIB_PACKED {
     uint8_t ip6[16];
   } addr;
   uint16_t f_family;
+  uint16_t padding;
 } tChrony_IPAddr;
 
 typedef struct ATTRIB_PACKED {
   tChrony_IPAddr addr;
-  uint16_t
-      dummy; /* FIXME: Strange dummy space. Needed on gcc 4.8.3/clang 3.4.1 on
-                x86_64 */
   int16_t f_poll;     /* 2^f_poll = Time between polls (s) */
   uint16_t f_stratum; /* Remote clock stratum */
   uint16_t f_state;   /* 0 = RPY_SD_ST_SYNC,    1 = RPY_SD_ST_UNREACH,   2 =
@@ -212,9 +211,6 @@ typedef struct ATTRIB_PACKED {
 typedef struct ATTRIB_PACKED {
   uint32_t f_ref_id;
   tChrony_IPAddr addr;
-  uint16_t
-      dummy; /* FIXME: Strange dummy space. Needed on gcc 4.8.3/clang 3.4.1 on
-                x86_64 */
   uint32_t f_n_samples;       /* Number of measurements done   */
   uint32_t f_n_runs;          /* How many measurements to come */
   uint32_t f_span_seconds;    /* For how long we're measuring  */
@@ -229,9 +225,6 @@ typedef struct ATTRIB_PACKED {
 typedef struct ATTRIB_PACKED {
   uint32_t f_ref_id;
   tChrony_IPAddr addr;
-  uint16_t
-      dummy; /* FIXME: Strange dummy space. Needed on gcc 4.8.3/clang 3.4.1 on
-                x86_64 */
   uint16_t f_stratum;
   uint16_t f_leap_status;
   tTimeval f_ref_time;
@@ -354,6 +347,19 @@ static char *niptoha(const tChrony_IPAddr *addr, char *p_buf,
   return p_buf;
 }
 
+static void nreftostr(uint32_t nrefid, char *p_buf, size_t p_buf_size) {
+  int i, j, c;
+
+  for (i = j = 0; i < 4; i++) {
+    c = ntohl(nrefid) << i * 8 >> 24;
+    if (!isalnum(c) || j + 1 >= p_buf_size)
+      continue;
+    p_buf[j++] = c;
+  }
+  if (j < p_buf_size)
+    p_buf[j] = '\0';
+}
+
 static int chrony_set_timeout(void) {
   /* Set the socket's  timeout to g_chrony_timeout; a value of 0 signals
    * infinite timeout */
@@ -584,9 +590,10 @@ static double ntohf(tFloat p_float) {
   uint32_t uval;
 
   uval = ntohl(p_float.value);
-  exp = (uval >> FLOAT_COEF_BITS) - FLOAT_COEF_BITS;
+  exp = (uval >> FLOAT_COEF_BITS);
   if (exp >= 1 << (FLOAT_EXP_BITS - 1))
     exp -= 1 << FLOAT_EXP_BITS;
+  exp -= FLOAT_COEF_BITS;
 
   /* coef = (x << FLOAT_EXP_BITS) >> FLOAT_EXP_BITS; */
   coef = uval % (1U << FLOAT_COEF_BITS);
@@ -832,15 +839,14 @@ static int chrony_request_sources_count(unsigned int *p_count) {
   return CHRONY_RC_OK;
 }
 
-static int chrony_request_source_data(int p_src_idx, int *p_is_reachable) {
+static int chrony_request_source_data(int p_src_idx, char *src_addr,
+                                      size_t addr_size, int *p_is_reachable) {
   /* Perform Source data request for source #p_src_idx */
   int rc;
   size_t chrony_resp_size;
   tChrony_Request chrony_req;
   tChrony_Response chrony_resp;
 
-  char src_addr[IPV6_STR_MAX_SIZE] = {0};
-
   chrony_init_req(&chrony_req);
   chrony_req.body.source_data.f_index = htonl(p_src_idx);
   rc = chrony_query(REQ_SOURCE_DATA, &chrony_req, &chrony_resp,
@@ -851,7 +857,11 @@ static int chrony_request_source_data(int p_src_idx, int *p_is_reachable) {
     return rc;
   }
 
-  niptoha(&chrony_resp.body.source_data.addr, src_addr, sizeof(src_addr));
+  if (ntohs(chrony_resp.body.source_data.f_mode) == MODE_REFCLOCK)
+    nreftostr(chrony_resp.body.source_data.addr.addr.ip4, src_addr, addr_size);
+  else
+    niptoha(&chrony_resp.body.source_data.addr, src_addr, addr_size);
+
   DEBUG(PLUGIN_NAME ": Source[%d] data: .addr = %s, .poll = %u, .stratum = %u, "
                     ".state = %u, .mode = %u, .flags = %u, .reach = %u, "
                     ".latest_meas_ago = %u, .orig_latest_meas = %f, "
@@ -881,26 +891,26 @@ static int chrony_request_source_data(int p_src_idx, int *p_is_reachable) {
   chrony_push_data_valid("clock_reachability", src_addr, is_reachable,
                          ntohs(chrony_resp.body.source_data.f_reachability));
   chrony_push_data_valid("clock_last_meas", src_addr, is_reachable,
-                         ntohs(chrony_resp.body.source_data.f_since_sample));
+                         ntohl(chrony_resp.body.source_data.f_since_sample));
+  chrony_push_data_valid(
+      "time_offset", src_addr, is_reachable,
+      ntohf(chrony_resp.body.source_data.f_origin_latest_meas));
 
   return CHRONY_RC_OK;
 }
 
-static int chrony_request_source_stats(int p_src_idx,
+static int chrony_request_source_stats(int p_src_idx, const char *src_addr,
                                        const int *p_is_reachable) {
   /* Perform Source stats request for source #p_src_idx */
   int rc;
   size_t chrony_resp_size;
   tChrony_Request chrony_req;
   tChrony_Response chrony_resp;
-  double skew_ppm, frequency_error, time_offset;
-
-  char src_addr[IPV6_STR_MAX_SIZE] = {0};
+  double skew_ppm, frequency_error;
 
   if (*p_is_reachable == 0) {
     skew_ppm = 0;
     frequency_error = 0;
-    time_offset = 0;
   } else {
     chrony_init_req(&chrony_req);
     chrony_req.body.source_stats.f_index = htonl(p_src_idx);
@@ -915,9 +925,7 @@ static int chrony_request_source_stats(int p_src_idx,
 
     skew_ppm = ntohf(chrony_resp.body.source_stats.f_skew_ppm);
     frequency_error = ntohf(chrony_resp.body.source_stats.f_rtc_gain_rate_ppm);
-    time_offset = ntohf(chrony_resp.body.source_stats.f_est_offset);
 
-    niptoha(&chrony_resp.body.source_stats.addr, src_addr, sizeof(src_addr));
     DEBUG(PLUGIN_NAME
           ": Source[%d] stat: .addr = %s, .ref_id= %u, .n_samples = %u, "
           ".n_runs = %u, .span_seconds = %u, .rtc_seconds_fast = %f, "
@@ -928,7 +936,8 @@ static int chrony_request_source_stats(int p_src_idx,
           ntohl(chrony_resp.body.source_stats.f_n_runs),
           ntohl(chrony_resp.body.source_stats.f_span_seconds),
           ntohf(chrony_resp.body.source_stats.f_rtc_seconds_fast),
-          frequency_error, skew_ppm, time_offset,
+          frequency_error, skew_ppm,
+          ntohf(chrony_resp.body.source_stats.f_est_offset),
           ntohf(chrony_resp.body.source_stats.f_est_offset_err));
 
   } /* if (*is_reachable) */
@@ -937,8 +946,6 @@ static int chrony_request_source_stats(int p_src_idx,
   chrony_push_data_valid("clock_skew_ppm", src_addr, *p_is_reachable, skew_ppm);
   chrony_push_data_valid("frequency_error", src_addr, *p_is_reachable,
                          frequency_error); /* unit: ppm */
-  chrony_push_data_valid("time_offset", src_addr, *p_is_reachable,
-                         time_offset); /* unit: s */
 
   return CHRONY_RC_OK;
 }
@@ -968,12 +975,14 @@ static int chrony_read(void) {
     return rc;
 
   for (unsigned int now_src = 0; now_src < n_sources; ++now_src) {
+    char src_addr[IPV6_STR_MAX_SIZE] = {0};
     int is_reachable;
-    rc = chrony_request_source_data(now_src, &is_reachable);
+    rc = chrony_request_source_data(now_src, src_addr, sizeof(src_addr),
+                                    &is_reachable);
     if (rc != CHRONY_RC_OK)
       return rc;
 
-    rc = chrony_request_source_stats(now_src, &is_reachable);
+    rc = chrony_request_source_stats(now_src, src_addr, &is_reachable);
     if (rc != CHRONY_RC_OK)
       return rc;
   }
index 993541d..4c54dad 100644 (file)
@@ -118,7 +118,7 @@ cn_strdup(const char *str) /* {{{ */
   ret = (char *)malloc(strsize);
   if (ret != NULL)
     memcpy(ret, str, strsize);
-  return (ret);
+  return ret;
 } /* }}} char *cn_strdup */
 
 static int filter_ds(size_t *values_num, double **values,
@@ -127,19 +127,19 @@ static int filter_ds(size_t *values_num, double **values,
   char **new_names;
 
   if (match_ds_g == NULL)
-    return (RET_OKAY);
+    return RET_OKAY;
 
   new_values = (gauge_t *)calloc(match_ds_num_g, sizeof(*new_values));
   if (new_values == NULL) {
     fprintf(stderr, "calloc failed: %s\n", strerror(errno));
-    return (RET_UNKNOWN);
+    return RET_UNKNOWN;
   }
 
   new_names = (char **)calloc(match_ds_num_g, sizeof(*new_names));
   if (new_names == NULL) {
     fprintf(stderr, "calloc failed: %s\n", strerror(errno));
     free(new_values);
-    return (RET_UNKNOWN);
+    return RET_UNKNOWN;
   }
 
   for (size_t i = 0; i < match_ds_num_g; i++) {
@@ -153,7 +153,7 @@ static int filter_ds(size_t *values_num, double **values,
       for (j = 0; j < i; j++)
         free(new_names[j]);
       free(new_names);
-      return (RET_UNKNOWN);
+      return RET_UNKNOWN;
     }
 
     for (j = 0; j < *values_num; j++)
@@ -166,7 +166,7 @@ static int filter_ds(size_t *values_num, double **values,
       for (j = 0; j <= i; j++)
         free(new_names[j]);
       free(new_names);
-      return (RET_CRITICAL);
+      return RET_CRITICAL;
     }
 
     new_values[i] = (*values)[j];
@@ -180,7 +180,7 @@ static int filter_ds(size_t *values_num, double **values,
   *values = new_values;
   *values_names = new_names;
   *values_num = match_ds_num_g;
-  return (RET_OKAY);
+  return RET_OKAY;
 } /* int filter_ds */
 
 static void parse_range(char *string, range_t *range) {
@@ -227,7 +227,7 @@ static int match_range(range_t *range, double value) {
   if (!isnan(range->max) && (range->max < value))
     ret = 1;
 
-  return (((ret - range->invert) == 0) ? 0 : 1);
+  return ((ret - range->invert) == 0) ? 0 : 1;
 } /* int match_range */
 
 __attribute__((noreturn)) static void usage(const char *name) {
@@ -279,7 +279,7 @@ static int do_listval(lcc_connection_t *connection) {
     printf("UNKNOWN: %s\n", lcc_strerror(connection));
     if (ret_ident != NULL)
       free(ret_ident);
-    return (RET_UNKNOWN);
+    return RET_UNKNOWN;
   }
 
   status = lcc_sort_identifiers(connection, ret_ident, ret_ident_num);
@@ -287,7 +287,7 @@ static int do_listval(lcc_connection_t *connection) {
     printf("UNKNOWN: %s\n", lcc_strerror(connection));
     if (ret_ident != NULL)
       free(ret_ident);
-    return (RET_UNKNOWN);
+    return RET_UNKNOWN;
   }
 
   for (size_t i = 0; i < ret_ident_num; ++i) {
@@ -322,7 +322,7 @@ static int do_listval(lcc_connection_t *connection) {
 
   free(ret_ident);
   free(hostname);
-  return (RET_OKAY);
+  return RET_OKAY;
 } /* int do_listval */
 
 static int do_check_con_none(size_t values_num, double *values,
@@ -349,7 +349,7 @@ static int do_check_con_none(size_t values_num, double *values,
 
   if ((num_critical == 0) && (num_warning == 0) && (num_okay == 0)) {
     printf("WARNING: No defined values found\n");
-    return (RET_WARNING);
+    return RET_WARNING;
   } else if ((num_critical == 0) && (num_warning == 0)) {
     status_str = "OKAY";
     status_code = RET_OKAY;
@@ -370,7 +370,7 @@ static int do_check_con_none(size_t values_num, double *values,
   }
   printf("\n");
 
-  return (status_code);
+  return status_code;
 } /* int do_check_con_none */
 
 static int do_check_con_average(size_t values_num, double *values,
@@ -389,7 +389,7 @@ static int do_check_con_average(size_t values_num, double *values,
         continue;
 
       printf("CRITICAL: Data source \"%s\" is NaN\n", values_names[i]);
-      return (RET_CRITICAL);
+      return RET_CRITICAL;
     }
 
     total += values[i];
@@ -398,7 +398,7 @@ static int do_check_con_average(size_t values_num, double *values,
 
   if (total_num == 0) {
     printf("WARNING: No defined values found\n");
-    return (RET_WARNING);
+    return RET_WARNING;
   }
 
   average = total / total_num;
@@ -419,7 +419,7 @@ static int do_check_con_average(size_t values_num, double *values,
     printf(" %s=%f;;;;", values_names[i], values[i]);
   printf("\n");
 
-  return (status_code);
+  return status_code;
 } /* int do_check_con_average */
 
 static int do_check_con_sum(size_t values_num, double *values,
@@ -437,7 +437,7 @@ static int do_check_con_sum(size_t values_num, double *values,
         continue;
 
       printf("CRITICAL: Data source \"%s\" is NaN\n", values_names[i]);
-      return (RET_CRITICAL);
+      return RET_CRITICAL;
     }
 
     total += values[i];
@@ -446,7 +446,7 @@ static int do_check_con_sum(size_t values_num, double *values,
 
   if (total_num == 0) {
     printf("WARNING: No defined values found\n");
-    return (RET_WARNING);
+    return RET_WARNING;
   }
 
   if (match_range(&range_critical_g, total) != 0) {
@@ -465,7 +465,7 @@ static int do_check_con_sum(size_t values_num, double *values,
     printf(" %s=%f;;;;", values_names[i], values[i]);
   printf("\n");
 
-  return (status_code);
+  return status_code;
 } /* int do_check_con_sum */
 
 static int do_check_con_percentage(size_t values_num, double *values,
@@ -478,7 +478,7 @@ static int do_check_con_percentage(size_t values_num, double *values,
 
   if ((values_num < 1) || (isnan(values[0]))) {
     printf("WARNING: The first value is not defined\n");
-    return (RET_WARNING);
+    return RET_WARNING;
   }
 
   for (size_t i = 0; i < values_num; i++) {
@@ -487,7 +487,7 @@ static int do_check_con_percentage(size_t values_num, double *values,
         continue;
 
       printf("CRITICAL: Data source \"%s\" is NaN\n", values_names[i]);
-      return (RET_CRITICAL);
+      return RET_CRITICAL;
     }
 
     sum += values[i];
@@ -495,7 +495,7 @@ static int do_check_con_percentage(size_t values_num, double *values,
 
   if (sum == 0.0) {
     printf("WARNING: Values sum up to zero\n");
-    return (RET_WARNING);
+    return RET_WARNING;
   }
 
   percentage = 100.0 * values[0] / sum;
@@ -514,7 +514,7 @@ static int do_check_con_percentage(size_t values_num, double *values,
   printf("%s: %lf percent |", status_str, percentage);
   for (size_t i = 0; i < values_num; i++)
     printf(" %s=%lf;;;;", values_names[i], values[i]);
-  return (status_code);
+  return status_code;
 } /* int do_check_con_percentage */
 
 static int do_check(lcc_connection_t *connection) {
@@ -533,7 +533,7 @@ static int do_check(lcc_connection_t *connection) {
     printf("ERROR: Creating an identifier failed: %s.\n",
            lcc_strerror(connection));
     LCC_DESTROY(connection);
-    return (RET_CRITICAL);
+    return RET_CRITICAL;
   }
 
   status = lcc_getval(connection, &ident, &values_num, &values, &values_names);
@@ -541,14 +541,14 @@ static int do_check(lcc_connection_t *connection) {
     printf("ERROR: Retrieving values from the daemon failed: %s.\n",
            lcc_strerror(connection));
     LCC_DESTROY(connection);
-    return (RET_CRITICAL);
+    return RET_CRITICAL;
   }
 
   LCC_DESTROY(connection);
 
   status = filter_ds(&values_num, &values, &values_names);
   if (status != RET_OKAY)
-    return (status);
+    return status;
 
   status = RET_UNKNOWN;
   if (consolitation_g == CON_NONE)
@@ -566,7 +566,7 @@ static int do_check(lcc_connection_t *connection) {
       free(values_names[i]);
   free(values_names);
 
-  return (status);
+  return status;
 } /* int do_check */
 
 int main(int argc, char **argv) {
@@ -625,13 +625,13 @@ int main(int argc, char **argv) {
       tmp = realloc(match_ds_g, (match_ds_num_g + 1) * sizeof(char *));
       if (tmp == NULL) {
         fprintf(stderr, "realloc failed: %s\n", strerror(errno));
-        return (RET_UNKNOWN);
+        return RET_UNKNOWN;
       }
       match_ds_g = tmp;
       match_ds_g[match_ds_num_g] = cn_strdup(optarg);
       if (match_ds_g[match_ds_num_g] == NULL) {
         fprintf(stderr, "cn_strdup failed: %s\n", strerror(errno));
-        return (RET_UNKNOWN);
+        return RET_UNKNOWN;
       }
       match_ds_num_g++;
       break;
@@ -657,11 +657,11 @@ int main(int argc, char **argv) {
   status = lcc_connect(address, &connection);
   if (status != 0) {
     printf("ERROR: Connecting to daemon at %s failed.\n", socket_file_g);
-    return (RET_CRITICAL);
+    return RET_CRITICAL;
   }
 
   if (0 == strcasecmp(value_string_g, "LIST"))
-    return (do_listval(connection));
+    return do_listval(connection);
 
-  return (do_check(connection));
+  return do_check(connection);
 } /* int main */
index 16b26af..6a83b97 100644 (file)
@@ -717,7 +717,7 @@ dispatched by the python plugin after upgrades.
 =item *
 
 Not all aspects of the collectd API are accessible from Python. This includes
-but is not limited to filters and data sets.
+but is not limited to filters.
 
 =back
 
index c246f1d..edb9506 100644 (file)
@@ -44,7 +44,7 @@ collectd-snmp - Documentation of collectd's C<snmp plugin>
       Collect "std_traffic" "hr_users"
     </Host>
     <Host "secure.router.mydomain.org">
-      Address "192.168.0.7"
+      Address "192.168.0.7:165"
       Version 3
       SecurityLevel "authPriv"
       Username "cosmo"
@@ -55,7 +55,7 @@ collectd-snmp - Documentation of collectd's C<snmp plugin>
       Collect "std_traffic"
     </Host>
     <Host "some.ups.mydomain.org">
-      Address "192.168.0.3"
+      Address "tcp:192.168.0.3"
       Version 1
       Community "more_communities"
       Collect "powerplus_voltge_input"
@@ -228,7 +228,8 @@ stored by collectd.
 
 =item B<Address> I<IP-Address>|I<Hostname>
 
-Set the address to connect to.
+Set the address to connect to. Address may include transport specifier and/or
+port number.
 
 =item B<Version> B<1>|B<2>|B<3>
 
index 7ded64d..d8b2ea1 100644 (file)
@@ -107,7 +107,7 @@ static double dtime(void) /* {{{ */
   if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0)
     perror("clock_gettime");
 
-  return ((double)ts.tv_sec) + (((double)ts.tv_nsec) / 1e9);
+  return (double)ts.tv_sec + (double)ts.tv_nsec / 1e9;
 } /* }}} double dtime */
 #else
 /* Work around for Mac OS X which doesn't have clock_gettime(2). *sigh* */
@@ -118,7 +118,7 @@ static double dtime(void) /* {{{ */
   if (gettimeofday(&tv, /* timezone = */ NULL) != 0)
     perror("gettimeofday");
 
-  return ((double)tv.tv_sec) + (((double)tv.tv_usec) / 1e6);
+  return (double)tv.tv_sec + ((double)tv.tv_usec) / 1e6;
 } /* }}} double dtime */
 #endif
 
@@ -128,11 +128,11 @@ static int compare_time(const void *v0, const void *v1) /* {{{ */
   const lcc_value_list_t *vl1 = v1;
 
   if (vl0->time < vl1->time)
-    return (-1);
+    return -1;
   else if (vl0->time > vl1->time)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* }}} int compare_time */
 
 static int get_boundet_random(int min, int max) /* {{{ */
@@ -140,14 +140,13 @@ static int get_boundet_random(int min, int max) /* {{{ */
   int range;
 
   if (min >= max)
-    return (-1);
+    return -1;
   if (min == (max - 1))
-    return (min);
+    return min;
 
   range = max - min;
 
-  return (min + ((int)(((double)range) * ((double)random()) /
-                       (((double)RAND_MAX) + 1.0))));
+  return min + ((int)(((double)range) * ((double)random()) / (((double)RAND_MAX) + 1.0)));
 } /* }}} int get_boundet_random */
 
 static lcc_value_list_t *create_value_list(void) /* {{{ */
@@ -158,14 +157,14 @@ static lcc_value_list_t *create_value_list(void) /* {{{ */
   vl = calloc(1, sizeof(*vl));
   if (vl == NULL) {
     fprintf(stderr, "calloc failed.\n");
-    return (NULL);
+    return NULL;
   }
 
   vl->values = calloc(/* nmemb = */ 1, sizeof(*vl->values));
   if (vl->values == NULL) {
     fprintf(stderr, "calloc failed.\n");
     free(vl);
-    return (NULL);
+    return NULL;
   }
 
   vl->values_types = calloc(/* nmemb = */ 1, sizeof(*vl->values_types));
@@ -173,7 +172,7 @@ static lcc_value_list_t *create_value_list(void) /* {{{ */
     fprintf(stderr, "calloc failed.\n");
     free(vl->values);
     free(vl);
-    return (NULL);
+    return NULL;
   }
 
   vl->values_len = 1;
@@ -199,7 +198,7 @@ static lcc_value_list_t *create_value_list(void) /* {{{ */
   snprintf(vl->identifier.type_instance, sizeof(vl->identifier.type_instance),
            "ti%li", random());
 
-  return (vl);
+  return vl;
 } /* }}} int create_value_list */
 
 static void destroy_value_list(lcc_value_list_t *vl) /* {{{ */
@@ -228,7 +227,7 @@ static int send_value(lcc_value_list_t *vl) /* {{{ */
 
   vl->time += vl->interval;
 
-  return (0);
+  return 0;
 } /* }}} int send_value */
 
 static int get_integer_opt(const char *str, int *ret_value) /* {{{ */
@@ -252,7 +251,7 @@ static int get_integer_opt(const char *str, int *ret_value) /* {{{ */
   }
 
   *ret_value = tmp;
-  return (0);
+  return 0;
 } /* }}} int get_integer_opt */
 
 static int get_double_opt(const char *str, double *ret_value) /* {{{ */
@@ -276,7 +275,7 @@ static int get_double_opt(const char *str, double *ret_value) /* {{{ */
   }
 
   *ret_value = tmp;
-  return (0);
+  return 0;
 } /* }}} int get_double_opt */
 
 static int read_options(int argc, char **argv) /* {{{ */
@@ -317,7 +316,7 @@ static int read_options(int argc, char **argv) /* {{{ */
     } /* switch (opt) */
   }   /* while (getopt) */
 
-  return (0);
+  return 0;
 } /* }}} int read_options */
 
 int main(int argc, char **argv) /* {{{ */
@@ -423,5 +422,3 @@ int main(int argc, char **argv) /* {{{ */
   lcc_network_destroy(net);
   exit(EXIT_SUCCESS);
 } /* }}} int main */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index e5b9643..fb161af 100644 (file)
 #@BUILD_PLUGIN_DF_TRUE@LoadPlugin df
 #@BUILD_PLUGIN_DISK_TRUE@LoadPlugin disk
 #@BUILD_PLUGIN_DNS_TRUE@LoadPlugin dns
+#@BUILD_PLUGIN_DPDKEVENTS_TRUE@LoadPlugin dpdkevents
 #@BUILD_PLUGIN_DPDKSTAT_TRUE@LoadPlugin dpdkstat
 #@BUILD_PLUGIN_DRBD_TRUE@LoadPlugin drbd
 #@BUILD_PLUGIN_EMAIL_TRUE@LoadPlugin email
 #@BUILD_PLUGIN_LVM_TRUE@LoadPlugin lvm
 #@BUILD_PLUGIN_MADWIFI_TRUE@LoadPlugin madwifi
 #@BUILD_PLUGIN_MBMON_TRUE@LoadPlugin mbmon
+#@BUILD_PLUGIN_MCELOG_TRUE@LoadPlugin mcelog
 #@BUILD_PLUGIN_MD_TRUE@LoadPlugin md
 #@BUILD_PLUGIN_MEMCACHEC_TRUE@LoadPlugin memcachec
 #@BUILD_PLUGIN_MEMCACHED_TRUE@LoadPlugin memcached
 #@BUILD_PLUGIN_OPENLDAP_TRUE@LoadPlugin openldap
 #@BUILD_PLUGIN_OPENVPN_TRUE@LoadPlugin openvpn
 #@BUILD_PLUGIN_ORACLE_TRUE@LoadPlugin oracle
+#@BUILD_PLUGIN_OVS_EVENTS_TRUE@LoadPlugin ovs_events
+#@BUILD_PLUGIN_OVS_STATS_TRUE@LoadPlugin ovs_stats
 #@BUILD_PLUGIN_PERL_TRUE@LoadPlugin perl
 #@BUILD_PLUGIN_PINBA_TRUE@LoadPlugin pinba
 #@BUILD_PLUGIN_PING_TRUE@LoadPlugin ping
 #@BUILD_PLUGIN_SIGROK_TRUE@LoadPlugin sigrok
 #@BUILD_PLUGIN_SMART_TRUE@LoadPlugin smart
 #@BUILD_PLUGIN_SNMP_TRUE@LoadPlugin snmp
+#@BUILD_PLUGIN_SNMP_AGENT_TRUE@LoadPlugin snmp_agent
 #@BUILD_PLUGIN_STATSD_TRUE@LoadPlugin statsd
 #@BUILD_PLUGIN_SWAP_TRUE@LoadPlugin swap
 #@BUILD_PLUGIN_TABLE_TRUE@LoadPlugin table
 #      SelectNumericQueryTypes true
 #</Plugin>
 
+#<Plugin "dpdkevents">
+#  <EAL>
+#    Coremask "0x1"
+#    MemoryChannels "4"
+#    ProcessType "secondary"
+#    FilePrefix "rte"
+#  </EAL>
+#  <Event "link_status">
+#    SendEventsOnUpdate true
+#    EnabledPortMask 0xffff
+#    PortName "interface1"
+#    PortName "interface2"
+#    SendNotification false
+#  </Event>
+#  <Event "keep_alive">
+#    SendEventsOnUpdate true
+#    LCoreMask "0xf"
+#    KeepAliveShmName "/dpdk_keepalive_shm_name"
+#    SendNotification false
+#  </Event>
+#</Plugin>
+
 #<Plugin dpdkstat>
-#       Interval 1
-#       Coremask "0xf"
-#       ProcessType "secondary"
-#       FilePrefix "rte"
-#       EnabledPortMask 0xffff
-#       PortName "interface1"
-#       PortName "interface2"
+#  <EAL>
+#    Coremask "0x2"
+#    MemoryChannels "4"
+#    ProcessType "secondary"
+#    FilePrefix "rte"
+#  </EAL>
+#  SharedMemObj "dpdk_collectd_stats_0"
+#  EnabledPortMask 0xffff
+#  PortName "interface1"
+#  PortName "interface2"
 #</Plugin>
 
 #<Plugin email>
 #      Port "411"
 #</Plugin>
 
+#<Plugin mcelog>
+#      McelogClientSocket "/var/run/mcelog-client"
+#      McelogLogfile "/var/log/mcelog"
+#</Plugin>
+
 #<Plugin md>
 #      Device "/dev/md0"
 #      IgnoreSelected false
 
 #<Plugin nut>
 #      UPS "upsname@hostname:port"
+#      ForceSSL true
+#      VerifyPeer true
+#      CAPath "/path/to/folder"
 #</Plugin>
 
 #<Plugin olsrd>
 #  </Database>
 #</Plugin>
 
+#<Plugin ovs_events>
+#  Port "6640"
+#  Address "127.0.0.1"
+#  Socket "/var/run/openvswitch/db.sock"
+#  Interfaces "br0" "veth0"
+#  SendNotification true
+#  DispatchValues false
+#</Plugin>
+
+#<Plugin ovs_stats>
+#  Port "6640"
+#  Address "127.0.0.1"
+#  Socket "/var/run/openvswitch/db.sock"
+#  Bridges "br0" "br_ext"
+#</Plugin>
+
 #<Plugin perl>
 #      IncludeDir "/my/include/path"
 #      BaseName "Collectd::Plugins"
 #</Plugin>
 
 #<Plugin processes>
+#      CollectFileDescriptor true
+#      CollectContextSwitch true
 #      Process "name"
+#      ProcessMatch "name" "regex"
+#      <Process "collectd">
+#              CollectFileDescriptor false
+#              CollectContextSwitch false
+#      </Process>
+#      <ProcessMatch "name" "regex">
+#              CollectFileDescriptor false
+#              CollectContextSwitch true
+#      </Process>
 #</Plugin>
 
 #<Plugin protocols>
 #   </Host>
 #</Plugin>
 
+#<Plugin snmp_agent>
+#  <Data "memAvailReal">
+#    Plugin "memory"
+#    Type "memory"
+#    TypeInstance "free"
+#    OIDs "1.3.6.1.4.1.2021.4.6.0"
+#  </Data>
+#  <Table "ifTable">
+#    IndexOID "IF-MIB::ifIndex"
+#    SizeOID "IF-MIB::ifNumber"
+#    <Data "ifDescr">
+#      Instance true
+#      Plugin "interface"
+#      OIDs "IF-MIB::ifDescr"
+#    </Data>
+#    <Data "ifOctets">
+#      Plugin "interface"
+#      Type "if_octets"
+#      TypeInstance ""
+#      OIDs "IF-MIB::ifInOctets" "IF-MIB::ifOutOctets"
+#    </Data>
+#  </Table>
+#</Plugin>
+
 #<Plugin statsd>
 #  Host "::"
 #  Port "8125"
 #      HostnameFormat name
 #      InterfaceFormat name
 #      PluginInstanceFormat name
+#      Instances 1
+#      ExtraStats "cpu_util disk disk_err domain_state fs_info job_stats_background pcpu perf vcpupin"
 #</Plugin>
 
 #<Plugin vmem>
 #              Header "X-Custom-Header: custom_value"
 #              SSLVersion "TLSv1"
 #              Format "Command"
+#              Attribute "key" "value"     # only available for KAIROSDB format
+#              TTL 0   # data ttl, only available for KAIROSDB format
 #              Metrics true
 #              Notifications false
 #              StoreRates false
index 881ae20..ceb6a13 100644 (file)
@@ -2393,6 +2393,128 @@ Enabled by default, collects unknown (and thus presented as numeric only) query
 
 =back
 
+=head2 Plugin C<dpdkevents>
+
+The I<dpdkevents plugin> collects events from DPDK such as link status of
+network ports and Keep Alive status of DPDK logical cores.
+In order to get Keep Alive events following requirements must be met:
+- DPDK >= 16.07
+- support for Keep Alive implemented in DPDK application. More details can
+be found here: http://dpdk.org/doc/guides/sample_app_ug/keep_alive.html
+
+B<Synopsis:>
+
+ <Plugin "dpdkevents">
+   <EAL>
+     Coremask "0x1"
+     MemoryChannels "4"
+     ProcessType "secondary"
+     FilePrefix "rte"
+   </EAL>
+   <Event "link_status">
+     SendEventsOnUpdate true
+     EnabledPortMask 0xffff
+     PortName "interface1"
+     PortName "interface2"
+     SendNotification false
+   </Event>
+   <Event "keep_alive">
+     SendEventsOnUpdate true
+     LCoreMask "0xf"
+     KeepAliveShmName "/dpdk_keepalive_shm_name"
+     SendNotification false
+   </Event>
+ </Plugin>
+
+B<Options:>
+
+
+=head3 The EAL block
+
+=over 5
+
+=item B<Coremask> I<Mask>
+
+=item B<Memorychannels> I<Channels>
+
+Number of memory channels per processor socket.
+
+=item B<ProcessType> I<type>
+
+The type of DPDK process instance.
+
+=item B<FilePrefix> I<File>
+
+The prefix text used for hugepage filenames. The filename will be set to
+/var/run/.<prefix>_config where prefix is what is passed in by the user.
+
+=back
+
+=head3 The Event block
+
+The B<Event> block defines configuration for specific event. It accepts a
+single argument which specifies the name of the event.
+
+=head4 Link Status event
+
+=over 5
+
+=item B<SendEventOnUpdate> I<true|false>
+
+If set to true link status value will be dispatched only when it is
+different from previously read value. This is an optional argument - default
+value is true.
+
+=item B<EnabledPortMask> I<Mask>
+
+A hexidecimal bit mask of the DPDK ports which should be enabled. A mask
+of 0x0 means that all ports will be disabled. A bitmask of all F's means
+that all ports will be enabled. This is an optional argument - by default
+all ports are enabled.
+
+=item B<PortName> I<Name>
+
+A string containing an optional name for the enabled DPDK ports. Each PortName
+option should contain only one port name; specify as many PortName options as
+desired. Default naming convention will be used if PortName is blank. If there
+are less PortName options than there are enabled ports, the default naming
+convention will be used for the additional ports.
+
+=item B<SendNotification> I<true|false>
+
+If set to true, link status notifications are sent, instead of link status
+being collected as a statistic. This is an optional argument - default
+value is false.
+
+=back
+
+=head4 Keep Alive event
+
+=over 5
+
+=item B<SendEventOnUpdate> I<true|false>
+
+If set to true keep alive value will be dispatched only when it is
+different from previously read value. This is an optional argument - default
+value is true.
+
+=item B<LCoreMask> I<Mask>
+
+An hexadecimal bit mask of the logical cores to monitor keep alive state.
+
+=item B<KeepAliveShmName> I<Name>
+
+Shared memory name identifier that is used by secondary process to monitor
+the keep alive cores state.
+
+=item B<SendNotification> I<true|false>
+
+If set to true, keep alive notifications are sent, instead of keep alive
+information being collected as a statistic. This is an optional
+argument - default value is false.
+
+=back
+
 =head2 Plugin C<dpdkstat>
 
 The I<dpdkstat plugin> collects information about DPDK interfaces using the
@@ -2401,18 +2523,24 @@ extended NIC stats API in DPDK.
 B<Synopsis:>
 
  <Plugin "dpdkstat">
-    Coremask "0x4"
-    MemoryChannels "4"
-    ProcessType "secondary"
-    FilePrefix "rte"
-    EnabledPortMask 0xffff
-    PortName "interface1"
-    PortName "interface2"
+   <EAL>
+     Coremask "0x4"
+     MemoryChannels "4"
+     ProcessType "secondary"
+     FilePrefix "rte"
+     SocketMemory "1024"
+   </EAL>
+   SharedMemObj "dpdk_collectd_stats_0"
+   EnabledPortMask 0xffff
+   PortName "interface1"
+   PortName "interface2"
  </Plugin>
 
 B<Options:>
 
-=over 4
+=head3 The EAL block
+
+=over 5
 
 =item B<Coremask> I<Mask>
 
@@ -2435,7 +2563,16 @@ The prefix text used for hugepage filenames. The filename will be set to
 =item B<SocketMemory> I<MB>
 
 A string containing amount of Memory to allocate from hugepages on specific
-sockets in MB
+sockets in MB. This is an optional value.
+
+=back
+
+=over 3
+
+=item B<SharedMemObj> I<Mask>
+A string containing the name of the shared memory object that should be used to
+share stats from the DPDK secondary process to the collectd dpdkstat plugin.
+Defaults to dpdk_collectd_stats if no other value is configured.
 
 =item B<EnabledPortMask> I<Mask>
 
@@ -2959,6 +3096,10 @@ allows to monitor instructions per clock (IPC).
 Monitor events are hardware dependant. Monitoring capabilities are detected on
 plugin initialization and only supported events are monitored.
 
+B<Note:> I<intel_rdt> plugin is using model-specific registers (MSRs), which
+require an additional capability to be enabled if collectd is run as a service.
+Please refer to I<contrib/systemd.collectd.service> file for more details.
+
 B<Synopsis:>
 
   <Plugin "intel_rdt">
@@ -3012,7 +3153,7 @@ See F</"IGNORELISTS"> for details.
 
 =item B<IgnoreSelected> I<true>|I<false>
 
-If no configuration if given, the B<interface>-plugin will collect data from
+If no configuration is given, the B<interface>-plugin will collect data from
 all interfaces. This may not be practical, especially for loopback- and
 similar interfaces. Thus, you can use the B<Interface>-option to pick the
 interfaces you're interested in. Sometimes, however, it's easier/preferred
@@ -3338,6 +3479,28 @@ TCP-Port to connect to. Defaults to B<411>.
 
 =back
 
+=head2 Plugin C<mcelog>
+
+The C<mcelog plugin> uses mcelog to retrieve machine check exceptions.
+
+By default the plugin connects to B<"/var/run/mcelog-client"> to check if the
+mcelog server is running. When the server is running, the plugin will tail the
+specified logfile to retrieve machine check exception information and send a
+notification with the details from the logfile. The plugin will use the mcelog
+client protocol to retrieve memory related machine check exceptions.
+
+=over 4
+
+=item B<McelogClientSocket> I<Path>
+Connect to the mcelog client socket using the UNIX domain socket at I<Path>.
+Defaults to B<"/var/run/mcelog-client">.
+
+=item B<McelogLogfile> I<Path>
+
+The mcelog file to parse. Defaults to B<"/var/log/mcelog">.
+
+=back
+
 =head2 Plugin C<md>
 
 The C<md plugin> collects information from Linux Software-RAID devices (md).
@@ -5108,6 +5271,35 @@ making it through.
 Add a UPS to collect data from. The format is identical to the one accepted by
 L<upsc(8)>.
 
+=item B<ForceSSL> B<true>|B<false>
+
+Stops connections from falling back to unsecured if an SSL connection
+cannot be established. Defaults to false if undeclared.
+
+=item B<VerifyPeer> I<true>|I<false>
+
+If set to true, requires a CAPath be provided. Will use the CAPath to find
+certificates to use as Trusted Certificates to validate a upsd server certificate.
+If validation of the upsd server certificate fails, the connection will not be
+established. If ForceSSL is undeclared or set to false, setting VerifyPeer to true
+will override and set ForceSSL to true.
+
+=item B<CAPath> I/path/to/certs/folder
+
+If VerifyPeer is set to true, this is required. Otherwise this is ignored.
+The folder pointed at must contain certificate(s) named according to their hash.
+Ex: XXXXXXXX.Y where X is the hash value of a cert and Y is 0. If name collisions
+occur because two different certs have the same hash value, Y can be  incremented
+in order to avoid conflict. To create a symbolic link to a certificate the following
+command can be used from within the directory where the cert resides:
+
+C<ln -s some.crt ./$(openssl x509 -hash -noout -in some.crt).0>
+
+Alternatively, the package openssl-perl provides a command C<c_rehash> that will
+generate links like the one described above for ALL certs in a given folder.
+Example usage:
+C<c_rehash /path/to/certs/folder>
+
 =back
 
 =head2 Plugin C<olsrd>
@@ -5455,6 +5647,123 @@ refer to them from.
 
 =back
 
+=head2 Plugin C<ovs_events>
+
+The I<ovs_events> plugin monitors the link status of I<Open vSwitch> (OVS)
+connected interfaces, dispatches the values to collectd and sends the
+notification whenever the link state change occurs. This plugin uses OVS
+database to get a link state change notification.
+
+B<Synopsis:>
+
+ <Plugin "ovs_events">
+   Port 6640
+   Address "127.0.0.1"
+   Socket "/var/run/openvswitch/db.sock"
+   Interfaces "br0" "veth0"
+   SendNotification true
+   DispatchValues false
+ </Plugin>
+
+The plugin provides the following configuration options:
+
+=over 4
+
+=item B<Address> I<node>
+
+The address of the OVS DB server JSON-RPC interface used by the plugin. To
+enable the interface, OVS DB daemon should be running with C<--remote=ptcp:>
+option. See L<ovsdb-server(1)> for more details. The option may be either
+network hostname, IPv4 numbers-and-dots notation or IPv6 hexadecimal string
+format. Defaults to B<'localhost'>.
+
+=item B<Port> I<service>
+
+TCP-port to connect to. Either a service name or a port number may be given.
+Defaults to B<6640>.
+
+=item B<Socket> I<path>
+
+The UNIX domain socket path of OVS DB server JSON-RPC interface used by the
+plugin. To enable the interface, the OVS DB daemon should be running with
+C<--remote=punix:> option. See L<ovsdb-server(1)> for more details. If this
+option is set, B<Address> and B<Port> options are ignored.
+
+=item B<Interfaces> [I<ifname> ...]
+
+List of interface names to be monitored by this plugin. If this option is not
+specified or is empty then all OVS connected interfaces on all bridges are
+monitored.
+
+Default: empty (all interfaces on all bridges are monitored)
+
+=item B<SendNotification> I<true|false>
+
+If set to true, OVS link notifications (interface status and OVS DB connection
+terminate) are sent to collectd. Default value is true.
+
+=item B<DispatchValues> I<true|false>
+
+Dispatch the OVS DB interface link status value with configured plugin interval.
+Defaults to false. Please note, if B<SendNotification> and B<DispatchValues>
+options are false, no OVS information will be provided by the plugin.
+
+=back
+
+B<Note:> By default, the global interval setting is used within which to
+retrieve the OVS link status. To configure a plugin-specific interval, please
+use B<Interval> option of the OVS B<LoadPlugin> block settings. For milliseconds
+simple divide the time by 1000 for example if the desired interval is 50ms, set
+interval to 0.05.
+
+=head2 Plugin C<ovs_stats>
+
+The I<ovs_stats> plugin collects statistics of OVS connected interfaces.
+This plugin uses OVSDB management protocol (RFC7047) monitor mechanism to get
+statistics from OVSDB
+
+B<Synopsis:>
+
+ <Plugin "ovs_stats">
+   Port 6640
+   Address "127.0.0.1"
+   Socket "/var/run/openvswitch/db.sock"
+   Bridges "br0" "br_ext"
+ </Plugin>
+
+The plugin provides the following configuration options:
+
+=over 4
+
+=item B<Address> I<node>
+
+The address of the OVS DB server JSON-RPC interface used by the plugin. To
+enable the interface, OVS DB daemon should be running with C<--remote=ptcp:>
+option. See L<ovsdb-server(1)> for more details. The option may be either
+network hostname, IPv4 numbers-and-dots notation or IPv6 hexadecimal string
+format. Defaults to B<'localhost'>.
+
+=item B<Port> I<service>
+
+TCP-port to connect to. Either a service name or a port number may be given.
+Defaults to B<6640>.
+
+=item B<Socket> I<path>
+
+The UNIX domain socket path of OVS DB server JSON-RPC interface used by the
+plugin. To enable the interface, the OVS DB daemon should be running with
+C<--remote=punix:> option. See L<ovsdb-server(1)> for more details. If this
+option is set, B<Address> and B<Port> options are ignored.
+
+=item B<Bridges> [I<brname> ...]
+
+List of OVS bridge names to be monitored by this plugin. If this option is
+omitted or is empty then all OVS bridges will be monitored.
+
+Default: empty (monitor all bridges)
+
+=back
+
 =head2 Plugin C<perl>
 
 This plugin embeds a Perl-interpreter into collectd and provides an interface
@@ -6243,9 +6552,15 @@ C<I<prefix>/var/run/collectd-powerdns>.
 =item B<Process> I<Name>
 
 Select more detailed statistics of processes matching this name. The statistics
-collected for these selected processes are size of the resident segment size
-(RSS), user- and system-time used, number of processes and number of threads,
-io data (where available) and minor and major pagefaults.
+collected for these selected processes are:
+ - size of the resident segment size (RSS)
+ - user- and system-time used
+ - number of processes
+ - number of threads
+ - number of open files (under Linux)
+ - io data (where available)
+ - context switches (under Linux)
+ - minor and major pagefaults.
 
 Some platforms have a limit on the length of process names. I<Name> must stay
 below this limit.
@@ -6867,6 +7182,115 @@ Since the configuration of the C<snmp plugin> is a little more complicated than
 other plugins, its documentation has been moved to an own manpage,
 L<collectd-snmp(5)>. Please see there for details.
 
+=head2 Plugin C<snmp_agent>
+
+The I<snmp_agent> plugin is an AgentX subagent that receives and handles queries
+from SNMP master agent and returns the data collected by read plugins.
+The I<snmp_agent> plugin handles requests only for OIDs specified in
+configuration file. To handle SNMP queries the plugin gets data from collectd
+and translates requested values from collectd's internal format to SNMP format.
+This plugin is a generic plugin and cannot work without configuration.
+For more details on AgentX subagent see
+<http://www.net-snmp.org/tutorial/tutorial-5/toolkit/demon/>
+
+B<Synopsis:>
+
+  <Plugin snmp_agent>
+    <Data "memAvailReal">
+      Plugin "memory"
+      Type "memory"
+      TypeInstance "free"
+      OIDs "1.3.6.1.4.1.2021.4.6.0"
+    </Data>
+    <Table "ifTable">
+      IndexOID "IF-MIB::ifIndex"
+      SizeOID "IF-MIB::ifNumber"
+      <Data "ifDescr">
+        Instance true
+        Plugin "interface"
+        OIDs "IF-MIB::ifDescr"
+      </Data>
+      <Data "ifOctets">
+        Plugin "interface"
+        Type "if_octets"
+        TypeInstance ""
+        OIDs "IF-MIB::ifInOctets" "IF-MIB::ifOutOctets"
+      </Data>
+    </Table>
+  </Plugin>
+
+There are two types of blocks that can be contained in the
+C<E<lt>PluginE<nbsp> snmp_agentE<gt>> block: B<Data> and B<Table>:
+
+=head3 The B<Data> block
+
+The B<Data> block defines a list OIDs that are to be handled. This block can
+define scalar or table OIDs. If B<Data> block is defined inside of B<Table>
+block it reperesents table OIDs.
+The following options can be set:
+
+=over 4
+
+=item B<Instance> I<true|false>
+
+When B<Instance> is set to B<true>, the value for requested OID is copied from
+plugin instance field of corresponding collectd value. If B<Data> block defines
+scalar data type B<Instance> has no effect and can be omitted.
+
+=item B<Plugin> I<String>
+
+Read plugin name whose collected data will be mapped to specified OIDs.
+
+=item B<Type> I<String>
+
+Collectd's type that is to be used for specified OID, e.E<nbsp>g. "if_octets"
+for example. The types are read from the B<TypesDB> (see L<collectd.conf(5)>).
+
+=item B<TypeInstance> I<String>
+
+Collectd's type-instance that is to be used for specified OID.
+
+=item B<OIDs> I<OID> [I<OID> ...]
+
+Configures the OIDs to be handled by I<snmp_agent> plugin. Values for these OIDs
+are taken from collectd data type specified by B<Plugin>, B<Type>,
+B<TypeInstance> fields of this B<Data> block. Number of the OIDs configured
+should correspond to number of values in specified B<Type>.
+For example two OIDs "IF-MIB::ifInOctets" "IF-MIB::ifOutOctets" can be mapped to
+"rx" and "tx" values of "if_octets" type.
+
+=item B<Scale> I<Value>
+
+The values taken from collectd are multiplied by I<Value>. The field is optional
+and the default is B<1.0>.
+
+=item B<Shift> I<Value>
+
+I<Value> is added to values from collectd after they have been multiplied by
+B<Scale> value. The field is optional and the default value is B<0.0>.
+
+=back
+
+=head3 The B<Table> block
+
+The B<Table> block defines a collection of B<Data> blocks that belong to one
+snmp table. In addition to multiple B<Data> blocks the following options can be
+set:
+
+=over 4
+
+=item B<IndexOID> I<OID>
+
+OID that is handled by the plugin and is mapped to numerical index value that is
+generated by the plugin for each table record.
+
+=item B<SizeOID> I<OID>
+
+OID that is handled by the plugin. Returned value is the number of records in
+the table. The field is optional.
+
+=back
+
 =head2 Plugin C<statsd>
 
 The I<statsd plugin> listens to a UDP socket, reads "events" in the statsd
@@ -7863,11 +8287,11 @@ Collect statistics about worker threads. False by default.
 
 =head2 Plugin C<virt>
 
-This plugin allows CPU, disk and network load to be collected for virtualized
-guests on the machine. This means that these metrics can be collected for guest
-systems without installing any software on them - I<collectd> only runs on the
-host system. The statistics are collected through libvirt
-(L<http://libvirt.org/>).
+This plugin allows CPU, disk, network load and other metrics to be collected for
+virtualized guests on the machine. The statistics are collected through libvirt
+API (L<http://libvirt.org/>). Majority of metrics can be gathered without
+installing any additional software on guests, especially I<collectd>, which runs
+only on the host system.
 
 Only I<Connection> is required.
 
@@ -8005,6 +8429,61 @@ You can also specify combinations of the B<name> and B<uuid> fields.
 For example B<name uuid> means to concatenate the guest name and UUID
 (with a literal colon character between, thus I<"foo:1234-1234-1234-1234">).
 
+=item B<Instances> B<integer>
+
+How many read instances you want to use for this plugin. The default is one,
+and the sensible setting is a multiple of the B<ReadThreads> value.
+If you are not sure, just use the default setting.
+
+=item B<ExtraStats> B<string>
+
+Report additional extra statistics. The default is no extra statistics, preserving
+the previous behaviour of the plugin. If unsure, leave the default. If enabled,
+allows the plugin to reported more detailed statistics about the behaviour of
+Virtual Machines. The argument is a space-separated list of selectors.
+
+Currently supported selectors are:
+
+=over 4
+
+=item B<cpu_util>: report CPU utilization per domain in percentage.
+
+=item B<disk>: report extra statistics like number of flush operations and total
+service time for read, write and flush operations. Requires libvirt API version
+I<0.9.5> or later.
+
+=item B<disk_err>: report disk errors if any occured. Requires libvirt API version
+I<0.9.10> or later.
+
+=item B<domain_state>: report domain state and reason in human-readable format as
+a notification. If libvirt API version I<0.9.2> or later is available, domain
+reason will be included in notification.
+
+=item B<fs_info>: report file system information as a notification. Requires
+libvirt API version I<1.2.11> or later. Can be collected only if I<Guest Agent>
+is installed and configured inside VM. Make sure that installed I<Guest Agent>
+version supports retrieving  file system information.
+
+=item B<job_stats_background>: report statistics about progress of a background
+job on a domain. Only one type of job statistics can be collected at the same time.
+Requires libvirt API version I<1.2.9> or later.
+
+=item B<job_stats_completed>: report statistics about a recently completed job on
+a domain. Only one type of job statistics can be collected at the same time.
+Requires libvirt API version I<1.2.9> or later.
+
+=item B<pcpu>: report the physical user/system cpu time consumed by the hypervisor, per-vm.
+Requires libvirt API version I<0.9.11> or later.
+
+=item B<perf>: report performance monitoring events. To collect performance
+metrics they must be enabled for domain and supported by the platform. Requires
+libvirt API version I<1.3.3> or later.
+B<Note>: I<perf> metrics can't be collected if I<intel_rdt> plugin is enabled.
+
+=item B<vcpupin>: report pinning of domain VCPUs to host physical CPUs.
+
+=back
+
 =back
 
 =head2 Plugin C<vmem>
@@ -8175,6 +8654,8 @@ packets.
 Synopsis:
 
  <Plugin write_tsdb>
+   ResolveInterval 60
+   ResolveJitter 60
    <Node "example">
      Host "tsd-1.my.domain"
      Port "4242"
@@ -8183,7 +8664,36 @@ Synopsis:
  </Plugin>
 
 The configuration consists of one or more E<lt>B<Node>E<nbsp>I<Name>E<gt>
-blocks. Inside the B<Node> blocks, the following options are recognized:
+blocks and global directives.
+
+Global directives are:
+
+=over 4
+
+=item B<ResolveInterval> I<seconds>
+
+=item B<ResolveJitter> I<seconds>
+
+When I<collectd> connects to a TSDB node, it will request the hostname from
+DNS. This can become a problem if the TSDB node is unavailable or badly
+configured because collectd will request DNS in order to reconnect for every
+metric, which can flood your DNS. So you can cache the last value for
+I<ResolveInterval> seconds.
+Defaults to the I<Interval> of the I<write_tsdb plugin>, e.g. 10E<nbsp>seconds.
+
+You can also define a jitter, a random interval to wait in addition to
+I<ResolveInterval>. This prevents all your collectd servers to resolve the
+hostname at the same time when the connection fails.
+Defaults to the I<Interval> of the I<write_tsdb plugin>, e.g. 10E<nbsp>seconds.
+
+B<Note:> If the DNS resolution has already been successful when the socket
+closes, the plugin will try to reconnect immediately with the cached
+information. DNS is queried only when the socket is closed for a longer than
+I<ResolveInterval> + I<ResolveJitter> seconds.
+
+=back
+
+Inside the B<Node> blocks, the following options are recognized:
 
 =over 4
 
@@ -8400,6 +8910,23 @@ create output in the I<JavaScript Object Notation> (JSON). When set to KAIROSDB
 
 Defaults to B<Command>.
 
+=item B<Attribute> I<String> I<String>
+
+Only available for the KAIROSDB output format.
+
+Consider the two given strings to be the key and value of an additional tag for
+each metric being sent out.
+
+You can add multiple B<Attribute>.
+
+=item B<TTL> I<Int>
+
+Only available for the KAIROSDB output format.
+
+Sets the Cassandra ttl for the data points.
+
+Please refer to L<http://kairosdb.github.io/docs/build/html/restapi/AddDataPoints.html?highlight=ttl>
+
 =item B<Metrics> B<true>|B<false>
 
 Controls whether I<metrics> are POSTed to this location. Defaults to B<true>.
index 30d1cdc..4b0db2a 100644 (file)
@@ -138,12 +138,12 @@ static int array_grow(void **array, size_t *array_len, size_t elem_size) {
   tmp = realloc(*array, (*array_len + 1) * elem_size);
   if (tmp == NULL) {
     fprintf(stderr, "ERROR: Failed to allocate memory.\n");
-    return (-1);
+    return -1;
   }
 
   *array = tmp;
   ++(*array_len);
-  return (0);
+  return 0;
 } /* array_grow */
 
 static int parse_identifier(lcc_connection_t *c, const char *value,
@@ -162,7 +162,7 @@ static int parse_identifier(lcc_connection_t *c, const char *value,
     if (gethostname(hostname, sizeof(hostname)) != 0) {
       fprintf(stderr, "ERROR: Failed to get local hostname: %s",
               strerror(errno));
-      return (-1);
+      return -1;
     }
     hostname[sizeof(hostname) - 1] = '\0';
 
@@ -177,9 +177,9 @@ static int parse_identifier(lcc_connection_t *c, const char *value,
   if (status != 0) {
     fprintf(stderr, "ERROR: Failed to parse identifier ``%s'': %s.\n",
             ident_str, lcc_strerror(c));
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* parse_identifier */
 
 static int getval(lcc_connection_t *c, int argc, char **argv) {
@@ -195,12 +195,12 @@ static int getval(lcc_connection_t *c, int argc, char **argv) {
 
   if (argc != 2) {
     fprintf(stderr, "ERROR: getval: Missing identifier.\n");
-    return (-1);
+    return -1;
   }
 
   status = parse_identifier(c, argv[1], &ident);
   if (status != 0)
-    return (status);
+    return status;
 
 #define BAIL_OUT(s)                                                            \
   do {                                                                         \
@@ -212,7 +212,7 @@ static int getval(lcc_connection_t *c, int argc, char **argv) {
       free(ret_values_names);                                                  \
     }                                                                          \
     ret_values_num = 0;                                                        \
-    return (s);                                                                \
+    return s;                                                                  \
   } while (0)
 
   status =
@@ -249,7 +249,7 @@ static int flush(lcc_connection_t *c, int argc, char **argv) {
     if (plugins != NULL)                                                       \
       free(plugins);                                                           \
     plugins_num = 0;                                                           \
-    return (s);                                                                \
+    return s;                                                                  \
   } while (0)
 
   for (int i = 1; i < argc; ++i) {
@@ -347,7 +347,7 @@ static int listval(lcc_connection_t *c, int argc, char **argv) {
 
   if (argc != 1) {
     fprintf(stderr, "ERROR: listval: Does not accept any arguments.\n");
-    return (-1);
+    return -1;
   }
 
 #define BAIL_OUT(s)                                                            \
@@ -355,7 +355,7 @@ static int listval(lcc_connection_t *c, int argc, char **argv) {
     if (ret_ident != NULL)                                                     \
       free(ret_ident);                                                         \
     ret_ident_num = 0;                                                         \
-    return (s);                                                                \
+    return s;                                                                  \
   } while (0)
 
   status = lcc_listval(c, &ret_ident, &ret_ident_num);
@@ -396,7 +396,7 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
   if (argc < 3) {
     fprintf(stderr, "ERROR: putval: Missing identifier "
                     "and/or value list.\n");
-    return (-1);
+    return -1;
   }
 
   vl.values = values;
@@ -404,7 +404,7 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
 
   status = parse_identifier(c, argv[1], &vl.identifier);
   if (status != 0)
-    return (status);
+    return status;
 
   for (int i = 2; i < argc; ++i) {
     char *tmp;
@@ -426,7 +426,7 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
         if (endptr == value) {
           fprintf(stderr, "ERROR: Failed to parse interval as number: %s.\n",
                   value);
-          return (-1);
+          return -1;
         } else if ((endptr != NULL) && (*endptr != '\0')) {
           fprintf(stderr, "WARNING: Ignoring trailing garbage after "
                           "interval: %s.\n",
@@ -434,7 +434,7 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
         }
       } else {
         fprintf(stderr, "ERROR: putval: Unknown option `%s'.\n", key);
-        return (-1);
+        return -1;
       }
     } else { /* value list */
       char *value;
@@ -443,7 +443,7 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
 
       if (tmp == NULL) {
         fprintf(stderr, "ERROR: putval: Invalid value list: %s.\n", argv[i]);
-        return (-1);
+        return -1;
       }
 
       *tmp = '\0';
@@ -459,10 +459,10 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
         if (endptr == argv[i]) {
           fprintf(stderr, "ERROR: Failed to parse time as number: %s.\n",
                   argv[i]);
-          return (-1);
+          return -1;
         } else if ((endptr != NULL) && (*endptr != '\0')) {
           fprintf(stderr, "ERROR: Garbage after time: %s.\n", endptr);
-          return (-1);
+          return -1;
         }
       }
 
@@ -499,10 +499,10 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
         if (endptr == value) {
           fprintf(stderr, "ERROR: Failed to parse value as number: %s.\n",
                   argv[i]);
-          return (-1);
+          return -1;
         } else if ((endptr != NULL) && (*endptr != '\0')) {
           fprintf(stderr, "ERROR: Garbage after value: %s.\n", endptr);
-          return (-1);
+          return -1;
         }
 
         value = tmp;
@@ -514,16 +514,16 @@ static int putval(lcc_connection_t *c, int argc, char **argv) {
       status = lcc_putval(c, &vl);
       if (status != 0) {
         fprintf(stderr, "ERROR: %s\n", lcc_strerror(c));
-        return (-1);
+        return -1;
       }
     }
   }
 
   if (values_len == 0) {
     fprintf(stderr, "ERROR: putval: Missing value list(s).\n");
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* putval */
 
 int main(int argc, char **argv) {
@@ -563,7 +563,7 @@ int main(int argc, char **argv) {
   if (status != 0) {
     fprintf(stderr, "ERROR: Failed to connect to daemon at %s: %s.\n", address,
             strerror(errno));
-    return (1);
+    return 1;
   }
 
   if (strcasecmp(argv[optind], "getval") == 0)
@@ -576,14 +576,12 @@ int main(int argc, char **argv) {
     status = putval(c, argc - optind, argv + optind);
   else {
     fprintf(stderr, "%s: invalid command: %s\n", argv[0], argv[optind]);
-    return (1);
+    return 1;
   }
 
   LCC_DESTROY(c);
 
   if (status != 0)
-    return (status);
-  return (0);
+    return status;
+  return 0;
 } /* main */
-
-/* vim: set sw=2 ts=2 tw=78 expandtab : */
index 9040f8d..4a7d1a6 100644 (file)
@@ -386,5 +386,3 @@ int main(int argc, char **argv) {
   free(collectd_argv);
   return 0;
 } /* main */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 8a9200d..3cd2dee 100644 (file)
@@ -70,13 +70,13 @@ static int conntrack_read(void) {
   char const *path = old_files ? CONNTRACK_FILE_OLD : CONNTRACK_FILE;
   if (parse_value_file(path, &conntrack, DS_TYPE_GAUGE) != 0) {
     ERROR("conntrack plugin: Reading \"%s\" failed.", path);
-    return (-1);
+    return -1;
   }
 
   path = old_files ? CONNTRACK_MAX_FILE_OLD : CONNTRACK_MAX_FILE;
   if (parse_value_file(path, &conntrack_max, DS_TYPE_GAUGE) != 0) {
     ERROR("conntrack plugin: Reading \"%s\" failed.", path);
-    return (-1);
+    return -1;
   }
 
   conntrack_pct.gauge = (conntrack.gauge / conntrack_max.gauge) * 100;
@@ -85,7 +85,7 @@ static int conntrack_read(void) {
   conntrack_submit("conntrack", "max", conntrack_max);
   conntrack_submit("percent", "used", conntrack_pct);
 
-  return (0);
+  return 0;
 } /* static int conntrack_read */
 
 void module_register(void) {
index 1d73f04..461fb0a 100644 (file)
@@ -69,7 +69,7 @@ static int cs_read(void) {
   if (status != 0) {
     ERROR("contextswitch plugin: sysctlbyname "
           "(vm.stats.sys.v_swtch) failed");
-    return (-1);
+    return -1;
   }
 
   cs_submit(value);
@@ -87,7 +87,7 @@ static int cs_read(void) {
   if (fh == NULL) {
     ERROR("contextswitch plugin: unable to open /proc/stat: %s",
           sstrerror(errno, buffer, sizeof(buffer)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -129,7 +129,7 @@ static int cs_read(void) {
     char errbuf[1024];
     ERROR("contextswitch plugin: perfstat_cpu_total: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   cs_submit(perfcputotal.pswitch);
index 9091fef..a5a136e 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
@@ -209,9 +209,9 @@ static int cpu_config(char const *key, char const *value) /* {{{ */
   else if (strcasecmp(key, "ReportNumCpu") == 0)
     report_num_cpu = IS_TRUE(value) ? 1 : 0;
   else
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* }}} int cpu_config */
 
 static int init(void) {
@@ -229,12 +229,12 @@ static int init(void) {
           "load information. "
           "<https://collectd.org/bugs/22>");
     cpu_list_len = 0;
-    return (-1);
+    return -1;
   }
   if (status != KERN_SUCCESS) {
     ERROR("cpu plugin: host_processors() failed with status %d.", (int)status);
     cpu_list_len = 0;
-    return (-1);
+    return -1;
   }
 
   INFO("cpu plugin: Found %i processor%s.", (int)cpu_list_len,
@@ -247,7 +247,7 @@ static int init(void) {
   numcpu = 0;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   /* Solaris doesn't count linear.. *sigh* */
   for (numcpu = 0, ksp_chain = kc->kc_chain;
@@ -269,7 +269,7 @@ static int init(void) {
   if (status == -1) {
     char errbuf[1024];
     WARNING("cpu plugin: sysctl: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 /* #endif CAN_USE_SYSCTL */
 
@@ -282,7 +282,7 @@ static int init(void) {
     char errbuf[1024];
     WARNING("cpu plugin: sysctlbyname(hw.ncpu): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
 #ifdef HAVE_SYSCTL_KERN_CP_TIMES
@@ -292,7 +292,7 @@ static int init(void) {
     char errbuf[1024];
     WARNING("cpu plugin: sysctlbyname(kern.smp.maxcpus): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 #else
   if (numcpu != 1)
@@ -310,7 +310,7 @@ static int init(void) {
 /* nothing to initialize */
 #endif /* HAVE_PERFSTAT */
 
-  return (0);
+  return 0;
 } /* int init */
 
 static void submit_value(int cpu_num, int cpu_state, const char *type,
@@ -362,7 +362,7 @@ static int cpu_states_alloc(size_t cpu_num) /* {{{ */
   tmp = realloc(cpu_states, sz * sizeof(*cpu_states));
   if (tmp == NULL) {
     ERROR("cpu plugin: realloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
   cpu_states = tmp;
   tmp = cpu_states + cpu_states_num;
@@ -377,9 +377,9 @@ static cpu_state_t *get_cpu_state(size_t cpu_num, size_t state) /* {{{ */
   size_t index = ((cpu_num * COLLECTD_CPU_STATE_MAX) + state);
 
   if (index >= cpu_states_num)
-    return (NULL);
+    return NULL;
 
-  return (&cpu_states[index]);
+  return &cpu_states[index];
 } /* }}} cpu_state_t *get_cpu_state */
 
 #if defined(HAVE_PERFSTAT) /* {{{ */
@@ -390,13 +390,13 @@ static int total_rate(gauge_t *sum_by_state, size_t state, derive_t d,
   int status =
       value_to_rate(&rate, (value_t){.derive = d}, DS_TYPE_DERIVE, now, conv);
   if (status != 0)
-    return (status);
+    return status;
 
   sum_by_state[state] = rate;
 
   if (state != COLLECTD_CPU_STATE_IDLE)
     RATE_ADD(sum_by_state[COLLECTD_CPU_STATE_ACTIVE], sum_by_state[state]);
-  return (0);
+  return 0;
 }
 #endif /* }}} HAVE_PERFSTAT */
 
@@ -567,11 +567,11 @@ static int cpu_stage(size_t cpu_num, size_t state, derive_t d,
   value_t val = {.derive = d};
 
   if (state >= COLLECTD_CPU_STATE_ACTIVE)
-    return (EINVAL);
+    return EINVAL;
 
   status = cpu_states_alloc(cpu_num);
   if (status != 0)
-    return (status);
+    return status;
 
   if (global_cpu_num <= cpu_num)
     global_cpu_num = cpu_num + 1;
@@ -580,11 +580,11 @@ static int cpu_stage(size_t cpu_num, size_t state, derive_t d,
 
   status = value_to_rate(&rate, val, DS_TYPE_DERIVE, now, &s->conv);
   if (status != 0)
-    return (status);
+    return status;
 
   s->rate = rate;
   s->has_value = 1;
-  return (0);
+  return 0;
 } /* }}} int cpu_stage */
 
 static int cpu_read(void) {
@@ -639,7 +639,7 @@ static int cpu_read(void) {
     char errbuf[1024];
     ERROR("cpu plugin: fopen (/proc/stat) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buf, 1024, fh) != NULL) {
@@ -678,7 +678,7 @@ static int cpu_read(void) {
   static cpu_stat_t cs;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (int cpu = 0; cpu < numcpu; cpu++) {
     if (kstat_read(kc, ksp[cpu], &cs) == -1)
@@ -703,7 +703,7 @@ static int cpu_read(void) {
   if (numcpu < 1) {
     ERROR("cpu plugin: Could not determine number of "
           "installed CPUs using sysctl(3).");
-    return (-1);
+    return -1;
   }
 
   memset(cpuinfo, 0, sizeof(cpuinfo));
@@ -721,7 +721,7 @@ static int cpu_read(void) {
         char errbuf[1024];
         ERROR("cpu plugin: sysctl failed: %s.",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
     }
   } else
@@ -738,7 +738,7 @@ static int cpu_read(void) {
       char errbuf[1024];
       ERROR("cpu plugin: sysctl failed: %s.",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
 
     for (int i = 0; i < CPUSTATES; i++) {
@@ -768,7 +768,7 @@ static int cpu_read(void) {
     char errbuf[1024];
     ERROR("cpu plugin: sysctlbyname failed: %s.",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < numcpu; i++) {
@@ -791,7 +791,7 @@ static int cpu_read(void) {
     char errbuf[1024];
     ERROR("cpu plugin: sysctlbyname failed: %s.",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   cpu_stage(0, COLLECTD_CPU_STATE_USER, (derive_t)cpuinfo[CP_USER], now);
@@ -807,7 +807,7 @@ static int cpu_read(void) {
 
   if (cs == NULL) {
     ERROR("cpu plugin: sg_get_cpu_stats failed.");
-    return (-1);
+    return -1;
   }
 
   cpu_state(0, COLLECTD_CPU_STATE_IDLE, (derive_t)cs->idle);
@@ -827,7 +827,7 @@ static int cpu_read(void) {
     char errbuf[1024];
     WARNING("cpu plugin: perfstat_cpu: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (pnumcpu != numcpu || perfcpu == NULL) {
@@ -841,7 +841,7 @@ static int cpu_read(void) {
     char errbuf[1024];
     WARNING("cpu plugin: perfstat_cpu: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < cpus; i++) {
@@ -854,7 +854,7 @@ static int cpu_read(void) {
 
   cpu_commit();
   cpu_reset();
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -862,5 +862,3 @@ void module_register(void) {
   plugin_register_config("cpu", cpu_config, config_keys, config_keys_num);
   plugin_register_read("cpu", cpu_read);
 } /* void module_register */
-
-/* vim: set sw=8 sts=8 noet fdm=marker : */
index c3080cb..608e60e 100644 (file)
@@ -52,7 +52,7 @@ static int cpufreq_init(void) {
   if (num_cpu == 0)
     plugin_unregister_read("cpufreq");
 
-  return (0);
+  return 0;
 } /* int cpufreq_init */
 
 static void cpufreq_submit(int cpu_num, value_t value) {
@@ -85,7 +85,7 @@ static int cpufreq_read(void) {
     cpufreq_submit(i, v);
   }
 
-  return (0);
+  return 0;
 } /* int cpufreq_read */
 
 void module_register(void) {
index 62988fb..aa14cc1 100644 (file)
@@ -51,12 +51,12 @@ static int cpusleep_read(void) {
   struct timespec b, m;
   if (clock_gettime(CLOCK_BOOTTIME, &b) < 0) {
     ERROR("cpusleep plugin: clock_boottime failed");
-    return (-1);
+    return -1;
   }
 
   if (clock_gettime(CLOCK_MONOTONIC, &m) < 0) {
     ERROR("cpusleep plugin: clock_monotonic failed");
-    return (-1);
+    return -1;
   }
 
   // to avoid false positives in counter overflow due to reboot,
@@ -67,7 +67,7 @@ static int cpusleep_read(void) {
 
   cpusleep_submit(sleep);
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index c1759f5..e4c84f7 100644 (file)
--- a/src/csv.c
+++ b/src/csv.c
@@ -49,7 +49,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
 
   status = ssnprintf(buffer, buffer_len, "%.3f", CDTIME_T_TO_DOUBLE(vl->time));
   if ((status < 1) || (status >= buffer_len))
-    return (-1);
+    return -1;
   offset = status;
 
   for (size_t i = 0; i < ds->ds_num; i++) {
@@ -58,7 +58,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
         (ds->ds[i].type != DS_TYPE_DERIVE) &&
         (ds->ds[i].type != DS_TYPE_ABSOLUTE)) {
       sfree(rates);
-      return (-1);
+      return -1;
     }
 
     if (ds->ds[i].type == DS_TYPE_GAUGE) {
@@ -70,7 +70,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
       if (rates == NULL) {
         WARNING("csv plugin: "
                 "uc_get_rate failed.");
-        return (-1);
+        return -1;
       }
       status =
           ssnprintf(buffer + offset, buffer_len - offset, ",%lf", rates[i]);
@@ -87,14 +87,14 @@ static int value_list_to_string(char *buffer, int buffer_len,
 
     if ((status < 1) || (status >= (buffer_len - offset))) {
       sfree(rates);
-      return (-1);
+      return -1;
     }
 
     offset += status;
   } /* for ds->ds_num */
 
   sfree(rates);
-  return (0);
+  return 0;
 } /* int value_list_to_string */
 
 static int value_list_to_filename(char *buffer, size_t buffer_size,
@@ -110,7 +110,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
     size_t len = strlen(datadir) + 1;
 
     if (len >= ptr_size)
-      return (ENOBUFS);
+      return ENOBUFS;
 
     memcpy(ptr, datadir, len);
     ptr[len - 1] = '/';
@@ -120,12 +120,12 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
 
   status = FORMAT_VL(ptr, ptr_size, vl);
   if (status != 0)
-    return (status);
+    return status;
 
   /* Skip all the time formatting stuff when printing to STDOUT or
    * STDERR. */
   if (use_stdio)
-    return (0);
+    return 0;
 
   ptr_size -= strlen(ptr);
   ptr += strlen(ptr);
@@ -133,7 +133,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
   /* "-2013-07-12" => 11 bytes */
   if (ptr_size < 12) {
     ERROR("csv plugin: Buffer too small.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   /* TODO: Find a way to minimize the calls to `localtime_r',
@@ -141,31 +141,31 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
   now = time(NULL);
   if (localtime_r(&now, &struct_tm) == NULL) {
     ERROR("csv plugin: localtime_r failed");
-    return (-1);
+    return -1;
   }
 
   status = strftime(ptr, ptr_size, "-%Y-%m-%d", &struct_tm);
   if (status == 0) /* yep, it returns zero on error. */
   {
     ERROR("csv plugin: strftime failed");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int value_list_to_filename */
 
 static int csv_create_file(const char *filename, const data_set_t *ds) {
   FILE *csv;
 
   if (check_create_dir(filename))
-    return (-1);
+    return -1;
 
   csv = fopen(filename, "w");
   if (csv == NULL) {
     char errbuf[1024];
     ERROR("csv plugin: fopen (%s) failed: %s", filename,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   fprintf(csv, "epoch");
@@ -186,10 +186,10 @@ static int csv_config(const char *key, const char *value) {
     }
     if (strcasecmp("stdout", value) == 0) {
       use_stdio = 1;
-      return (0);
+      return 0;
     } else if (strcasecmp("stderr", value) == 0) {
       use_stdio = 2;
-      return (0);
+      return 0;
     }
     datadir = strdup(value);
     if (datadir != NULL) {
@@ -209,9 +209,9 @@ static int csv_config(const char *key, const char *value) {
     else
       store_rates = 0;
   } else {
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* int csv_config */
 
 static int csv_write(const data_set_t *ds, const value_list_t *vl,
@@ -231,12 +231,12 @@ static int csv_write(const data_set_t *ds, const value_list_t *vl,
 
   status = value_list_to_filename(filename, sizeof(filename), vl);
   if (status != 0)
-    return (-1);
+    return -1;
 
   DEBUG("csv plugin: csv_write: filename = %s;", filename);
 
   if (value_list_to_string(values, sizeof(values), ds, vl) != 0)
-    return (-1);
+    return -1;
 
   if (use_stdio) {
     escape_string(filename, sizeof(filename));
@@ -251,22 +251,22 @@ static int csv_write(const data_set_t *ds, const value_list_t *vl,
 
     fprintf(use_stdio == 1 ? stdout : stderr, "PUTVAL %s interval=%.3f %s\n",
             filename, CDTIME_T_TO_DOUBLE(vl->interval), values);
-    return (0);
+    return 0;
   }
 
   if (stat(filename, &statbuf) == -1) {
     if (errno == ENOENT) {
       if (csv_create_file(filename, ds))
-        return (-1);
+        return -1;
     } else {
       char errbuf[1024];
       ERROR("stat(%s) failed: %s", filename,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   } else if (!S_ISREG(statbuf.st_mode)) {
     ERROR("stat(%s): Not a regular file!", filename);
-    return (-1);
+    return -1;
   }
 
   csv = fopen(filename, "a");
@@ -274,7 +274,7 @@ static int csv_write(const data_set_t *ds, const value_list_t *vl,
     char errbuf[1024];
     ERROR("csv plugin: fopen (%s) failed: %s", filename,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   csv_fd = fileno(csv);
 
@@ -288,7 +288,7 @@ static int csv_write(const data_set_t *ds, const value_list_t *vl,
     ERROR("csv plugin: flock (%s) failed: %s", filename,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     fclose(csv);
-    return (-1);
+    return -1;
   }
 
   fprintf(csv, "%s\n", values);
@@ -297,7 +297,7 @@ static int csv_write(const data_set_t *ds, const value_list_t *vl,
    * because the `FILE *' may need to flush a cache first */
   fclose(csv);
 
-  return (0);
+  return 0;
 } /* int csv_write */
 
 void module_register(void) {
index c6f0b60..808f242 100644 (file)
@@ -97,11 +97,11 @@ static size_t cc_curl_callback(void *buf, /* {{{ */
 
   len = size * nmemb;
   if (len == 0)
-    return (len);
+    return len;
 
   wp = user_data;
   if (wp == NULL)
-    return (0);
+    return 0;
 
   if ((wp->buffer_fill + len) >= wp->buffer_size) {
     char *temp;
@@ -111,7 +111,7 @@ static size_t cc_curl_callback(void *buf, /* {{{ */
     temp = realloc(wp->buffer, temp_size);
     if (temp == NULL) {
       ERROR("curl plugin: realloc failed.");
-      return (0);
+      return 0;
     }
     wp->buffer = temp;
     wp->buffer_size = temp_size;
@@ -121,7 +121,7 @@ static size_t cc_curl_callback(void *buf, /* {{{ */
   wp->buffer_fill += len;
   wp->buffer[wp->buffer_fill] = 0;
 
-  return (len);
+  return len;
 } /* }}} size_t cc_curl_callback */
 
 static void cc_web_match_free(web_match_t *wm) /* {{{ */
@@ -170,16 +170,16 @@ static int cc_config_append_string(const char *name,
   struct curl_slist *temp = NULL;
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl plugin: `%s' needs exactly one string argument.", name);
-    return (-1);
+    return -1;
   }
 
   temp = curl_slist_append(*dest, ci->values[0].value.string);
   if (temp == NULL)
-    return (-1);
+    return -1;
 
   *dest = temp;
 
-  return (0);
+  return 0;
 } /* }}} int cc_config_append_string */
 
 static int cc_config_add_match_dstype(int *dstype_ret, /* {{{ */
@@ -188,7 +188,7 @@ static int cc_config_add_match_dstype(int *dstype_ret, /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl plugin: `DSType' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   if (strncasecmp("Gauge", ci->values[0].value.string, strlen("Gauge")) == 0) {
@@ -243,11 +243,11 @@ static int cc_config_add_match_dstype(int *dstype_ret, /* {{{ */
   if (dstype == 0) {
     WARNING("curl plugin: `%s' is not a valid argument to `DSType'.",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   *dstype_ret = dstype;
-  return (0);
+  return 0;
 } /* }}} int cc_config_add_match_dstype */
 
 static int cc_config_add_match(web_page_t *page, /* {{{ */
@@ -262,7 +262,7 @@ static int cc_config_add_match(web_page_t *page, /* {{{ */
   match = calloc(1, sizeof(*match));
   if (match == NULL) {
     ERROR("curl plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -309,7 +309,7 @@ static int cc_config_add_match(web_page_t *page, /* {{{ */
 
   if (status != 0) {
     cc_web_match_free(match);
-    return (status);
+    return status;
   }
 
   match->match =
@@ -317,7 +317,7 @@ static int cc_config_add_match(web_page_t *page, /* {{{ */
   if (match->match == NULL) {
     ERROR("curl plugin: match_create_simple failed.");
     cc_web_match_free(match);
-    return (-1);
+    return -1;
   } else {
     web_match_t *prev;
 
@@ -331,7 +331,7 @@ static int cc_config_add_match(web_page_t *page, /* {{{ */
       prev->next = match;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cc_config_add_match */
 
 static int cc_page_init_curl(web_page_t *wp) /* {{{ */
@@ -339,7 +339,7 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */
   wp->curl = curl_easy_init();
   if (wp->curl == NULL) {
     ERROR("curl plugin: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(wp->curl, CURLOPT_NOSIGNAL, 1L);
@@ -366,7 +366,7 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */
     wp->credentials = malloc(credentials_size);
     if (wp->credentials == NULL) {
       ERROR("curl plugin: malloc failed.");
-      return (-1);
+      return -1;
     }
 
     ssnprintf(wp->credentials, credentials_size, "%s:%s", wp->user,
@@ -395,7 +395,7 @@ static int cc_page_init_curl(web_page_t *wp) /* {{{ */
                      (long)CDTIME_T_TO_MS(plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int cc_page_init_curl */
 
 static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */
@@ -405,13 +405,13 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl plugin: `Page' blocks need exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   page = calloc(1, sizeof(*page));
   if (page == NULL) {
     ERROR("curl plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   page->url = NULL;
   page->user = NULL;
@@ -428,7 +428,7 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */
   if (page->instance == NULL) {
     ERROR("curl plugin: strdup failed.");
     sfree(page);
-    return (-1);
+    return -1;
   }
 
   /* Process all children */
@@ -501,7 +501,7 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     cc_web_page_free(page);
-    return (status);
+    return status;
   }
 
   /* Add the new page to the linked list */
@@ -516,7 +516,7 @@ static int cc_config_add_page(oconfig_item_t *ci) /* {{{ */
     prev->next = page;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cc_config_add_page */
 
 static int cc_config(oconfig_item_t *ci) /* {{{ */
@@ -545,20 +545,20 @@ static int cc_config(oconfig_item_t *ci) /* {{{ */
 
   if ((success == 0) && (errors > 0)) {
     ERROR("curl plugin: All statements failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cc_config */
 
 static int cc_init(void) /* {{{ */
 {
   if (pages_g == NULL) {
     INFO("curl plugin: No pages have been defined.");
-    return (-1);
+    return -1;
   }
   curl_global_init(CURL_GLOBAL_SSL);
-  return (0);
+  return 0;
 } /* }}} int cc_init */
 
 static void cc_submit(const web_page_t *wp, const web_match_t *wm, /* {{{ */
@@ -615,7 +615,7 @@ static int cc_read_page(web_page_t *wp) /* {{{ */
   if (status != CURLE_OK) {
     ERROR("curl plugin: curl_easy_perform failed with status %i: %s", status,
           wp->curl_errbuf);
-    return (-1);
+    return -1;
   }
 
   if (wp->response_time)
@@ -654,7 +654,7 @@ static int cc_read_page(web_page_t *wp) /* {{{ */
     match_value_reset(mv);
   } /* for (wm = wp->matches; wm != NULL; wm = wm->next) */
 
-  return (0);
+  return 0;
 } /* }}} int cc_read_page */
 
 static int cc_read(void) /* {{{ */
@@ -662,7 +662,7 @@ static int cc_read(void) /* {{{ */
   for (web_page_t *wp = pages_g; wp != NULL; wp = wp->next)
     cc_read_page(wp);
 
-  return (0);
+  return 0;
 } /* }}} int cc_read */
 
 static int cc_shutdown(void) /* {{{ */
@@ -670,7 +670,7 @@ static int cc_shutdown(void) /* {{{ */
   cc_web_page_free(pages_g);
   pages_g = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int cc_shutdown */
 
 void module_register(void) {
@@ -679,5 +679,3 @@ void module_register(void) {
   plugin_register_read("curl", cc_read);
   plugin_register_shutdown("curl", cc_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 6f31145..8037742 100644 (file)
@@ -44,8 +44,6 @@
 #endif
 
 #define CJ_DEFAULT_HOST "localhost"
-#define CJ_KEY_MAGIC 0x43484b59UL /* CHKY */
-#define CJ_IS_KEY(key) ((key)->magic == CJ_KEY_MAGIC)
 #define CJ_ANY "*"
 #define COUCH_MIN(x, y) ((x) < (y) ? (x) : (y))
 
@@ -53,13 +51,34 @@ struct cj_key_s;
 typedef struct cj_key_s cj_key_t;
 struct cj_key_s /* {{{ */
 {
-  unsigned long magic;
   char *path;
   char *type;
   char *instance;
 };
 /* }}} */
 
+/* cj_tree_entry_t is a union of either a metric configuration ("key") or a tree
+ * mapping array indexes / map keys to a descendant cj_tree_entry_t*. */
+typedef struct {
+  enum { KEY, TREE } type;
+  union {
+    c_avl_tree_t *tree;
+    cj_key_t *key;
+  };
+} cj_tree_entry_t;
+
+/* cj_state_t is a stack providing the configuration relevant for the context
+ * that is currently being parsed. If entry->type == KEY, the parser should
+ * expect a metric (a numeric value). If entry->type == TREE, the parser should
+ * expect an array of map to descent into. If entry == NULL, no configuration
+ * exists for this part of the JSON structure. */
+typedef struct {
+  cj_tree_entry_t *entry;
+  _Bool in_array;
+  int index;
+  char name[DATA_MAX_NAME_LEN];
+} cj_state_t;
+
 struct cj_s /* {{{ */
 {
   char *instance;
@@ -86,17 +105,8 @@ struct cj_s /* {{{ */
 
   yajl_handle yajl;
   c_avl_tree_t *tree;
-  cj_key_t *key;
   int depth;
-  struct {
-    union {
-      c_avl_tree_t *tree;
-      cj_key_t *key;
-    };
-    _Bool in_array;
-    int index;
-    char name[DATA_MAX_NAME_LEN];
-  } state[YAJL_MAX_DEPTH];
+  cj_state_t state[YAJL_MAX_DEPTH];
 };
 typedef struct cj_s cj_t; /* }}} */
 
@@ -107,7 +117,11 @@ typedef unsigned int yajl_len_t;
 #endif
 
 static int cj_read(user_data_t *ud);
-static void cj_submit(cj_t *db, cj_key_t *key, value_t *value);
+static void cj_submit_impl(cj_t *db, cj_key_t *key, value_t *value);
+
+/* cj_submit is a function pointer to cj_submit_impl, allowing the unit-test to
+ * overwrite which function is called. */
+static void (*cj_submit)(cj_t *, cj_key_t *, value_t *) = cj_submit_impl;
 
 static size_t cj_curl_callback(void *buf, /* {{{ */
                                size_t size, size_t nmemb, void *user_data) {
@@ -118,18 +132,18 @@ static size_t cj_curl_callback(void *buf, /* {{{ */
   len = size * nmemb;
 
   if (len == 0)
-    return (len);
+    return len;
 
   db = user_data;
   if (db == NULL)
-    return (0);
+    return 0;
 
   status = yajl_parse(db->yajl, (unsigned char *)buf, len);
   if (status == yajl_status_ok)
-    return (len);
+    return len;
 #if !HAVE_YAJL_V2
   else if (status == yajl_status_insufficient_data)
-    return (len);
+    return len;
 #endif
 
   unsigned char *msg =
@@ -137,16 +151,14 @@ static size_t cj_curl_callback(void *buf, /* {{{ */
                      /* jsonText = */ (unsigned char *)buf, (unsigned int)len);
   ERROR("curl_json plugin: yajl_parse failed: %s", msg);
   yajl_free_error(db->yajl, msg);
-  return (0); /* abort write callback */
+  return 0; /* abort write callback */
 } /* }}} size_t cj_curl_callback */
 
 static int cj_get_type(cj_key_t *key) {
-  const data_set_t *ds;
-
-  if ((key == NULL) || !CJ_IS_KEY(key))
+  if (key == NULL)
     return -EINVAL;
 
-  ds = plugin_get_ds(key->type);
+  const data_set_t *ds = plugin_get_ds(key->type);
   if (ds == NULL) {
     static char type[DATA_MAX_NAME_LEN] = "!!!invalid!!!";
 
@@ -179,31 +191,20 @@ static int cj_load_key(cj_t *db, char const *key) {
 
   sstrncpy(db->state[db->depth].name, key, sizeof(db->state[db->depth].name));
 
-  c_avl_tree_t *tree = db->state[db->depth - 1].tree;
-  if (tree == NULL) {
+  if (db->state[db->depth - 1].entry == NULL ||
+      db->state[db->depth - 1].entry->type != TREE) {
     return 0;
   }
 
-  /* the parent has a key, so the tree pointer is invalid. */
-  if (CJ_IS_KEY(db->state[db->depth - 1].key)) {
-    return 0;
-  }
+  c_avl_tree_t *tree = db->state[db->depth - 1].entry->tree;
+  cj_tree_entry_t *e = NULL;
 
-  void *value = NULL;
-  if (c_avl_get(tree, key, (void *)&value) == 0) {
-    if (CJ_IS_KEY((cj_key_t *)value)) {
-      db->state[db->depth].key = value;
-    } else {
-      db->state[db->depth].tree = value;
-    }
-  } else if (c_avl_get(tree, CJ_ANY, (void *)&value) == 0) {
-    if (CJ_IS_KEY((cj_key_t *)value)) {
-      db->state[db->depth].key = value;
-    } else {
-      db->state[db->depth].tree = value;
-    }
+  if (c_avl_get(tree, key, (void *)&e) == 0) {
+    db->state[db->depth].entry = e;
+  } else if (c_avl_get(tree, CJ_ANY, (void *)&e) == 0) {
+    db->state[db->depth].entry = e;
   } else {
-    db->state[db->depth].key = NULL;
+    db->state[db->depth].entry = NULL;
   }
 
   return 0;
@@ -226,51 +227,47 @@ static void cj_advance_array(cj_t *db) {
 
 static int cj_cb_boolean(void *ctx, int boolVal) {
   cj_advance_array(ctx);
-  return (CJ_CB_CONTINUE);
+  return CJ_CB_CONTINUE;
 }
 
 static int cj_cb_null(void *ctx) {
   cj_advance_array(ctx);
-  return (CJ_CB_CONTINUE);
+  return CJ_CB_CONTINUE;
 }
 
 static int cj_cb_number(void *ctx, const char *number, yajl_len_t number_len) {
-  char buffer[number_len + 1];
-
   cj_t *db = (cj_t *)ctx;
-  cj_key_t *key = db->state[db->depth].key;
 
   /* Create a null-terminated version of the string. */
+  char buffer[number_len + 1];
   memcpy(buffer, number, number_len);
   buffer[sizeof(buffer) - 1] = 0;
 
-
-
-  if (key == NULL) {
-    /* no config for this element. */
-    cj_advance_array(ctx);
-    return CJ_CB_CONTINUE;
-  } else if (!CJ_IS_KEY(key)) {
-    /* the config expects a map or an array. */
-    NOTICE(
-        "curl_json plugin: Found \"%s\", but the configuration expects a map.",
-        buffer);
+  if (db->state[db->depth].entry == NULL ||
+      db->state[db->depth].entry->type != KEY) {
+    if (db->state[db->depth].entry != NULL) {
+      NOTICE("curl_json plugin: Found \"%s\", but the configuration expects a "
+             "map.",
+             buffer);
+    }
     cj_advance_array(ctx);
     return CJ_CB_CONTINUE;
   }
 
+  cj_key_t *key = db->state[db->depth].entry->key;
+
   int type = cj_get_type(key);
   value_t vt;
   int status = parse_value(buffer, &vt, type);
   if (status != 0) {
     NOTICE("curl_json plugin: Unable to parse number: \"%s\"", buffer);
     cj_advance_array(ctx);
-    return (CJ_CB_CONTINUE);
+    return CJ_CB_CONTINUE;
   }
 
   cj_submit(db, key, &vt);
   cj_advance_array(ctx);
-  return (CJ_CB_CONTINUE);
+  return CJ_CB_CONTINUE;
 } /* int cj_cb_number */
 
 /* Queries the key-tree of the parent context for "in_name" and, if found,
@@ -291,15 +288,15 @@ static int cj_cb_map_key(void *ctx, unsigned char const *in_name,
 
 static int cj_cb_string(void *ctx, const unsigned char *val, yajl_len_t len) {
   /* Handle the string as if it was a number. */
-  return (cj_cb_number(ctx, (const char *)val, len));
+  return cj_cb_number(ctx, (const char *)val, len);
 } /* int cj_cb_string */
 
 static int cj_cb_end(void *ctx) {
   cj_t *db = (cj_t *)ctx;
-  db->state[db->depth].tree = NULL;
+  memset(&db->state[db->depth], 0, sizeof(db->state[db->depth]));
   db->depth--;
   cj_advance_array(ctx);
-  return (CJ_CB_CONTINUE);
+  return CJ_CB_CONTINUE;
 }
 
 static int cj_cb_start_map(void *ctx) {
@@ -308,10 +305,10 @@ static int cj_cb_start_map(void *ctx) {
   if ((db->depth + 1) >= YAJL_MAX_DEPTH) {
     ERROR("curl_json plugin: %s depth exceeds max, aborting.",
           db->url ? db->url : db->sock);
-    return (CJ_CB_ABORT);
+    return CJ_CB_ABORT;
   }
   db->depth++;
-  return (CJ_CB_CONTINUE);
+  return CJ_CB_CONTINUE;
 }
 
 static int cj_cb_end_map(void *ctx) { return cj_cb_end(ctx); }
@@ -364,17 +361,16 @@ static void cj_key_free(cj_key_t *key) /* {{{ */
 static void cj_tree_free(c_avl_tree_t *tree) /* {{{ */
 {
   char *name;
-  void *value;
+  cj_tree_entry_t *e;
 
-  while (c_avl_pick(tree, (void *)&name, (void *)&value) == 0) {
-    cj_key_t *key = (cj_key_t *)value;
+  while (c_avl_pick(tree, (void *)&name, (void *)&e) == 0) {
+    sfree(name);
 
-    if (CJ_IS_KEY(key))
-      cj_key_free(key);
+    if (e->type == KEY)
+      cj_key_free(e->key);
     else
-      cj_tree_free((c_avl_tree_t *)value);
-
-    sfree(name);
+      cj_tree_free(e->tree);
+    sfree(e);
   }
 
   c_avl_destroy(tree);
@@ -428,18 +424,79 @@ static int cj_config_append_string(const char *name,
   struct curl_slist *temp = NULL;
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_json plugin: `%s' needs exactly one string argument.", name);
-    return (-1);
+    return -1;
   }
 
   temp = curl_slist_append(*dest, ci->values[0].value.string);
   if (temp == NULL)
-    return (-1);
+    return -1;
 
   *dest = temp;
 
-  return (0);
+  return 0;
 } /* }}} int cj_config_append_string */
 
+/* cj_append_key adds key to the configuration stored in db.
+ *
+ * For example:
+ * "httpd/requests/count",
+ * "httpd/requests/current" ->
+ * { "httpd": { "requests": { "count": $key, "current": $key } } }
+ */
+static int cj_append_key(cj_t *db, cj_key_t *key) { /* {{{ */
+  if (db->tree == NULL)
+    db->tree = cj_avl_create();
+
+  c_avl_tree_t *tree = db->tree;
+
+  char const *start = key->path;
+  if (*start == '/')
+    ++start;
+
+  char const *end;
+  while ((end = strchr(start, '/')) != NULL) {
+    char name[PATH_MAX];
+
+    size_t len = end - start;
+    if (len == 0)
+      break;
+
+    len = COUCH_MIN(len, sizeof(name) - 1);
+    sstrncpy(name, start, len + 1);
+
+    cj_tree_entry_t *e;
+    if (c_avl_get(tree, name, (void *)&e) != 0) {
+      e = calloc(1, sizeof(*e));
+      if (e == NULL)
+        return ENOMEM;
+      e->type = TREE;
+      e->tree = cj_avl_create();
+
+      c_avl_insert(tree, strdup(name), e);
+    }
+
+    if (e->type != TREE)
+      return EINVAL;
+
+    tree = e->tree;
+    start = end + 1;
+  }
+
+  if (strlen(start) == 0) {
+    ERROR("curl_json plugin: invalid key: %s", key->path);
+    return -1;
+  }
+
+  cj_tree_entry_t *e = calloc(1, sizeof(*e));
+  if (e == NULL)
+    return ENOMEM;
+  e->type = KEY;
+  e->key = key;
+
+  c_avl_insert(tree, strdup(start), e);
+  return 0;
+} /* }}} int cj_append_key */
+
 static int cj_config_add_key(cj_t *db, /* {{{ */
                              oconfig_item_t *ci) {
   cj_key_t *key;
@@ -448,28 +505,27 @@ static int cj_config_add_key(cj_t *db, /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_json plugin: The `Key' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   key = calloc(1, sizeof(*key));
   if (key == NULL) {
     ERROR("curl_json plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
-  key->magic = CJ_KEY_MAGIC;
 
   if (strcasecmp("Key", ci->key) == 0) {
     status = cf_util_get_string(ci, &key->path);
     if (status != 0) {
       sfree(key);
-      return (status);
+      return status;
     }
   } else {
     ERROR("curl_json plugin: cj_config: "
           "Invalid key: %s",
           ci->key);
     cj_key_free(key);
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -491,62 +547,22 @@ static int cj_config_add_key(cj_t *db, /* {{{ */
 
   if (status != 0) {
     cj_key_free(key);
-    return (-1);
+    return -1;
   }
 
   if (key->type == NULL) {
     WARNING("curl_json plugin: `Type' missing in `Key' block.");
     cj_key_free(key);
-    return (-1);
-  }
-
-  /* store path in a tree that will match the json map structure, example:
-   * "httpd/requests/count",
-   * "httpd/requests/current" ->
-   * { "httpd": { "requests": { "count": $key, "current": $key } } }
-   */
-  char *ptr;
-  char *name;
-  c_avl_tree_t *tree;
-
-  if (db->tree == NULL)
-    db->tree = cj_avl_create();
-
-  tree = db->tree;
-  ptr = key->path;
-  if (*ptr == '/')
-    ++ptr;
-
-  name = ptr;
-  while ((ptr = strchr(name, '/')) != NULL) {
-    char ent[PATH_MAX];
-    c_avl_tree_t *value;
-    size_t len;
-
-    len = ptr - name;
-    if (len == 0)
-      break;
-
-    len = COUCH_MIN(len, sizeof(ent) - 1);
-    sstrncpy(ent, name, len + 1);
-
-    if (c_avl_get(tree, ent, (void *)&value) != 0) {
-      value = cj_avl_create();
-      c_avl_insert(tree, strdup(ent), value);
-    }
-
-    tree = value;
-    name = ptr + 1;
+    return -1;
   }
 
-  if (strlen(name) == 0) {
-    ERROR("curl_json plugin: invalid key: %s", key->path);
+  status = cj_append_key(db, key);
+  if (status != 0) {
     cj_key_free(key);
-    return (-1);
+    return -1;
   }
 
-  c_avl_insert(tree, strdup(name), key);
-  return (status);
+  return 0;
 } /* }}} int cj_config_add_key */
 
 static int cj_init_curl(cj_t *db) /* {{{ */
@@ -554,7 +570,7 @@ static int cj_init_curl(cj_t *db) /* {{{ */
   db->curl = curl_easy_init();
   if (db->curl == NULL) {
     ERROR("curl_json plugin: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(db->curl, CURLOPT_NOSIGNAL, 1L);
@@ -581,7 +597,7 @@ static int cj_init_curl(cj_t *db) /* {{{ */
     db->credentials = malloc(credentials_size);
     if (db->credentials == NULL) {
       ERROR("curl_json plugin: malloc failed.");
-      return (-1);
+      return -1;
     }
 
     ssnprintf(db->credentials, credentials_size, "%s:%s", db->user,
@@ -613,7 +629,7 @@ static int cj_init_curl(cj_t *db) /* {{{ */
                      (long)CDTIME_T_TO_MS(plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int cj_init_curl */
 
 static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */
@@ -624,13 +640,13 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_json plugin: The `URL' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   db = calloc(1, sizeof(*db));
   if (db == NULL) {
     ERROR("curl_json plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   db->timeout = -1;
@@ -644,11 +660,11 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */
           "Invalid key: %s",
           ci->key);
     cj_free(db);
-    return (-1);
+    return -1;
   }
   if (status != 0) {
     sfree(db);
-    return (status);
+    return status;
   }
 
   /* Fill the `cj_t' structure.. */
@@ -724,10 +740,10 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */
     sfree(cb_name);
   } else {
     cj_free(db);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 /* }}} int cj_config_add_database */
 
@@ -758,10 +774,10 @@ static int cj_config(oconfig_item_t *ci) /* {{{ */
 
   if ((success == 0) && (errors > 0)) {
     ERROR("curl_json plugin: All statements failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cj_config */
 
 /* }}} End of configuration handling functions */
@@ -774,7 +790,7 @@ static const char *cj_host(cj_t *db) /* {{{ */
   return db->host;
 } /* }}} cj_host */
 
-static void cj_submit(cj_t *db, cj_key_t *key, value_t *value) /* {{{ */
+static void cj_submit_impl(cj_t *db, cj_key_t *key, value_t *value) /* {{{ */
 {
   value_list_t vl = VALUE_LIST_INIT;
 
@@ -798,24 +814,25 @@ static void cj_submit(cj_t *db, cj_key_t *key, value_t *value) /* {{{ */
     vl.interval = db->interval;
 
   plugin_dispatch_values(&vl);
-} /* }}} int cj_submit */
+} /* }}} int cj_submit_impl */
 
 static int cj_sock_perform(cj_t *db) /* {{{ */
 {
   char errbuf[1024];
-  struct sockaddr_un sa_unix = {0};
-  sa_unix.sun_family = AF_UNIX;
+  struct sockaddr_un sa_unix = {
+      .sun_family = AF_UNIX,
+  };
   sstrncpy(sa_unix.sun_path, db->sock, sizeof(sa_unix.sun_path));
 
   int fd = socket(AF_UNIX, SOCK_STREAM, 0);
   if (fd < 0)
-    return (-1);
+    return -1;
   if (connect(fd, (struct sockaddr *)&sa_unix, sizeof(sa_unix)) < 0) {
     ERROR("curl_json plugin: connect(%s) failed: %s",
           (db->sock != NULL) ? db->sock : "<null>",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(fd);
-    return (-1);
+    return -1;
   }
 
   ssize_t red;
@@ -827,13 +844,13 @@ static int cj_sock_perform(cj_t *db) /* {{{ */
             (db->sock != NULL) ? db->sock : "<null>",
             sstrerror(errno, errbuf, sizeof(errbuf)));
       close(fd);
-      return (-1);
+      return -1;
     }
     if (!cj_curl_callback(buffer, red, 1, db))
       break;
   } while (red > 0);
   close(fd);
-  return (0);
+  return 0;
 } /* }}} int cj_sock_perform */
 
 static int cj_curl_perform(cj_t *db) /* {{{ */
@@ -847,7 +864,7 @@ static int cj_curl_perform(cj_t *db) /* {{{ */
   if (status != CURLE_OK) {
     ERROR("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)",
           status, db->curl_errbuf, url);
-    return (-1);
+    return -1;
   }
   if (db->stats != NULL)
     curl_stats_dispatch(db->stats, db->curl, cj_host(db), "curl_json",
@@ -861,9 +878,9 @@ static int cj_curl_perform(cj_t *db) /* {{{ */
     ERROR("curl_json plugin: curl_easy_perform failed with "
           "response code %ld (%s)",
           rc, url);
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* }}} int cj_curl_perform */
 
 static int cj_perform(cj_t *db) /* {{{ */
@@ -881,7 +898,7 @@ static int cj_perform(cj_t *db) /* {{{ */
   if (db->yajl == NULL) {
     ERROR("curl_json plugin: yajl_alloc failed.");
     db->yajl = yprev;
-    return (-1);
+    return -1;
   }
 
   if (db->url)
@@ -891,7 +908,7 @@ static int cj_perform(cj_t *db) /* {{{ */
   if (status < 0) {
     yajl_free(db->yajl);
     db->yajl = yprev;
-    return (-1);
+    return -1;
   }
 
 #if HAVE_YAJL_V2
@@ -908,12 +925,12 @@ static int cj_perform(cj_t *db) /* {{{ */
     yajl_free_error(db->yajl, errmsg);
     yajl_free(db->yajl);
     db->yajl = yprev;
-    return (-1);
+    return -1;
   }
 
   yajl_free(db->yajl);
   db->yajl = yprev;
-  return (0);
+  return 0;
 } /* }}} int cj_perform */
 
 static int cj_read(user_data_t *ud) /* {{{ */
@@ -922,17 +939,26 @@ static int cj_read(user_data_t *ud) /* {{{ */
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("curl_json plugin: cj_read: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   db = (cj_t *)ud->data;
 
   db->depth = 0;
   memset(&db->state, 0, sizeof(db->state));
-  db->state[db->depth].tree = db->tree;
-  db->key = NULL;
 
-  return cj_perform(db);
+  /* This is not a compound literal because EPEL6's GCC is not cool enough to
+   * handle anonymous unions within compound literals. */
+  cj_tree_entry_t root = {0};
+  root.type = TREE;
+  root.tree = db->tree;
+  db->state[0].entry = &root;
+
+  int status = cj_perform(db);
+
+  db->state[0].entry = NULL;
+
+  return status;
 } /* }}} int cj_read */
 
 static int cj_init(void) /* {{{ */
@@ -940,12 +966,10 @@ 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);
+  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_json_test.c b/src/curl_json_test.c
new file mode 100644 (file)
index 0000000..e8f8f6b
--- /dev/null
@@ -0,0 +1,148 @@
+/**
+ * collectd - src/curl_json.c
+ * Copyright (C) 2017  Florian octo Forster
+ *
+ * Licensed under the same terms and conditions as src/curl_json.c.
+ *
+ * Authors:
+ *   Florian octo Forster <octo at collectd.org>
+ **/
+
+#include "curl_json.c"
+
+#include "testing.h"
+
+static void test_submit(cj_t *db, cj_key_t *key, value_t *value) {
+  /* hack: we repurpose db->curl to store received values. */
+  c_avl_tree_t *values = (void *)db->curl;
+
+  value_t *value_copy = calloc(1, sizeof(*value_copy));
+  memmove(value_copy, value, sizeof(*value_copy));
+
+  assert(c_avl_insert(values, key->path, value_copy) == 0);
+}
+
+static derive_t test_metric(cj_t *db, char const *path) {
+  c_avl_tree_t *values = (void *)db->curl;
+
+  value_t *ret = NULL;
+  if (c_avl_get(values, path, (void *)&ret) == 0) {
+    return ret->derive;
+  }
+
+  return -1;
+}
+
+static cj_t *test_setup(char *json, char *key_path) {
+  cj_t *db = calloc(1, sizeof(*db));
+  db->yajl = yajl_alloc(&ycallbacks,
+#if HAVE_YAJL_V2
+                        /* alloc funcs = */ NULL,
+#else
+                        /* alloc funcs = */ NULL, NULL,
+#endif
+                        /* context = */ (void *)db);
+
+  /* hack; see above. */
+  db->curl = (void *)cj_avl_create();
+
+  cj_key_t *key = calloc(1, sizeof(*key));
+  key->path = strdup(key_path);
+  key->type = strdup("MAGIC");
+
+  assert(cj_append_key(db, key) == 0);
+
+  cj_tree_entry_t root = {0};
+  root.type = TREE;
+  root.tree = db->tree;
+  db->state[0].entry = &root;
+
+  cj_curl_callback(json, strlen(json), 1, db);
+#if HAVE_YAJL_V2
+  yajl_complete_parse(db->yajl);
+#else
+  yajl_parse_complete(db->yajl);
+#endif
+
+  db->state[0].entry = NULL;
+
+  return db;
+}
+
+static void test_teardown(cj_t *db) {
+  c_avl_tree_t *values = (void *)db->curl;
+  db->curl = NULL;
+
+  void *key;
+  void *value;
+  while (c_avl_pick(values, &key, &value) == 0) {
+    /* key will be freed by cj_free. */
+    free(value);
+  }
+  c_avl_destroy(values);
+
+  yajl_free(db->yajl);
+  db->yajl = NULL;
+
+  cj_free(db);
+}
+
+DEF_TEST(parse) {
+  struct {
+    char *json;
+    char *key_path;
+    derive_t want;
+  } cases[] = {
+      /* simple map */
+      {"{\"foo\":42,\"bar\":23}", "foo", 42},
+      {"{\"foo\":42,\"bar\":23}", "bar", 23},
+      /* nested map */
+      {"{\"a\":{\"b\":{\"c\":123}}", "a/b/c", 123},
+      {"{\"x\":{\"y\":{\"z\":789}}", "x/*/z", 789},
+      /* simple array */
+      {"[10,11,12,13]", "0", 10},
+      {"[10,11,12,13]", "1", 11},
+      {"[10,11,12,13]", "2", 12},
+      {"[10,11,12,13]", "3", 13},
+      /* array index after non-numeric entry */
+      {"[true,11]", "1", 11},
+      {"[null,11]", "1", 11},
+      {"[\"s\",11]", "1", 11},
+      {"[{\"k\":\"v\"},11]", "1", 11},
+      {"[[0,1,2],11]", "1", 11},
+      /* nested array */
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "0/0", 0},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "0/1", 1},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "0/2", 2},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "1/0", 3},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "1/1", 4},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "1/2", 5},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "2/0", 6},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "2/1", 7},
+      {"[[0,1,2],[3,4,5],[6,7,8]]", "2/2", 8},
+      /* testcase from #2266 */
+      {"{\"a\":[[10,11,12,13,14]]}", "a/0/0", 10},
+      {"{\"a\":[[10,11,12,13,14]]}", "a/0/1", 11},
+      {"{\"a\":[[10,11,12,13,14]]}", "a/0/2", 12},
+      {"{\"a\":[[10,11,12,13,14]]}", "a/0/3", 13},
+      {"{\"a\":[[10,11,12,13,14]]}", "a/0/4", 14},
+  };
+
+  for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) {
+    cj_t *db = test_setup(cases[i].json, cases[i].key_path);
+
+    EXPECT_EQ_INT(cases[i].want, test_metric(db, cases[i].key_path));
+
+    test_teardown(db);
+  }
+
+  return 0;
+}
+
+int main(int argc, char **argv) {
+  cj_submit = test_submit;
+
+  RUN_TEST(parse);
+
+  END_TEST;
+}
index 4e4c6f9..a0dca05 100644 (file)
@@ -111,11 +111,11 @@ static size_t cx_curl_callback(void *buf, /* {{{ */
   if (db == NULL) {
     ERROR("curl_xml plugin: cx_curl_callback: "
           "user_data pointer is NULL.");
-    return (0);
+    return 0;
   }
 
   if (len == 0)
-    return (len);
+    return len;
 
   if ((db->buffer_fill + len) >= db->buffer_size) {
     char *temp;
@@ -123,7 +123,7 @@ static size_t cx_curl_callback(void *buf, /* {{{ */
     temp = realloc(db->buffer, db->buffer_fill + len + 1);
     if (temp == NULL) {
       ERROR("curl_xml plugin: realloc failed.");
-      return (0);
+      return 0;
     }
     db->buffer = temp;
     db->buffer_size = db->buffer_fill + len + 1;
@@ -133,7 +133,7 @@ static size_t cx_curl_callback(void *buf, /* {{{ */
   db->buffer_fill += len;
   db->buffer[db->buffer_fill] = 0;
 
-  return (len);
+  return len;
 } /* }}} size_t cx_curl_callback */
 
 static void cx_xpath_free(cx_xpath_t *xpath) /* {{{ */
@@ -221,33 +221,33 @@ static int cx_config_append_string(const char *name,
   struct curl_slist *temp = NULL;
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_xml plugin: `%s' needs exactly one string argument.", name);
-    return (-1);
+    return -1;
   }
 
   temp = curl_slist_append(*dest, ci->values[0].value.string);
   if (temp == NULL)
-    return (-1);
+    return -1;
 
   *dest = temp;
 
-  return (0);
+  return 0;
 } /* }}} int cx_config_append_string */
 
 static int cx_check_type(const data_set_t *ds, cx_xpath_t *xpath) /* {{{ */
 {
   if (!ds) {
     WARNING("curl_xml plugin: DataSet `%s' not defined.", xpath->type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num != xpath->values_len) {
     WARNING("curl_xml plugin: DataSet `%s' requires %zu values, but config "
             "talks about %zu",
             xpath->type, ds->ds_num, xpath->values_len);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} cx_check_type */
 
 static xmlXPathObjectPtr
@@ -271,7 +271,7 @@ static int cx_if_not_text_node(xmlNodePtr node) /* {{{ */
 {
   if (node->type == XML_TEXT_NODE || node->type == XML_ATTRIBUTE_NODE ||
       node->type == XML_ELEMENT_NODE)
-    return (0);
+    return 0;
 
   WARNING("curl_xml plugin: "
           "Node \"%s\" doesn't seem to be a text node. Skipping...",
@@ -290,7 +290,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
   values_node_obj =
       cx_evaluate_xpath(xpath_ctx, BAD_CAST xpath->values[index].path);
   if (values_node_obj == NULL)
-    return (-1); /* Error already logged. */
+    return -1; /* Error already logged. */
 
   values_node = values_node_obj->nodesetval;
   tmp_size = (values_node) ? values_node->nodeNr : 0;
@@ -301,7 +301,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
             "Skipping...",
             xpath->values[index].path);
     xmlXPathFreeObject(values_node_obj);
-    return (-1);
+    return -1;
   }
 
   if (tmp_size > 1) {
@@ -310,7 +310,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
             "only one node. Skipping...",
             xpath->values[index].path);
     xmlXPathFreeObject(values_node_obj);
-    return (-1);
+    return -1;
   }
 
   /* ignoring the element if other than textnode/attribute*/
@@ -320,7 +320,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
             "only text/attribute node which is not the case. Skipping...",
             xpath->values[index].path);
     xmlXPathFreeObject(values_node_obj);
-    return (-1);
+    return -1;
   }
 
   node_value = (char *)xmlNodeGetContent(values_node->nodeTab[0]);
@@ -351,7 +351,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
 
   /* We have reached here which means that
    * we have got something to work */
-  return (0);
+  return 0;
 } /* }}} int cx_handle_single_value_xpath */
 
 static int cx_handle_all_value_xpaths(xmlXPathContextPtr xpath_ctx, /* {{{ */
@@ -368,13 +368,13 @@ static int cx_handle_all_value_xpaths(xmlXPathContextPtr xpath_ctx, /* {{{ */
   for (size_t i = 0; i < xpath->values_len; i++) {
     status = cx_handle_single_value_xpath(xpath_ctx, xpath, ds, vl, i);
     if (status != 0)
-      return (-1); /* An error has been printed. */
+      return -1; /* An error has been printed. */
   }                /* for (i = 0; i < xpath->values_len; i++) */
 
   plugin_dispatch_values(vl);
   vl->values = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int cx_handle_all_value_xpaths */
 
 static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
@@ -393,7 +393,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
             "Base-XPath %s is a table (more than one result was returned), "
             "but no instance-XPath has been defined.",
             xpath->path);
-    return (-1);
+    return -1;
   }
 
   /* instance has to be an xpath expression */
@@ -402,7 +402,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
 
     instance_node_obj = cx_evaluate_xpath(xpath_ctx, BAD_CAST xpath->instance);
     if (instance_node_obj == NULL)
-      return (-1); /* error is logged already */
+      return -1; /* error is logged already */
 
     instance_node = instance_node_obj->nodesetval;
     tmp_size = (instance_node) ? instance_node->nodeNr : 0;
@@ -414,7 +414,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
           "any of the nodes. Skipping the node.",
           xpath->instance);
       xmlXPathFreeObject(instance_node_obj);
-      return (-1);
+      return -1;
     }
 
     if (tmp_size > 1) {
@@ -423,7 +423,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
               "to return only one text node. Skipping the node.",
               xpath->instance);
       xmlXPathFreeObject(instance_node_obj);
-      return (-1);
+      return -1;
     }
 
     /* ignoring the element if other than textnode/attribute */
@@ -434,7 +434,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
               "which is not the case. Skipping the node.",
               xpath->instance);
       xmlXPathFreeObject(instance_node_obj);
-      return (-1);
+      return -1;
     }
   } /* if (xpath->instance != NULL) */
 
@@ -461,7 +461,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */
    * somewhere inside this structure. */
   xmlXPathFreeObject(instance_node_obj);
 
-  return (0);
+  return 0;
 } /* }}} int cx_handle_instance_xpath */
 
 static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */
@@ -528,7 +528,7 @@ static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */
   /* free up the allocated memory */
   xmlXPathFreeObject(base_node_obj);
 
-  return (0);
+  return 0;
 } /* }}} cx_handle_base_xpath */
 
 static int cx_handle_parsed_xml(xmlDocPtr doc, /* {{{ */
@@ -565,14 +565,14 @@ static int cx_parse_stats_xml(xmlChar *xml, cx_t *db) /* {{{ */
   doc = xmlParseDoc(xml);
   if (doc == NULL) {
     ERROR("curl_xml plugin: Failed to parse the xml document  - %s", xml);
-    return (-1);
+    return -1;
   }
 
   xpath_ctx = xmlXPathNewContext(doc);
   if (xpath_ctx == NULL) {
     ERROR("curl_xml plugin: Failed to create the xml context");
     xmlFreeDoc(doc);
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < db->namespaces_num; i++) {
@@ -585,7 +585,7 @@ static int cx_parse_stats_xml(xmlChar *xml, cx_t *db) /* {{{ */
             ns->prefix, ns->url);
       xmlXPathFreeContext(xpath_ctx);
       xmlFreeDoc(doc);
-      return (status);
+      return status;
     }
   }
 
@@ -609,7 +609,7 @@ static int cx_curl_perform(cx_t *db, CURL *curl) /* {{{ */
   if (status != CURLE_OK) {
     ERROR("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)",
           status, db->curl_errbuf, url);
-    return (-1);
+    return -1;
   }
   if (db->stats != NULL)
     curl_stats_dispatch(db->stats, db->curl, cx_host(db), "curl_xml",
@@ -623,7 +623,7 @@ static int cx_curl_perform(cx_t *db, CURL *curl) /* {{{ */
     ERROR(
         "curl_xml plugin: curl_easy_perform failed with response code %ld (%s)",
         rc, url);
-    return (-1);
+    return -1;
   }
 
   ptr = db->buffer;
@@ -640,7 +640,7 @@ static int cx_read(user_data_t *ud) /* {{{ */
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("curl_xml plugin: cx_read: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   db = (cx_t *)ud->data;
@@ -654,13 +654,13 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */
                                 oconfig_item_t *ci) {
   if (ci->values_num < 1) {
     WARNING("curl_xml plugin: `ValuesFrom' needs at least one argument.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; i++)
     if (ci->values[i].type != OCONFIG_TYPE_STRING) {
       WARNING("curl_xml plugin: `ValuesFrom' needs only string argument.");
-      return (-1);
+      return -1;
     }
 
   sfree(xpath->values);
@@ -668,7 +668,7 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */
   xpath->values_len = 0;
   xpath->values = malloc(sizeof(cx_values_t) * ci->values_num);
   if (xpath->values == NULL)
-    return (-1);
+    return -1;
   xpath->values_len = (size_t)ci->values_num;
 
   /* populate cx_values_t structure */
@@ -678,7 +678,7 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */
              sizeof(xpath->values[i].path));
   }
 
-  return (0);
+  return 0;
 } /* }}} cx_config_add_values */
 
 static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
@@ -691,13 +691,13 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
   xpath = calloc(1, sizeof(*xpath));
   if (xpath == NULL) {
     ERROR("curl_xml plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = cf_util_get_string(ci, &xpath->path);
   if (status != 0) {
     cx_xpath_free(xpath);
-    return (status);
+    return status;
   }
 
   /* error out if xpath->path is an empty string */
@@ -705,7 +705,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
     ERROR("curl_xml plugin: invalid xpath. "
           "xpath value can't be an empty string");
     cx_xpath_free(xpath);
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -745,7 +745,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
     if (db->list == NULL) {
       ERROR("curl_xml plugin: list creation failed.");
       cx_xpath_free(xpath);
-      return (-1);
+      return -1;
     }
   }
 
@@ -753,7 +753,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
   if (name == NULL) {
     ERROR("curl_xml plugin: strdup failed.");
     cx_xpath_free(xpath);
-    return (-1);
+    return -1;
   }
 
   le = llentry_create(name, xpath);
@@ -761,11 +761,11 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */
     ERROR("curl_xml plugin: llentry_create failed.");
     cx_xpath_free(xpath);
     sfree(name);
-    return (-1);
+    return -1;
   }
 
   llist_append(db->list, le);
-  return (0);
+  return 0;
 } /* }}} int cx_config_add_xpath */
 
 static int cx_config_add_namespace(cx_t *db, /* {{{ */
@@ -776,14 +776,14 @@ static int cx_config_add_namespace(cx_t *db, /* {{{ */
       (ci->values[1].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_xml plugin: The `Namespace' option "
             "needs exactly two string arguments.");
-    return (EINVAL);
+    return EINVAL;
   }
 
   ns = realloc(db->namespaces,
                sizeof(*db->namespaces) * (db->namespaces_num + 1));
   if (ns == NULL) {
     ERROR("curl_xml plugin: realloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
   db->namespaces = ns;
   ns = db->namespaces + db->namespaces_num;
@@ -796,11 +796,11 @@ static int cx_config_add_namespace(cx_t *db, /* {{{ */
     sfree(ns->prefix);
     sfree(ns->url);
     ERROR("curl_xml plugin: strdup failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   db->namespaces_num++;
-  return (0);
+  return 0;
 } /* }}} int cx_config_add_namespace */
 
 /* Initialize db->curl */
@@ -809,7 +809,7 @@ static int cx_init_curl(cx_t *db) /* {{{ */
   db->curl = curl_easy_init();
   if (db->curl == NULL) {
     ERROR("curl_xml plugin: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(db->curl, CURLOPT_NOSIGNAL, 1L);
@@ -836,7 +836,7 @@ static int cx_init_curl(cx_t *db) /* {{{ */
     db->credentials = malloc(credentials_size);
     if (db->credentials == NULL) {
       ERROR("curl_xml plugin: malloc failed.");
-      return (-1);
+      return -1;
     }
 
     ssnprintf(db->credentials, credentials_size, "%s:%s", db->user,
@@ -865,7 +865,7 @@ static int cx_init_curl(cx_t *db) /* {{{ */
                      (long)CDTIME_T_TO_MS(plugin_get_interval()));
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int cx_init_curl */
 
 static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */
@@ -876,13 +876,13 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("curl_xml plugin: The `URL' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   db = calloc(1, sizeof(*db));
   if (db == NULL) {
     ERROR("curl_xml plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   db->timeout = -1;
@@ -891,14 +891,14 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */
     status = cf_util_get_string(ci, &db->url);
     if (status != 0) {
       sfree(db);
-      return (status);
+      return status;
     }
   } else {
     ERROR("curl_xml plugin: cx_config: "
           "Invalid key: %s",
           ci->key);
     cx_free(db);
-    return (-1);
+    return -1;
   }
 
   /* Fill the `cx_t' structure.. */
@@ -974,10 +974,10 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */
     sfree(cb_name);
   } else {
     cx_free(db);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cx_config_add_url */
 
 /* }}} End of configuration handling functions */
@@ -1008,10 +1008,10 @@ static int cx_config(oconfig_item_t *ci) /* {{{ */
 
   if ((success == 0) && (errors > 0)) {
     ERROR("curl_xml plugin: All statements failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cx_config */
 
 static int cx_init(void) /* {{{ */
@@ -1019,12 +1019,10 @@ 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);
+  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/daemon/Makefile.am b/src/daemon/Makefile.am
deleted file mode 100644 (file)
index 5207943..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-AM_CPPFLAGS = -I$(top_srcdir)/src
-AM_CPPFLAGS += -DPREFIX='"${prefix}"'
-AM_CPPFLAGS += -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"'
-AM_CPPFLAGS += -DLOCALSTATEDIR='"${localstatedir}"'
-AM_CPPFLAGS += -DPKGLOCALSTATEDIR='"${localstatedir}/lib/${PACKAGE_NAME}"'
-if BUILD_FEATURE_DAEMON
-AM_CPPFLAGS += -DPIDFILE='"${localstatedir}/run/${PACKAGE_NAME}.pid"'
-endif
-AM_CPPFLAGS += -DPLUGINDIR='"${pkglibdir}"'
-AM_CPPFLAGS += -DPKGDATADIR='"${pkgdatadir}"'
-
-# Link to these libraries..
-COMMON_LIBS = $(PTHREAD_LIBS)
-if BUILD_WITH_CAPABILITY
-COMMON_LIBS += -lcap
-endif
-if BUILD_WITH_LIBRT
-COMMON_LIBS += -lrt
-endif
-if BUILD_WITH_LIBPOSIX4
-COMMON_LIBS += -lposix4
-endif
-if BUILD_WITH_LIBSOCKET
-COMMON_LIBS += -lsocket
-endif
-if BUILD_WITH_LIBRESOLV
-COMMON_LIBS += -lresolv
-endif
-if BUILD_WITH_LIBKSTAT
-COMMON_LIBS += -lkstat
-endif
-if BUILD_WITH_LIBDEVINFO
-COMMON_LIBS += -ldevinfo
-endif
-
-sbin_PROGRAMS = collectd
-
-noinst_LTLIBRARIES = libavltree.la libcommon.la libheap.la libmetadata.la libplugin_mock.la
-
-libavltree_la_SOURCES = utils_avltree.c utils_avltree.h
-
-libcommon_la_SOURCES = common.c common.h
-libcommon_la_LIBADD = $(COMMON_LIBS)
-
-libheap_la_SOURCES = utils_heap.c utils_heap.h
-
-libmetadata_la_SOURCES = meta_data.c meta_data.h
-
-libplugin_mock_la_SOURCES = plugin_mock.c utils_cache_mock.c \
-                           utils_time.c utils_time.h
-libplugin_mock_la_CPPFLAGS = $(AM_CPPFLAGS) -DMOCK_TIME
-libplugin_mock_la_LIBADD = $(COMMON_LIBS) libcommon.la
-
-collectd_SOURCES = collectd.c collectd.h \
-                  configfile.c configfile.h \
-                  filter_chain.c filter_chain.h \
-                  meta_data.c meta_data.h \
-                  plugin.c plugin.h \
-                  utils_cache.c utils_cache.h \
-                  utils_complain.c utils_complain.h \
-                  utils_ignorelist.c utils_ignorelist.h \
-                  utils_llist.c utils_llist.h \
-                  utils_random.c utils_random.h \
-                  utils_subst.c utils_subst.h \
-                  utils_time.c utils_time.h \
-                  types_list.c types_list.h \
-                  utils_threshold.c utils_threshold.h
-
-
-collectd_CPPFLAGS =  $(AM_CPPFLAGS) $(LTDLINCL)
-collectd_CFLAGS = $(AM_CFLAGS)
-collectd_LDFLAGS = -export-dynamic
-collectd_LDADD = libavltree.la libcommon.la libheap.la -lm $(COMMON_LIBS)
-collectd_DEPENDENCIES = libavltree.la libcommon.la libheap.la libmetadata.la
-
-# The daemon needs to call sg_init, so we need to link it against libstatgrab,
-# too. -octo
-if BUILD_WITH_LIBSTATGRAB
-collectd_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS)
-collectd_LDADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
-endif
-
-if BUILD_WITH_OWN_LIBOCONFIG
-collectd_LDADD += $(LIBLTDL) $(top_builddir)/src/liboconfig/liboconfig.la
-collectd_DEPENDENCIES += $(top_builddir)/src/liboconfig/liboconfig.la
-else
-collectd_LDADD += -loconfig
-endif
-
-LOG_COMPILER = env VALGRIND="@VALGRIND@" $(abs_top_srcdir)/testwrapper.sh
-
-check_PROGRAMS = test_common test_meta_data test_utils_avltree test_utils_heap test_utils_time test_utils_subst
-TESTS          = test_common test_meta_data test_utils_avltree test_utils_heap test_utils_time test_utils_subst
-
-test_common_SOURCES = common_test.c ../testing.h
-test_common_LDADD = libplugin_mock.la
-
-test_meta_data_SOURCES = meta_data_test.c ../testing.h
-test_meta_data_LDADD = libmetadata.la libplugin_mock.la
-
-test_utils_avltree_SOURCES = utils_avltree_test.c ../testing.h
-test_utils_avltree_LDADD = libavltree.la $(COMMON_LIBS)
-
-test_utils_heap_SOURCES = utils_heap_test.c ../testing.h
-test_utils_heap_LDADD = libheap.la $(COMMON_LIBS)
-
-test_utils_time_SOURCES = utils_time_test.c ../testing.h
-
-test_utils_subst_SOURCES = utils_subst_test.c ../testing.h \
-                          utils_subst.c utils_subst.h
-test_utils_subst_LDADD = libplugin_mock.la
index 6b7c413..2edfa37 100644 (file)
@@ -94,18 +94,18 @@ static int init_hostname(void) {
   str = global_option_get("Hostname");
   if ((str != NULL) && (str[0] != 0)) {
     sstrncpy(hostname_g, str, sizeof(hostname_g));
-    return (0);
+    return 0;
   }
 
   if (gethostname(hostname_g, sizeof(hostname_g)) != 0) {
     fprintf(stderr, "`gethostname' failed and no "
                     "hostname was configured.\n");
-    return (-1);
+    return -1;
   }
 
   str = global_option_get("FQDNLookup");
   if (IS_FALSE(str))
-    return (0);
+    return 0;
 
   struct addrinfo ai_hints = {.ai_flags = AI_CANONNAME};
 
@@ -117,7 +117,7 @@ static int init_hostname(void) {
           "name. Please fix the network "
           "configuration.",
           hostname_g);
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -130,7 +130,7 @@ static int init_hostname(void) {
   }
 
   freeaddrinfo(ai_list);
-  return (0);
+  return 0;
 } /* int init_hostname */
 
 static int init_global_variables(void) {
@@ -147,15 +147,15 @@ static int init_global_variables(void) {
   if (timeout_g <= 1) {
     fprintf(stderr, "Cannot set the timeout to a correct value.\n"
                     "Please check your settings.\n");
-    return (-1);
+    return -1;
   }
   DEBUG("timeout_g = %i;", timeout_g);
 
   if (init_hostname() != 0)
-    return (-1);
+    return -1;
   DEBUG("hostname_g = %s;", hostname_g);
 
-  return (0);
+  return 0;
 } /* int init_global_variables */
 
 static int change_basedir(const char *orig_dir) {
@@ -167,7 +167,7 @@ static int change_basedir(const char *orig_dir) {
   if (dir == NULL) {
     char errbuf[1024];
     ERROR("strdup failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   dirlen = strlen(dir);
@@ -176,19 +176,19 @@ static int change_basedir(const char *orig_dir) {
 
   if (dirlen == 0) {
     free(dir);
-    return (-1);
+    return -1;
   }
 
   status = chdir(dir);
   if (status == 0) {
     free(dir);
-    return (0);
+    return 0;
   } else if (errno != ENOENT) {
     char errbuf[1024];
     ERROR("change_basedir: chdir (%s): %s", dir,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     free(dir);
-    return (-1);
+    return -1;
   }
 
   status = mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO);
@@ -197,7 +197,7 @@ static int change_basedir(const char *orig_dir) {
     ERROR("change_basedir: mkdir (%s): %s", dir,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     free(dir);
-    return (-1);
+    return -1;
   }
 
   status = chdir(dir);
@@ -206,11 +206,11 @@ static int change_basedir(const char *orig_dir) {
     ERROR("change_basedir: chdir (%s): %s", dir,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     free(dir);
-    return (-1);
+    return -1;
   }
 
   free(dir);
-  return (0);
+  return 0;
 } /* static int change_basedir (char *dir) */
 
 #if HAVE_LIBKSTAT
@@ -285,12 +285,12 @@ static int do_init(void) {
 #endif
           )) {
     ERROR("sg_init: %s", sg_str_error(sg_get_error()));
-    return (-1);
+    return -1;
   }
 
   if (sg_drop_privileges()) {
     ERROR("sg_drop_privileges: %s", sg_str_error(sg_get_error()));
-    return (-1);
+    return -1;
   }
 #endif
 
@@ -329,12 +329,12 @@ static int do_loop(void) {
       if (errno != EINTR) {
         char errbuf[1024];
         ERROR("nanosleep failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
     }
   } /* while (loop == 0) */
 
-  return (0);
+  return 0;
 } /* int do_loop */
 
 static int do_shutdown(void) {
@@ -349,13 +349,13 @@ static int pidfile_create(void) {
   if ((fh = fopen(file, "w")) == NULL) {
     char errbuf[1024];
     ERROR("fopen (%s): %s", file, sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   fprintf(fh, "%i\n", (int)getpid());
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* static int pidfile_create (const char *file) */
 
 static int pidfile_remove(void) {
@@ -363,7 +363,7 @@ static int pidfile_remove(void) {
   if (file == NULL)
     return 0;
 
-  return (unlink(file));
+  return unlink(file);
 } /* static int pidfile_remove (const char *file) */
 #endif /* COLLECT_DAEMON */
 
@@ -522,7 +522,7 @@ int main(int argc, char **argv) {
   if (cf_read(configfile)) {
     fprintf(stderr, "Error: Reading the config file failed!\n"
                     "Read the logs for details.\n");
-    return (1);
+    return 1;
   }
 
   /*
@@ -532,10 +532,10 @@ int main(int argc, char **argv) {
   if ((basedir = global_option_get("BaseDir")) == NULL) {
     fprintf(stderr,
             "Don't have a basedir to use. This should not happen. Ever.");
-    return (1);
+    return 1;
   } else if (change_basedir(basedir)) {
     fprintf(stderr, "Error: Unable to change to directory `%s'.\n", basedir);
-    return (1);
+    return 1;
   }
 
   /*
@@ -548,7 +548,7 @@ int main(int argc, char **argv) {
     exit(EXIT_FAILURE);
 
   if (test_config)
-    return (0);
+    return 0;
 
 #if COLLECT_DAEMON
   /*
@@ -573,11 +573,11 @@ int main(int argc, char **argv) {
       /* error */
       char errbuf[1024];
       fprintf(stderr, "fork: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      return 1;
     } else if (pid != 0) {
       /* parent */
       /* printf ("Running (PID %i)\n", pid); */
-      return (0);
+      return 0;
     }
 
     /* Detach from session */
@@ -596,21 +596,21 @@ int main(int argc, char **argv) {
     if (status != 0) {
       ERROR("Error: Could not connect `STDIN' to `/dev/null' (status %d)",
             status);
-      return (1);
+      return 1;
     }
 
     status = dup(0);
     if (status != 1) {
       ERROR("Error: Could not connect `STDOUT' to `/dev/null' (status %d)",
             status);
-      return (1);
+      return 1;
     }
 
     status = dup(0);
     if (status != 2) {
       ERROR("Error: Could not connect `STDERR' to `/dev/null', (status %d)",
             status);
-      return (1);
+      return 1;
     }
   }    /* if (daemonize) */
 #endif /* COLLECT_DAEMON */
@@ -628,7 +628,7 @@ int main(int argc, char **argv) {
     char errbuf[1024];
     ERROR("Error: Failed to install a signal handler for signal INT: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   struct sigaction sig_term_action = {.sa_handler = sig_term_handler};
@@ -637,7 +637,7 @@ int main(int argc, char **argv) {
     char errbuf[1024];
     ERROR("Error: Failed to install a signal handler for signal TERM: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   struct sigaction sig_usr1_action = {.sa_handler = sig_usr1_handler};
@@ -646,7 +646,7 @@ int main(int argc, char **argv) {
     char errbuf[1024];
     ERROR("Error: Failed to install a signal handler for signal USR1: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   /*
@@ -680,5 +680,5 @@ int main(int argc, char **argv) {
     pidfile_remove();
 #endif /* COLLECT_DAEMON */
 
-  return (exit_status);
+  return exit_status;
 } /* int main */
index 4ec002d..01d484e 100644 (file)
 #include "config.h"
 #endif
 
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #if HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
 #if HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
-#if STDC_HEADERS
-#include <stddef.h>
-#include <stdlib.h>
-#else
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#endif
-#if HAVE_STRING_H
-#if !STDC_HEADERS && HAVE_MEMORY_H
-#include <memory.h>
-#endif
-#include <string.h>
-#endif
 #if HAVE_STRINGS_H
 #include <strings.h>
 #endif
-#if HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-#if HAVE_STDINT_H
-#include <stdint.h>
-#endif
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #ifndef WIFEXITED
 #define WIFEXITED(stat_val) (((stat_val)&255) == 0)
 #endif
-#if HAVE_SIGNAL_H
-#include <signal.h>
-#endif
 #if HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
-#if HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#if HAVE_LIMITS_H
-#include <limits.h>
-#endif
 #if TIME_WITH_SYS_TIME
 #include <sys/time.h>
 #include <time.h>
 #include <sys/socket.h>
 #endif
 
-#if HAVE_ASSERT_H
-#include <assert.h>
-#else
-#define assert(...) /* nop */
-#endif
-
-#if !defined(HAVE__BOOL) || !HAVE__BOOL
-typedef int _Bool;
-#undef HAVE__BOOL
-#define HAVE__BOOL 1
-#endif
-
 #if NAN_STATIC_DEFAULT
 #include <math.h>
 /* #endif NAN_STATIC_DEFAULT*/
@@ -212,12 +182,6 @@ typedef int _Bool;
 #endif
 #endif
 
-#if HAVE_STDARG_H
-#include <stdarg.h>
-#endif
-#if HAVE_CTYPE_H
-#include <ctype.h>
-#endif
 #if HAVE_SYS_PARAM_H
 #include <sys/param.h>
 #endif
@@ -276,10 +240,8 @@ typedef int _Bool;
 
 /* Only enable __attribute__() for compilers known to support it. */
 #if !defined(__clang__) && !defined(__GNUC__)
-#if !defined(__attribute__)
 #define __attribute__(x) /**/
 #endif
-#endif
 
 #if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
 #undef strcpy
index ec5c7ab..d9c8348 100644 (file)
 #include "plugin.h"
 #include "utils_cache.h"
 
-#ifdef HAVE_MATH_H
-#include <math.h>
-#endif
-
 /* for getaddrinfo */
 #include <netdb.h>
 #include <sys/types.h>
@@ -85,7 +81,7 @@ char *sstrncpy(char *dest, const char *src, size_t n) {
   strncpy(dest, src, n);
   dest[n - 1] = '\0';
 
-  return (dest);
+  return dest;
 } /* char *sstrncpy */
 
 int ssnprintf(char *dest, size_t n, const char *format, ...) {
@@ -97,7 +93,7 @@ int ssnprintf(char *dest, size_t n, const char *format, ...) {
   dest[n - 1] = '\0';
   va_end(ap);
 
-  return (ret);
+  return ret;
 } /* int ssnprintf */
 
 char *ssnprintf_alloc(char const *format, ...) /* {{{ */
@@ -115,17 +111,17 @@ char *ssnprintf_alloc(char const *format, ...) /* {{{ */
   status = vsnprintf(static_buffer, sizeof(static_buffer), format, ap);
   va_end(ap);
   if (status < 0)
-    return (NULL);
+    return NULL;
 
   /* "status" does not include the null byte. */
   alloc_buffer_size = (size_t)(status + 1);
   if (alloc_buffer_size <= sizeof(static_buffer))
-    return (strdup(static_buffer));
+    return strdup(static_buffer);
 
   /* Allocate a buffer large enough to hold the string. */
   alloc_buffer = calloc(1, alloc_buffer_size);
   if (alloc_buffer == NULL)
-    return (NULL);
+    return NULL;
 
   /* Print again into this new buffer. */
   va_start(ap, format);
@@ -133,10 +129,10 @@ char *ssnprintf_alloc(char const *format, ...) /* {{{ */
   va_end(ap);
   if (status < 0) {
     sfree(alloc_buffer);
-    return (NULL);
+    return NULL;
   }
 
-  return (alloc_buffer);
+  return alloc_buffer;
 } /* }}} char *ssnprintf_alloc */
 
 char *sstrdup(const char *s) {
@@ -144,7 +140,7 @@ char *sstrdup(const char *s) {
   size_t sz;
 
   if (s == NULL)
-    return (NULL);
+    return NULL;
 
   /* Do not use `strdup' here, because it's not specified in POSIX. It's
    * ``only'' an XSI extension. */
@@ -154,9 +150,9 @@ char *sstrdup(const char *s) {
     ERROR("sstrdup: Out of memory.");
     exit(3);
   }
-  memcpy(r, s, sizeof(char) * sz);
+  memcpy(r, s, sz);
 
-  return (r);
+  return r;
 } /* char *sstrdup */
 
 /* Even though Posix requires "strerror_r" to return an "int",
@@ -201,7 +197,7 @@ char *sstrerror(int errnum, char *buf, size_t buflen) {
   }
 #endif /* STRERROR_R_CHAR_P */
 
-  return (buf);
+  return buf;
 } /* char *sstrerror */
 
 void *smalloc(size_t size) {
@@ -212,7 +208,7 @@ void *smalloc(size_t size) {
     exit(3);
   }
 
-  return (r);
+  return r;
 } /* void *smalloc */
 
 #if 0
@@ -243,14 +239,14 @@ ssize_t sread(int fd, void *buf, size_t count) {
       continue;
 
     if (status < 0)
-      return (status);
+      return status;
 
     if (status == 0) {
       DEBUG("Received EOF from fd %i. "
             "Closing fd and returning error.",
             fd);
       close(fd);
-      return (-1);
+      return -1;
     }
 
     assert((0 > status) || (nleft >= (size_t)status));
@@ -259,7 +255,7 @@ ssize_t sread(int fd, void *buf, size_t count) {
     ptr = ptr + ((size_t)status);
   }
 
-  return (0);
+  return 0;
 }
 
 ssize_t swrite(int fd, const void *buf, size_t count) {
@@ -302,7 +298,7 @@ ssize_t swrite(int fd, const void *buf, size_t count) {
     ptr = ptr + ((size_t)status);
   }
 
-  return (0);
+  return 0;
 }
 
 int strsplit(char *string, char **fields, size_t size) {
@@ -321,7 +317,7 @@ int strsplit(char *string, char **fields, size_t size) {
       break;
   }
 
-  return ((int)i);
+  return (int)i;
 }
 
 int strjoin(char *buffer, size_t buffer_size, char **fields, size_t fields_num,
@@ -334,7 +330,7 @@ int strjoin(char *buffer, size_t buffer_size, char **fields, size_t fields_num,
 
   if (((fields_num != 0) && (fields == NULL)) ||
       ((buffer_size != 0) && (buffer == NULL)))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (buffer != NULL)
     buffer[0] = 0;
@@ -387,14 +383,14 @@ int escape_string(char *buffer, size_t buffer_size) {
   /* Check if we need to escape at all first */
   temp = strpbrk(buffer, " \t\"\\");
   if (temp == NULL)
-    return (0);
+    return 0;
 
   if (buffer_size < 3)
-    return (EINVAL);
+    return EINVAL;
 
   temp = calloc(1, buffer_size);
   if (temp == NULL)
-    return (ENOMEM);
+    return ENOMEM;
 
   temp[0] = '"';
   j = 1;
@@ -422,7 +418,7 @@ int escape_string(char *buffer, size_t buffer_size) {
 
   sstrncpy(buffer, temp, buffer_size);
   sfree(temp);
-  return (0);
+  return 0;
 } /* int escape_string */
 
 int strunescape(char *buf, size_t buf_len) {
@@ -434,7 +430,7 @@ int strunescape(char *buf, size_t buf_len) {
       ERROR("string unescape: backslash found at end of string.");
       /* Ensure null-byte at the end of the buffer. */
       buf[i] = 0;
-      return (-1);
+      return -1;
     }
 
     switch (buf[i + 1]) {
@@ -457,7 +453,7 @@ int strunescape(char *buf, size_t buf_len) {
     memmove(buf + i + 1, buf + i + 2, buf_len - i - 2);
     buf[buf_len - 1] = 0;
   }
-  return (0);
+  return 0;
 } /* int strunescape */
 
 size_t strstripnewline(char *buffer) {
@@ -470,7 +466,7 @@ size_t strstripnewline(char *buffer) {
     buffer[buffer_len] = 0;
   }
 
-  return (buffer_len);
+  return buffer_len;
 } /* size_t strstripnewline */
 
 int escape_slashes(char *buffer, size_t buffer_size) {
@@ -481,10 +477,10 @@ int escape_slashes(char *buffer, size_t buffer_size) {
   if (buffer_len <= 1) {
     if (strcmp("/", buffer) == 0) {
       if (buffer_size < 5)
-        return (-1);
+        return -1;
       sstrncpy(buffer, "root", buffer_size);
     }
-    return (0);
+    return 0;
   }
 
   /* Move one to the left */
@@ -498,7 +494,7 @@ int escape_slashes(char *buffer, size_t buffer_size) {
       buffer[i] = '_';
   }
 
-  return (0);
+  return 0;
 } /* int escape_slashes */
 
 void replace_special(char *buffer, size_t buffer_size) {
@@ -524,7 +520,7 @@ int timeval_cmp(struct timeval tv0, struct timeval tv1, struct timeval *delta) {
       delta->tv_sec = 0;
       delta->tv_usec = 0;
     }
-    return (0);
+    return 0;
   }
 
   if ((tv0.tv_sec < tv1.tv_sec) ||
@@ -552,7 +548,7 @@ int timeval_cmp(struct timeval tv0, struct timeval tv1, struct timeval *delta) {
   assert((delta == NULL) ||
          ((0 <= delta->tv_usec) && (delta->tv_usec < 1000000)));
 
-  return (status);
+  return status;
 } /* int timeval_cmp */
 
 int check_create_dir(const char *file_orig) {
@@ -573,12 +569,12 @@ int check_create_dir(const char *file_orig) {
    * Sanity checks first
    */
   if (file_orig == NULL)
-    return (-1);
+    return -1;
 
   if ((len = strlen(file_orig)) < 1)
-    return (-1);
+    return -1;
   else if (len >= sizeof(file_copy))
-    return (-1);
+    return -1;
 
   /*
    * If `file_orig' ends in a slash the last component is a directory,
@@ -622,7 +618,7 @@ int check_create_dir(const char *file_orig) {
       ERROR("Cowardly refusing to create a directory that "
             "begins with a `.' (dot): `%s'",
             file_orig);
-      return (-2);
+      return -2;
     }
 
     /*
@@ -632,7 +628,7 @@ int check_create_dir(const char *file_orig) {
     if (strjoin(dir + path_is_absolute, (size_t)(dir_len - path_is_absolute),
                 fields, (size_t)(i + 1), "/") < 0) {
       ERROR("strjoin failed: `%s', component #%i", file_orig, i);
-      return (-1);
+      return -1;
     }
 
     while (42) {
@@ -650,24 +646,24 @@ int check_create_dir(const char *file_orig) {
           char errbuf[1024];
           ERROR("check_create_dir: mkdir (%s): %s", dir,
                 sstrerror(errno, errbuf, sizeof(errbuf)));
-          return (-1);
+          return -1;
         } else {
           char errbuf[1024];
           ERROR("check_create_dir: stat (%s): %s", dir,
                 sstrerror(errno, errbuf, sizeof(errbuf)));
-          return (-1);
+          return -1;
         }
       } else if (!S_ISDIR(statbuf.st_mode)) {
         ERROR("check_create_dir: `%s' exists but is not "
               "a directory!",
               dir);
-        return (-1);
+        return -1;
       }
       break;
     }
   }
 
-  return (0);
+  return 0;
 } /* check_create_dir */
 
 #ifdef HAVE_LIBKSTAT
@@ -677,20 +673,20 @@ int get_kstat(kstat_t **ksp_ptr, char *module, int instance, char *name) {
   *ksp_ptr = NULL;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   ssnprintf(ident, sizeof(ident), "%s,%i,%s", module, instance, name);
 
   *ksp_ptr = kstat_lookup(kc, module, instance, name);
   if (*ksp_ptr == NULL) {
     ERROR("get_kstat: Cound not find kstat %s", ident);
-    return (-1);
+    return -1;
   }
 
   if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED) {
     ERROR("get_kstat: kstat %s has wrong type", ident);
     *ksp_ptr = NULL;
-    return (-1);
+    return -1;
   }
 
 #ifdef assert
@@ -700,15 +696,15 @@ int get_kstat(kstat_t **ksp_ptr, char *module, int instance, char *name) {
 
   if (kstat_read(kc, *ksp_ptr, NULL) == -1) {
     ERROR("get_kstat: kstat %s could not be read", ident);
-    return (-1);
+    return -1;
   }
 
   if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED) {
     ERROR("get_kstat: kstat %s has wrong type", ident);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 long long get_kstat_value(kstat_t *ksp, char *name) {
@@ -717,16 +713,16 @@ long long get_kstat_value(kstat_t *ksp, char *name) {
 
   if (ksp == NULL) {
     ERROR("get_kstat_value (\"%s\"): ksp is NULL.", name);
-    return (-1LL);
+    return -1LL;
   } else if (ksp->ks_type != KSTAT_TYPE_NAMED) {
     ERROR("get_kstat_value (\"%s\"): ksp->ks_type (%#x) "
           "is not KSTAT_TYPE_NAMED (%#x).",
           name, (unsigned int)ksp->ks_type, (unsigned int)KSTAT_TYPE_NAMED);
-    return (-1LL);
+    return -1LL;
   }
 
   if ((kn = (kstat_named_t *)kstat_data_lookup(ksp, name)) == NULL)
-    return (-1LL);
+    return -1LL;
 
   if (kn->data_type == KSTAT_DATA_INT32)
     retval = (long long)kn->value.i32;
@@ -741,14 +737,14 @@ long long get_kstat_value(kstat_t *ksp, char *name) {
   else
     WARNING("get_kstat_value: Not a numeric value: %s", name);
 
-  return (retval);
+  return retval;
 }
 #endif /* HAVE_LIBKSTAT */
 
 #ifndef HAVE_HTONLL
 unsigned long long ntohll(unsigned long long n) {
 #if BYTE_ORDER == BIG_ENDIAN
-  return (n);
+  return n;
 #else
   return (((unsigned long long)ntohl(n)) << 32) + ntohl(n >> 32);
 #endif
@@ -756,7 +752,7 @@ unsigned long long ntohll(unsigned long long n) {
 
 unsigned long long htonll(unsigned long long n) {
 #if BYTE_ORDER == BIG_ENDIAN
-  return (n);
+  return n;
 #else
   return (((unsigned long long)htonl(n)) << 32) + htonl(n >> 32);
 #endif
@@ -797,13 +793,13 @@ double ntohd(double d) {
   if ((ret.byte[0] == 0x00) && (ret.byte[1] == 0x00) && (ret.byte[2] == 0x00) &&
       (ret.byte[3] == 0x00) && (ret.byte[4] == 0x00) && (ret.byte[5] == 0x00) &&
       (ret.byte[6] == 0xf8) && (ret.byte[7] == 0x7f)) {
-    return (NAN);
+    return NAN;
   } else {
     uint64_t tmp;
 
     tmp = ret.integer;
     ret.integer = FP_CONVERT(tmp);
-    return (ret.floating);
+    return ret.floating;
   }
 } /* double ntohd */
 
@@ -819,14 +815,14 @@ double htond(double d) {
     ret.byte[4] = ret.byte[5] = 0x00;
     ret.byte[6] = 0xf8;
     ret.byte[7] = 0x7f;
-    return (ret.floating);
+    return ret.floating;
   } else {
     uint64_t tmp;
 
     ret.floating = d;
     tmp = FP_CONVERT(ret.integer);
     ret.integer = tmp;
-    return (ret.floating);
+    return ret.floating;
   }
 } /* double htond */
 #endif /* FP_LAYOUT_NEED_ENDIANFLIP || FP_LAYOUT_NEED_INTSWAP */
@@ -844,7 +840,7 @@ int format_name(char *ret, int ret_len, const char *hostname,
   do {                                                                         \
     size_t l = strlen(str);                                                    \
     if (l >= buffer_size)                                                      \
-      return (ENOBUFS);                                                        \
+      return ENOBUFS;                                                          \
     memcpy(buffer, (str), l);                                                  \
     buffer += l;                                                               \
     buffer_size -= l;                                                          \
@@ -870,7 +866,7 @@ int format_name(char *ret, int ret_len, const char *hostname,
   buffer[0] = 0;
 
 #undef APPEND
-  return (0);
+  return 0;
 } /* int format_name */
 
 int format_values(char *ret, size_t ret_len, /* {{{ */
@@ -889,10 +885,10 @@ int format_values(char *ret, size_t ret_len, /* {{{ */
     status = ssnprintf(ret + offset, ret_len - offset, __VA_ARGS__);           \
     if (status < 1) {                                                          \
       sfree(rates);                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (((size_t)status) >= (ret_len - offset)) {                       \
       sfree(rates);                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else                                                                     \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -907,7 +903,7 @@ int format_values(char *ret, size_t ret_len, /* {{{ */
         rates = uc_get_rate(ds, vl);
       if (rates == NULL) {
         WARNING("format_values: uc_get_rate failed.");
-        return (-1);
+        return -1;
       }
       BUFFER_ADD(":" GAUGE_FORMAT, rates[i]);
     } else if (ds->ds[i].type == DS_TYPE_COUNTER)
@@ -919,14 +915,14 @@ int format_values(char *ret, size_t ret_len, /* {{{ */
     else {
       ERROR("format_values: Unknown data source type: %i", ds->ds[i].type);
       sfree(rates);
-      return (-1);
+      return -1;
     }
   } /* for ds->ds_num */
 
 #undef BUFFER_ADD
 
   sfree(rates);
-  return (0);
+  return 0;
 } /* }}} int format_values */
 
 int parse_identifier(char *str, char **ret_host, char **ret_plugin,
@@ -940,18 +936,18 @@ int parse_identifier(char *str, char **ret_host, char **ret_plugin,
 
   hostname = str;
   if (hostname == NULL)
-    return (-1);
+    return -1;
 
   plugin = strchr(hostname, '/');
   if (plugin == NULL)
-    return (-1);
+    return -1;
   *plugin = '\0';
   plugin++;
 
   type = strchr(plugin, '/');
   if (type == NULL) {
     if (default_host == NULL)
-      return (-1);
+      return -1;
     /* else: no host specified; use default */
     type = plugin;
     plugin = hostname;
@@ -978,7 +974,7 @@ int parse_identifier(char *str, char **ret_host, char **ret_plugin,
   *ret_plugin_instance = plugin_instance;
   *ret_type = type;
   *ret_type_instance = type_instance;
-  return (0);
+  return 0;
 } /* int parse_identifier */
 
 int parse_identifier_vl(const char *str, value_list_t *vl) /* {{{ */
@@ -992,7 +988,7 @@ int parse_identifier_vl(const char *str, value_list_t *vl) /* {{{ */
   int status;
 
   if ((str == NULL) || (vl == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   sstrncpy(str_copy, str, sizeof(str_copy));
 
@@ -1000,7 +996,7 @@ int parse_identifier_vl(const char *str, value_list_t *vl) /* {{{ */
                             &type_instance,
                             /* default_host = */ NULL);
   if (status != 0)
-    return (status);
+    return status;
 
   sstrncpy(vl->host, host, sizeof(vl->host));
   sstrncpy(vl->plugin, plugin, sizeof(vl->plugin));
@@ -1011,7 +1007,7 @@ int parse_identifier_vl(const char *str, value_list_t *vl) /* {{{ */
   sstrncpy(vl->type_instance, (type_instance != NULL) ? type_instance : "",
            sizeof(vl->type_instance));
 
-  return (0);
+  return 0;
 } /* }}} int parse_identifier_vl */
 
 int parse_value(const char *value_orig, value_t *ret_value, int ds_type) {
@@ -1020,11 +1016,11 @@ int parse_value(const char *value_orig, value_t *ret_value, int ds_type) {
   size_t value_len;
 
   if (value_orig == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   value = strdup(value_orig);
   if (value == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   value_len = strlen(value);
 
   while ((value_len > 0) && isspace((int)value[value_len - 1])) {
@@ -1104,7 +1100,7 @@ int parse_values(char *buffer, value_list_t *vl, const data_set_t *ds) {
             || (endptr == ptr)  /* Invalid string */
             || (endptr == NULL) /* This should not happen */
             || (*endptr != 0))  /* Trailing chars */
-          return (-1);
+          return -1;
 
         vl->time = DOUBLE_TO_CDTIME_T(tmp);
       }
@@ -1121,8 +1117,8 @@ int parse_values(char *buffer, value_list_t *vl, const data_set_t *ds) {
   } /* while (strtok_r) */
 
   if ((ptr != NULL) || (i == 0))
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* int parse_values */
 
 int parse_value_file(char const *path, value_t *ret_value, int ds_type) {
@@ -1131,11 +1127,11 @@ int parse_value_file(char const *path, value_t *ret_value, int ds_type) {
 
   fh = fopen(path, "r");
   if (fh == NULL)
-    return (-1);
+    return -1;
 
   if (fgets(buffer, sizeof(buffer), fh) == NULL) {
     fclose(fh);
-    return (-1);
+    return -1;
   }
 
   fclose(fh);
@@ -1189,7 +1185,7 @@ int getpwnam_r(const char *name, struct passwd *pwbuf, char *buf, size_t buflen,
 
   pthread_mutex_unlock(&getpwnam_r_lock);
 
-  return (status);
+  return status;
 } /* int getpwnam_r */
 #endif /* !HAVE_GETPWNAM_R */
 
@@ -1214,7 +1210,7 @@ int notification_init(notification_t *n, int severity, const char *message,
   if (type_instance != NULL)
     sstrncpy(n->type_instance, type_instance, sizeof(n->type_instance));
 
-  return (0);
+  return 0;
 } /* int notification_init */
 
 int walk_directory(const char *dir, dirwalk_callback_f callback,
@@ -1256,8 +1252,8 @@ int walk_directory(const char *dir, dirwalk_callback_f callback,
   closedir(dh);
 
   if ((success == 0) && (failure > 0))
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 }
 
 ssize_t read_file_contents(const char *filename, char *buf, size_t bufsize) {
@@ -1266,7 +1262,7 @@ ssize_t read_file_contents(const char *filename, char *buf, size_t bufsize) {
 
   fh = fopen(filename, "r");
   if (fh == NULL)
-    return (-1);
+    return -1;
 
   ret = (ssize_t)fread(buf, 1, bufsize, fh);
   if ((ret == 0) && (ferror(fh) != 0)) {
@@ -1275,7 +1271,7 @@ ssize_t read_file_contents(const char *filename, char *buf, size_t bufsize) {
   }
 
   fclose(fh);
-  return (ret);
+  return ret;
 }
 
 counter_t counter_diff(counter_t old_value, counter_t new_value) {
@@ -1290,7 +1286,7 @@ counter_t counter_diff(counter_t old_value, counter_t new_value) {
     diff = new_value - old_value;
   }
 
-  return (diff);
+  return diff;
 } /* counter_t counter_diff */
 
 int rate_to_value(value_t *ret_value, gauge_t rate, /* {{{ */
@@ -1303,7 +1299,7 @@ int rate_to_value(value_t *ret_value, gauge_t rate, /* {{{ */
     state->last_time = t;
 
     *ret_value = state->last_value;
-    return (0);
+    return 0;
   }
 
   /* Counter and absolute can't handle negative rates. Reset "last time"
@@ -1312,13 +1308,13 @@ int rate_to_value(value_t *ret_value, gauge_t rate, /* {{{ */
   if ((rate < 0.0) &&
       ((ds_type == DS_TYPE_COUNTER) || (ds_type == DS_TYPE_ABSOLUTE))) {
     memset(state, 0, sizeof(*state));
-    return (EINVAL);
+    return EINVAL;
   }
 
   /* Another invalid state: The time is not increasing. */
   if (t <= state->last_time) {
     memset(state, 0, sizeof(*state));
-    return (EINVAL);
+    return EINVAL;
   }
 
   delta_t = t - state->last_time;
@@ -1341,7 +1337,7 @@ int rate_to_value(value_t *ret_value, gauge_t rate, /* {{{ */
     }
 
     state->last_time = t;
-    return (EAGAIN);
+    return EAGAIN;
   } /* }}} */
 
   if (ds_type == DS_TYPE_DERIVE) {
@@ -1365,7 +1361,7 @@ int rate_to_value(value_t *ret_value, gauge_t rate, /* {{{ */
 
   state->last_time = t;
   *ret_value = state->last_value;
-  return (0);
+  return 0;
 } /* }}} value_t rate_to_value */
 
 int value_to_rate(gauge_t *ret_rate, /* {{{ */
@@ -1376,7 +1372,7 @@ int value_to_rate(gauge_t *ret_rate, /* {{{ */
   /* Another invalid state: The time is not increasing. */
   if (t <= state->last_time) {
     memset(state, 0, sizeof(*state));
-    return (EINVAL);
+    return EINVAL;
   }
 
   interval = CDTIME_T_TO_DOUBLE(t - state->last_time);
@@ -1385,7 +1381,7 @@ int value_to_rate(gauge_t *ret_rate, /* {{{ */
   if (state->last_time == 0) {
     state->last_value = value;
     state->last_time = t;
-    return (EAGAIN);
+    return EAGAIN;
   }
 
   switch (ds_type) {
@@ -1414,7 +1410,7 @@ int value_to_rate(gauge_t *ret_rate, /* {{{ */
 
   state->last_value = value;
   state->last_time = t;
-  return (0);
+  return 0;
 } /* }}} value_t rate_to_value */
 
 int service_name_to_port_number(const char *service_name) {
@@ -1423,7 +1419,7 @@ int service_name_to_port_number(const char *service_name) {
   int service_number;
 
   if (service_name == NULL)
-    return (-1);
+    return -1;
 
   struct addrinfo ai_hints = {.ai_family = AF_UNSPEC};
 
@@ -1431,7 +1427,7 @@ int service_name_to_port_number(const char *service_name) {
   if (status != 0) {
     ERROR("service_name_to_port_number: getaddrinfo failed: %s",
           gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   service_number = -1;
@@ -1456,8 +1452,8 @@ int service_name_to_port_number(const char *service_name) {
   freeaddrinfo(ai_list);
 
   if ((service_number > 0) && (service_number <= 65535))
-    return (service_number);
-  return (-1);
+    return service_number;
+  return -1;
 } /* int service_name_to_port_number */
 
 void set_sock_opts(int sockfd) /* {{{ */
@@ -1503,16 +1499,16 @@ int strtoderive(const char *string, derive_t *ret_value) /* {{{ */
   char *endptr;
 
   if ((string == NULL) || (ret_value == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   errno = 0;
   endptr = NULL;
   tmp = (derive_t)strtoll(string, &endptr, /* base = */ 0);
   if ((endptr == string) || (errno != 0))
-    return (-1);
+    return -1;
 
   *ret_value = tmp;
-  return (0);
+  return 0;
 } /* }}} int strtoderive */
 
 int strtogauge(const char *string, gauge_t *ret_value) /* {{{ */
@@ -1521,18 +1517,18 @@ int strtogauge(const char *string, gauge_t *ret_value) /* {{{ */
   char *endptr = NULL;
 
   if ((string == NULL) || (ret_value == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   errno = 0;
   endptr = NULL;
   tmp = (gauge_t)strtod(string, &endptr);
   if (errno != 0)
-    return (errno);
+    return errno;
   else if ((endptr == NULL) || (*endptr != 0))
-    return (EINVAL);
+    return EINVAL;
 
   *ret_value = tmp;
-  return (0);
+  return 0;
 } /* }}} int strtogauge */
 
 int strarray_add(char ***ret_array, size_t *ret_array_len,
@@ -1542,20 +1538,20 @@ int strarray_add(char ***ret_array, size_t *ret_array_len,
   size_t array_len = *ret_array_len;
 
   if (str == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   array = realloc(*ret_array, (array_len + 1) * sizeof(*array));
   if (array == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   *ret_array = array;
 
   array[array_len] = strdup(str);
   if (array[array_len] == NULL)
-    return (ENOMEM);
+    return ENOMEM;
 
   array_len++;
   *ret_array_len = array_len;
-  return (0);
+  return 0;
 } /* }}} int strarray_add */
 
 void strarray_free(char **array, size_t array_len) /* {{{ */
@@ -1573,27 +1569,27 @@ int check_capability(int arg) /* {{{ */
   cap_flag_value_t cap_flag_value;
 
   if (!CAP_IS_SUPPORTED(cap_value))
-    return (-1);
+    return -1;
 
   if (!(cap = cap_get_proc())) {
     ERROR("check_capability: cap_get_proc failed.");
-    return (-1);
+    return -1;
   }
 
   if (cap_get_flag(cap, cap_value, CAP_EFFECTIVE, &cap_flag_value) < 0) {
     ERROR("check_capability: cap_get_flag failed.");
     cap_free(cap);
-    return (-1);
+    return -1;
   }
   cap_free(cap);
 
-  return (cap_flag_value != CAP_SET);
+  return cap_flag_value != CAP_SET;
 } /* }}} int check_capability */
 #else
 int check_capability(__attribute__((unused)) int arg) /* {{{ */
 {
   WARNING("check_capability: unsupported capability implementation. "
           "Some plugin(s) may require elevated privileges to work properly.");
-  return (0);
+  return 0;
 } /* }}} int check_capability */
 #endif /* HAVE_CAPABILITY */
index 0c96945..5b577d4 100644 (file)
@@ -55,7 +55,7 @@ DEF_TEST(sstrncpy) {
   EXPECT_EQ_STR("collect", ptr);
   OK(buffer[3] == buffer[12]);
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(ssnprintf) {
@@ -76,7 +76,7 @@ DEF_TEST(ssnprintf) {
   EXPECT_EQ_STR("collect", ptr);
   OK(buffer[3] == buffer[12]);
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(sstrdup) {
@@ -91,7 +91,7 @@ DEF_TEST(sstrdup) {
   ptr = sstrdup(NULL);
   OK(ptr == NULL);
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(strsplit) {
@@ -141,7 +141,7 @@ DEF_TEST(strsplit) {
   status = strsplit(buffer, fields, 8);
   OK(status == 0);
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(strjoin) {
@@ -190,7 +190,7 @@ DEF_TEST(strjoin) {
   /* use (NULL, 0) to determine required buffer size. */
   EXPECT_EQ_INT(3, strjoin(NULL, 0, (char *[]){"a", "b"}, 2, "-"));
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(escape_slashes) {
@@ -264,7 +264,7 @@ DEF_TEST(strunescape) {
   status = strunescape(buffer, sizeof(buffer));
   OK(status != 0);
   EXPECT_EQ_STR("\tbackslash end", buffer);
-  return (0);
+  return 0;
 
   /* Backslash at buffer end */
   strncpy(buffer, "\\t3\\56", sizeof(buffer));
@@ -278,7 +278,7 @@ DEF_TEST(strunescape) {
   OK(buffer[5] == '6');
   OK(buffer[6] == '7');
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(parse_values) {
@@ -323,7 +323,7 @@ DEF_TEST(parse_values) {
     EXPECT_EQ_DOUBLE(cases[i].value, vl.values[0].gauge);
   }
 
-  return (0);
+  return 0;
 }
 
 DEF_TEST(value_to_rate) {
@@ -392,5 +392,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index 3934e1f..5594bb7 100644 (file)
@@ -128,13 +128,13 @@ static cf_callback_t *cf_search(const char *type) {
   cf_callback_t *cf_cb;
 
   if (type == NULL)
-    return (NULL);
+    return NULL;
 
   for (cf_cb = first_callback; cf_cb != NULL; cf_cb = cf_cb->next)
     if (strcasecmp(cf_cb->type, type) == 0)
       break;
 
-  return (cf_cb);
+  return cf_cb;
 }
 
 static int cf_dispatch(const char *type, const char *orig_key,
@@ -147,7 +147,7 @@ static int cf_dispatch(const char *type, const char *orig_key,
   int i = 0;
 
   if (orig_key == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   DEBUG("type = %s, key = %s, value = %s", ESCAPE_NULL(type), orig_key,
         ESCAPE_NULL(orig_value));
@@ -157,14 +157,14 @@ static int cf_dispatch(const char *type, const char *orig_key,
             "the plugin isn't loaded or didn't register "
             "a configuration callback.",
             type);
-    return (-1);
+    return -1;
   }
 
   if ((key = strdup(orig_key)) == NULL)
-    return (1);
+    return 1;
   if ((value = strdup(orig_value)) == NULL) {
     free(key);
-    return (2);
+    return 2;
   }
 
   ret = -1;
@@ -186,26 +186,26 @@ static int cf_dispatch(const char *type, const char *orig_key,
   free(key);
   free(value);
 
-  return (ret);
+  return ret;
 } /* int cf_dispatch */
 
 static int dispatch_global_option(const oconfig_item_t *ci) {
   if (ci->values_num != 1)
-    return (-1);
+    return -1;
   if (ci->values[0].type == OCONFIG_TYPE_STRING)
-    return (global_option_set(ci->key, ci->values[0].value.string, 0));
+    return global_option_set(ci->key, ci->values[0].value.string, 0);
   else if (ci->values[0].type == OCONFIG_TYPE_NUMBER) {
     char tmp[128];
     ssnprintf(tmp, sizeof(tmp), "%lf", ci->values[0].value.number);
-    return (global_option_set(ci->key, tmp, 0));
+    return global_option_set(ci->key, tmp, 0);
   } else if (ci->values[0].type == OCONFIG_TYPE_BOOLEAN) {
     if (ci->values[0].value.boolean)
-      return (global_option_set(ci->key, "true", 0));
+      return global_option_set(ci->key, "true", 0);
     else
-      return (global_option_set(ci->key, "false", 0));
+      return global_option_set(ci->key, "false", 0);
   }
 
-  return (-1);
+  return -1;
 } /* int dispatch_global_option */
 
 static int dispatch_value_typesdb(oconfig_item_t *ci) {
@@ -215,7 +215,7 @@ static int dispatch_value_typesdb(oconfig_item_t *ci) {
 
   if (ci->values_num < 1) {
     ERROR("configfile: `TypesDB' needs at least one argument.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; ++i) {
@@ -228,24 +228,24 @@ static int dispatch_value_typesdb(oconfig_item_t *ci) {
 
     read_types_list(ci->values[i].value.string);
   }
-  return (0);
+  return 0;
 } /* int dispatch_value_typesdb */
 
 static int dispatch_value_plugindir(oconfig_item_t *ci) {
   assert(strcasecmp(ci->key, "PluginDir") == 0);
 
   if (ci->values_num != 1)
-    return (-1);
+    return -1;
   if (ci->values[0].type != OCONFIG_TYPE_STRING)
-    return (-1);
+    return -1;
 
   plugin_set_dir(ci->values[0].value.string);
-  return (0);
+  return 0;
 }
 
 static int dispatch_loadplugin(oconfig_item_t *ci) {
   const char *name;
-  unsigned int flags = 0;
+  _Bool global = 0;
   plugin_ctx_t ctx = {0};
   plugin_ctx_t old_ctx;
   int ret_val;
@@ -253,9 +253,9 @@ static int dispatch_loadplugin(oconfig_item_t *ci) {
   assert(strcasecmp(ci->key, "LoadPlugin") == 0);
 
   if (ci->values_num != 1)
-    return (-1);
+    return -1;
   if (ci->values[0].type != OCONFIG_TYPE_STRING)
-    return (-1);
+    return -1;
 
   name = ci->values[0].value.string;
   if (strcmp("libvirt", name) == 0)
@@ -270,7 +270,7 @@ static int dispatch_loadplugin(oconfig_item_t *ci) {
     oconfig_item_t *child = ci->children + i;
 
     if (strcasecmp("Globals", child->key) == 0)
-      cf_util_get_flag(child, &flags, PLUGIN_FLAGS_GLOBAL);
+      cf_util_get_boolean(child, &global);
     else if (strcasecmp("Interval", child->key) == 0)
       cf_util_get_cdtime(child, &ctx.interval);
     else if (strcasecmp("FlushInterval", child->key) == 0)
@@ -285,11 +285,11 @@ static int dispatch_loadplugin(oconfig_item_t *ci) {
   }
 
   old_ctx = plugin_set_ctx(ctx);
-  ret_val = plugin_load(name, (uint32_t)flags);
+  ret_val = plugin_load(name, global);
   /* reset to the "global" context */
   plugin_set_ctx(old_ctx);
 
-  return (ret_val);
+  return ret_val;
 } /* int dispatch_value_loadplugin */
 
 static int dispatch_value_plugin(const char *plugin, oconfig_item_t *ci) {
@@ -314,14 +314,14 @@ static int dispatch_value_plugin(const char *plugin, oconfig_item_t *ci) {
                          ci->values[i].value.boolean ? "true" : "false");
 
     if ((status < 0) || (status >= buffer_free))
-      return (-1);
+      return -1;
     buffer_free -= status;
     buffer_ptr += status;
   }
   /* skip the initial space */
   buffer_ptr = buffer + 1;
 
-  return (cf_dispatch(plugin, ci->key, buffer_ptr));
+  return cf_dispatch(plugin, ci->key, buffer_ptr);
 } /* int dispatch_value_plugin */
 
 static int dispatch_value(oconfig_item_t *ci) {
@@ -339,18 +339,18 @@ static int dispatch_value(oconfig_item_t *ci) {
       break;
     }
 
-  return (ret);
+  return ret;
 } /* int dispatch_value */
 
 static int dispatch_block_plugin(oconfig_item_t *ci) {
   const char *name;
 
   if (strcasecmp(ci->key, "Plugin") != 0)
-    return (-1);
+    return -1;
   if (ci->values_num < 1)
-    return (-1);
+    return -1;
   if (ci->values[0].type != OCONFIG_TYPE_STRING)
-    return (-1);
+    return -1;
 
   name = ci->values[0].value.string;
   if (strcmp("libvirt", name) == 0) {
@@ -380,7 +380,7 @@ static int dispatch_block_plugin(oconfig_item_t *ci) {
       ERROR("Automatically loading plugin \"%s\" failed "
             "with status %i.",
             name, status);
-      return (status);
+      return status;
     }
   }
 
@@ -394,7 +394,7 @@ static int dispatch_block_plugin(oconfig_item_t *ci) {
       old_ctx = plugin_set_ctx(cb->ctx);
       ret_val = (cb->callback(ci));
       plugin_set_ctx(old_ctx);
-      return (ret_val);
+      return ret_val;
     }
   }
 
@@ -413,18 +413,18 @@ static int dispatch_block_plugin(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 static int dispatch_block(oconfig_item_t *ci) {
   if (strcasecmp(ci->key, "LoadPlugin") == 0)
-    return (dispatch_loadplugin(ci));
+    return dispatch_loadplugin(ci);
   else if (strcasecmp(ci->key, "Plugin") == 0)
-    return (dispatch_block_plugin(ci));
+    return dispatch_block_plugin(ci);
   else if (strcasecmp(ci->key, "Chain") == 0)
-    return (fc_configure(ci));
+    return fc_configure(ci);
 
-  return (0);
+  return 0;
 }
 
 static int cf_ci_replace_child(oconfig_item_t *dst, oconfig_item_t *src,
@@ -458,7 +458,7 @@ static int cf_ci_replace_child(oconfig_item_t *dst, oconfig_item_t *src,
    * all children. */
   if (dst->children_num + src->children_num - 1 == 0) {
     dst->children_num = 0;
-    return (0);
+    return 0;
   }
 
   temp =
@@ -466,7 +466,7 @@ static int cf_ci_replace_child(oconfig_item_t *dst, oconfig_item_t *src,
                                  (dst->children_num + src->children_num - 1));
   if (temp == NULL) {
     ERROR("configfile: realloc failed.");
-    return (-1);
+    return -1;
   }
   dst->children = temp;
 
@@ -493,20 +493,20 @@ static int cf_ci_replace_child(oconfig_item_t *dst, oconfig_item_t *src,
   /* Update the number of children. */
   dst->children_num += (src->children_num - 1);
 
-  return (0);
+  return 0;
 } /* int cf_ci_replace_child */
 
 static int cf_ci_append_children(oconfig_item_t *dst, oconfig_item_t *src) {
   oconfig_item_t *temp;
 
   if ((src == NULL) || (src->children_num == 0))
-    return (0);
+    return 0;
 
   temp = realloc(dst->children, sizeof(oconfig_item_t) *
                                     (dst->children_num + src->children_num));
   if (temp == NULL) {
     ERROR("configfile: realloc failed.");
-    return (-1);
+    return -1;
   }
   dst->children = temp;
 
@@ -514,7 +514,7 @@ static int cf_ci_append_children(oconfig_item_t *dst, oconfig_item_t *src) {
          sizeof(oconfig_item_t) * src->children_num);
   dst->children_num += src->children_num;
 
-  return (0);
+  return 0;
 } /* int cf_ci_append_children */
 
 #define CF_MAX_DEPTH 8
@@ -553,13 +553,13 @@ static int cf_include_all(oconfig_item_t *root, int depth) {
     sfree(pattern);
 
     if (new == NULL)
-      return (-1);
+      return -1;
 
     /* Now replace the i'th child in `root' with `new'. */
     if (cf_ci_replace_child(root, new, i) < 0) {
       sfree(new->values);
       sfree(new);
-      return (-1);
+      return -1;
     }
 
     /* ... and go back to the new i'th child. */
@@ -569,7 +569,7 @@ static int cf_include_all(oconfig_item_t *root, int depth) {
     sfree(new);
   } /* for (i = 0; i < root->children_num; i++) */
 
-  return (0);
+  return 0;
 } /* int cf_include_all */
 
 static oconfig_item_t *cf_read_file(const char *file, const char *pattern,
@@ -589,7 +589,7 @@ static oconfig_item_t *cf_read_file(const char *file, const char *pattern,
             "does not match pattern `%s'.",
             filename, pattern);
       free(tmp);
-      return (NULL);
+      return NULL;
     }
 
     free(tmp);
@@ -604,16 +604,16 @@ static oconfig_item_t *cf_read_file(const char *file, const char *pattern,
   root = oconfig_parse_file(file);
   if (root == NULL) {
     ERROR("configfile: Cannot read file `%s'.", file);
-    return (NULL);
+    return NULL;
   }
 
   status = cf_include_all(root, depth);
   if (status != 0) {
     oconfig_free(root);
-    return (NULL);
+    return NULL;
   }
 
-  return (root);
+  return root;
 } /* oconfig_item_t *cf_read_file */
 
 static int cf_compare_string(const void *p1, const void *p2) {
@@ -636,14 +636,14 @@ static oconfig_item_t *cf_read_dir(const char *dir, const char *pattern,
     char errbuf[1024];
     ERROR("configfile: opendir failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (NULL);
+    return NULL;
   }
 
   root = calloc(1, sizeof(*root));
   if (root == NULL) {
     ERROR("configfile: calloc failed.");
     closedir(dh);
-    return (NULL);
+    return NULL;
   }
 
   while ((de = readdir(dh)) != NULL) {
@@ -663,7 +663,7 @@ static oconfig_item_t *cf_read_dir(const char *dir, const char *pattern,
         free(filenames[i]);
       free(filenames);
       free(root);
-      return (NULL);
+      return NULL;
     }
 
     ++filenames_num;
@@ -675,7 +675,7 @@ static oconfig_item_t *cf_read_dir(const char *dir, const char *pattern,
         free(filenames[i]);
       free(filenames);
       free(root);
-      return (NULL);
+      return NULL;
     }
     filenames = tmp;
 
@@ -684,7 +684,7 @@ static oconfig_item_t *cf_read_dir(const char *dir, const char *pattern,
 
   if (filenames == NULL) {
     closedir(dh);
-    return (root);
+    return root;
   }
 
   qsort((void *)filenames, filenames_num, sizeof(*filenames),
@@ -710,7 +710,7 @@ static oconfig_item_t *cf_read_dir(const char *dir, const char *pattern,
 
   closedir(dh);
   free(filenames);
-  return (root);
+  return root;
 } /* oconfig_item_t *cf_read_dir */
 
 /*
@@ -736,19 +736,19 @@ static oconfig_item_t *cf_read_generic(const char *path, const char *pattern,
     ERROR("configfile: Not including `%s' because the maximum "
           "nesting depth has been reached.",
           path);
-    return (NULL);
+    return NULL;
   }
 
   status = wordexp(path, &we, WRDE_NOCMD);
   if (status != 0) {
     ERROR("configfile: wordexp (%s) failed.", path);
-    return (NULL);
+    return NULL;
   }
 
   root = calloc(1, sizeof(*root));
   if (root == NULL) {
     ERROR("configfile: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* wordexp() might return a sorted list already. That's not
@@ -783,7 +783,7 @@ static oconfig_item_t *cf_read_generic(const char *path, const char *pattern,
 
     if (temp == NULL) {
       oconfig_free(root);
-      return (NULL);
+      return NULL;
     }
 
     cf_ci_append_children(root, temp);
@@ -793,7 +793,7 @@ static oconfig_item_t *cf_read_generic(const char *path, const char *pattern,
 
   wordfree(&we);
 
-  return (root);
+  return root;
 } /* oconfig_item_t *cf_read_generic */
 /* #endif HAVE_WORDEXP_H */
 
@@ -807,7 +807,7 @@ static oconfig_item_t *cf_read_generic(const char *path, const char *pattern,
     ERROR("configfile: Not including `%s' because the maximum "
           "nesting depth has been reached.",
           path);
-    return (NULL);
+    return NULL;
   }
 
   status = stat(path, &statbuf);
@@ -815,16 +815,16 @@ static oconfig_item_t *cf_read_generic(const char *path, const char *pattern,
     char errbuf[1024];
     ERROR("configfile: stat (%s) failed: %s", path,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (NULL);
+    return NULL;
   }
 
   if (S_ISREG(statbuf.st_mode))
-    return (cf_read_file(path, pattern, depth));
+    return cf_read_file(path, pattern, depth);
   else if (S_ISDIR(statbuf.st_mode))
-    return (cf_read_dir(path, pattern, depth));
+    return cf_read_dir(path, pattern, depth);
 
   ERROR("configfile: %s is neither a file nor a directory.", path);
-  return (NULL);
+  return NULL;
 } /* oconfig_item_t *cf_read_generic */
 #endif /* !HAVE_WORDEXP_H */
 
@@ -841,14 +841,14 @@ int global_option_set(const char *option, const char *value, _Bool from_cli) {
 
   if (i >= cf_global_options_num) {
     ERROR("configfile: Cannot set unknown global option `%s'.", option);
-    return (-1);
+    return -1;
   }
 
   if (cf_global_options[i].from_cli && (!from_cli)) {
     DEBUG("configfile: Ignoring %s `%s' option because "
           "it was overriden by a command-line option.",
           option, value);
-    return (0);
+    return 0;
   }
 
   sfree(cf_global_options[i].value);
@@ -860,7 +860,7 @@ int global_option_set(const char *option, const char *value, _Bool from_cli) {
 
   cf_global_options[i].from_cli = from_cli;
 
-  return (0);
+  return 0;
 }
 
 const char *global_option_get(const char *option) {
@@ -871,11 +871,10 @@ const char *global_option_get(const char *option) {
 
   if (i >= cf_global_options_num) {
     ERROR("configfile: Cannot get unknown global option `%s'.", option);
-    return (NULL);
+    return NULL;
   }
 
-  return ((cf_global_options[i].value != NULL) ? cf_global_options[i].value
-                                               : cf_global_options[i].def);
+  return (cf_global_options[i].value != NULL) ? cf_global_options[i].value : cf_global_options[i].def;
 } /* char *global_option_get */
 
 long global_option_get_long(const char *option, long default_value) {
@@ -884,14 +883,14 @@ long global_option_get_long(const char *option, long default_value) {
 
   str = global_option_get(option);
   if (NULL == str)
-    return (default_value);
+    return default_value;
 
   errno = 0;
   value = strtol(str, /* endptr = */ NULL, /* base = */ 0);
   if (errno != 0)
-    return (default_value);
+    return default_value;
 
-  return (value);
+  return value;
 } /* char *global_option_get_long */
 
 cdtime_t global_option_get_time(const char *name, cdtime_t def) /* {{{ */
@@ -902,21 +901,21 @@ cdtime_t global_option_get_time(const char *name, cdtime_t def) /* {{{ */
 
   optstr = global_option_get(name);
   if (optstr == NULL)
-    return (def);
+    return def;
 
   errno = 0;
   v = strtod(optstr, &endptr);
   if ((endptr == NULL) || (*endptr != 0) || (errno != 0))
-    return (def);
+    return def;
   else if (v <= 0.0)
-    return (def);
+    return def;
 
-  return (DOUBLE_TO_CDTIME_T(v));
+  return DOUBLE_TO_CDTIME_T(v);
 } /* }}} cdtime_t global_option_get_time */
 
 cdtime_t cf_get_default_interval(void) {
-  return (global_option_get_time(
-      "Interval", DOUBLE_TO_CDTIME_T(COLLECTD_DEFAULT_INTERVAL)));
+  return global_option_get_time("Interval",
+                                DOUBLE_TO_CDTIME_T(COLLECTD_DEFAULT_INTERVAL));
 }
 
 void cf_unregister(const char *type) {
@@ -974,12 +973,12 @@ int cf_register_complex(const char *type, int (*callback)(oconfig_item_t *)) {
 
   new = malloc(sizeof(*new));
   if (new == NULL)
-    return (-1);
+    return -1;
 
   new->type = strdup(type);
   if (new->type == NULL) {
     sfree(new);
-    return (-1);
+    return -1;
   }
 
   new->callback = callback;
@@ -996,7 +995,7 @@ int cf_register_complex(const char *type, int (*callback)(oconfig_item_t *)) {
     last->next = new;
   }
 
-  return (0);
+  return 0;
 } /* int cf_register_complex */
 
 int cf_read(const char *filename) {
@@ -1006,11 +1005,11 @@ int cf_read(const char *filename) {
   conf = cf_read_generic(filename, /* pattern = */ NULL, /* depth = */ 0);
   if (conf == NULL) {
     ERROR("Unable to read config file %s.", filename);
-    return (-1);
+    return -1;
   } else if (conf->children_num == 0) {
     ERROR("Configuration file %s is empty.", filename);
     oconfig_free(conf);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < conf->children_num; i++) {
@@ -1045,18 +1044,18 @@ int cf_util_get_string(const oconfig_item_t *ci, char **ret_string) /* {{{ */
     ERROR("cf_util_get_string: The %s option requires "
           "exactly one string argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   string = strdup(ci->values[0].value.string);
   if (string == NULL)
-    return (-1);
+    return -1;
 
   if (*ret_string != NULL)
     sfree(*ret_string);
   *ret_string = string;
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_string */
 
 /* Assures the config option is a string and copies it to the provided buffer.
@@ -1064,67 +1063,67 @@ int cf_util_get_string(const oconfig_item_t *ci, char **ret_string) /* {{{ */
 int cf_util_get_string_buffer(const oconfig_item_t *ci, char *buffer, /* {{{ */
                               size_t buffer_size) {
   if ((ci == NULL) || (buffer == NULL) || (buffer_size < 1))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     ERROR("cf_util_get_string_buffer: The %s option requires "
           "exactly one string argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   strncpy(buffer, ci->values[0].value.string, buffer_size);
   buffer[buffer_size - 1] = 0;
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_string_buffer */
 
 /* Assures the config option is a number and returns it as an int. */
 int cf_util_get_int(const oconfig_item_t *ci, int *ret_value) /* {{{ */
 {
   if ((ci == NULL) || (ret_value == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) {
     ERROR("cf_util_get_int: The %s option requires "
           "exactly one numeric argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_value = (int)ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_int */
 
 int cf_util_get_double(const oconfig_item_t *ci, double *ret_value) /* {{{ */
 {
   if ((ci == NULL) || (ret_value == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) {
     ERROR("cf_util_get_double: The %s option requires "
           "exactly one numeric argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_value = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_double */
 
 int cf_util_get_boolean(const oconfig_item_t *ci, _Bool *ret_bool) /* {{{ */
 {
   if ((ci == NULL) || (ret_bool == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || ((ci->values[0].type != OCONFIG_TYPE_BOOLEAN) &&
                                 (ci->values[0].type != OCONFIG_TYPE_STRING))) {
     ERROR("cf_util_get_boolean: The %s option requires "
           "exactly one boolean argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   switch (ci->values[0].type) {
@@ -1145,12 +1144,12 @@ int cf_util_get_boolean(const oconfig_item_t *ci, _Bool *ret_bool) /* {{{ */
       ERROR("cf_util_get_boolean: Cannot parse string value `%s' of the `%s' "
             "option as a boolean value.",
             ci->values[0].value.string, ci->key);
-      return (-1);
+      return -1;
     }
     break;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_boolean */
 
 int cf_util_get_flag(const oconfig_item_t *ci, /* {{{ */
@@ -1159,12 +1158,12 @@ int cf_util_get_flag(const oconfig_item_t *ci, /* {{{ */
   _Bool b;
 
   if (ret_value == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   b = 0;
   status = cf_util_get_boolean(ci, &b);
   if (status != 0)
-    return (status);
+    return status;
 
   if (b) {
     *ret_value |= flag;
@@ -1172,7 +1171,7 @@ int cf_util_get_flag(const oconfig_item_t *ci, /* {{{ */
     *ret_value &= ~flag;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_flag */
 
 /* Assures that the config option is a string or a number if the correct range
@@ -1189,11 +1188,11 @@ int cf_util_get_port_number(const oconfig_item_t *ci) /* {{{ */
     ERROR("cf_util_get_port_number: The \"%s\" option requires "
           "exactly one string argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].type == OCONFIG_TYPE_STRING)
-    return (service_name_to_port_number(ci->values[0].value.string));
+    return service_name_to_port_number(ci->values[0].value.string);
 
   assert(ci->values[0].type == OCONFIG_TYPE_NUMBER);
   tmp = (int)(ci->values[0].value.number + 0.5);
@@ -1203,10 +1202,10 @@ int cf_util_get_port_number(const oconfig_item_t *ci) /* {{{ */
           "you specified, %i, is not in the valid "
           "range of 1-65535.",
           ci->key, tmp);
-    return (-1);
+    return -1;
   }
 
-  return (tmp);
+  return tmp;
 } /* }}} int cf_util_get_port_number */
 
 int cf_util_get_service(const oconfig_item_t *ci, char **ret_string) /* {{{ */
@@ -1219,11 +1218,11 @@ int cf_util_get_service(const oconfig_item_t *ci, char **ret_string) /* {{{ */
     ERROR("cf_util_get_service: The %s option requires exactly "
           "one argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].type == OCONFIG_TYPE_STRING)
-    return (cf_util_get_string(ci, ret_string));
+    return cf_util_get_string(ci, ret_string);
   if (ci->values[0].type != OCONFIG_TYPE_NUMBER) {
     ERROR("cf_util_get_service: The %s option requires "
           "exactly one string or numeric argument.",
@@ -1233,48 +1232,48 @@ int cf_util_get_service(const oconfig_item_t *ci, char **ret_string) /* {{{ */
   port = 0;
   status = cf_util_get_int(ci, &port);
   if (status != 0)
-    return (status);
+    return status;
   else if ((port < 1) || (port > 65535)) {
     ERROR("cf_util_get_service: The port number given "
           "for the %s option is out of "
           "range (%i).",
           ci->key, port);
-    return (-1);
+    return -1;
   }
 
   service = malloc(6);
   if (service == NULL) {
     ERROR("cf_util_get_service: Out of memory.");
-    return (-1);
+    return -1;
   }
   ssnprintf(service, 6, "%i", port);
 
   sfree(*ret_string);
   *ret_string = service;
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_service */
 
 int cf_util_get_cdtime(const oconfig_item_t *ci, cdtime_t *ret_value) /* {{{ */
 {
   if ((ci == NULL) || (ret_value == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) {
     ERROR("cf_util_get_cdtime: The %s option requires "
           "exactly one numeric argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.number < 0.0) {
     ERROR("cf_util_get_cdtime: The numeric argument of the %s "
           "option must not be negative.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_value = DOUBLE_TO_CDTIME_T(ci->values[0].value.number);
 
-  return (0);
+  return 0;
 } /* }}} int cf_util_get_cdtime */
index 9c4a89c..5a2d647 100644 (file)
@@ -166,16 +166,16 @@ static char *fc_strdup(const char *orig) /* {{{ */
   char *dest;
 
   if (orig == NULL)
-    return (NULL);
+    return NULL;
 
   sz = strlen(orig) + 1;
   dest = malloc(sz);
   if (dest == NULL)
-    return (NULL);
+    return NULL;
 
   memcpy(dest, orig, sz);
 
-  return (dest);
+  return dest;
 } /* }}} char *fc_strdup */
 
 /*
@@ -208,7 +208,7 @@ static int fc_config_add_match(fc_match_t **matches_head, /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("Filter subsystem: `Match' blocks require "
             "exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   ptr = match_list_head;
@@ -222,13 +222,13 @@ static int fc_config_add_match(fc_match_t **matches_head, /* {{{ */
     WARNING("Filter subsystem: Cannot find a \"%s\" match. "
             "Did you load the appropriate plugin?",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   m = calloc(1, sizeof(*m));
   if (m == NULL) {
     ERROR("fc_config_add_match: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(m->name, ptr->name, sizeof(m->name));
@@ -241,7 +241,7 @@ static int fc_config_add_match(fc_match_t **matches_head, /* {{{ */
     if (status != 0) {
       WARNING("Filter subsystem: Failed to create a %s match.", m->name);
       fc_free_matches(m);
-      return (-1);
+      return -1;
     }
   }
 
@@ -255,7 +255,7 @@ static int fc_config_add_match(fc_match_t **matches_head, /* {{{ */
     *matches_head = m;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_config_add_match */
 
 static int fc_config_add_target(fc_target_t **targets_head, /* {{{ */
@@ -267,7 +267,7 @@ static int fc_config_add_target(fc_target_t **targets_head, /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("Filter subsystem: `Target' blocks require "
             "exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   ptr = target_list_head;
@@ -281,13 +281,13 @@ static int fc_config_add_target(fc_target_t **targets_head, /* {{{ */
     WARNING("Filter subsystem: Cannot find a \"%s\" target. "
             "Did you load the appropriate plugin?",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   t = calloc(1, sizeof(*t));
   if (t == NULL) {
     ERROR("fc_config_add_target: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(t->name, ptr->name, sizeof(t->name));
@@ -300,7 +300,7 @@ static int fc_config_add_target(fc_target_t **targets_head, /* {{{ */
     if (status != 0) {
       WARNING("Filter subsystem: Failed to create a %s target.", t->name);
       fc_free_targets(t);
-      return (-1);
+      return -1;
     }
   } else {
     t->user_data = NULL;
@@ -316,7 +316,7 @@ static int fc_config_add_target(fc_target_t **targets_head, /* {{{ */
     *targets_head = t;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_config_add_target */
 
 static int fc_config_add_rule(fc_chain_t *chain, /* {{{ */
@@ -327,18 +327,18 @@ static int fc_config_add_rule(fc_chain_t *chain, /* {{{ */
 
   if (ci->values_num > 1) {
     WARNING("Filter subsystem: `Rule' blocks have at most one argument.");
-    return (-1);
+    return -1;
   } else if ((ci->values_num == 1) &&
              (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("Filter subsystem: `Rule' blocks expect one string argument "
             "or no argument at all.");
-    return (-1);
+    return -1;
   }
 
   rule = calloc(1, sizeof(*rule));
   if (rule == NULL) {
     ERROR("fc_config_add_rule: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   if (ci->values_num == 1) {
@@ -378,7 +378,7 @@ static int fc_config_add_rule(fc_chain_t *chain, /* {{{ */
 
   if (status != 0) {
     fc_free_rules(rule);
-    return (-1);
+    return -1;
   }
 
   if (chain->rules != NULL) {
@@ -393,7 +393,7 @@ static int fc_config_add_rule(fc_chain_t *chain, /* {{{ */
     chain->rules = rule;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_config_add_rule */
 
 static int fc_config_add_chain(const oconfig_item_t *ci) /* {{{ */
@@ -405,7 +405,7 @@ static int fc_config_add_chain(const oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("Filter subsystem: <Chain> blocks require exactly one "
             "string argument.");
-    return (-1);
+    return -1;
   }
 
   if (chain_list_head != NULL) {
@@ -417,7 +417,7 @@ static int fc_config_add_chain(const oconfig_item_t *ci) /* {{{ */
     chain = calloc(1, sizeof(*chain));
     if (chain == NULL) {
       ERROR("fc_config_add_chain: calloc failed.");
-      return (-1);
+      return -1;
     }
     sstrncpy(chain->name, ci->values[0].value.string, sizeof(chain->name));
   }
@@ -442,12 +442,12 @@ static int fc_config_add_chain(const oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     fc_free_chains(chain);
-    return (-1);
+    return -1;
   }
 
   if (chain_list_head != NULL) {
     if (!new_chain)
-      return (0);
+      return 0;
 
     fc_chain_t *ptr;
 
@@ -460,7 +460,7 @@ static int fc_config_add_chain(const oconfig_item_t *ci) /* {{{ */
     chain_list_head = chain;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_config_add_chain */
 
 /*
@@ -475,7 +475,7 @@ static int fc_bit_jump_create(const oconfig_item_t *ci, /* {{{ */
   if (ci->children_num != 1) {
     ERROR("Filter subsystem: The built-in target `jump' needs exactly "
           "one `Chain' argument!");
-    return (-1);
+    return -1;
   }
 
   ci_chain = ci->children;
@@ -483,23 +483,23 @@ static int fc_bit_jump_create(const oconfig_item_t *ci, /* {{{ */
     ERROR("Filter subsystem: The built-in target `jump' does not "
           "support the configuration option `%s'.",
           ci_chain->key);
-    return (-1);
+    return -1;
   }
 
   if ((ci_chain->values_num != 1) ||
       (ci_chain->values[0].type != OCONFIG_TYPE_STRING)) {
     ERROR("Filter subsystem: Built-in target `jump': The `Chain' option "
           "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   *user_data = fc_strdup(ci_chain->values[0].value.string);
   if (*user_data == NULL) {
     ERROR("fc_bit_jump_create: fc_strdup failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_bit_jump_create */
 
 static int fc_bit_jump_destroy(void **user_data) /* {{{ */
@@ -509,7 +509,7 @@ static int fc_bit_jump_destroy(void **user_data) /* {{{ */
     *user_data = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_bit_jump_destroy */
 
 static int fc_bit_jump_invoke(const data_set_t *ds, /* {{{ */
@@ -531,16 +531,16 @@ static int fc_bit_jump_invoke(const data_set_t *ds, /* {{{ */
     ERROR("Filter subsystem: Built-in target `jump': There is no chain "
           "named `%s'.",
           chain_name);
-    return (-1);
+    return -1;
   }
 
   status = fc_process_chain(ds, vl, chain);
   if (status < 0)
-    return (status);
+    return status;
   else if (status == FC_TARGET_STOP)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
   else
-    return (FC_TARGET_CONTINUE);
+    return FC_TARGET_CONTINUE;
 } /* }}} int fc_bit_jump_invoke */
 
 static int
@@ -548,7 +548,7 @@ fc_bit_stop_invoke(const data_set_t __attribute__((unused)) * ds, /* {{{ */
                    value_list_t __attribute__((unused)) * vl,
                    notification_meta_t __attribute__((unused)) * *meta,
                    void __attribute__((unused)) * *user_data) {
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int fc_bit_stop_invoke */
 
 static int
@@ -556,7 +556,7 @@ fc_bit_return_invoke(const data_set_t __attribute__((unused)) * ds, /* {{{ */
                      value_list_t __attribute__((unused)) * vl,
                      notification_meta_t __attribute__((unused)) * *meta,
                      void __attribute__((unused)) * *user_data) {
-  return (FC_TARGET_RETURN);
+  return FC_TARGET_RETURN;
 } /* }}} int fc_bit_return_invoke */
 
 static int fc_bit_write_create(const oconfig_item_t *ci, /* {{{ */
@@ -606,7 +606,7 @@ static int fc_bit_write_create(const oconfig_item_t *ci, /* {{{ */
 
   *user_data = plugin_list;
 
-  return (0);
+  return 0;
 } /* }}} int fc_bit_write_create */
 
 static int fc_bit_write_destroy(void **user_data) /* {{{ */
@@ -614,7 +614,7 @@ static int fc_bit_write_destroy(void **user_data) /* {{{ */
   fc_writer_t *plugin_list;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (0);
+    return 0;
 
   plugin_list = *user_data;
 
@@ -622,7 +622,7 @@ static int fc_bit_write_destroy(void **user_data) /* {{{ */
     free(plugin_list[i].plugin);
   free(plugin_list);
 
-  return (0);
+  return 0;
 } /* }}} int fc_bit_write_destroy */
 
 static int fc_bit_write_invoke(const data_set_t *ds, /* {{{ */
@@ -688,7 +688,7 @@ static int fc_bit_write_invoke(const data_set_t *ds, /* {{{ */
     } /* for (i = 0; plugin_list[i] != NULL; i++) */
   }
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int fc_bit_write_invoke */
 
 static int fc_init_once(void) /* {{{ */
@@ -697,7 +697,7 @@ static int fc_init_once(void) /* {{{ */
   target_proc_t tproc = {0};
 
   if (done != 0)
-    return (0);
+    return 0;
 
   tproc.create = fc_bit_jump_create;
   tproc.destroy = fc_bit_jump_destroy;
@@ -723,7 +723,7 @@ static int fc_init_once(void) /* {{{ */
   fc_register_target("write", tproc);
 
   done++;
-  return (0);
+  return 0;
 } /* }}} int fc_init_once */
 
 /*
@@ -738,7 +738,7 @@ int fc_register_match(const char *name, match_proc_t proc) /* {{{ */
 
   m = calloc(1, sizeof(*m));
   if (m == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   sstrncpy(m->name, name, sizeof(m->name));
   memcpy(&m->proc, &proc, sizeof(m->proc));
@@ -755,7 +755,7 @@ int fc_register_match(const char *name, match_proc_t proc) /* {{{ */
     ptr->next = m;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_register_match */
 
 /* Add a target to list of available targets. */
@@ -767,7 +767,7 @@ int fc_register_target(const char *name, target_proc_t proc) /* {{{ */
 
   t = calloc(1, sizeof(*t));
   if (t == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   sstrncpy(t->name, name, sizeof(t->name));
   memcpy(&t->proc, &proc, sizeof(t->proc));
@@ -784,19 +784,19 @@ int fc_register_target(const char *name, target_proc_t proc) /* {{{ */
     ptr->next = t;
   }
 
-  return (0);
+  return 0;
 } /* }}} int fc_register_target */
 
 fc_chain_t *fc_chain_get_by_name(const char *chain_name) /* {{{ */
 {
   if (chain_name == NULL)
-    return (NULL);
+    return NULL;
 
   for (fc_chain_t *chain = chain_list_head; chain != NULL; chain = chain->next)
     if (strcasecmp(chain_name, chain->name) == 0)
-      return (chain);
+      return chain;
 
-  return (NULL);
+  return NULL;
 } /* }}} int fc_chain_get_by_name */
 
 int fc_process_chain(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -805,7 +805,7 @@ int fc_process_chain(const data_set_t *ds, value_list_t *vl, /* {{{ */
   int status = FC_TARGET_CONTINUE;
 
   if (chain == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("fc_process_chain (chain = %s);", chain->name);
 
@@ -875,7 +875,7 @@ int fc_process_chain(const data_set_t *ds, value_list_t *vl, /* {{{ */
   } /* for (rule) */
 
   if ((status == FC_TARGET_STOP) || (status == FC_TARGET_RETURN))
-    return (status);
+    return status;
 
   DEBUG("fc_process_chain (%s): Executing the default targets.", chain->name);
 
@@ -908,15 +908,15 @@ int fc_process_chain(const data_set_t *ds, value_list_t *vl, /* {{{ */
           chain->name, target->name,
           (status == FC_TARGET_STOP) ? "stop" : "return");
     if (status == FC_TARGET_STOP)
-      return (FC_TARGET_STOP);
+      return FC_TARGET_STOP;
     else
-      return (FC_TARGET_CONTINUE);
+      return FC_TARGET_CONTINUE;
   }
 
   DEBUG("fc_process_chain (%s): Signaling `continue' at end of chain.",
         chain->name);
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int fc_process_chain */
 
 /* Iterate over all rules in the chain and execute all targets for which all
@@ -924,8 +924,7 @@ int fc_process_chain(const data_set_t *ds, value_list_t *vl, /* {{{ */
 int fc_default_action(const data_set_t *ds, value_list_t *vl) /* {{{ */
 {
   /* FIXME: Pass the meta-data to match targets here (when implemented). */
-  return (fc_bit_write_invoke(ds, vl,
-                              /* meta = */ NULL, /* user_data = */ NULL));
+  return fc_bit_write_invoke(ds, vl, NULL, NULL);
 } /* }}} int fc_default_action */
 
 int fc_configure(const oconfig_item_t *ci) /* {{{ */
@@ -933,14 +932,12 @@ int fc_configure(const oconfig_item_t *ci) /* {{{ */
   fc_init_once();
 
   if (ci == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if (strcasecmp("Chain", ci->key) == 0)
-    return (fc_config_add_chain(ci));
+    return fc_config_add_chain(ci);
 
   WARNING("Filter subsystem: Unknown top level config option `%s'.", ci->key);
 
-  return (-1);
+  return -1;
 } /* }}} int fc_configure */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 36ccbae..5cc06fc 100644 (file)
@@ -101,4 +101,3 @@ int fc_default_action(const data_set_t *ds, value_list_t *vl);
 int fc_configure(const oconfig_item_t *ci);
 
 #endif /* FILTER_CHAIN_H */
-/* vim: set sw=2 sts=2 et : */
index 583d819..502ca10 100644 (file)
@@ -67,16 +67,16 @@ static char *md_strdup(const char *orig) /* {{{ */
   char *dest;
 
   if (orig == NULL)
-    return (NULL);
+    return NULL;
 
   sz = strlen(orig) + 1;
   dest = malloc(sz);
   if (dest == NULL)
-    return (NULL);
+    return NULL;
 
   memcpy(dest, orig, sz);
 
-  return (dest);
+  return dest;
 } /* }}} char *md_strdup */
 
 static meta_entry_t *md_entry_alloc(const char *key) /* {{{ */
@@ -86,20 +86,20 @@ static meta_entry_t *md_entry_alloc(const char *key) /* {{{ */
   e = calloc(1, sizeof(*e));
   if (e == NULL) {
     ERROR("md_entry_alloc: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   e->key = md_strdup(key);
   if (e->key == NULL) {
     free(e);
     ERROR("md_entry_alloc: md_strdup failed.");
-    return (NULL);
+    return NULL;
   }
 
   e->type = 0;
   e->next = NULL;
 
-  return (e);
+  return e;
 } /* }}} meta_entry_t *md_entry_alloc */
 
 /* XXX: The lock on md must be held while calling this function! */
@@ -115,14 +115,14 @@ static meta_entry_t *md_entry_clone_contents(const meta_entry_t *orig) /* {{{ */
 
   copy = md_entry_alloc(orig->key);
   if (copy == NULL)
-    return (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;
 
-  return (copy);
+  return copy;
 } /* }}} meta_entry_t *md_entry_clone_contents */
 
 static meta_entry_t *md_entry_clone(const meta_entry_t *orig) /* {{{ */
@@ -130,12 +130,12 @@ static meta_entry_t *md_entry_clone(const meta_entry_t *orig) /* {{{ */
   meta_entry_t *copy;
 
   if (orig == NULL)
-    return (NULL);
+    return NULL;
 
   copy = md_entry_clone_contents(orig);
 
   copy->next = md_entry_clone(orig->next);
-  return (copy);
+  return copy;
 } /* }}} meta_entry_t *md_entry_clone */
 
 static void md_entry_free(meta_entry_t *e) /* {{{ */
@@ -160,7 +160,7 @@ static int md_entry_insert(meta_data_t *md, meta_entry_t *e) /* {{{ */
   meta_entry_t *prev;
 
   if ((md == NULL) || (e == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
@@ -201,7 +201,7 @@ static int md_entry_insert(meta_data_t *md, meta_entry_t *e) /* {{{ */
     md_entry_free(this);
   }
 
-  return (0);
+  return 0;
 } /* }}} int md_entry_insert */
 
 /* XXX: The lock on md must be held while calling this function! */
@@ -254,7 +254,7 @@ static int md_entry_insert_clone(meta_data_t *md, meta_entry_t *orig) /* {{{ */
     md_entry_free(this);
   }
 
-  return (0);
+  return 0;
 } /* }}} int md_entry_insert_clone */
 
 /* XXX: The lock on md must be held while calling this function! */
@@ -263,13 +263,13 @@ static meta_entry_t *md_entry_lookup(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL))
-    return (NULL);
+    return NULL;
 
   for (e = md->head; e != NULL; e = e->next)
     if (strcasecmp(key, e->key) == 0)
       break;
 
-  return (e);
+  return e;
 } /* }}} meta_entry_t *md_entry_lookup */
 
 /*
@@ -293,12 +293,12 @@ meta_data_t *meta_data_create(void) /* {{{ */
   md = calloc(1, sizeof(*md));
   if (md == NULL) {
     ERROR("meta_data_create: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   pthread_mutex_init(&md->lock, /* attr = */ NULL);
 
-  return (md);
+  return md;
 } /* }}} meta_data_t *meta_data_create */
 
 meta_data_t *meta_data_clone(meta_data_t *orig) /* {{{ */
@@ -306,27 +306,27 @@ meta_data_t *meta_data_clone(meta_data_t *orig) /* {{{ */
   meta_data_t *copy;
 
   if (orig == NULL)
-    return (NULL);
+    return NULL;
 
   copy = meta_data_create();
   if (copy == NULL)
-    return (NULL);
+    return NULL;
 
   pthread_mutex_lock(&orig->lock);
   copy->head = md_entry_clone(orig->head);
   pthread_mutex_unlock(&orig->lock);
 
-  return (copy);
+  return copy;
 } /* }}} meta_data_t *meta_data_clone */
 
 int meta_data_clone_merge(meta_data_t **dest, meta_data_t *orig) /* {{{ */
 {
   if (orig == NULL)
-    return (0);
+    return 0;
 
   if (*dest == NULL) {
     *dest = meta_data_clone(orig);
-    return (0);
+    return 0;
   }
 
   pthread_mutex_lock(&orig->lock);
@@ -335,7 +335,7 @@ int meta_data_clone_merge(meta_data_t **dest, meta_data_t *orig) /* {{{ */
   }
   pthread_mutex_unlock(&orig->lock);
 
-  return (0);
+  return 0;
 } /* }}} int meta_data_clone_merge */
 
 void meta_data_destroy(meta_data_t *md) /* {{{ */
@@ -351,19 +351,19 @@ void meta_data_destroy(meta_data_t *md) /* {{{ */
 int meta_data_exists(meta_data_t *md, const char *key) /* {{{ */
 {
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   for (meta_entry_t *e = md->head; e != NULL; e = e->next) {
     if (strcasecmp(key, e->key) == 0) {
       pthread_mutex_unlock(&md->lock);
-      return (1);
+      return 1;
     }
   }
 
   pthread_mutex_unlock(&md->lock);
-  return (0);
+  return 0;
 } /* }}} int meta_data_exists */
 
 int meta_data_type(meta_data_t *md, const char *key) /* {{{ */
@@ -398,7 +398,7 @@ int meta_data_toc(meta_data_t *md, char ***toc) /* {{{ */
 
   if (count == 0) {
     pthread_mutex_unlock(&md->lock);
-    return (count);
+    return count;
   }
 
   *toc = calloc(count, sizeof(**toc));
@@ -415,7 +415,7 @@ int meta_data_delete(meta_data_t *md, const char *key) /* {{{ */
   meta_entry_t *prev;
 
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
@@ -431,7 +431,7 @@ int meta_data_delete(meta_data_t *md, const char *key) /* {{{ */
 
   if (this == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   if (prev == NULL)
@@ -444,7 +444,7 @@ int meta_data_delete(meta_data_t *md, const char *key) /* {{{ */
   this->next = NULL;
   md_entry_free(this);
 
-  return (0);
+  return 0;
 } /* }}} int meta_data_delete */
 
 /*
@@ -455,21 +455,21 @@ int meta_data_add_string(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   e = md_entry_alloc(key);
   if (e == NULL)
-    return (-ENOMEM);
+    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);
+    return -ENOMEM;
   }
   e->type = MD_TYPE_STRING;
 
-  return (md_entry_insert(md, e));
+  return md_entry_insert(md, e);
 } /* }}} int meta_data_add_string */
 
 int meta_data_add_signed_int(meta_data_t *md, /* {{{ */
@@ -477,16 +477,16 @@ int meta_data_add_signed_int(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   e = md_entry_alloc(key);
   if (e == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   e->value.mv_signed_int = value;
   e->type = MD_TYPE_SIGNED_INT;
 
-  return (md_entry_insert(md, e));
+  return md_entry_insert(md, e);
 } /* }}} int meta_data_add_signed_int */
 
 int meta_data_add_unsigned_int(meta_data_t *md, /* {{{ */
@@ -494,16 +494,16 @@ int meta_data_add_unsigned_int(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   e = md_entry_alloc(key);
   if (e == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   e->value.mv_unsigned_int = value;
   e->type = MD_TYPE_UNSIGNED_INT;
 
-  return (md_entry_insert(md, e));
+  return md_entry_insert(md, e);
 } /* }}} int meta_data_add_unsigned_int */
 
 int meta_data_add_double(meta_data_t *md, /* {{{ */
@@ -511,16 +511,16 @@ int meta_data_add_double(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   e = md_entry_alloc(key);
   if (e == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   e->value.mv_double = value;
   e->type = MD_TYPE_DOUBLE;
 
-  return (md_entry_insert(md, e));
+  return md_entry_insert(md, e);
 } /* }}} int meta_data_add_double */
 
 int meta_data_add_boolean(meta_data_t *md, /* {{{ */
@@ -528,16 +528,16 @@ int meta_data_add_boolean(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   e = md_entry_alloc(key);
   if (e == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   e->value.mv_boolean = value;
   e->type = MD_TYPE_BOOLEAN;
 
-  return (md_entry_insert(md, e));
+  return md_entry_insert(md, e);
 } /* }}} int meta_data_add_boolean */
 
 /*
@@ -549,34 +549,34 @@ int meta_data_get_string(meta_data_t *md, /* {{{ */
   char *temp;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    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);
+    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);
+    return -ENOMEM;
   }
 
   pthread_mutex_unlock(&md->lock);
 
   *value = temp;
 
-  return (0);
+  return 0;
 } /* }}} int meta_data_get_string */
 
 int meta_data_get_signed_int(meta_data_t *md, /* {{{ */
@@ -584,26 +584,26 @@ int meta_data_get_signed_int(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    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);
+    return -ENOENT;
   }
 
   *value = e->value.mv_signed_int;
 
   pthread_mutex_unlock(&md->lock);
-  return (0);
+  return 0;
 } /* }}} int meta_data_get_signed_int */
 
 int meta_data_get_unsigned_int(meta_data_t *md, /* {{{ */
@@ -611,26 +611,26 @@ int meta_data_get_unsigned_int(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    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);
+    return -ENOENT;
   }
 
   *value = e->value.mv_unsigned_int;
 
   pthread_mutex_unlock(&md->lock);
-  return (0);
+  return 0;
 } /* }}} int meta_data_get_unsigned_int */
 
 int meta_data_get_double(meta_data_t *md, /* {{{ */
@@ -638,26 +638,26 @@ int meta_data_get_double(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    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);
+    return -ENOENT;
   }
 
   *value = e->value.mv_double;
 
   pthread_mutex_unlock(&md->lock);
-  return (0);
+  return 0;
 } /* }}} int meta_data_get_double */
 
 int meta_data_get_boolean(meta_data_t *md, /* {{{ */
@@ -665,45 +665,45 @@ int meta_data_get_boolean(meta_data_t *md, /* {{{ */
   meta_entry_t *e;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    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);
+    return -ENOENT;
   }
 
   *value = e->value.mv_boolean;
 
   pthread_mutex_unlock(&md->lock);
-  return (0);
+  return 0;
 } /* }}} int meta_data_get_boolean */
 
 int meta_data_as_string(meta_data_t *md, /* {{{ */
                         const char *key, char **value) {
   meta_entry_t *e;
-  char *actual;
+  const char *actual;
   char buffer[MD_MAX_NONSTRING_CHARS]; /* For non-string types. */
   char *temp;
   int type;
 
   if ((md == NULL) || (key == NULL) || (value == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&md->lock);
 
   e = md_entry_lookup(md, key);
   if (e == NULL) {
     pthread_mutex_unlock(&md->lock);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   type = e->type;
@@ -730,7 +730,7 @@ int meta_data_as_string(meta_data_t *md, /* {{{ */
   default:
     pthread_mutex_unlock(&md->lock);
     ERROR("meta_data_as_string: unknown type %d for key `%s'", type, key);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   pthread_mutex_unlock(&md->lock);
@@ -739,12 +739,10 @@ int meta_data_as_string(meta_data_t *md, /* {{{ */
   if (temp == NULL) {
     pthread_mutex_unlock(&md->lock);
     ERROR("meta_data_as_string: md_strdup failed for key `%s'.", key);
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   *value = temp;
 
-  return (0);
+  return 0;
 } /* }}} int meta_data_as_string */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 3ef3360..50fdb8d 100644 (file)
@@ -69,4 +69,3 @@ int meta_data_get_boolean(meta_data_t *md, const char *key, _Bool *value);
 int meta_data_as_string(meta_data_t *md, const char *key, char **value);
 
 #endif /* META_DATA_H */
-/* vim: set sw=2 sts=2 et : */
index 803c745..bcd457d 100644 (file)
@@ -114,5 +114,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index 0f06737..3bf183d 100644 (file)
@@ -46,7 +46,7 @@
 #include <pthread_np.h> /* for pthread_set_name_np(3) */
 #endif
 
-#include <ltdl.h>
+#include <dlfcn.h>
 
 /*
  * Private structures
@@ -148,9 +148,9 @@ static int plugin_dispatch_values_internal(value_list_t *vl);
 
 static const char *plugin_get_dir(void) {
   if (plugindir == NULL)
-    return (PLUGINDIR);
+    return PLUGINDIR;
   else
-    return (plugindir);
+    return plugindir;
 }
 
 static int plugin_update_internal_statistics(void) { /* {{{ */
@@ -258,7 +258,7 @@ static int register_callback(llist_t **list, /* {{{ */
       ERROR("plugin: register_callback: "
             "llist_create failed.");
       destroy_callback(cf);
-      return (-1);
+      return -1;
     }
   }
 
@@ -266,7 +266,7 @@ static int register_callback(llist_t **list, /* {{{ */
   if (key == NULL) {
     ERROR("plugin: register_callback: strdup failed.");
     destroy_callback(cf);
-    return (-1);
+    return -1;
   }
 
   le = llist_search(*list, name);
@@ -277,7 +277,7 @@ static int register_callback(llist_t **list, /* {{{ */
             "llentry_create failed.");
       sfree(key);
       destroy_callback(cf);
-      return (-1);
+      return -1;
     }
 
     llist_append(*list, le);
@@ -296,7 +296,7 @@ static int register_callback(llist_t **list, /* {{{ */
     sfree(key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int register_callback */
 
 static void log_list_callbacks(llist_t **list, /* {{{ */
@@ -346,7 +346,7 @@ static int create_register_callback(llist_t **list, /* {{{ */
   cf = calloc(1, sizeof(*cf));
   if (cf == NULL) {
     ERROR("plugin: create_register_callback: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   cf->cf_callback = callback;
@@ -359,7 +359,7 @@ static int create_register_callback(llist_t **list, /* {{{ */
 
   cf->cf_ctx = plugin_get_ctx();
 
-  return (register_callback(list, name, cf));
+  return register_callback(list, name, cf);
 } /* }}} int create_register_callback */
 
 static int plugin_unregister(llist_t *list, const char *name) /* {{{ */
@@ -367,11 +367,11 @@ static int plugin_unregister(llist_t *list, const char *name) /* {{{ */
   llentry_t *e;
 
   if (list == NULL)
-    return (-1);
+    return -1;
 
   e = llist_search(list, name);
   if (e == NULL)
-    return (-1);
+    return -1;
 
   llist_remove(list, e);
 
@@ -380,7 +380,7 @@ static int plugin_unregister(llist_t *list, const char *name) /* {{{ */
 
   llentry_destroy(e);
 
-  return (0);
+  return 0;
 } /* }}} int plugin_unregister */
 
 /*
@@ -388,40 +388,25 @@ static int plugin_unregister(llist_t *list, const char *name) /* {{{ */
  * object, but it will bitch about a shared object not having a
  * ``module_register'' symbol..
  */
-static int plugin_load_file(char *file, uint32_t flags) {
-  lt_dlhandle dlh;
+static int plugin_load_file(const char *file, _Bool global) {
   void (*reg_handle)(void);
 
-  lt_dlinit();
-  lt_dlerror(); /* clear errors */
+  int flags = RTLD_NOW;
+  if (global)
+    flags |= RTLD_GLOBAL;
 
-#if LIBTOOL_VERSION == 2
-  if (flags & PLUGIN_FLAGS_GLOBAL) {
-    lt_dladvise advise;
-    lt_dladvise_init(&advise);
-    lt_dladvise_global(&advise);
-    dlh = lt_dlopenadvise(file, advise);
-    lt_dladvise_destroy(&advise);
-  } else {
-    dlh = lt_dlopen(file);
-  }
-#else /* if LIBTOOL_VERSION == 1 */
-  if (flags & PLUGIN_FLAGS_GLOBAL)
-    WARNING("plugin_load_file: The global flag is not supported, "
-            "libtool 2 is required for this.");
-  dlh = lt_dlopen(file);
-#endif
+  void *dlh = dlopen(file, flags);
 
   if (dlh == NULL) {
     char errbuf[1024] = "";
 
     ssnprintf(errbuf, sizeof(errbuf),
-              "lt_dlopen (\"%s\") failed: %s. "
+              "dlopen (\"%s\") failed: %s. "
               "The most common cause for this problem is "
               "missing dependencies. Use ldd(1) to check "
               "the dependencies of the plugin "
               "/ shared object.",
-              file, lt_dlerror());
+              file, dlerror());
 
     ERROR("%s", errbuf);
     /* Make sure this is printed to STDERR in any case, but also
@@ -429,19 +414,20 @@ static int plugin_load_file(char *file, uint32_t flags) {
     if (list_log != NULL)
       fprintf(stderr, "ERROR: %s\n", errbuf);
 
-    return (1);
+    return 1;
   }
 
-  if ((reg_handle = (void (*)(void))lt_dlsym(dlh, "module_register")) == NULL) {
+  reg_handle = (void (*)(void))dlsym(dlh, "module_register");
+  if (reg_handle == NULL) {
     WARNING("Couldn't find symbol \"module_register\" in \"%s\": %s\n", file,
-            lt_dlerror());
-    lt_dlclose(dlh);
-    return (-1);
+            dlerror());
+    dlclose(dlh);
+    return -1;
   }
 
   (*reg_handle)();
 
-  return (0);
+  return 0;
 }
 
 static void *plugin_read_thread(void __attribute__((unused)) * args) {
@@ -596,7 +582,7 @@ static void *plugin_read_thread(void __attribute__((unused)) * args) {
   } /* while (read_loop) */
 
   pthread_exit(NULL);
-  return ((void *)0);
+  return (void *)0;
 } /* void *plugin_read_thread */
 
 #ifdef PTHREAD_MAX_NAMELEN_NP
@@ -699,11 +685,11 @@ plugin_value_list_clone(value_list_t const *vl_orig) /* {{{ */
   value_list_t *vl;
 
   if (vl_orig == NULL)
-    return (NULL);
+    return NULL;
 
   vl = malloc(sizeof(*vl));
   if (vl == NULL)
-    return (NULL);
+    return NULL;
   memcpy(vl, vl_orig, sizeof(*vl));
 
   if (vl->host[0] == 0)
@@ -712,7 +698,7 @@ plugin_value_list_clone(value_list_t const *vl_orig) /* {{{ */
   vl->values = calloc(vl_orig->values_len, sizeof(*vl->values));
   if (vl->values == NULL) {
     plugin_value_list_free(vl);
-    return (NULL);
+    return NULL;
   }
   memcpy(vl->values, vl_orig->values,
          vl_orig->values_len * sizeof(*vl->values));
@@ -720,7 +706,7 @@ plugin_value_list_clone(value_list_t const *vl_orig) /* {{{ */
   vl->meta = meta_data_clone(vl->meta);
   if ((vl_orig->meta != NULL) && (vl->meta == NULL)) {
     plugin_value_list_free(vl);
-    return (NULL);
+    return NULL;
   }
 
   if (vl->time == 0)
@@ -747,7 +733,7 @@ plugin_value_list_clone(value_list_t const *vl_orig) /* {{{ */
     }
   }
 
-  return (vl);
+  return vl;
 } /* }}} value_list_t *plugin_value_list_clone */
 
 static int plugin_write_enqueue(value_list_t const *vl) /* {{{ */
@@ -756,13 +742,13 @@ static int plugin_write_enqueue(value_list_t const *vl) /* {{{ */
 
   q = malloc(sizeof(*q));
   if (q == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   q->next = NULL;
 
   q->vl = plugin_value_list_clone(vl);
   if (q->vl == NULL) {
     sfree(q);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   /* Store context of caller (read plugin); otherwise, it would not be
@@ -785,7 +771,7 @@ static int plugin_write_enqueue(value_list_t const *vl) /* {{{ */
   pthread_cond_signal(&write_cond);
   pthread_mutex_unlock(&write_lock);
 
-  return (0);
+  return 0;
 } /* }}} int plugin_write_enqueue */
 
 static value_list_t *plugin_write_dequeue(void) /* {{{ */
@@ -800,7 +786,7 @@ static value_list_t *plugin_write_dequeue(void) /* {{{ */
 
   if (write_queue_head == NULL) {
     pthread_mutex_unlock(&write_lock);
-    return (NULL);
+    return NULL;
   }
 
   q = write_queue_head;
@@ -817,7 +803,7 @@ static value_list_t *plugin_write_dequeue(void) /* {{{ */
 
   vl = q->vl;
   sfree(q);
-  return (vl);
+  return vl;
 } /* }}} value_list_t *plugin_write_dequeue */
 
 static void *plugin_write_thread(void __attribute__((unused)) * args) /* {{{ */
@@ -833,7 +819,7 @@ static void *plugin_write_thread(void __attribute__((unused)) * args) /* {{{ */
   }
 
   pthread_exit(NULL);
-  return ((void *)0);
+  return (void *)0;
 } /* }}} void *plugin_write_thread */
 
 static void start_write_threads(size_t num) /* {{{ */
@@ -939,7 +925,7 @@ static _Bool plugin_is_loaded(char const *name) {
   assert(plugins_loaded != NULL);
 
   status = c_avl_get(plugins_loaded, name, /* ret_value = */ NULL);
-  return (status == 0);
+  return status == 0;
 }
 
 static int plugin_mark_loaded(char const *name) {
@@ -948,11 +934,11 @@ static int plugin_mark_loaded(char const *name) {
 
   name_copy = strdup(name);
   if (name_copy == NULL)
-    return (ENOMEM);
+    return ENOMEM;
 
   status = c_avl_insert(plugins_loaded,
                         /* key = */ name_copy, /* value = */ NULL);
-  return (status);
+  return status;
 }
 
 static void plugin_free_loaded(void) {
@@ -972,7 +958,7 @@ static void plugin_free_loaded(void) {
 }
 
 #define BUFSIZE 512
-int plugin_load(char const *plugin_name, uint32_t flags) {
+int plugin_load(char const *plugin_name, _Bool global) {
   DIR *dh;
   const char *dir;
   char filename[BUFSIZE] = "";
@@ -983,12 +969,12 @@ int plugin_load(char const *plugin_name, uint32_t flags) {
   int status;
 
   if (plugin_name == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* Check if plugin is already loaded and don't do anything in this
    * case. */
   if (plugin_is_loaded(plugin_name))
-    return (0);
+    return 0;
 
   dir = plugin_get_dir();
   ret = 1;
@@ -1006,21 +992,21 @@ int plugin_load(char const *plugin_name, uint32_t flags) {
    */
   if ((strcasecmp("perl", plugin_name) == 0) ||
       (strcasecmp("python", plugin_name) == 0))
-    flags |= PLUGIN_FLAGS_GLOBAL;
+    global = 1;
 
   /* `cpu' should not match `cpufreq'. To solve this we add `.so' to the
    * type when matching the filename */
   status = ssnprintf(typename, sizeof(typename), "%s.so", plugin_name);
   if ((status < 0) || ((size_t)status >= sizeof(typename))) {
     WARNING("plugin_load: Filename too long: \"%s.so\"", plugin_name);
-    return (-1);
+    return -1;
   }
 
   if ((dh = opendir(dir)) == NULL) {
     char errbuf[1024];
     ERROR("plugin_load: opendir (%s) failed: %s", dir,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while ((de = readdir(dh)) != NULL) {
@@ -1044,7 +1030,7 @@ int plugin_load(char const *plugin_name, uint32_t flags) {
       continue;
     }
 
-    status = plugin_load_file(filename, flags);
+    status = plugin_load_file(filename, global);
     if (status == 0) {
       /* success */
       plugin_mark_loaded(plugin_name);
@@ -1063,7 +1049,7 @@ int plugin_load(char const *plugin_name, uint32_t flags) {
   if (filename[0] == 0)
     ERROR("plugin_load: Could not find plugin \"%s\" in %s", plugin_name, dir);
 
-  return (ret);
+  return ret;
 }
 
 /*
@@ -1073,17 +1059,16 @@ int plugin_register_config(const char *name,
                            int (*callback)(const char *key, const char *val),
                            const char **keys, int keys_num) {
   cf_register(name, callback, keys, keys_num);
-  return (0);
+  return 0;
 } /* int plugin_register_config */
 
 int plugin_register_complex_config(const char *type,
                                    int (*callback)(oconfig_item_t *)) {
-  return (cf_register_complex(type, callback));
+  return cf_register_complex(type, callback);
 } /* int plugin_register_complex_config */
 
 int plugin_register_init(const char *name, int (*callback)(void)) {
-  return (create_register_callback(&list_init, name, (void *)callback,
-                                   /* user_data = */ NULL));
+  return create_register_callback(&list_init, name, (void *)callback, NULL);
 } /* plugin_register_init */
 
 static int plugin_compare_read_func(const void *arg0, const void *arg1) {
@@ -1094,11 +1079,11 @@ static int plugin_compare_read_func(const void *arg0, const void *arg1) {
   rf1 = arg1;
 
   if (rf0->rf_next_read < rf1->rf_next_read)
-    return (-1);
+    return -1;
   else if (rf0->rf_next_read > rf1->rf_next_read)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* int plugin_compare_read_func */
 
 /* Add a read function to both, the heap and a linked list. The linked list if
@@ -1118,7 +1103,7 @@ static int plugin_insert_read(read_func_t *rf) {
     if (read_list == NULL) {
       pthread_mutex_unlock(&read_lock);
       ERROR("plugin_insert_read: read_list failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -1127,7 +1112,7 @@ static int plugin_insert_read(read_func_t *rf) {
     if (read_heap == NULL) {
       pthread_mutex_unlock(&read_lock);
       ERROR("plugin_insert_read: c_heap_create failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -1138,14 +1123,14 @@ static int plugin_insert_read(read_func_t *rf) {
             "Check for duplicate \"LoadPlugin\" lines "
             "in your configuration!",
             rf->rf_name);
-    return (EINVAL);
+    return EINVAL;
   }
 
   le = llentry_create(rf->rf_name, rf);
   if (le == NULL) {
     pthread_mutex_unlock(&read_lock);
     ERROR("plugin_insert_read: llentry_create failed.");
-    return (-1);
+    return -1;
   }
 
   status = c_heap_insert(read_heap, rf);
@@ -1153,7 +1138,7 @@ static int plugin_insert_read(read_func_t *rf) {
     pthread_mutex_unlock(&read_lock);
     ERROR("plugin_insert_read: c_heap_insert failed.");
     llentry_destroy(le);
-    return (-1);
+    return -1;
   }
 
   /* This does not fail. */
@@ -1162,7 +1147,7 @@ static int plugin_insert_read(read_func_t *rf) {
   /* Wake up all the read threads. */
   pthread_cond_broadcast(&read_cond);
   pthread_mutex_unlock(&read_lock);
-  return (0);
+  return 0;
 } /* int plugin_insert_read */
 
 int plugin_register_read(const char *name, int (*callback)(void)) {
@@ -1172,7 +1157,7 @@ int plugin_register_read(const char *name, int (*callback)(void)) {
   rf = calloc(1, sizeof(*rf));
   if (rf == NULL) {
     ERROR("plugin_register_read: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   rf->rf_callback = (void *)callback;
@@ -1190,7 +1175,7 @@ int plugin_register_read(const char *name, int (*callback)(void)) {
     sfree(rf);
   }
 
-  return (status);
+  return status;
 } /* int plugin_register_read */
 
 int plugin_register_complex_read(const char *group, const char *name,
@@ -1202,7 +1187,7 @@ int plugin_register_complex_read(const char *group, const char *name,
   rf = calloc(1, sizeof(*rf));
   if (rf == NULL) {
     ERROR("plugin_register_complex_read: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   rf->rf_callback = (void *)callback;
@@ -1230,18 +1215,18 @@ int plugin_register_complex_read(const char *group, const char *name,
     sfree(rf);
   }
 
-  return (status);
+  return status;
 } /* int plugin_register_complex_read */
 
 int plugin_register_write(const char *name, plugin_write_cb callback,
                           user_data_t const *ud) {
-  return (create_register_callback(&list_write, name, (void *)callback, ud));
+  return create_register_callback(&list_write, name, (void *)callback, ud);
 } /* int plugin_register_write */
 
 static int plugin_flush_timeout_callback(user_data_t *ud) {
   flush_callback_t *cb = ud->data;
 
-  return plugin_flush(cb->name, cb->timeout, /* identifier = */ NULL);
+  return plugin_flush(cb->name, cb->timeout, NULL);
 } /* static int plugin_flush_callback */
 
 static void plugin_flush_timeout_callback_free(void *data) {
@@ -1266,7 +1251,7 @@ static char *plugin_flush_callback_name(const char *name) {
   flush_name = malloc(name_size + prefix_size + 1);
   if (flush_name == NULL) {
     ERROR("plugin_flush_callback_name: malloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   sstrncpy(flush_name, flush_prefix, prefix_size + 1);
@@ -1290,13 +1275,13 @@ int plugin_register_flush(const char *name, plugin_flush_cb callback,
 
     flush_name = plugin_flush_callback_name(name);
     if (flush_name == NULL)
-      return (-1);
+      return -1;
 
     cb = malloc(sizeof(*cb));
     if (cb == NULL) {
       ERROR("plugin_register_flush: malloc failed.");
       sfree(flush_name);
-      return (-1);
+      return -1;
     }
 
     cb->name = strdup(name);
@@ -1304,7 +1289,7 @@ int plugin_register_flush(const char *name, plugin_flush_cb callback,
       ERROR("plugin_register_flush: strdup failed.");
       sfree(cb);
       sfree(flush_name);
-      return (-1);
+      return -1;
     }
     cb->timeout = ctx.flush_timeout;
 
@@ -1330,12 +1315,12 @@ int plugin_register_flush(const char *name, plugin_flush_cb callback,
 
 int plugin_register_missing(const char *name, plugin_missing_cb callback,
                             user_data_t const *ud) {
-  return (create_register_callback(&list_missing, name, (void *)callback, ud));
+  return create_register_callback(&list_missing, name, (void *)callback, ud);
 } /* int plugin_register_missing */
 
 int plugin_register_shutdown(const char *name, int (*callback)(void)) {
-  return (create_register_callback(&list_shutdown, name, (void *)callback,
-                                   /* user_data = */ NULL));
+  return create_register_callback(&list_shutdown, name, (void *)callback,
+                                  NULL);
 } /* int plugin_register_shutdown */
 
 static void plugin_free_data_sets(void) {
@@ -1366,50 +1351,50 @@ int plugin_register_data_set(const data_set_t *ds) {
   } else if (data_sets == NULL) {
     data_sets = c_avl_create((int (*)(const void *, const void *))strcmp);
     if (data_sets == NULL)
-      return (-1);
+      return -1;
   }
 
   ds_copy = malloc(sizeof(*ds_copy));
   if (ds_copy == NULL)
-    return (-1);
+    return -1;
   memcpy(ds_copy, ds, sizeof(data_set_t));
 
   ds_copy->ds = malloc(sizeof(*ds_copy->ds) * ds->ds_num);
   if (ds_copy->ds == NULL) {
     sfree(ds_copy);
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < ds->ds_num; i++)
     memcpy(ds_copy->ds + i, ds->ds + i, sizeof(data_source_t));
 
-  return (c_avl_insert(data_sets, (void *)ds_copy->type, (void *)ds_copy));
+  return c_avl_insert(data_sets, (void *)ds_copy->type, (void *)ds_copy);
 } /* int plugin_register_data_set */
 
 int plugin_register_log(const char *name, plugin_log_cb callback,
                         user_data_t const *ud) {
-  return (create_register_callback(&list_log, name, (void *)callback, ud));
+  return create_register_callback(&list_log, name, (void *)callback, ud);
 } /* int plugin_register_log */
 
 int plugin_register_notification(const char *name,
                                  plugin_notification_cb callback,
                                  user_data_t const *ud) {
-  return (
-      create_register_callback(&list_notification, name, (void *)callback, ud));
+  return create_register_callback(&list_notification, name, (void *)callback,
+                                  ud);
 } /* int plugin_register_log */
 
 int plugin_unregister_config(const char *name) {
   cf_unregister(name);
-  return (0);
+  return 0;
 } /* int plugin_unregister_config */
 
 int plugin_unregister_complex_config(const char *name) {
   cf_unregister_complex(name);
-  return (0);
+  return 0;
 } /* int plugin_unregister_complex_config */
 
 int plugin_unregister_init(const char *name) {
-  return (plugin_unregister(list_init, name));
+  return plugin_unregister(list_init, name);
 }
 
 int plugin_unregister_read(const char *name) /* {{{ */
@@ -1418,20 +1403,20 @@ int plugin_unregister_read(const char *name) /* {{{ */
   read_func_t *rf;
 
   if (name == NULL)
-    return (-ENOENT);
+    return -ENOENT;
 
   pthread_mutex_lock(&read_lock);
 
   if (read_list == NULL) {
     pthread_mutex_unlock(&read_lock);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   le = llist_search(read_list, name);
   if (le == NULL) {
     pthread_mutex_unlock(&read_lock);
     WARNING("plugin_unregister_read: No such read function: %s", name);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   llist_remove(read_list, le);
@@ -1446,7 +1431,7 @@ int plugin_unregister_read(const char *name) /* {{{ */
 
   DEBUG("plugin_unregister_read: Marked `%s' for removal.", name);
 
-  return (0);
+  return 0;
 } /* }}} int plugin_unregister_read */
 
 void plugin_log_available_writers(void) {
@@ -1469,13 +1454,13 @@ int plugin_unregister_read_group(const char *group) /* {{{ */
   int found = 0;
 
   if (group == NULL)
-    return (-ENOENT);
+    return -ENOENT;
 
   pthread_mutex_lock(&read_lock);
 
   if (read_list == NULL) {
     pthread_mutex_unlock(&read_lock);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   while (42) {
@@ -1505,14 +1490,14 @@ int plugin_unregister_read_group(const char *group) /* {{{ */
     WARNING("plugin_unregister_read_group: No such "
             "group of read function: %s",
             group);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
-  return (0);
+  return 0;
 } /* }}} int plugin_unregister_read_group */
 
 int plugin_unregister_write(const char *name) {
-  return (plugin_unregister(list_write, name));
+  return plugin_unregister(list_write, name);
 }
 
 int plugin_unregister_flush(const char *name) {
@@ -1532,34 +1517,34 @@ int plugin_unregister_flush(const char *name) {
 }
 
 int plugin_unregister_missing(const char *name) {
-  return (plugin_unregister(list_missing, name));
+  return plugin_unregister(list_missing, name);
 }
 
 int plugin_unregister_shutdown(const char *name) {
-  return (plugin_unregister(list_shutdown, name));
+  return plugin_unregister(list_shutdown, name);
 }
 
 int plugin_unregister_data_set(const char *name) {
   data_set_t *ds;
 
   if (data_sets == NULL)
-    return (-1);
+    return -1;
 
   if (c_avl_remove(data_sets, name, NULL, (void *)&ds) != 0)
-    return (-1);
+    return -1;
 
   sfree(ds->ds);
   sfree(ds);
 
-  return (0);
+  return 0;
 } /* int plugin_unregister_data_set */
 
 int plugin_unregister_log(const char *name) {
-  return (plugin_unregister(list_log, name));
+  return plugin_unregister(list_log, name);
 }
 
 int plugin_unregister_notification(const char *name) {
-  return (plugin_unregister(list_notification, name));
+  return plugin_unregister(list_notification, name);
 }
 
 int plugin_init_all(void) {
@@ -1674,7 +1659,7 @@ int plugin_read_all_once(void) {
 
   if (read_heap == NULL) {
     NOTICE("No read-functions are registered.");
-    return (0);
+    return 0;
   }
 
   while (42) {
@@ -1710,7 +1695,7 @@ int plugin_read_all_once(void) {
     destroy_callback((void *)rf);
   }
 
-  return (return_status);
+  return return_status;
 } /* int plugin_read_all_once */
 
 int plugin_write(const char *plugin, /* {{{ */
@@ -1719,16 +1704,16 @@ int plugin_write(const char *plugin, /* {{{ */
   int status;
 
   if (vl == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (list_write == NULL)
-    return (ENOENT);
+    return ENOENT;
 
   if (ds == NULL) {
     ds = plugin_get_ds(vl->type);
     if (ds == NULL) {
       ERROR("plugin_write: Unable to lookup type `%s'.", vl->type);
-      return (ENOENT);
+      return ENOENT;
     }
   }
 
@@ -1773,7 +1758,7 @@ int plugin_write(const char *plugin, /* {{{ */
     }
 
     if (le == NULL)
-      return (ENOENT);
+      return ENOENT;
 
     cf = le->value;
 
@@ -1785,14 +1770,14 @@ int plugin_write(const char *plugin, /* {{{ */
     status = (*callback)(ds, vl, &cf->cf_udata);
   }
 
-  return (status);
+  return status;
 } /* }}} int plugin_write */
 
 int plugin_flush(const char *plugin, cdtime_t timeout, const char *identifier) {
   llentry_t *le;
 
   if (list_flush == NULL)
-    return (0);
+    return 0;
 
   le = llist_head(list_flush);
   while (le != NULL) {
@@ -1815,7 +1800,7 @@ int plugin_flush(const char *plugin, cdtime_t timeout, const char *identifier) {
 
     le = le->next;
   }
-  return (0);
+  return 0;
 } /* int plugin_flush */
 
 int plugin_shutdown_all(void) {
@@ -1881,7 +1866,7 @@ int plugin_shutdown_all(void) {
 
   plugin_free_loaded();
   plugin_free_data_sets();
-  return (ret);
+  return ret;
 } /* void plugin_shutdown_all */
 
 int plugin_dispatch_missing(const value_list_t *vl) /* {{{ */
@@ -1889,7 +1874,7 @@ int plugin_dispatch_missing(const value_list_t *vl) /* {{{ */
   llentry_t *le;
 
   if (list_missing == NULL)
-    return (0);
+    return 0;
 
   le = llist_head(list_missing);
   while (le != NULL) {
@@ -1909,15 +1894,15 @@ int plugin_dispatch_missing(const value_list_t *vl) /* {{{ */
         ERROR("plugin_dispatch_missing: Callback function \"%s\" "
               "failed with status %i.",
               le->key, status);
-        return (status);
+        return status;
       } else {
-        return (0);
+        return 0;
       }
     }
 
     le = le->next;
   }
-  return (0);
+  return 0;
 } /* int }}} plugin_dispatch_missing */
 
 static int plugin_dispatch_values_internal(value_list_t *vl) {
@@ -1939,7 +1924,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
     ERROR("plugin_dispatch_values: Invalid value list "
           "from plugin %s.",
           vl->plugin);
-    return (-1);
+    return -1;
   }
 
   /* Free meta data only if the calling function didn't specify any. In
@@ -1958,7 +1943,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
     ERROR("plugin_dispatch_values: No data sets registered. "
           "Could the types database be read? Check "
           "your `TypesDB' setting!");
-    return (-1);
+    return -1;
   }
 
   if (c_avl_get(data_sets, vl->type, (void *)&ds) != 0) {
@@ -1968,7 +1953,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
     INFO("plugin_dispatch_values: Dataset not found: %s "
          "(from \"%s\"), check your types.db!",
          vl->type, ident);
-    return (-1);
+    return -1;
   }
 
   DEBUG("plugin_dispatch_values: time = %.3f; interval = %.3f; "
@@ -1994,7 +1979,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
           "(ds->ds_num = %zu) != "
           "(vl->values_len = %zu)",
           ds->type, ds->ds_num, vl->values_len);
-    return (-1);
+    return -1;
   }
 #endif
 
@@ -2012,7 +1997,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
               "status %i (%#x).",
               status, status);
     } else if (status == FC_TARGET_STOP)
-      return (0);
+      return 0;
   }
 
   /* Update the value cache */
@@ -2034,7 +2019,7 @@ static int plugin_dispatch_values_internal(value_list_t *vl) {
     vl->meta = NULL;
   }
 
-  return (0);
+  return 0;
 } /* int plugin_dispatch_values_internal */
 
 static double get_drop_probability(void) /* {{{ */
@@ -2048,14 +2033,14 @@ static double get_drop_probability(void) /* {{{ */
   pthread_mutex_unlock(&write_lock);
 
   if (wql < write_limit_low)
-    return (0.0);
+    return 0.0;
   if (wql >= write_limit_high)
-    return (1.0);
+    return 1.0;
 
   pos = 1 + wql - write_limit_low;
   size = 1 + write_limit_high - write_limit_low;
 
-  return (((double)pos) / ((double)size));
+  return (double)pos / (double)size;
 } /* }}} double get_drop_probability */
 
 static _Bool check_drop_value(void) /* {{{ */
@@ -2068,11 +2053,11 @@ static _Bool check_drop_value(void) /* {{{ */
   int status;
 
   if (write_limit_high == 0)
-    return (0);
+    return 0;
 
   p = get_drop_probability();
   if (p == 0.0)
-    return (0);
+    return 0;
 
   status = pthread_mutex_trylock(&last_message_lock);
   if (status == 0) {
@@ -2089,13 +2074,13 @@ static _Bool check_drop_value(void) /* {{{ */
   }
 
   if (p == 1.0)
-    return (1);
+    return 1;
 
   q = cdrand_d();
   if (q > p)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* }}} _Bool check_drop_value */
 
 int plugin_dispatch_values(value_list_t const *vl) {
@@ -2108,7 +2093,7 @@ int plugin_dispatch_values(value_list_t const *vl) {
       stats_values_dropped++;
       pthread_mutex_unlock(&statistics_lock);
     }
-    return (0);
+    return 0;
   }
 
   status = plugin_write_enqueue(vl);
@@ -2117,10 +2102,10 @@ int plugin_dispatch_values(value_list_t const *vl) {
     ERROR("plugin_dispatch_values: plugin_write_enqueue failed "
           "with status %i (%s).",
           status, sstrerror(status, errbuf, sizeof(errbuf)));
-    return (status);
+    return status;
   }
 
-  return (0);
+  return 0;
 }
 
 __attribute__((sentinel)) int
@@ -2195,7 +2180,7 @@ plugin_dispatch_multivalue(value_list_t const *template, /* {{{ */
   va_end(ap);
 
   plugin_value_list_free(vl);
-  return (failed);
+  return failed;
 } /* }}} int plugin_dispatch_multivalue */
 
 int plugin_dispatch_notification(const notification_t *notif) {
@@ -2209,7 +2194,7 @@ int plugin_dispatch_notification(const notification_t *notif) {
 
   /* Nobody cares for notifications */
   if (list_notification == NULL)
-    return (-1);
+    return -1;
 
   le = llist_head(list_notification);
   while (le != NULL) {
@@ -2232,7 +2217,7 @@ int plugin_dispatch_notification(const notification_t *notif) {
     le = le->next;
   }
 
-  return (0);
+  return 0;
 } /* int plugin_dispatch_notification */
 
 void plugin_log(int level, const char *format, ...) {
@@ -2290,7 +2275,7 @@ int parse_log_severity(const char *severity) {
     log_level = LOG_DEBUG;
 #endif /* COLLECT_DEBUG */
 
-  return (log_level);
+  return log_level;
 } /* int parse_log_severity */
 
 int parse_notif_severity(const char *severity) {
@@ -2304,7 +2289,7 @@ int parse_notif_severity(const char *severity) {
            (strcmp(severity, "WARN") == 0))
     notif_severity = NOTIF_WARNING;
 
-  return (notif_severity);
+  return notif_severity;
 } /* int parse_notif_severity */
 
 const data_set_t *plugin_get_ds(const char *name) {
@@ -2312,15 +2297,15 @@ const data_set_t *plugin_get_ds(const char *name) {
 
   if (data_sets == NULL) {
     ERROR("plugin_get_ds: No data sets are defined yet.");
-    return (NULL);
+    return NULL;
   }
 
   if (c_avl_get(data_sets, name, (void *)&ds) != 0) {
     DEBUG("No such dataset registered: %s", name);
-    return (NULL);
+    return NULL;
   }
 
-  return (ds);
+  return ds;
 } /* data_set_t *plugin_get_ds */
 
 static int plugin_notification_meta_add(notification_t *n, const char *name,
@@ -2331,13 +2316,13 @@ static int plugin_notification_meta_add(notification_t *n, const char *name,
 
   if ((n == NULL) || (name == NULL) || (value == NULL)) {
     ERROR("plugin_notification_meta_add: A pointer is NULL!");
-    return (-1);
+    return -1;
   }
 
   meta = calloc(1, sizeof(*meta));
   if (meta == NULL) {
     ERROR("plugin_notification_meta_add: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(meta->name, name, sizeof(meta->name));
@@ -2349,7 +2334,7 @@ static int plugin_notification_meta_add(notification_t *n, const char *name,
     if (meta->nm_value.nm_string == NULL) {
       ERROR("plugin_notification_meta_add: strdup failed.");
       sfree(meta);
-      return (-1);
+      return -1;
     }
     break;
   }
@@ -2372,7 +2357,7 @@ static int plugin_notification_meta_add(notification_t *n, const char *name,
   default: {
     ERROR("plugin_notification_meta_add: Unknown type: %i", type);
     sfree(meta);
-    return (-1);
+    return -1;
   }
   } /* switch (type) */
 
@@ -2386,33 +2371,33 @@ static int plugin_notification_meta_add(notification_t *n, const char *name,
   else
     tail->next = meta;
 
-  return (0);
+  return 0;
 } /* int plugin_notification_meta_add */
 
 int plugin_notification_meta_add_string(notification_t *n, const char *name,
                                         const char *value) {
-  return (plugin_notification_meta_add(n, name, NM_TYPE_STRING, value));
+  return plugin_notification_meta_add(n, name, NM_TYPE_STRING, value);
 }
 
 int plugin_notification_meta_add_signed_int(notification_t *n, const char *name,
                                             int64_t value) {
-  return (plugin_notification_meta_add(n, name, NM_TYPE_SIGNED_INT, &value));
+  return plugin_notification_meta_add(n, name, NM_TYPE_SIGNED_INT, &value);
 }
 
 int plugin_notification_meta_add_unsigned_int(notification_t *n,
                                               const char *name,
                                               uint64_t value) {
-  return (plugin_notification_meta_add(n, name, NM_TYPE_UNSIGNED_INT, &value));
+  return plugin_notification_meta_add(n, name, NM_TYPE_UNSIGNED_INT, &value);
 }
 
 int plugin_notification_meta_add_double(notification_t *n, const char *name,
                                         double value) {
-  return (plugin_notification_meta_add(n, name, NM_TYPE_DOUBLE, &value));
+  return plugin_notification_meta_add(n, name, NM_TYPE_DOUBLE, &value);
 }
 
 int plugin_notification_meta_add_boolean(notification_t *n, const char *name,
                                          _Bool value) {
-  return (plugin_notification_meta_add(n, name, NM_TYPE_BOOLEAN, &value));
+  return plugin_notification_meta_add(n, name, NM_TYPE_BOOLEAN, &value);
 }
 
 int plugin_notification_meta_copy(notification_t *dst,
@@ -2440,7 +2425,7 @@ int plugin_notification_meta_copy(notification_t *dst,
                                            meta->nm_value.nm_boolean);
   }
 
-  return (0);
+  return 0;
 } /* int plugin_notification_meta_copy */
 
 int plugin_notification_meta_free(notification_meta_t *n) {
@@ -2449,7 +2434,7 @@ int plugin_notification_meta_free(notification_meta_t *n) {
 
   if (n == NULL) {
     ERROR("plugin_notification_meta_free: n == NULL!");
-    return (-1);
+    return -1;
   }
 
   this = n;
@@ -2469,7 +2454,7 @@ int plugin_notification_meta_free(notification_meta_t *n) {
     this = next;
   }
 
-  return (0);
+  return 0;
 } /* int plugin_notification_meta_free */
 
 static void plugin_ctx_destructor(void *ctx) {
@@ -2493,7 +2478,7 @@ static plugin_ctx_t *plugin_ctx_create(void) {
   assert(plugin_ctx_key_initialized);
   pthread_setspecific(plugin_ctx_key, ctx);
   DEBUG("Created new plugin context.");
-  return (ctx);
+  return ctx;
 } /* int plugin_ctx_create */
 
 void plugin_init_ctx(void) {
@@ -2514,7 +2499,7 @@ plugin_ctx_t plugin_get_ctx(void) {
       return ctx_init;
   }
 
-  return (*ctx);
+  return *ctx;
 } /* plugin_ctx_t plugin_get_ctx */
 
 plugin_ctx_t plugin_set_ctx(plugin_ctx_t ctx) {
@@ -2534,7 +2519,7 @@ plugin_ctx_t plugin_set_ctx(plugin_ctx_t ctx) {
   old = *c;
   *c = ctx;
 
-  return (old);
+  return old;
 } /* void plugin_set_ctx */
 
 cdtime_t plugin_get_interval(void) {
@@ -2590,5 +2575,3 @@ int plugin_thread_create(pthread_t *thread, const pthread_attr_t *attr,
 
   return 0;
 } /* int plugin_thread_create */
-
-/* vim: set sw=8 ts=8 noet fdm=marker : */
index f6448a5..4f877e0 100644 (file)
@@ -36,8 +36,6 @@
 
 #include <pthread.h>
 
-#define PLUGIN_FLAGS_GLOBAL 0x0001
-
 #ifndef DATA_MAX_NAME_LEN
 #define DATA_MAX_NAME_LEN 128
 #endif
@@ -226,7 +224,7 @@ void plugin_set_dir(const char *dir);
  *
  * ARGUMENTS
  *  `name'      Name of the plugin to load.
- *  `flags'     Hints on how to handle this plugin.
+ *  `global'    Make this plugins symbols available for other shared libraries.
  *
  * RETURN VALUE
  *  Returns zero upon success, a value greater than zero if no plugin was found
@@ -236,7 +234,7 @@ void plugin_set_dir(const char *dir);
  *  Re-loading an already loaded module is detected and zero is returned in
  *  this case.
  */
-int plugin_load(const char *name, uint32_t flags);
+int plugin_load(const char *name, _Bool global);
 
 int plugin_init_all(void);
 void plugin_read_all(void);
index ddfc789..ca98539 100644 (file)
@@ -32,6 +32,17 @@ kstat_ctl_t *kc = NULL;
 
 char hostname_g[] = "example.com";
 
+void plugin_set_dir(const char *dir) { /* nop */
+}
+
+int plugin_load(const char *name, _Bool global) { return ENOTSUP; }
+
+int plugin_register_config(const char *name,
+                           int (*callback)(const char *key, const char *val),
+                           const char **keys, int keys_num) {
+  return ENOTSUP;
+}
+
 int plugin_register_complex_config(const char *type,
                                    int (*callback)(oconfig_item_t *)) {
   return ENOTSUP;
@@ -45,10 +56,19 @@ int plugin_register_read(const char *name, int (*callback)(void)) {
   return ENOTSUP;
 }
 
+int plugin_register_complex_read(const char *group, const char *name,
+                                 int (*callback)(user_data_t *),
+                                 cdtime_t interval,
+                                 user_data_t const *user_data) {
+  return ENOTSUP;
+}
+
 int plugin_register_shutdown(const char *name, int (*callback)(void)) {
   return ENOTSUP;
 }
 
+int plugin_register_data_set(const data_set_t *ds) { return ENOTSUP; }
+
 int plugin_dispatch_values(value_list_t const *vl) { return ENOTSUP; }
 
 int plugin_flush(const char *plugin, cdtime_t timeout, const char *identifier) {
@@ -75,6 +95,25 @@ void plugin_log(int level, char const *format, ...) {
   printf("plugin_log (%i, \"%s\");\n", level, buffer);
 }
 
-cdtime_t plugin_get_interval(void) { return TIME_T_TO_CDTIME_T(10); }
+void plugin_init_ctx(void) { /* nop */
+}
+
+plugin_ctx_t mock_context = {
+    .interval = TIME_T_TO_CDTIME_T_STATIC(10),
+};
+
+plugin_ctx_t plugin_get_ctx(void) { return mock_context; }
+
+plugin_ctx_t plugin_set_ctx(plugin_ctx_t ctx) {
+  plugin_ctx_t prev = mock_context;
+  mock_context = ctx;
+  return prev;
+}
+
+cdtime_t plugin_get_interval(void) { return mock_context.interval; }
 
-/* vim: set sw=2 sts=2 et : */
+/* TODO(octo): this function is actually from filter_chain.h, but in order not
+ * to tumble down that rabbit hole, we're declaring it here. A better solution
+ * would be to hard-code the top-level config keys in daemon/collectd.c to avoid
+ * having these references in daemon/configfile.c. */
+int fc_configure(const oconfig_item_t *ci) { return ENOTSUP; }
index b1a7203..89a08dd 100644 (file)
@@ -40,7 +40,7 @@ static int parse_ds(data_source_t *dsrc, char *buf, size_t buf_len) {
 
   if (buf_len < 11) {
     ERROR("parse_ds: (buf_len = %zu) < 11", buf_len);
-    return (-1);
+    return -1;
   }
 
   if (buf[buf_len - 1] == ',') {
@@ -61,7 +61,7 @@ static int parse_ds(data_source_t *dsrc, char *buf, size_t buf_len) {
 
   if (fields_num != 4) {
     ERROR("parse_ds: (fields_num = %i) != 4", fields_num);
-    return (-1);
+    return -1;
   }
 
   sstrncpy(dsrc->name, fields[0], sizeof(dsrc->name));
@@ -77,7 +77,7 @@ static int parse_ds(data_source_t *dsrc, char *buf, size_t buf_len) {
   else {
     ERROR("(fields[1] = %s) != (GAUGE || COUNTER || DERIVE || ABSOLUTE)",
           fields[1]);
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp(fields[2], "U") == 0)
@@ -90,7 +90,7 @@ static int parse_ds(data_source_t *dsrc, char *buf, size_t buf_len) {
   else
     dsrc->max = atof(fields[3]);
 
-  return (0);
+  return 0;
 } /* int parse_ds */
 
 static void parse_line(char *buf) {
@@ -170,7 +170,7 @@ int read_types_list(const char *file) {
   FILE *fh;
 
   if (file == NULL)
-    return (-1);
+    return -1;
 
   fh = fopen(file, "r");
   if (fh == NULL) {
@@ -179,7 +179,7 @@ int read_types_list(const char *file) {
             sstrerror(errno, errbuf, sizeof(errbuf)));
     ERROR("Failed to open types database `%s': %s", file,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   parse_file(fh);
@@ -189,9 +189,5 @@ int read_types_list(const char *file) {
 
   DEBUG("Done parsing `%s'", file);
 
-  return (0);
+  return 0;
 } /* int read_types_list */
-
-/*
- * vim: shiftwidth=2:softtabstop=2:tabstop=8
- */
index 92259ae..87568fb 100644 (file)
@@ -94,12 +94,12 @@ static int calc_height(c_avl_node_t *n) {
   int height_right;
 
   if (n == NULL)
-    return (0);
+    return 0;
 
   height_left = (n->left == NULL) ? 0 : n->left->height;
   height_right = (n->right == NULL) ? 0 : n->right->height;
 
-  return (((height_left > height_right) ? height_left : height_right) + 1);
+  return ((height_left > height_right) ? height_left : height_right) + 1;
 } /* int calc_height */
 
 static c_avl_node_t *search(c_avl_tree_t *t, const void *key) {
@@ -110,14 +110,14 @@ static c_avl_node_t *search(c_avl_tree_t *t, const void *key) {
   while (n != NULL) {
     cmp = t->compare(key, n->key);
     if (cmp == 0)
-      return (n);
+      return n;
     else if (cmp < 0)
       n = n->left;
     else
       n = n->right;
   }
 
-  return (NULL);
+  return NULL;
 }
 
 /*         (x)             (y)
@@ -159,7 +159,7 @@ static c_avl_node_t *rotate_right(c_avl_tree_t *t, c_avl_node_t *x) {
   x->height = calc_height(x);
   y->height = calc_height(y);
 
-  return (y);
+  return y;
 } /* void rotate_right */
 
 /*
@@ -202,17 +202,17 @@ static c_avl_node_t *rotate_left(c_avl_tree_t *t, c_avl_node_t *x) {
   x->height = calc_height(x);
   y->height = calc_height(y);
 
-  return (y);
+  return y;
 } /* void rotate_left */
 
 static c_avl_node_t *rotate_left_right(c_avl_tree_t *t, c_avl_node_t *x) {
   rotate_left(t, x->left);
-  return (rotate_right(t, x));
+  return rotate_right(t, x);
 } /* void rotate_left_right */
 
 static c_avl_node_t *rotate_right_left(c_avl_tree_t *t, c_avl_node_t *x) {
   rotate_right(t, x->right);
-  return (rotate_left(t, x));
+  return rotate_left(t, x);
 } /* void rotate_right_left */
 
 static void rebalance(c_avl_tree_t *t, c_avl_node_t *n) {
@@ -256,7 +256,7 @@ static c_avl_node_t *c_avl_node_next(c_avl_node_t *n) {
   c_avl_node_t *r; /* return node */
 
   if (n == NULL) {
-    return (NULL);
+    return NULL;
   }
 
   /* If we can't descent any further, we have to backtrack to the first
@@ -274,10 +274,10 @@ static c_avl_node_t *c_avl_node_next(c_avl_node_t *n) {
      * r->left != n => r->right = n => r->parent == NULL */
     if ((r == NULL) || (r->left != n)) {
       assert((r == NULL) || (r->parent == NULL));
-      return (NULL);
+      return NULL;
     } else {
       assert(r->left == n);
-      return (r);
+      return r;
     }
   } else {
     r = n->right;
@@ -285,14 +285,14 @@ static c_avl_node_t *c_avl_node_next(c_avl_node_t *n) {
       r = r->left;
   }
 
-  return (r);
+  return r;
 } /* c_avl_node_t *c_avl_node_next */
 
 static c_avl_node_t *c_avl_node_prev(c_avl_node_t *n) {
   c_avl_node_t *r; /* return node */
 
   if (n == NULL) {
-    return (NULL);
+    return NULL;
   }
 
   /* If we can't descent any further, we have to backtrack to the first
@@ -310,10 +310,10 @@ static c_avl_node_t *c_avl_node_prev(c_avl_node_t *n) {
      * r->right != n => r->left = n => r->parent == NULL */
     if ((r == NULL) || (r->right != n)) {
       assert((r == NULL) || (r->parent == NULL));
-      return (NULL);
+      return NULL;
     } else {
       assert(r->right == n);
-      return (r);
+      return r;
     }
   } else {
     r = n->left;
@@ -321,7 +321,7 @@ static c_avl_node_t *c_avl_node_prev(c_avl_node_t *n) {
       r = r->right;
   }
 
-  return (r);
+  return r;
 } /* c_avl_node_t *c_avl_node_prev */
 
 static int _remove(c_avl_tree_t *t, c_avl_node_t *n) {
@@ -409,7 +409,7 @@ static int _remove(c_avl_tree_t *t, c_avl_node_t *n) {
     assert(0);
   }
 
-  return (0);
+  return 0;
 } /* void *_remove */
 
 /*
@@ -419,16 +419,16 @@ c_avl_tree_t *c_avl_create(int (*compare)(const void *, const void *)) {
   c_avl_tree_t *t;
 
   if (compare == NULL)
-    return (NULL);
+    return NULL;
 
   if ((t = malloc(sizeof(*t))) == NULL)
-    return (NULL);
+    return NULL;
 
   t->root = NULL;
   t->compare = compare;
   t->size = 0;
 
-  return (t);
+  return t;
 }
 
 void c_avl_destroy(c_avl_tree_t *t) {
@@ -444,7 +444,7 @@ int c_avl_insert(c_avl_tree_t *t, void *key, void *value) {
   int cmp;
 
   if ((new = malloc(sizeof(*new))) == NULL)
-    return (-1);
+    return -1;
 
   new->key = key;
   new->value = value;
@@ -456,7 +456,7 @@ int c_avl_insert(c_avl_tree_t *t, void *key, void *value) {
     new->parent = NULL;
     t->root = new;
     t->size = 1;
-    return (0);
+    return 0;
   }
 
   nptr = t->root;
@@ -464,7 +464,7 @@ int c_avl_insert(c_avl_tree_t *t, void *key, void *value) {
     cmp = t->compare(nptr->key, new->key);
     if (cmp == 0) {
       free_node(new);
-      return (1);
+      return 1;
     } else if (cmp < 0) {
       /* nptr < new */
       if (nptr->right == NULL) {
@@ -491,7 +491,7 @@ int c_avl_insert(c_avl_tree_t *t, void *key, void *value) {
 
   verify_tree(t->root);
   ++t->size;
-  return (0);
+  return 0;
 } /* int c_avl_insert */
 
 int c_avl_remove(c_avl_tree_t *t, const void *key, void **rkey, void **rvalue) {
@@ -502,7 +502,7 @@ int c_avl_remove(c_avl_tree_t *t, const void *key, void **rkey, void **rvalue) {
 
   n = search(t, key);
   if (n == NULL)
-    return (-1);
+    return -1;
 
   if (rkey != NULL)
     *rkey = n->key;
@@ -512,7 +512,7 @@ int c_avl_remove(c_avl_tree_t *t, const void *key, void **rkey, void **rvalue) {
   status = _remove(t, n);
   verify_tree(t->root);
   --t->size;
-  return (status);
+  return status;
 } /* void *c_avl_remove */
 
 int c_avl_get(c_avl_tree_t *t, const void *key, void **value) {
@@ -522,22 +522,24 @@ int c_avl_get(c_avl_tree_t *t, const void *key, void **value) {
 
   n = search(t, key);
   if (n == NULL)
-    return (-1);
+    return -1;
 
   if (value != NULL)
     *value = n->value;
 
-  return (0);
+  return 0;
 }
 
 int c_avl_pick(c_avl_tree_t *t, void **key, void **value) {
   c_avl_node_t *n;
   c_avl_node_t *p;
 
+  assert(t != NULL);
+
   if ((key == NULL) || (value == NULL))
-    return (-1);
+    return -1;
   if (t->root == NULL)
-    return (-1);
+    return -1;
 
   n = t->root;
   while ((n->left != NULL) || (n->right != NULL)) {
@@ -570,28 +572,28 @@ int c_avl_pick(c_avl_tree_t *t, void **key, void **value) {
   --t->size;
   rebalance(t, p);
 
-  return (0);
+  return 0;
 } /* int c_avl_pick */
 
 c_avl_iterator_t *c_avl_get_iterator(c_avl_tree_t *t) {
   c_avl_iterator_t *iter;
 
   if (t == NULL)
-    return (NULL);
+    return NULL;
 
   iter = calloc(1, sizeof(*iter));
   if (iter == NULL)
-    return (NULL);
+    return NULL;
   iter->tree = t;
 
-  return (iter);
+  return iter;
 } /* c_avl_iterator_t *c_avl_get_iterator */
 
 int c_avl_iterator_next(c_avl_iterator_t *iter, void **key, void **value) {
   c_avl_node_t *n;
 
   if ((iter == NULL) || (key == NULL) || (value == NULL))
-    return (-1);
+    return -1;
 
   if (iter->node == NULL) {
     for (n = iter->tree->root; n != NULL; n = n->left)
@@ -603,20 +605,20 @@ int c_avl_iterator_next(c_avl_iterator_t *iter, void **key, void **value) {
   }
 
   if (n == NULL)
-    return (-1);
+    return -1;
 
   iter->node = n;
   *key = n->key;
   *value = n->value;
 
-  return (0);
+  return 0;
 } /* int c_avl_iterator_next */
 
 int c_avl_iterator_prev(c_avl_iterator_t *iter, void **key, void **value) {
   c_avl_node_t *n;
 
   if ((iter == NULL) || (key == NULL) || (value == NULL))
-    return (-1);
+    return -1;
 
   if (iter->node == NULL) {
     for (n = iter->tree->root; n != NULL; n = n->left)
@@ -628,19 +630,19 @@ int c_avl_iterator_prev(c_avl_iterator_t *iter, void **key, void **value) {
   }
 
   if (n == NULL)
-    return (-1);
+    return -1;
 
   iter->node = n;
   *key = n->key;
   *value = n->value;
 
-  return (0);
+  return 0;
 } /* int c_avl_iterator_prev */
 
 void c_avl_iterator_destroy(c_avl_iterator_t *iter) { free(iter); }
 
 int c_avl_size(c_avl_tree_t *t) {
   if (t == NULL)
-    return (0);
-  return (t->size);
+    return 0;
+  return t->size;
 }
index 0a84f6f..bb30f9d 100644 (file)
@@ -41,7 +41,7 @@ static int compare_callback(void const *v0, void const *v1) {
   assert(v1 != NULL);
 
   compare_total_count++;
-  return (strcmp(v0, v1));
+  return strcmp(v0, v1);
 }
 
 DEF_TEST(success) {
@@ -127,7 +127,7 @@ DEF_TEST(success) {
 
   c_avl_destroy(t);
 
-  return (0);
+  return 0;
 }
 
 int main(void) {
@@ -135,5 +135,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index aa8ce9e..7d6e8fd 100644 (file)
@@ -83,7 +83,7 @@ static int cache_compare(const cache_entry_t *a, const cache_entry_t *b) {
 #if COLLECT_DEBUG
   assert((a != NULL) && (b != NULL));
 #endif
-  return (strcmp(a->name, b->name));
+  return strcmp(a->name, b->name);
 } /* int cache_compare */
 
 static cache_entry_t *cache_alloc(size_t values_num) {
@@ -92,7 +92,7 @@ static cache_entry_t *cache_alloc(size_t values_num) {
   ce = calloc(1, sizeof(*ce));
   if (ce == NULL) {
     ERROR("utils_cache: cache_alloc: calloc failed.");
-    return (NULL);
+    return NULL;
   }
   ce->values_num = values_num;
 
@@ -103,14 +103,14 @@ static cache_entry_t *cache_alloc(size_t values_num) {
     sfree(ce->values_raw);
     sfree(ce);
     ERROR("utils_cache: cache_alloc: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   ce->history = NULL;
   ce->history_length = 0;
   ce->meta = NULL;
 
-  return (ce);
+  return ce;
 } /* cache_entry_t *cache_alloc */
 
 static void cache_free(cache_entry_t *ce) {
@@ -148,14 +148,14 @@ static int uc_insert(const data_set_t *ds, const value_list_t *vl,
   key_copy = strdup(key);
   if (key_copy == NULL) {
     ERROR("uc_insert: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   ce = cache_alloc(ds->ds_num);
   if (ce == NULL) {
     sfree(key_copy);
     ERROR("uc_insert: cache_alloc (%zu) failed.", ds->ds_num);
-    return (-1);
+    return -1;
   }
 
   sstrncpy(ce->name, key, sizeof(ce->name));
@@ -191,7 +191,7 @@ static int uc_insert(const data_set_t *ds, const value_list_t *vl,
             ds->ds[i].type);
       sfree(key_copy);
       cache_free(ce);
-      return (-1);
+      return -1;
     } /* switch (ds->ds[i].type) */
   }   /* for (i) */
 
@@ -206,11 +206,11 @@ static int uc_insert(const data_set_t *ds, const value_list_t *vl,
   if (c_avl_insert(cache_tree, key_copy, ce) != 0) {
     sfree(key_copy);
     ERROR("uc_insert: c_avl_insert failed.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("uc_insert: Added %s to the cache.", key);
-  return (0);
+  return 0;
 } /* int uc_insert */
 
 int uc_init(void) {
@@ -218,7 +218,7 @@ int uc_init(void) {
     cache_tree =
         c_avl_create((int (*)(const void *, const void *))cache_compare);
 
-  return (0);
+  return 0;
 } /* int uc_init */
 
 int uc_check_timeout(void) {
@@ -265,7 +265,7 @@ int uc_check_timeout(void) {
 
   if (expired_num == 0) {
     sfree(expired);
-    return (0);
+    return 0;
   }
 
   /* Call the "missing" callback for each value. Do this before removing the
@@ -309,7 +309,7 @@ int uc_check_timeout(void) {
   pthread_mutex_unlock(&cache_lock);
 
   sfree(expired);
-  return (0);
+  return 0;
 } /* int uc_check_timeout */
 
 int uc_update(const data_set_t *ds, const value_list_t *vl) {
@@ -319,7 +319,7 @@ int uc_update(const data_set_t *ds, const value_list_t *vl) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_update: FORMAT_VL failed.");
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -329,7 +329,7 @@ int uc_update(const data_set_t *ds, const value_list_t *vl) {
   {
     status = uc_insert(ds, vl, name);
     pthread_mutex_unlock(&cache_lock);
-    return (status);
+    return status;
   }
 
   assert(ce != NULL);
@@ -341,7 +341,7 @@ int uc_update(const data_set_t *ds, const value_list_t *vl) {
            "last cache update = %.3f;",
            name, CDTIME_T_TO_DOUBLE(vl->time),
            CDTIME_T_TO_DOUBLE(ce->last_time));
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < ds->ds_num; i++) {
@@ -378,7 +378,7 @@ int uc_update(const data_set_t *ds, const value_list_t *vl) {
       pthread_mutex_unlock(&cache_lock);
       ERROR("uc_update: Don't know how to handle data source type %i.",
             ds->ds[i].type);
-      return (-1);
+      return -1;
     } /* switch (ds->ds[i].type) */
 
     DEBUG("uc_update: %s: ds[%zu] = %lf", name, i, ce->values_gauge[i]);
@@ -405,7 +405,7 @@ int uc_update(const data_set_t *ds, const value_list_t *vl) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (0);
+  return 0;
 } /* int uc_update */
 
 int uc_get_rate_by_name(const char *name, gauge_t **ret_values,
@@ -448,7 +448,7 @@ int uc_get_rate_by_name(const char *name, gauge_t **ret_values,
     *ret_values_num = ret_num;
   }
 
-  return (status);
+  return status;
 } /* gauge_t *uc_get_rate_by_name */
 
 gauge_t *uc_get_rate(const data_set_t *ds, const value_list_t *vl) {
@@ -459,12 +459,12 @@ gauge_t *uc_get_rate(const data_set_t *ds, const value_list_t *vl) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("utils_cache: uc_get_rate: FORMAT_VL failed.");
-    return (NULL);
+    return NULL;
   }
 
   status = uc_get_rate_by_name(name, &ret, &ret_num);
   if (status != 0)
-    return (NULL);
+    return NULL;
 
   /* This is important - the caller has no other way of knowing how many
    * values are returned. */
@@ -473,11 +473,80 @@ gauge_t *uc_get_rate(const data_set_t *ds, const value_list_t *vl) {
           "but uc_get_rate_by_name returned %zu.",
           ds->type, ds->ds_num, ret_num);
     sfree(ret);
+    return NULL;
+  }
+
+  return ret;
+} /* gauge_t *uc_get_rate */
+
+int uc_get_value_by_name(const char *name, value_t **ret_values,
+                         size_t *ret_values_num) {
+  value_t *ret = NULL;
+  size_t ret_num = 0;
+  cache_entry_t *ce = NULL;
+  int status = 0;
+
+  pthread_mutex_lock(&cache_lock);
+
+  if (c_avl_get(cache_tree, name, (void *) &ce) == 0) {
+    assert(ce != NULL);
+
+    /* remove missing values from getval */
+    if (ce->state == STATE_MISSING) {
+      status = -1;
+    } else {
+      ret_num = ce->values_num;
+      ret = malloc(ret_num * sizeof(*ret));
+      if (ret == NULL) {
+        ERROR("utils_cache: uc_get_value_by_name: malloc failed.");
+        status = -1;
+      } else {
+        memcpy(ret, ce->values_raw, ret_num * sizeof(value_t));
+      }
+    }
+  }
+  else {
+    DEBUG("utils_cache: uc_get_value_by_name: No such value: %s", name);
+    status = -1;
+  }
+
+  pthread_mutex_unlock(&cache_lock);
+
+  if (status == 0) {
+    *ret_values = ret;
+    *ret_values_num = ret_num;
+  }
+
+  return (status);
+} /* int uc_get_value_by_name */
+
+value_t *uc_get_value(const data_set_t *ds, const value_list_t *vl) {
+  char name[6 * DATA_MAX_NAME_LEN];
+  value_t *ret = NULL;
+  size_t ret_num = 0;
+  int status;
+
+  if (FORMAT_VL(name, sizeof(name), vl) != 0) {
+    ERROR("utils_cache: uc_get_value: FORMAT_VL failed.");
+    return (NULL);
+  }
+
+  status = uc_get_value_by_name(name, &ret, &ret_num);
+  if (status != 0)
+    return (NULL);
+
+  /* This is important - the caller has no other way of knowing how many
+   * values are returned. */
+  if (ret_num != (size_t) ds->ds_num) {
+    ERROR("utils_cache: uc_get_value: ds[%s] has %zu values, "
+          "but uc_get_value_by_name returned %zu.", ds->type, ds->ds_num,
+          ret_num);
+    sfree(ret);
     return (NULL);
   }
 
   return (ret);
-} /* gauge_t *uc_get_rate */
+} /* value_t *uc_get_value */
 
 size_t uc_get_size(void) {
   size_t size_arrays = 0;
@@ -486,7 +555,7 @@ size_t uc_get_size(void) {
   size_arrays = (size_t)c_avl_size(cache_tree);
   pthread_mutex_unlock(&cache_lock);
 
-  return (size_arrays);
+  return size_arrays;
 }
 
 int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
@@ -502,7 +571,7 @@ int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
   int status = 0;
 
   if ((ret_names == NULL) || (ret_number == NULL))
-    return (-1);
+    return -1;
 
   pthread_mutex_lock(&cache_lock);
 
@@ -511,7 +580,7 @@ int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
     /* Handle the "no values" case here, to avoid the error message when
      * calloc() returns NULL. */
     pthread_mutex_unlock(&cache_lock);
-    return (0);
+    return 0;
   }
 
   names = calloc(size_arrays, sizeof(*names));
@@ -521,7 +590,7 @@ int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
     sfree(names);
     sfree(times);
     pthread_mutex_unlock(&cache_lock);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   iter = c_avl_get_iterator(cache_tree);
@@ -556,7 +625,7 @@ int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
     sfree(names);
     sfree(times);
 
-    return (-1);
+    return -1;
   }
 
   *ret_names = names;
@@ -566,7 +635,7 @@ int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
     sfree(times);
   *ret_number = number;
 
-  return (0);
+  return 0;
 } /* int uc_get_names */
 
 int uc_get_state(const data_set_t *ds, const value_list_t *vl) {
@@ -576,7 +645,7 @@ int uc_get_state(const data_set_t *ds, const value_list_t *vl) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_get_state: FORMAT_VL failed.");
-    return (STATE_ERROR);
+    return STATE_ERROR;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -588,7 +657,7 @@ int uc_get_state(const data_set_t *ds, const value_list_t *vl) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (ret);
+  return ret;
 } /* int uc_get_state */
 
 int uc_set_state(const data_set_t *ds, const value_list_t *vl, int state) {
@@ -598,7 +667,7 @@ int uc_set_state(const data_set_t *ds, const value_list_t *vl, int state) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_set_state: FORMAT_VL failed.");
-    return (STATE_ERROR);
+    return STATE_ERROR;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -611,7 +680,7 @@ int uc_set_state(const data_set_t *ds, const value_list_t *vl, int state) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (ret);
+  return ret;
 } /* int uc_set_state */
 
 int uc_get_history_by_name(const char *name, gauge_t *ret_history,
@@ -624,12 +693,12 @@ int uc_get_history_by_name(const char *name, gauge_t *ret_history,
   status = c_avl_get(cache_tree, name, (void *)&ce);
   if (status != 0) {
     pthread_mutex_unlock(&cache_lock);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   if (((size_t)ce->values_num) != num_ds) {
     pthread_mutex_unlock(&cache_lock);
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   /* Check if there are enough values available. If not, increase the buffer
@@ -641,7 +710,7 @@ int uc_get_history_by_name(const char *name, gauge_t *ret_history,
         realloc(ce->history, sizeof(*ce->history) * num_steps * ce->values_num);
     if (tmp == NULL) {
       pthread_mutex_unlock(&cache_lock);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     for (size_t i = ce->history_length * ce->values_num;
@@ -671,7 +740,7 @@ int uc_get_history_by_name(const char *name, gauge_t *ret_history,
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (0);
+  return 0;
 } /* int uc_get_history_by_name */
 
 int uc_get_history(const data_set_t *ds, const value_list_t *vl,
@@ -680,10 +749,10 @@ int uc_get_history(const data_set_t *ds, const value_list_t *vl,
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("utils_cache: uc_get_history: FORMAT_VL failed.");
-    return (-1);
+    return -1;
   }
 
-  return (uc_get_history_by_name(name, ret_history, num_steps, num_ds));
+  return uc_get_history_by_name(name, ret_history, num_steps, num_ds);
 } /* int uc_get_history */
 
 int uc_get_hits(const data_set_t *ds, const value_list_t *vl) {
@@ -693,7 +762,7 @@ int uc_get_hits(const data_set_t *ds, const value_list_t *vl) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_get_hits: FORMAT_VL failed.");
-    return (STATE_ERROR);
+    return STATE_ERROR;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -705,7 +774,7 @@ int uc_get_hits(const data_set_t *ds, const value_list_t *vl) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (ret);
+  return ret;
 } /* int uc_get_hits */
 
 int uc_set_hits(const data_set_t *ds, const value_list_t *vl, int hits) {
@@ -715,7 +784,7 @@ int uc_set_hits(const data_set_t *ds, const value_list_t *vl, int hits) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_set_hits: FORMAT_VL failed.");
-    return (STATE_ERROR);
+    return STATE_ERROR;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -728,7 +797,7 @@ int uc_set_hits(const data_set_t *ds, const value_list_t *vl, int hits) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (ret);
+  return ret;
 } /* int uc_set_hits */
 
 int uc_inc_hits(const data_set_t *ds, const value_list_t *vl, int step) {
@@ -738,7 +807,7 @@ int uc_inc_hits(const data_set_t *ds, const value_list_t *vl, int step) {
 
   if (FORMAT_VL(name, sizeof(name), vl) != 0) {
     ERROR("uc_inc_hits: FORMAT_VL failed.");
-    return (STATE_ERROR);
+    return STATE_ERROR;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -751,7 +820,7 @@ int uc_inc_hits(const data_set_t *ds, const value_list_t *vl, int step) {
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (ret);
+  return ret;
 } /* int uc_inc_hits */
 
 /*
@@ -762,24 +831,24 @@ uc_iter_t *uc_get_iterator(void) {
 
   iter = (uc_iter_t *)calloc(1, sizeof(*iter));
   if (iter == NULL)
-    return (NULL);
+    return NULL;
 
   pthread_mutex_lock(&cache_lock);
 
   iter->iter = c_avl_get_iterator(cache_tree);
   if (iter->iter == NULL) {
     free(iter);
-    return (NULL);
+    return NULL;
   }
 
-  return (iter);
+  return iter;
 } /* uc_iter_t *uc_get_iterator */
 
 int uc_iterator_next(uc_iter_t *iter, char **ret_name) {
   int status;
 
   if (iter == NULL)
-    return (-1);
+    return -1;
 
   while ((status = c_avl_iterator_next(iter->iter, (void *)&iter->name,
                                        (void *)&iter->entry)) == 0) {
@@ -791,13 +860,13 @@ int uc_iterator_next(uc_iter_t *iter, char **ret_name) {
   if (status != 0) {
     iter->name = NULL;
     iter->entry = NULL;
-    return (-1);
+    return -1;
   }
 
   if (ret_name != NULL)
     *ret_name = iter->name;
 
-  return (0);
+  return 0;
 } /* int uc_iterator_next */
 
 void uc_iterator_destroy(uc_iter_t *iter) {
@@ -812,36 +881,36 @@ void uc_iterator_destroy(uc_iter_t *iter) {
 
 int uc_iterator_get_time(uc_iter_t *iter, cdtime_t *ret_time) {
   if ((iter == NULL) || (iter->entry == NULL) || (ret_time == NULL))
-    return (-1);
+    return -1;
 
   *ret_time = iter->entry->last_time;
-  return (0);
+  return 0;
 } /* int uc_iterator_get_name */
 
 int uc_iterator_get_values(uc_iter_t *iter, value_t **ret_values,
                            size_t *ret_num) {
   if ((iter == NULL) || (iter->entry == NULL) || (ret_values == NULL) ||
       (ret_num == NULL))
-    return (-1);
+    return -1;
 
   *ret_values =
       calloc(iter->entry->values_num, sizeof(*iter->entry->values_raw));
   if (*ret_values == NULL)
-    return (-1);
+    return -1;
   for (size_t i = 0; i < iter->entry->values_num; ++i)
     *ret_values[i] = iter->entry->values_raw[i];
 
   *ret_num = iter->entry->values_num;
 
-  return (0);
+  return 0;
 } /* int uc_iterator_get_values */
 
 int uc_iterator_get_interval(uc_iter_t *iter, cdtime_t *ret_interval) {
   if ((iter == NULL) || (iter->entry == NULL) || (ret_interval == NULL))
-    return (-1);
+    return -1;
 
   *ret_interval = iter->entry->interval;
-  return (0);
+  return 0;
 } /* int uc_iterator_get_name */
 
 /*
@@ -857,7 +926,7 @@ static meta_data_t *uc_get_meta(const value_list_t *vl) /* {{{ */
   status = FORMAT_VL(name, sizeof(name), vl);
   if (status != 0) {
     ERROR("utils_cache: uc_get_meta: FORMAT_VL failed.");
-    return (NULL);
+    return NULL;
   }
 
   pthread_mutex_lock(&cache_lock);
@@ -865,7 +934,7 @@ static meta_data_t *uc_get_meta(const value_list_t *vl) /* {{{ */
   status = c_avl_get(cache_tree, name, (void *)&ce);
   if (status != 0) {
     pthread_mutex_unlock(&cache_lock);
-    return (NULL);
+    return NULL;
   }
   assert(ce != NULL);
 
@@ -875,7 +944,7 @@ static meta_data_t *uc_get_meta(const value_list_t *vl) /* {{{ */
   if (ce->meta == NULL)
     pthread_mutex_unlock(&cache_lock);
 
-  return (ce->meta);
+  return ce->meta;
 } /* }}} meta_data_t *uc_get_meta */
 
 /* Sorry about this preprocessor magic, but it really makes this file much
@@ -886,10 +955,10 @@ static meta_data_t *uc_get_meta(const value_list_t *vl) /* {{{ */
     int status;                                                                \
     meta = uc_get_meta(vl);                                                    \
     if (meta == NULL)                                                          \
-      return (-1);                                                             \
+      return -1;                                                               \
     status = wrap_function(meta, key);                                         \
     pthread_mutex_unlock(&cache_lock);                                         \
-    return (status);                                                           \
+    return status;                                                             \
   }
 int uc_meta_data_exists(const value_list_t *vl,
                         const char *key) UC_WRAP(meta_data_exists)
@@ -906,10 +975,10 @@ int uc_meta_data_exists(const value_list_t *vl,
     int status;                                                                \
     meta = uc_get_meta(vl);                                                    \
     if (meta == NULL)                                                          \
-      return (-1);                                                             \
+      return -1;                                                               \
     status = wrap_function(meta, key, value);                                  \
     pthread_mutex_unlock(&cache_lock);                                         \
-    return (status);                                                           \
+    return status;                                                             \
   }
         int uc_meta_data_add_string(const value_list_t *vl, const char *key,
                                     const char *value)
@@ -940,5 +1009,3 @@ int uc_meta_data_exists(const value_list_t *vl,
                                                 const char *key, _Bool *value)
                                                 UC_WRAP(meta_data_get_boolean)
 #undef UC_WRAP
-
-    /* vim: set sw=2 ts=8 sts=2 tw=78 : */
index 2f40873..8ba7133 100644 (file)
@@ -42,6 +42,8 @@ int uc_update(const data_set_t *ds, const value_list_t *vl);
 int uc_get_rate_by_name(const char *name, gauge_t **ret_values,
                         size_t *ret_values_num);
 gauge_t *uc_get_rate(const data_set_t *ds, const value_list_t *vl);
+int uc_get_value_by_name(const char *name, value_t **ret_values, size_t *ret_values_num);
+value_t *uc_get_value(const data_set_t *ds, const value_list_t *vl);
 
 size_t uc_get_size(void);
 int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number);
@@ -133,5 +135,4 @@ int uc_meta_data_get_double(const value_list_t *vl, const char *key,
 int uc_meta_data_get_boolean(const value_list_t *vl, const char *key,
                              _Bool *value);
 
-/* vim: set shiftwidth=2 softtabstop=2 tabstop=8 : */
 #endif /* !UTILS_CACHE_H */
index 0f0077d..5389d12 100644 (file)
 gauge_t *uc_get_rate(__attribute__((unused)) data_set_t const *ds,
                      __attribute__((unused)) value_list_t const *vl) {
   errno = ENOTSUP;
-  return (NULL);
+  return NULL;
 }
 
 int uc_get_rate_by_name(const char *name, gauge_t **ret_values,
                         size_t *ret_values_num) {
-  return (ENOTSUP);
+  return ENOTSUP;
 }
 
 int uc_get_names(char ***ret_names, cdtime_t **ret_times, size_t *ret_number) {
-  return (ENOTSUP);
+  return ENOTSUP;
 }
index fb45243..d2162ba 100644 (file)
@@ -97,5 +97,3 @@ void c_do_release(int level, c_complain_t *c, const char *format, ...) {
 
   plugin_log(level, "%s", message);
 } /* c_release */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index fbeea90..46d3a19 100644 (file)
@@ -113,5 +113,3 @@ c_do_release(int level, c_complain_t *c, const char *format, ...);
   } while (0)
 
 #endif /* UTILS_COMPLAIN_H */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 8dd501d..d36d410 100644 (file)
@@ -99,11 +99,11 @@ c_heap_t *c_heap_create(int (*compare)(const void *, const void *)) {
   c_heap_t *h;
 
   if (compare == NULL)
-    return (NULL);
+    return NULL;
 
   h = calloc(1, sizeof(*h));
   if (h == NULL)
-    return (NULL);
+    return NULL;
 
   pthread_mutex_init(&h->lock, /* attr = */ NULL);
   h->compare = compare;
@@ -112,7 +112,7 @@ c_heap_t *c_heap_create(int (*compare)(const void *, const void *)) {
   h->list_len = 0;
   h->list_size = 0;
 
-  return (h);
+  return h;
 } /* c_heap_t *c_heap_create */
 
 void c_heap_destroy(c_heap_t *h) {
@@ -133,7 +133,7 @@ int c_heap_insert(c_heap_t *h, void *ptr) {
   size_t index;
 
   if ((h == NULL) || (ptr == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   pthread_mutex_lock(&h->lock);
 
@@ -144,7 +144,7 @@ int c_heap_insert(c_heap_t *h, void *ptr) {
     tmp = realloc(h->list, (h->list_size + 16) * sizeof(*h->list));
     if (tmp == NULL) {
       pthread_mutex_unlock(&h->lock);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     h->list = tmp;
@@ -160,20 +160,20 @@ int c_heap_insert(c_heap_t *h, void *ptr) {
   reheap(h, /* parent of this node = */ (index - 1) / 2, DIR_UP);
 
   pthread_mutex_unlock(&h->lock);
-  return (0);
+  return 0;
 } /* int c_heap_insert */
 
 void *c_heap_get_root(c_heap_t *h) {
   void *ret = NULL;
 
   if (h == NULL)
-    return (NULL);
+    return NULL;
 
   pthread_mutex_lock(&h->lock);
 
   if (h->list_len == 0) {
     pthread_mutex_unlock(&h->lock);
-    return (NULL);
+    return NULL;
   } else if (h->list_len == 1) {
     ret = h->list[0];
     h->list[0] = NULL;
@@ -201,7 +201,5 @@ void *c_heap_get_root(c_heap_t *h) {
 
   pthread_mutex_unlock(&h->lock);
 
-  return (ret);
+  return ret;
 } /* void *c_heap_get_root */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 2f77cc4..d2d70cd 100644 (file)
@@ -97,4 +97,3 @@ int c_heap_insert(c_heap_t *h, void *ptr);
 void *c_heap_get_root(c_heap_t *h);
 
 #endif /* UTILS_HEAP_H */
-/* vim: set sw=2 sts=2 et : */
index 8443b60..827c090 100644 (file)
@@ -68,7 +68,7 @@ DEF_TEST(simple) {
   }
 
   c_heap_destroy(h);
-  return (0);
+  return 0;
 }
 
 int main(void) {
@@ -76,5 +76,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
diff --git a/src/daemon/utils_ignorelist.c b/src/daemon/utils_ignorelist.c
deleted file mode 100644 (file)
index 9cf6aa1..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-/**
- * collectd - src/utils_ignorelist.c
- * Copyright (C) 2006 Lubos Stanek <lubek at users.sourceforge.net>
- * Copyright (C) 2008 Florian Forster <octo at collectd.org>
- *
- * This program is free software; you can redistribute it and/
- * or modify it under the terms of the GNU General Public Li-
- * cence as published by the Free Software Foundation; either
- * version 2 of the Licence, or any later version.
- *
- * This program is distributed in the hope that it will be use-
- * ful, but WITHOUT ANY WARRANTY; without even the implied war-
- * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public Licence for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
- *
- * Authors:
- *   Lubos Stanek <lubek at users.sourceforge.net>
- *   Florian Forster <octo at collectd.org>
- **/
-/**
- * ignorelist handles plugin's list of configured collectable
- * entries with global ignore action
- **/
-/**
- * Usage:
- *
- * Define plugin's global pointer variable of type ignorelist_t:
- *   ignorelist_t *myconfig_ignore;
- * If you know the state of the global ignore (IgnoreSelected),
- * allocate the variable with:
- *   myconfig_ignore = ignorelist_create (YourKnownIgnore);
- * If you do not know the state of the global ignore,
- * initialize the global variable and set the ignore flag later:
- *   myconfig_ignore = ignorelist_init ();
- * Append single entries in your cf_register'ed callback function:
- *   ignorelist_add (myconfig_ignore, newentry);
- * When you hit the IgnoreSelected config option,
- * offer it to the list:
- *   ignorelist_ignore (myconfig_ignore, instantly_got_value_of_ignore);
- * That is all for the ignorelist initialization.
- * Later during read and write (plugin's registered functions) get
- * the information whether this entry would be collected or not:
- *   if (ignorelist_match (myconfig_ignore, thisentry))
- *     return;
- **/
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "common.h"
-#include "plugin.h"
-#include "utils_ignorelist.h"
-
-/*
- * private prototypes
- */
-struct ignorelist_item_s {
-#if HAVE_REGEX_H
-  regex_t *rmatch; /* regular expression entry identification */
-#endif
-  char *smatch; /* string entry identification */
-  struct ignorelist_item_s *next;
-};
-typedef struct ignorelist_item_s ignorelist_item_t;
-
-struct ignorelist_s {
-  int ignore;              /* ignore entries */
-  ignorelist_item_t *head; /* pointer to the first entry */
-};
-
-/* *** *** *** ********************************************* *** *** *** */
-/* *** *** *** *** *** ***   private functions   *** *** *** *** *** *** */
-/* *** *** *** ********************************************* *** *** *** */
-
-static inline void ignorelist_append(ignorelist_t *il,
-                                     ignorelist_item_t *item) {
-  assert((il != NULL) && (item != NULL));
-
-  item->next = il->head;
-  il->head = item;
-}
-
-#if HAVE_REGEX_H
-static int ignorelist_append_regex(ignorelist_t *il, const char *re_str) {
-  regex_t *re;
-  ignorelist_item_t *entry;
-  int status;
-
-  re = calloc(1, sizeof(*re));
-  if (re == NULL) {
-    ERROR("ignorelist_append_regex: calloc failed.");
-    return (ENOMEM);
-  }
-
-  status = regcomp(re, re_str, REG_EXTENDED);
-  if (status != 0) {
-    char errbuf[1024];
-    (void)regerror(status, re, errbuf, sizeof(errbuf));
-    ERROR("utils_ignorelist: regcomp failed: %s", errbuf);
-    ERROR("ignorelist_append_regex: Compiling regular expression \"%s\" "
-          "failed: %s",
-          re_str, errbuf);
-    sfree(re);
-    return (status);
-  }
-
-  entry = calloc(1, sizeof(*entry));
-  if (entry == NULL) {
-    ERROR("ignorelist_append_regex: calloc failed.");
-    regfree(re);
-    sfree(re);
-    return (ENOMEM);
-  }
-  entry->rmatch = re;
-
-  ignorelist_append(il, entry);
-  return (0);
-} /* int ignorelist_append_regex */
-#endif
-
-static int ignorelist_append_string(ignorelist_t *il, const char *entry) {
-  ignorelist_item_t *new;
-
-  /* create new entry */
-  if ((new = calloc(1, sizeof(*new))) == NULL) {
-    ERROR("cannot allocate new entry");
-    return (1);
-  }
-  new->smatch = sstrdup(entry);
-
-  /* append new entry */
-  ignorelist_append(il, new);
-
-  return (0);
-} /* int ignorelist_append_string(ignorelist_t *il, const char *entry) */
-
-#if HAVE_REGEX_H
-/*
- * check list for entry regex match
- * return 1 if found
- */
-static int ignorelist_match_regex(ignorelist_item_t *item, const char *entry) {
-  assert((item != NULL) && (item->rmatch != NULL) && (entry != NULL) &&
-         (strlen(entry) > 0));
-
-  /* match regex */
-  if (regexec(item->rmatch, entry, 0, NULL, 0) == 0)
-    return (1);
-
-  return (0);
-} /* int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) */
-#endif
-
-/*
- * check list for entry string match
- * return 1 if found
- */
-static int ignorelist_match_string(ignorelist_item_t *item, const char *entry) {
-  assert((item != NULL) && (item->smatch != NULL) && (entry != NULL) &&
-         (strlen(entry) > 0));
-
-  if (strcmp(entry, item->smatch) == 0)
-    return (1);
-
-  return (0);
-} /* int ignorelist_match_string (ignorelist_item_t *item, const char *entry) */
-
-/* *** *** *** ******************************************** *** *** *** */
-/* *** *** *** *** *** ***   public functions   *** *** *** *** *** *** */
-/* *** *** *** ******************************************** *** *** *** */
-
-/*
- * create the ignorelist_t with known ignore state
- * return pointer to ignorelist_t
- */
-ignorelist_t *ignorelist_create(int invert) {
-  ignorelist_t *il;
-
-  il = calloc(1, sizeof(*il));
-  if (il == NULL)
-    return NULL;
-
-  /*
-   * ->ignore == 0  =>  collect
-   * ->ignore == 1  =>  ignore
-   */
-  il->ignore = invert ? 0 : 1;
-
-  return (il);
-} /* ignorelist_t *ignorelist_create (int ignore) */
-
-/*
- * free memory used by ignorelist_t
- */
-void ignorelist_free(ignorelist_t *il) {
-  ignorelist_item_t *this;
-  ignorelist_item_t *next;
-
-  if (il == NULL)
-    return;
-
-  for (this = il->head; this != NULL; this = next) {
-    next = this->next;
-#if HAVE_REGEX_H
-    if (this->rmatch != NULL) {
-      regfree(this->rmatch);
-      sfree(this->rmatch);
-      this->rmatch = NULL;
-    }
-#endif
-    if (this->smatch != NULL) {
-      sfree(this->smatch);
-      this->smatch = NULL;
-    }
-    sfree(this);
-  }
-
-  sfree(il);
-} /* void ignorelist_destroy (ignorelist_t *il) */
-
-/*
- * set ignore state of the ignorelist_t
- */
-void ignorelist_set_invert(ignorelist_t *il, int invert) {
-  if (il == NULL) {
-    DEBUG("ignore call with ignorelist_t == NULL");
-    return;
-  }
-
-  il->ignore = invert ? 0 : 1;
-} /* void ignorelist_set_invert (ignorelist_t *il, int ignore) */
-
-/*
- * append entry into ignorelist_t
- * return 0 for success
- */
-int ignorelist_add(ignorelist_t *il, const char *entry) {
-  size_t len;
-
-  if (il == NULL) {
-    DEBUG("add called with ignorelist_t == NULL");
-    return (1);
-  }
-
-  len = strlen(entry);
-
-  /* append nothing */
-  if (len == 0) {
-    DEBUG("not appending: empty entry");
-    return (1);
-  }
-
-#if HAVE_REGEX_H
-  /* regex string is enclosed in "/.../" */
-  if ((len > 2) && (entry[0] == '/') && entry[len - 1] == '/') {
-    char *copy;
-    int status;
-
-    /* skip leading slash */
-    copy = strdup(entry + 1);
-    if (copy == NULL)
-      return ENOMEM;
-
-    /* trim trailing slash */
-    copy[strlen(copy) - 1] = 0;
-
-    status = ignorelist_append_regex(il, copy);
-    sfree(copy);
-    return status;
-  }
-#endif
-
-  return ignorelist_append_string(il, entry);
-} /* int ignorelist_add (ignorelist_t *il, const char *entry) */
-
-/*
- * check list for entry
- * return 1 for ignored entry
- */
-int ignorelist_match(ignorelist_t *il, const char *entry) {
-  /* if no entries, collect all */
-  if ((il == NULL) || (il->head == NULL))
-    return (0);
-
-  if ((entry == NULL) || (strlen(entry) == 0))
-    return (0);
-
-  /* traverse list and check entries */
-  for (ignorelist_item_t *traverse = il->head; traverse != NULL;
-       traverse = traverse->next) {
-#if HAVE_REGEX_H
-    if (traverse->rmatch != NULL) {
-      if (ignorelist_match_regex(traverse, entry))
-        return (il->ignore);
-    } else
-#endif
-    {
-      if (ignorelist_match_string(traverse, entry))
-        return (il->ignore);
-    }
-  } /* for traverse */
-
-  return (1 - il->ignore);
-} /* int ignorelist_match (ignorelist_t *il, const char *entry) */
diff --git a/src/daemon/utils_ignorelist.h b/src/daemon/utils_ignorelist.h
deleted file mode 100644 (file)
index a7fa86d..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * collectd - src/utils_ignorelist.h
- * Copyright (C) 2006 Lubos Stanek <lubek at users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/
- * or modify it under the terms of the GNU General Public Li-
- * cence as published by the Free Software Foundation; either
- * version 2 of the Licence, or any later version.
- *
- * This program is distributed in the hope that it will be use-
- * ful, but WITHOUT ANY WARRANTY; without even the implied war-
- * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public Licence for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
- *
- * Authors:
- *   Lubos Stanek <lubek at users.sourceforge.net>
- **/
-/**
- * ignorelist handles plugin's list of configured collectable
- * entries with global ignore action
- **/
-
-#ifndef UTILS_IGNORELIST_H
-#define UTILS_IGNORELIST_H 1
-
-#include "collectd.h"
-
-#if HAVE_REGEX_H
-#include <regex.h>
-#endif
-
-/* public prototypes */
-
-struct ignorelist_s;
-typedef struct ignorelist_s ignorelist_t;
-
-/*
- * create the ignorelist_t with known ignore state
- * return pointer to ignorelist_t
- */
-ignorelist_t *ignorelist_create(int invert);
-
-/*
- * free memory used by ignorelist_t
- */
-void ignorelist_free(ignorelist_t *il);
-
-/*
- * set ignore state of the ignorelist_t
- */
-void ignorelist_set_invert(ignorelist_t *il, int invert);
-
-/*
- * append entry to ignorelist_t
- * returns zero on success, non-zero upon failure.
- */
-int ignorelist_add(ignorelist_t *il, const char *entry);
-
-/*
- * check list for entry
- * return 1 for ignored entry
- */
-int ignorelist_match(ignorelist_t *il, const char *entry);
-
-#endif /* UTILS_IGNORELIST_H */
index 2ed56a0..61c6051 100644 (file)
@@ -46,9 +46,9 @@ llist_t *llist_create(void) {
 
   ret = calloc(1, sizeof(*ret));
   if (ret == NULL)
-    return (NULL);
+    return NULL;
 
-  return (ret);
+  return ret;
 }
 
 void llist_destroy(llist_t *l) {
@@ -76,7 +76,7 @@ llentry_t *llentry_create(char *key, void *value) {
     e->next = NULL;
   }
 
-  return (e);
+  return e;
 }
 
 void llentry_destroy(llentry_t *e) { free(e); }
@@ -124,16 +124,16 @@ void llist_remove(llist_t *l, llentry_t *e) {
   --(l->size);
 }
 
-int llist_size(llist_t *l) { return (l ? l->size : 0); }
+int llist_size(llist_t *l) { return l ? l->size : 0; }
 
 static int llist_strcmp(llentry_t *e, void *ud) {
   if ((e == NULL) || (ud == NULL))
-    return (-1);
-  return (strcmp(e->key, (const char *)ud));
+    return -1;
+  return strcmp(e->key, (const char *)ud);
 }
 
 llentry_t *llist_search(llist_t *l, const char *key) {
-  return (llist_search_custom(l, llist_strcmp, (void *)key));
+  return llist_search_custom(l, llist_strcmp, (void *)key);
 }
 
 llentry_t *llist_search_custom(llist_t *l, int (*compare)(llentry_t *, void *),
@@ -141,7 +141,7 @@ llentry_t *llist_search_custom(llist_t *l, int (*compare)(llentry_t *, void *),
   llentry_t *e;
 
   if (l == NULL)
-    return (NULL);
+    return NULL;
 
   e = l->head;
   while (e != NULL) {
@@ -153,17 +153,17 @@ llentry_t *llist_search_custom(llist_t *l, int (*compare)(llentry_t *, void *),
     e = next;
   }
 
-  return (e);
+  return e;
 }
 
 llentry_t *llist_head(llist_t *l) {
   if (l == NULL)
-    return (NULL);
-  return (l->head);
+    return NULL;
+  return l->head;
 }
 
 llentry_t *llist_tail(llist_t *l) {
   if (l == NULL)
-    return (NULL);
-  return (l->tail);
+    return NULL;
+  return l->tail;
 }
index d490986..cf926f9 100644 (file)
@@ -50,7 +50,7 @@ static void cdrand_seed(void) {
   have_seed = 1;
 }
 
-double cdrand_d() {
+double cdrand_d(void) {
   double r;
 
   pthread_mutex_lock(&lock);
@@ -58,10 +58,10 @@ double cdrand_d() {
   r = erand48(seed);
   pthread_mutex_unlock(&lock);
 
-  return (r);
+  return r;
 }
 
-uint32_t cdrand_u() {
+uint32_t cdrand_u(void) {
   long r;
 
   pthread_mutex_lock(&lock);
@@ -81,5 +81,5 @@ long cdrand_range(long min, long max) {
   r = (long)(0.5 + (cdrand_d() * range));
   r += min;
 
-  return (r);
+  return r;
 }
index e25ae9b..75bdc12 100644 (file)
@@ -29,7 +29,7 @@
  *
  * This function is thread- and reentrant-safe.
  */
-double cdrand_d();
+double cdrand_d(void);
 
 /**
  * cdrand_u returns a random uint32_t value uniformly distributed in the range
@@ -37,7 +37,7 @@ double cdrand_d();
  *
  * This function is thread- and reentrant-safe.
  */
-uint32_t cdrand_u();
+uint32_t cdrand_u(void);
 
 /**
  * Returns a random long between min and max, inclusively.
index 7056c5f..a016342 100644 (file)
@@ -119,7 +119,7 @@ char *subst_string(char *buf, size_t buflen, const char *string,
 
   if ((buf == NULL) || (string == NULL) || (needle == NULL) ||
       (replacement == NULL))
-    return (NULL);
+    return NULL;
 
   needle_len = strlen(needle);
   sstrncpy(buf, string, buflen);
@@ -157,7 +157,5 @@ char *subst_string(char *buf, size_t buflen, const char *string,
             i, string, needle, replacement);
   }
 
-  return (buf);
+  return buf;
 } /* char *subst_string */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 025f8d4..a10b258 100644 (file)
@@ -100,5 +100,3 @@ char *subst_string(char *buf, size_t buflen, const char *string,
                    const char *needle, const char *replacement);
 
 #endif /* UTILS_SUBST_H */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index e335b50..00ea0ea 100644 (file)
@@ -132,5 +132,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index ad832f5..8c03341 100644 (file)
@@ -58,9 +58,9 @@ threshold_t *threshold_get(const char *hostname, const char *plugin,
   name[sizeof(name) - 1] = '\0';
 
   if (c_avl_get(threshold_tree, name, (void *)&th) == 0)
-    return (th);
+    return th;
   else
-    return (NULL);
+    return NULL;
 } /* }}} threshold_t *threshold_get */
 
 /*
@@ -76,39 +76,39 @@ threshold_t *threshold_search(const value_list_t *vl) { /* {{{ */
 
   if ((th = threshold_get(vl->host, vl->plugin, vl->plugin_instance, vl->type,
                           vl->type_instance)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get(vl->host, vl->plugin, vl->plugin_instance,
                                vl->type, NULL)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get(vl->host, vl->plugin, NULL, vl->type,
                                vl->type_instance)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get(vl->host, vl->plugin, NULL, vl->type, NULL)) !=
            NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get(vl->host, "", NULL, vl->type,
                                vl->type_instance)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get(vl->host, "", NULL, vl->type, NULL)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", vl->plugin, vl->plugin_instance, vl->type,
                                vl->type_instance)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", vl->plugin, vl->plugin_instance, vl->type,
                                NULL)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", vl->plugin, NULL, vl->type,
                                vl->type_instance)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", vl->plugin, NULL, vl->type, NULL)) != NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", "", NULL, vl->type, vl->type_instance)) !=
            NULL)
-    return (th);
+    return th;
   else if ((th = threshold_get("", "", NULL, vl->type, NULL)) != NULL)
-    return (th);
+    return th;
 
-  return (NULL);
+  return NULL;
 } /* }}} threshold_t *threshold_search */
 
 int ut_search_threshold(const value_list_t *vl, /* {{{ */
@@ -116,14 +116,14 @@ int ut_search_threshold(const value_list_t *vl, /* {{{ */
   threshold_t *t;
 
   if (vl == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* Is this lock really necessary? */
   pthread_mutex_lock(&threshold_lock);
   t = threshold_search(vl);
   if (t == NULL) {
     pthread_mutex_unlock(&threshold_lock);
-    return (ENOENT);
+    return ENOENT;
   }
 
   memcpy(ret_threshold, t, sizeof(*ret_threshold));
@@ -131,5 +131,5 @@ int ut_search_threshold(const value_list_t *vl, /* {{{ */
 
   ret_threshold->next = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int ut_search_threshold */
index 585ad12..cefc6e2 100644 (file)
@@ -61,5 +61,3 @@ threshold_t *threshold_search(const value_list_t *vl);
 int ut_search_threshold(const value_list_t *vl, threshold_t *ret_threshold);
 
 #endif /* UTILS_THRESHOLD_H */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 9ba2b5a..815d969 100644 (file)
@@ -240,5 +240,3 @@ int rfc3339nano_local(char *buffer, size_t buffer_size, cdtime_t t) /* {{{ */
 
   return format_rfc3339_local(buffer, buffer_size, t, 1);
 } /* }}} int rfc3339nano */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index db510af..60a6ea9 100644 (file)
@@ -130,4 +130,3 @@ int rfc3339_local(char *buffer, size_t buffer_size, cdtime_t t);
 int rfc3339nano_local(char *buffer, size_t buffer_size, cdtime_t t);
 
 #endif /* UTILS_TIME_H */
-/* vim: set sw=2 sts=2 et : */
index c1c60a2..c0179cc 100644 (file)
@@ -167,5 +167,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index 7cab1d5..ac307ff 100644 (file)
--- a/src/dbi.c
+++ b/src/dbi.c
@@ -101,7 +101,7 @@ static const char *cdbi_strerror(dbi_conn conn, /* {{{ */
 
   if (conn == NULL) {
     sstrncpy(buffer, "connection is NULL", buffer_size);
-    return (buffer);
+    return buffer;
   }
 
   msg = NULL;
@@ -112,7 +112,7 @@ static const char *cdbi_strerror(dbi_conn conn, /* {{{ */
     ssnprintf(buffer, buffer_size, "dbi_conn_error failed with status %i",
               status);
 
-  return (buffer);
+  return buffer;
 } /* }}} const char *cdbi_conn_error */
 
 static int cdbi_result_get_field(dbi_result res, /* {{{ */
@@ -124,7 +124,7 @@ static int cdbi_result_get_field(dbi_result res, /* {{{ */
   if (src_type == DBI_TYPE_ERROR) {
     ERROR("dbi plugin: cdbi_result_get: "
           "dbi_result_get_field_type_idx failed.");
-    return (-1);
+    return -1;
   }
 
   if (src_type == DBI_TYPE_INTEGER) {
@@ -144,7 +144,7 @@ static int cdbi_result_get_field(dbi_result res, /* {{{ */
     if (value == NULL)
       sstrncpy(buffer, "", buffer_size);
     else if (strcmp("ERROR", value) == 0)
-      return (-1);
+      return -1;
     else
       sstrncpy(buffer, value, buffer_size);
   }
@@ -160,10 +160,10 @@ static int cdbi_result_get_field(dbi_result res, /* {{{ */
     ERROR("dbi plugin: Column `%s': Don't know how to handle "
           "source type %hu.",
           field_name, src_type);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_result_get_field */
 
 static void cdbi_database_free(cdbi_database_t *db) /* {{{ */
@@ -221,14 +221,14 @@ static int cdbi_config_add_database_driver_option(cdbi_database_t *db, /* {{{ */
        (ci->values[1].type != OCONFIG_TYPE_NUMBER))) {
     WARNING("dbi plugin: The `DriverOption' config option "
             "needs exactly two arguments.");
-    return (-1);
+    return -1;
   }
 
   option = realloc(db->driver_options,
                    sizeof(*option) * (db->driver_options_num + 1));
   if (option == NULL) {
     ERROR("dbi plugin: realloc failed");
-    return (-1);
+    return -1;
   }
 
   db->driver_options = option;
@@ -238,7 +238,7 @@ static int cdbi_config_add_database_driver_option(cdbi_database_t *db, /* {{{ */
   option->key = strdup(ci->values[0].value.string);
   if (option->key == NULL) {
     ERROR("dbi plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   if (ci->values[1].type == OCONFIG_TYPE_STRING) {
@@ -246,7 +246,7 @@ static int cdbi_config_add_database_driver_option(cdbi_database_t *db, /* {{{ */
     if (option->value.string == NULL) {
       ERROR("dbi plugin: strdup failed.");
       sfree(option->key);
-      return (-1);
+      return -1;
     }
   } else {
     assert(ci->values[1].type == OCONFIG_TYPE_NUMBER);
@@ -255,7 +255,7 @@ static int cdbi_config_add_database_driver_option(cdbi_database_t *db, /* {{{ */
   }
 
   db->driver_options_num++;
-  return (0);
+  return 0;
 } /* }}} int cdbi_config_add_database_driver_option */
 
 static int cdbi_config_add_database(oconfig_item_t *ci) /* {{{ */
@@ -266,19 +266,19 @@ static int cdbi_config_add_database(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("dbi plugin: The `Database' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   db = calloc(1, sizeof(*db));
   if (db == NULL) {
     ERROR("dbi plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = cf_util_get_string(ci, &db->name);
   if (status != 0) {
     sfree(db);
-    return (status);
+    return status;
   }
 
   /* Fill the `cdbi_database_t' structure.. */
@@ -371,10 +371,10 @@ static int cdbi_config_add_database(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     cdbi_database_free(db);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_config_add_database */
 
 static int cdbi_config(oconfig_item_t *ci) /* {{{ */
@@ -391,7 +391,7 @@ static int cdbi_config(oconfig_item_t *ci) /* {{{ */
     }
   } /* for (ci->children) */
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_config */
 
 /* }}} End of configuration handling functions */
@@ -402,34 +402,34 @@ static int cdbi_init(void) /* {{{ */
   int status;
 
   if (did_init != 0)
-    return (0);
+    return 0;
 
   if (queries_num == 0) {
     ERROR("dbi plugin: No <Query> blocks have been found. Without them, "
           "this plugin can't do anything useful, so we will return an error.");
-    return (-1);
+    return -1;
   }
 
   if (databases_num == 0) {
     ERROR("dbi plugin: No <Database> blocks have been found. Without them, "
           "this plugin can't do anything useful, so we will return an error.");
-    return (-1);
+    return -1;
   }
 
   status = dbi_initialize_r(/* driverdir = */ NULL, &dbi_instance);
   if (status < 0) {
     ERROR("dbi plugin: cdbi_init: dbi_initialize_r failed with status %i.",
           status);
-    return (-1);
+    return -1;
   } else if (status == 0) {
     ERROR("dbi plugin: `dbi_initialize_r' could not load any drivers. Please "
           "install at least one `DBD' or check your installation.");
-    return (-1);
+    return -1;
   }
   DEBUG("dbi plugin: cdbi_init: dbi_initialize_r reports %i driver%s.", status,
         (status == 1) ? "" : "s");
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_init */
 
 static int cdbi_read_database_query(cdbi_database_t *db, /* {{{ */
@@ -619,7 +619,7 @@ static int cdbi_connect_database(cdbi_database_t *db) /* {{{ */
   if (db->connection != NULL) {
     status = dbi_conn_ping(db->connection);
     if (status != 0) /* connection is alive */
-      return (0);
+      return 0;
 
     dbi_conn_close(db->connection);
     db->connection = NULL;
@@ -635,14 +635,14 @@ static int cdbi_connect_database(cdbi_database_t *db) /* {{{ */
          driver = dbi_driver_list_r(driver, dbi_instance)) {
       INFO("dbi plugin: * %s", dbi_driver_get_name(driver));
     }
-    return (-1);
+    return -1;
   }
 
   connection = dbi_conn_open(driver);
   if (connection == NULL) {
     ERROR("dbi plugin: cdbi_connect_database: dbi_conn_open (%s) failed.",
           db->driver);
-    return (-1);
+    return -1;
   }
 
   /* Set all the driver options. Because this is a very very very generic
@@ -686,7 +686,7 @@ static int cdbi_connect_database(cdbi_database_t *db) /* {{{ */
       }
 
       dbi_conn_close(connection);
-      return (-1);
+      return -1;
     }
   } /* for (i = 0; i < db->driver_options_num; i++) */
 
@@ -697,7 +697,7 @@ static int cdbi_connect_database(cdbi_database_t *db) /* {{{ */
           "dbi_conn_connect failed: %s",
           db->name, cdbi_strerror(connection, errbuf, sizeof(errbuf)));
     dbi_conn_close(connection);
-    return (-1);
+    return -1;
   }
 
   if (db->select_db != NULL) {
@@ -710,12 +710,12 @@ static int cdbi_connect_database(cdbi_database_t *db) /* {{{ */
           db->name, db->select_db,
           cdbi_strerror(connection, errbuf, sizeof(errbuf)));
       dbi_conn_close(connection);
-      return (-1);
+      return -1;
     }
   }
 
   db->connection = connection;
-  return (0);
+  return 0;
 } /* }}} int cdbi_connect_database */
 
 static int cdbi_read_database(user_data_t *ud) /* {{{ */
@@ -728,7 +728,7 @@ static int cdbi_read_database(user_data_t *ud) /* {{{ */
 
   status = cdbi_connect_database(db);
   if (status != 0)
-    return (status);
+    return status;
   assert(db->connection != NULL);
 
   db_version = dbi_conn_get_engine_version(db->connection);
@@ -749,10 +749,10 @@ static int cdbi_read_database(user_data_t *ud) /* {{{ */
 
   if (success == 0) {
     ERROR("dbi plugin: All queries failed for database `%s'.", db->name);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_read_database */
 
 static int cdbi_shutdown(void) /* {{{ */
@@ -771,7 +771,7 @@ static int cdbi_shutdown(void) /* {{{ */
   queries = NULL;
   queries_num = 0;
 
-  return (0);
+  return 0;
 } /* }}} int cdbi_shutdown */
 
 void module_register(void) /* {{{ */
@@ -780,7 +780,3 @@ void module_register(void) /* {{{ */
   plugin_register_init("dbi", cdbi_init);
   plugin_register_shutdown("dbi", cdbi_shutdown);
 } /* }}} void module_register */
-
-/*
- * vim: shiftwidth=2 softtabstop=2 et fdm=marker
- */
index 5416605..dd90f24 100644 (file)
--- a/src/df.c
+++ b/src/df.c
@@ -68,7 +68,7 @@ static int df_init(void) {
   if (il_fstype == NULL)
     il_fstype = ignorelist_create(1);
 
-  return (0);
+  return 0;
 }
 
 static int df_config(const char *key, const char *value) {
@@ -76,16 +76,16 @@ static int df_config(const char *key, const char *value) {
 
   if (strcasecmp(key, "Device") == 0) {
     if (ignorelist_add(il_device, value))
-      return (1);
-    return (0);
+      return 1;
+    return 0;
   } else if (strcasecmp(key, "MountPoint") == 0) {
     if (ignorelist_add(il_mountpoint, value))
-      return (1);
-    return (0);
+      return 1;
+    return 0;
   } else if (strcasecmp(key, "FSType") == 0) {
     if (ignorelist_add(il_fstype, value))
-      return (1);
-    return (0);
+      return 1;
+    return 0;
   } else if (strcasecmp(key, "IgnoreSelected") == 0) {
     if (IS_TRUE(value)) {
       ignorelist_set_invert(il_device, 0);
@@ -96,36 +96,36 @@ static int df_config(const char *key, const char *value) {
       ignorelist_set_invert(il_mountpoint, 1);
       ignorelist_set_invert(il_fstype, 1);
     }
-    return (0);
+    return 0;
   } else if (strcasecmp(key, "ReportByDevice") == 0) {
     if (IS_TRUE(value))
       by_device = 1;
 
-    return (0);
+    return 0;
   } else if (strcasecmp(key, "ReportInodes") == 0) {
     if (IS_TRUE(value))
       report_inodes = 1;
     else
       report_inodes = 0;
 
-    return (0);
+    return 0;
   } else if (strcasecmp(key, "ValuesAbsolute") == 0) {
     if (IS_TRUE(value))
       values_absolute = 1;
     else
       values_absolute = 0;
 
-    return (0);
+    return 0;
   } else if (strcasecmp(key, "ValuesPercentage") == 0) {
     if (IS_TRUE(value))
       values_percentage = 1;
     else
       values_percentage = 0;
 
-    return (0);
+    return 0;
   }
 
-  return (-1);
+  return -1;
 }
 
 __attribute__((nonnull(2))) static void df_submit_one(char *plugin_instance,
@@ -158,7 +158,7 @@ static int df_read(void) {
   mnt_list = NULL;
   if (cu_mount_getlist(&mnt_list) == NULL) {
     ERROR("df plugin: cu_mount_getlist failed.");
-    return (-1);
+    return -1;
   }
 
   for (cu_mount_t *mnt_ptr = mnt_list; mnt_ptr != NULL;
@@ -285,7 +285,7 @@ static int df_read(void) {
         df_submit_one(disk_name, "percent_bytes", "used",
                       (gauge_t)((float_t)(blk_used) / statbuf.f_blocks * 100));
       } else
-        return (-1);
+        return -1;
     }
 
     /* inode handling */
@@ -316,7 +316,7 @@ static int df_read(void) {
               disk_name, "percent_inodes", "used",
               (gauge_t)((float_t)(inode_used) / statbuf.f_files * 100));
         } else
-          return (-1);
+          return -1;
       }
       if (values_absolute) {
         df_submit_one(disk_name, "df_inodes", "free", (gauge_t)inode_free);
@@ -329,7 +329,7 @@ static int df_read(void) {
 
   cu_mount_freelist(mnt_list);
 
-  return (0);
+  return 0;
 } /* int df_read */
 
 void module_register(void) {
index e01e150..4a217c3 100644 (file)
@@ -139,7 +139,7 @@ static int pnumdisk;
 #error "No applicable input method."
 #endif
 
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
 #include <libudev.h>
 
 static char *conf_udev_name_attr = NULL;
@@ -156,7 +156,7 @@ static int disk_config(const char *key, const char *value) {
   if (ignorelist == NULL)
     ignorelist = ignorelist_create(/* invert = */ 1);
   if (ignorelist == NULL)
-    return (1);
+    return 1;
 
   if (strcasecmp("Disk", key) == 0) {
     ignorelist_add(ignorelist, value);
@@ -173,22 +173,22 @@ static int disk_config(const char *key, const char *value) {
             "on Mach / Mac OS X and will be ignored.");
 #endif
   } else if (strcasecmp("UdevNameAttr", key) == 0) {
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
     if (conf_udev_name_attr != NULL) {
       free(conf_udev_name_attr);
       conf_udev_name_attr = NULL;
     }
     if ((conf_udev_name_attr = strdup(value)) == NULL)
-      return (1);
+      return 1;
 #else
     WARNING("disk plugin: The \"UdevNameAttr\" option is only supported "
             "if collectd is built with libudev support");
 #endif
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int disk_config */
 
 static int disk_init(void) {
@@ -204,20 +204,20 @@ static int disk_init(void) {
   if (status != kIOReturnSuccess) {
     ERROR("IOMasterPort failed: %s", mach_error_string(status));
     io_master_port = MACH_PORT_NULL;
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_IOKIT_IOKITLIB_H */
 
 #elif KERNEL_LINUX
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
   if (conf_udev_name_attr != NULL) {
     handle_udev = udev_new();
     if (handle_udev == NULL) {
       ERROR("disk plugin: udev_new() failed!");
-      return (-1);
+      return -1;
     }
   }
-#endif /* HAVE_LIBUDEV */
+#endif /* HAVE_UDEV_H */
 /* #endif KERNEL_LINUX */
 
 #elif KERNEL_FREEBSD
@@ -226,12 +226,12 @@ static int disk_init(void) {
   rv = geom_gettree(&geom_tree);
   if (rv != 0) {
     ERROR("geom_gettree() failed, returned %d", rv);
-    return (-1);
+    return -1;
   }
   rv = geom_stats_open();
   if (rv != 0) {
     ERROR("geom_stats_open() failed, returned %d", rv);
-    return (-1);
+    return -1;
   }
 /* #endif KERNEL_FREEBSD */
 
@@ -241,7 +241,7 @@ static int disk_init(void) {
   numdisk = 0;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (numdisk = 0, ksp_chain = kc->kc_chain;
        (numdisk < MAX_NUMDISK) && (ksp_chain != NULL);
@@ -255,17 +255,17 @@ static int disk_init(void) {
   }
 #endif /* HAVE_LIBKSTAT */
 
-  return (0);
+  return 0;
 } /* int disk_init */
 
 static int disk_shutdown(void) {
 #if KERNEL_LINUX
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
   if (handle_udev != NULL)
     udev_unref(handle_udev);
-#endif /* HAVE_LIBUDEV */
+#endif /* HAVE_UDEV_H */
 #endif /* KERNEL_LINUX */
-  return (0);
+  return 0;
 } /* int disk_shutdown */
 
 static void disk_submit(const char *plugin_instance, const char *type,
@@ -321,11 +321,11 @@ static counter_t disk_calc_time_incr(counter_t delta_time,
   double avg_time = ((double)delta_time) / ((double)delta_ops);
   double avg_time_incr = interval * avg_time;
 
-  return ((counter_t)(avg_time_incr + .5));
+  return (counter_t)(avg_time_incr + .5);
 }
 #endif
 
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
 /**
  * Attempt to provide an rename disk instance from an assigned udev attribute.
  *
@@ -363,7 +363,7 @@ static signed long long dict_get_value(CFDictionaryRef dict, const char *key) {
                                       kCFStringEncodingASCII);
   if (key_obj == NULL) {
     DEBUG("CFStringCreateWithCString (%s) failed.", key);
-    return (-1LL);
+    return -1LL;
   }
 
   /* get => we don't need to release (== free) the object */
@@ -373,15 +373,15 @@ static signed long long dict_get_value(CFDictionaryRef dict, const char *key) {
 
   if (val_obj == NULL) {
     DEBUG("CFDictionaryGetValue (%s) failed.", key);
-    return (-1LL);
+    return -1LL;
   }
 
   if (!CFNumberGetValue(val_obj, kCFNumberSInt64Type, &val_int)) {
     DEBUG("CFNumberGetValue (%s) failed.", key);
-    return (-1LL);
+    return -1LL;
   }
 
-  return (val_int);
+  return val_int;
 }
 #endif /* HAVE_IOKIT_IOKITLIB_H */
 
@@ -405,10 +405,10 @@ static int disk_read(void) {
 
   /* Get the list of all disk objects. */
   if (IOServiceGetMatchingServices(
-          io_master_port, IOServiceMatching(kIOBlockStorageDriverClass),
-          &disk_list) != kIOReturnSuccess) {
+                                   io_master_port, IOServiceMatching(kIOBlockStorageDriverClass),
+                                   &disk_list) != kIOReturnSuccess) {
     ERROR("disk plugin: IOServiceGetMatchingServices failed.");
-    return (-1);
+    return -1;
   }
 
   while ((disk = IOIteratorNext(disk_list)) != 0) {
@@ -551,7 +551,7 @@ static int disk_read(void) {
     snap = geom_stats_snapshot_get();
     if (snap == NULL) {
       ERROR("disk plugin: geom_stats_snapshot_get() failed.");
-      return (-1);
+      return -1;
     }
 
     /* Check if we have dirty read from this snapshot */
@@ -568,7 +568,7 @@ static int disk_read(void) {
         if (geom_gettree(&geom_tree) != 0) {
           ERROR("disk plugin: geom_gettree() failed");
           geom_stats_snapshot_free(snap);
-          return (-1);
+          return -1;
         }
         geom_id = geom_lookupid(&geom_tree, snap_iter->id);
       }
@@ -682,7 +682,7 @@ static int disk_read(void) {
     fh = fopen("/proc/partitions", "r");
     if (fh == NULL) {
       ERROR("disk plugin: fopen (/proc/{diskstats,partitions}) failed.");
-      return (-1);
+      return -1;
     }
 
     /* Kernel is 2.4.* */
@@ -842,7 +842,7 @@ static int disk_read(void) {
 
     output_name = disk_name;
 
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
     char *alt_name = NULL;
     if (conf_udev_name_attr != NULL) {
       alt_name =
@@ -853,7 +853,7 @@ static int disk_read(void) {
 #endif
 
     if (ignorelist_match(ignorelist, output_name) != 0) {
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
       /* release udev-based alternate name, if allocated */
       sfree(alt_name);
 #endif
@@ -879,7 +879,7 @@ static int disk_read(void) {
         submit_io_time(output_name, io_time, weighted_time);
     } /* if (is_disk) */
 
-#if HAVE_LIBUDEV
+#if HAVE_UDEV_H
     /* release udev-based alternate name, if allocated */
     sfree(alt_name);
 #endif
@@ -910,7 +910,7 @@ static int disk_read(void) {
   static kstat_io_t kio;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (int i = 0; i < numdisk; i++) {
     if (kstat_read(kc, ksp[i], &kio) == -1)
@@ -946,7 +946,7 @@ static int disk_read(void) {
   char name[DATA_MAX_NAME_LEN];
 
   if ((ds = sg_get_disk_io_stats(&disks)) == NULL)
-    return (0);
+    return 0;
 
   for (int counter = 0; counter < disks; counter++) {
     strncpy(name, ds->disk_name, sizeof(name));
@@ -977,7 +977,7 @@ static int disk_read(void) {
     char errbuf[1024];
     WARNING("disk plugin: perfstat_disk: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (numdisk != pnumdisk || stat_disk == NULL) {
@@ -993,7 +993,7 @@ static int disk_read(void) {
     char errbuf[1024];
     WARNING("disk plugin: perfstat_disk : %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < rnumdisk; i++) {
@@ -1020,7 +1020,7 @@ static int disk_read(void) {
   }
 #endif /* defined(HAVE_PERFSTAT) */
 
-  return (0);
+  return 0;
 } /* int disk_read */
 
 void module_register(void) {
index e3208a6..e64af0d 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -84,7 +84,7 @@ static counter_list_t *counter_list_search(counter_list_t **list,
     if (entry->key == key)
       break;
 
-  return (entry);
+  return entry;
 }
 
 static counter_list_t *counter_list_create(counter_list_t **list,
@@ -94,7 +94,7 @@ static counter_list_t *counter_list_create(counter_list_t **list,
 
   entry = calloc(1, sizeof(*entry));
   if (entry == NULL)
-    return (NULL);
+    return NULL;
 
   entry->key = key;
   entry->value = value;
@@ -111,7 +111,7 @@ static counter_list_t *counter_list_create(counter_list_t **list,
     last->next = entry;
   }
 
-  return (entry);
+  return entry;
 }
 
 static void counter_list_add(counter_list_t **list, unsigned int key,
@@ -132,7 +132,7 @@ static int dns_config(const char *key, const char *value) {
     if (pcap_device != NULL)
       free(pcap_device);
     if ((pcap_device = strdup(value)) == NULL)
-      return (1);
+      return 1;
   } else if (strcasecmp(key, "IgnoreSource") == 0) {
     if (value != NULL)
       ignore_list_add_name(value);
@@ -142,10 +142,10 @@ static int dns_config(const char *key, const char *value) {
     else
       select_numeric_qtype = 1;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void dns_child_callback(const rfc1035_header_t *dns) {
@@ -208,19 +208,19 @@ static int dns_run_pcap_loop(void) {
     ERROR("dns plugin: Opening interface `%s' "
           "failed: %s",
           (pcap_device != NULL) ? pcap_device : "any", pcap_error);
-    return (PCAP_ERROR);
+    return PCAP_ERROR;
   }
 
   status = pcap_compile(pcap_obj, &fp, "udp port 53", 1, 0);
   if (status < 0) {
     ERROR("dns plugin: pcap_compile failed: %s", pcap_statustostr(status));
-    return (status);
+    return status;
   }
 
   status = pcap_setfilter(pcap_obj, &fp);
   if (status < 0) {
     ERROR("dns plugin: pcap_setfilter failed: %s", pcap_statustostr(status));
-    return (status);
+    return status;
   }
 
   DEBUG("dns plugin: PCAP object created.");
@@ -237,7 +237,7 @@ static int dns_run_pcap_loop(void) {
     status = PCAP_ERROR_IFACE_NOT_UP;
 
   pcap_close(pcap_obj);
-  return (status);
+  return status;
 } /* int dns_run_pcap_loop */
 
 static int dns_sleep_one_interval(void) /* {{{ */
@@ -247,10 +247,10 @@ static int dns_sleep_one_interval(void) /* {{{ */
     if ((errno == EINTR) || (errno == EAGAIN))
       continue;
 
-    return (errno);
+    return errno;
   }
 
-  return (0);
+  return 0;
 } /* }}} int dns_sleep_one_interval */
 
 static void *dns_child_loop(__attribute__((unused)) void *dummy) /* {{{ */
@@ -269,7 +269,7 @@ static void *dns_child_loop(__attribute__((unused)) void *dummy) /* {{{ */
     ERROR("dns plugin: PCAP returned error %s.", pcap_statustostr(status));
 
   listen_thread_init = 0;
-  return (NULL);
+  return NULL;
 } /* }}} void *dns_child_loop */
 
 static int dns_init(void) {
@@ -282,7 +282,7 @@ static int dns_init(void) {
   pthread_mutex_unlock(&traffic_mutex);
 
   if (listen_thread_init != 0)
-    return (-1);
+    return -1;
 
   status = plugin_thread_create(&listen_thread, NULL, dns_child_loop, (void *)0,
                                 "dns listen");
@@ -290,7 +290,7 @@ static int dns_init(void) {
     char errbuf[1024];
     ERROR("dns plugin: pthread_create failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   listen_thread_init = 1;
@@ -308,7 +308,7 @@ static int dns_init(void) {
   }
 #endif
 
-  return (0);
+  return 0;
 } /* int dns_init */
 
 static void submit_derive(const char *type, const char *type_instance,
@@ -392,7 +392,7 @@ static int dns_read(void) {
     submit_derive("dns_rcode", rcode_str(keys[i]), values[i]);
   }
 
-  return (0);
+  return 0;
 } /* int dns_read */
 
 void module_register(void) {
diff --git a/src/dpdkevents.c b/src/dpdkevents.c
new file mode 100644 (file)
index 0000000..6be6bc0
--- /dev/null
@@ -0,0 +1,584 @@
+/*
+ * collectd - src/dpdkevents.c
+ * MIT License
+ *
+ * Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Maryam Tahhan <maryam.tahhan@intel.com>
+ *   Harry van Haaren <harry.van.haaren@intel.com>
+ *   Serhiy Pshyk <serhiyx.pshyk@intel.com>
+ *   Kim-Marie Jones <kim-marie.jones@intel.com>
+ *   Krzysztof Matczak <krzysztofx@intel.com>
+ */
+
+#include "collectd.h"
+
+#include "common.h"
+#include "plugin.h"
+
+#include "semaphore.h"
+#include "sys/mman.h"
+#include "utils_dpdk.h"
+#include "utils_time.h"
+
+#include <rte_config.h>
+#include <rte_eal.h>
+#include <rte_ethdev.h>
+#include <rte_keepalive.h>
+
+#define DPDK_EVENTS_PLUGIN "dpdkevents"
+#define DPDK_EVENTS_NAME "dpdk_collectd_events"
+#define ETH_LINK_NA 0xFF
+
+#define INT64_BIT_SIZE 64
+#define KEEPALIVE_PLUGIN_INSTANCE "keepalive"
+#define RTE_KEEPALIVE_SHM_NAME "/dpdk_keepalive_shm_name"
+
+typedef struct dpdk_keepalive_shm_s {
+  sem_t core_died;
+  enum rte_keepalive_state core_state[RTE_KEEPALIVE_MAXCORES];
+  uint64_t core_last_seen_times[RTE_KEEPALIVE_MAXCORES];
+} dpdk_keepalive_shm_t;
+
+typedef struct dpdk_ka_monitor_s {
+  cdtime_t read_time;
+  int lcore_state;
+} dpdk_ka_monitor_t;
+
+typedef struct dpdk_link_status_config_s {
+  int enabled;
+  int send_updated;
+  uint32_t enabled_port_mask;
+  char port_name[RTE_MAX_ETHPORTS][DATA_MAX_NAME_LEN];
+  int notify;
+} dpdk_link_status_config_t;
+
+typedef struct dpdk_keep_alive_config_s {
+  int enabled;
+  int send_updated;
+  uint128_t lcore_mask;
+  dpdk_keepalive_shm_t *shm;
+  char shm_name[DATA_MAX_NAME_LEN];
+  int notify;
+} dpdk_keep_alive_config_t;
+
+typedef struct dpdk_events_config_s {
+  cdtime_t interval;
+  dpdk_link_status_config_t link_status;
+  dpdk_keep_alive_config_t keep_alive;
+} dpdk_events_config_t;
+
+typedef struct dpdk_link_info_s {
+  cdtime_t read_time;
+  int status_updated;
+  int link_status;
+} dpdk_link_info_t;
+
+typedef struct dpdk_events_ctx_s {
+  dpdk_events_config_t config;
+  uint32_t nb_ports;
+  dpdk_link_info_t link_info[RTE_MAX_ETHPORTS];
+  dpdk_ka_monitor_t core_info[RTE_KEEPALIVE_MAXCORES];
+} dpdk_events_ctx_t;
+
+#define DPDK_EVENTS_CTX_GET(a) ((dpdk_events_ctx_t *)dpdk_helper_priv_get(a))
+
+#define DPDK_EVENTS_TRACE()                                                    \
+  DEBUG("%s:%s:%d pid=%u", DPDK_EVENTS_PLUGIN, __FUNCTION__, __LINE__, getpid())
+
+static dpdk_helper_ctx_t *g_hc;
+
+static int dpdk_event_keep_alive_shm_create(void) {
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+  char *shm_name;
+
+  if (strlen(ec->config.keep_alive.shm_name)) {
+    shm_name = ec->config.keep_alive.shm_name;
+  } else {
+    shm_name = RTE_KEEPALIVE_SHM_NAME;
+    WARNING(DPDK_EVENTS_PLUGIN ": Keep alive shared memory identifier is not "
+                               "specified, using default one: %s",
+            shm_name);
+  }
+
+  char errbuf[ERR_BUF_SIZE];
+  int fd = shm_open(shm_name, O_RDWR, 0);
+  if (fd < 0) {
+    ERROR(DPDK_EVENTS_PLUGIN ": Failed to open %s as SHM:%s. Is DPDK KA "
+                             "primary application running?",
+          shm_name, sstrerror(errno, errbuf, sizeof(errbuf)));
+    return errno;
+  } else {
+    ec->config.keep_alive.shm =
+        (dpdk_keepalive_shm_t *)mmap(0, sizeof(*(ec->config.keep_alive.shm)),
+                                     PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+    close(fd);
+    if (ec->config.keep_alive.shm == MAP_FAILED) {
+      ERROR(DPDK_EVENTS_PLUGIN ": Failed to mmap KA SHM:%s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+      return errno;
+    }
+  }
+
+  return 0;
+}
+
+static void dpdk_events_default_config(void) {
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+
+  ec->config.interval = plugin_get_interval();
+
+  /* Link Status */
+  ec->config.link_status.enabled = 0;
+  ec->config.link_status.enabled_port_mask = ~0;
+  ec->config.link_status.send_updated = 1;
+  ec->config.link_status.notify = 0;
+
+  for (int i = 0; i < RTE_MAX_ETHPORTS; i++) {
+    ec->config.link_status.port_name[i][0] = 0;
+  }
+
+  /* Keep Alive */
+  ec->config.keep_alive.enabled = 0;
+  ec->config.keep_alive.send_updated = 1;
+  ec->config.keep_alive.notify = 0;
+  memset(&ec->config.keep_alive.lcore_mask, 0,
+         sizeof(ec->config.keep_alive.lcore_mask));
+  memset(&ec->config.keep_alive.shm_name, 0,
+         sizeof(ec->config.keep_alive.shm_name));
+}
+
+static int dpdk_events_preinit(void) {
+  DPDK_EVENTS_TRACE();
+
+  if (g_hc != NULL) {
+    /* already initialized if config callback was called before init callback */
+    DEBUG("dpdk_events_preinit: helper already initialized.");
+    return 0;
+  }
+
+  int ret =
+      dpdk_helper_init(DPDK_EVENTS_NAME, sizeof(dpdk_events_ctx_t), &g_hc);
+  if (ret != 0) {
+    ERROR(DPDK_EVENTS_PLUGIN ": failed to initialize %s helper(error: %s)",
+          DPDK_EVENTS_NAME, strerror(ret));
+    return ret;
+  }
+
+  dpdk_events_default_config();
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+  for (int i = 0; i < RTE_MAX_ETHPORTS; i++) {
+    ec->link_info[i].link_status = ETH_LINK_NA;
+  }
+
+  for (int i = 0; i < RTE_KEEPALIVE_MAXCORES; i++) {
+    ec->core_info[i].lcore_state = ETH_LINK_NA;
+  }
+
+  return ret;
+}
+
+static int dpdk_events_link_status_config(dpdk_events_ctx_t *ec,
+                                          oconfig_item_t *ci) {
+  ec->config.link_status.enabled = 1;
+
+  DEBUG(DPDK_EVENTS_PLUGIN ": Subscribed for Link Status Events.");
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+
+    if (strcasecmp("EnabledPortMask", child->key) == 0) {
+      ec->config.link_status.enabled_port_mask =
+          (uint32_t)child->values[0].value.number;
+      DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Enabled Port Mask 0x%X",
+            ec->config.link_status.enabled_port_mask);
+    } else if (strcasecmp("SendEventsOnUpdate", child->key) == 0) {
+      ec->config.link_status.send_updated = child->values[0].value.boolean;
+      DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendEventsOnUpdate %d",
+            (int)child->values[0].value.boolean);
+    } else if (strcasecmp("SendNotification", child->key) == 0) {
+      ec->config.link_status.notify = child->values[0].value.boolean;
+      DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendNotification %d",
+            (int)child->values[0].value.boolean);
+    }
+  }
+
+  int port_num = 0;
+
+  /* parse port names after EnabledPortMask was parsed */
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("PortName", child->key) == 0) {
+      while (!(ec->config.link_status.enabled_port_mask & (1 << port_num)))
+        port_num++;
+      ssnprintf(ec->config.link_status.port_name[port_num], DATA_MAX_NAME_LEN,
+                "%s", child->values[0].value.string);
+      DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Port %d Name: %s", port_num,
+            ec->config.link_status.port_name[port_num]);
+      port_num++;
+    }
+  }
+
+  return 0;
+}
+
+static int dpdk_events_keep_alive_config(dpdk_events_ctx_t *ec,
+                                         oconfig_item_t *ci) {
+  ec->config.keep_alive.enabled = 1;
+  DEBUG(DPDK_EVENTS_PLUGIN ": Subscribed for Keep Alive Events.");
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+
+    if (strcasecmp("SendEventsOnUpdate", child->key) == 0) {
+      ec->config.keep_alive.send_updated = child->values[0].value.boolean;
+      DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendEventsOnUpdate %d",
+            (int)child->values[0].value.boolean);
+    } else if (strcasecmp("LCoreMask", child->key) == 0) {
+      char lcore_mask[DATA_MAX_NAME_LEN];
+      ssnprintf(lcore_mask, sizeof(lcore_mask), "%s",
+                child->values[0].value.string);
+      ec->config.keep_alive.lcore_mask =
+          str_to_uint128(lcore_mask, strlen(lcore_mask));
+      DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:LCoreMask 0x%" PRIX64 "%" PRIX64 "",
+            ec->config.keep_alive.lcore_mask.high,
+            ec->config.keep_alive.lcore_mask.low);
+    } else if (strcasecmp("KeepAliveShmName", child->key) == 0) {
+      ssnprintf(ec->config.keep_alive.shm_name,
+                sizeof(ec->config.keep_alive.shm_name), "%s",
+                child->values[0].value.string);
+      DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:KeepAliveShmName %s",
+            ec->config.keep_alive.shm_name);
+    } else if (strcasecmp("SendNotification", child->key) == 0) {
+      ec->config.keep_alive.notify = child->values[0].value.boolean;
+      DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendNotification %d",
+            (int)child->values[0].value.boolean);
+    }
+  }
+
+  return 0;
+}
+
+static int dpdk_events_config(oconfig_item_t *ci) {
+  DPDK_EVENTS_TRACE();
+
+  int ret = dpdk_events_preinit();
+  if (ret)
+    return ret;
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("EAL", child->key) == 0) {
+      dpdk_helper_eal_config_parse(g_hc, child);
+    } else if (strcasecmp("Event", child->key) == 0) {
+      if (strcasecmp(child->values[0].value.string, "link_status") == 0) {
+        dpdk_events_link_status_config(ec, child);
+      } else if (strcasecmp(child->values[0].value.string, "keep_alive") == 0) {
+        dpdk_events_keep_alive_config(ec, child);
+      } else {
+        ERROR(DPDK_EVENTS_PLUGIN ": The selected event \"%s\" is unknown.",
+              child->values[0].value.string);
+      }
+    }
+  }
+
+  if (!ec->config.keep_alive.enabled && !ec->config.link_status.enabled) {
+    ERROR(DPDK_EVENTS_PLUGIN ": At least one type of events should be "
+                             "configured for collecting. Plugin misconfigured");
+    return -1;
+  }
+
+  return ret;
+}
+
+static int dpdk_helper_link_status_get(dpdk_helper_ctx_t *phc) {
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(phc);
+
+  /* get Link Status values from DPDK */
+  uint8_t nb_ports = rte_eth_dev_count();
+  if (nb_ports == 0) {
+    DPDK_CHILD_LOG("dpdkevent-helper: No DPDK ports available. "
+                   "Check bound devices to DPDK driver.\n");
+    return -ENODEV;
+  }
+  ec->nb_ports = nb_ports > RTE_MAX_ETHPORTS ? RTE_MAX_ETHPORTS : nb_ports;
+
+  for (int i = 0; i < ec->nb_ports; i++) {
+    if (ec->config.link_status.enabled_port_mask & (1 << i)) {
+      struct rte_eth_link link;
+      ec->link_info[i].read_time = cdtime();
+      rte_eth_link_get_nowait(i, &link);
+      if ((link.link_status == ETH_LINK_NA) ||
+          (link.link_status != ec->link_info[i].link_status)) {
+        ec->link_info[i].link_status = link.link_status;
+        ec->link_info[i].status_updated = 1;
+        DPDK_CHILD_LOG(" === PORT %d Link Status: %s\n", i,
+                       link.link_status ? "UP" : "DOWN");
+      }
+    }
+  }
+
+  return 0;
+}
+
+/* this function is called from helper context */
+int dpdk_helper_command_handler(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd) {
+  if (phc == NULL) {
+    DPDK_CHILD_LOG(DPDK_EVENTS_PLUGIN ": Invalid argument(phc)\n");
+    return -EINVAL;
+  }
+
+  if (cmd != DPDK_CMD_GET_EVENTS) {
+    DPDK_CHILD_LOG(DPDK_EVENTS_PLUGIN ": Unknown command (cmd=%d)\n", cmd);
+    return -EINVAL;
+  }
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(phc);
+  int ret = 0;
+  if (ec->config.link_status.enabled)
+    ret = dpdk_helper_link_status_get(phc);
+
+  return ret;
+}
+
+static void dpdk_events_notification_dispatch(int severity,
+                                              const char *plugin_instance,
+                                              cdtime_t time, const char *msg) {
+  notification_t n = {
+      .severity = severity, .time = time, .plugin = DPDK_EVENTS_PLUGIN};
+  sstrncpy(n.host, hostname_g, sizeof(n.host));
+  sstrncpy(n.plugin_instance, plugin_instance, sizeof(n.plugin_instance));
+  sstrncpy(n.message, msg, sizeof(n.message));
+  plugin_dispatch_notification(&n);
+}
+
+static void dpdk_events_gauge_submit(const char *plugin_instance,
+                                     const char *type_instance, gauge_t value,
+                                     cdtime_t time) {
+  value_list_t vl = {.values = &(value_t){.gauge = value},
+                     .values_len = 1,
+                     .time = time,
+                     .plugin = DPDK_EVENTS_PLUGIN,
+                     .type = "gauge",
+                     .meta = NULL};
+  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
+  sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
+  sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
+  plugin_dispatch_values(&vl);
+}
+
+static int dpdk_events_link_status_dispatch(dpdk_helper_ctx_t *phc) {
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(phc);
+  DEBUG(DPDK_EVENTS_PLUGIN ": %s:%d ports=%u", __FUNCTION__, __LINE__,
+        ec->nb_ports);
+
+  /* dispatch Link Status values to collectd */
+  for (int i = 0; i < ec->nb_ports; i++) {
+    if (ec->config.link_status.enabled_port_mask & (1 << i)) {
+      if (!ec->config.link_status.send_updated ||
+          ec->link_info[i].status_updated) {
+
+        DEBUG(DPDK_EVENTS_PLUGIN ": Dispatch PORT %d Link Status: %s", i,
+              ec->link_info[i].link_status ? "UP" : "DOWN");
+
+        char dev_name[DATA_MAX_NAME_LEN];
+        if (ec->config.link_status.port_name[i][0] != 0) {
+          ssnprintf(dev_name, sizeof(dev_name), "%s",
+                    ec->config.link_status.port_name[i]);
+        } else {
+          ssnprintf(dev_name, sizeof(dev_name), "port.%d", i);
+        }
+
+        if (ec->config.link_status.notify) {
+          int sev = ec->link_info[i].link_status ? NOTIF_OKAY : NOTIF_WARNING;
+          char msg[DATA_MAX_NAME_LEN];
+          ssnprintf(msg, sizeof(msg), "Link Status: %s",
+                    ec->link_info[i].link_status ? "UP" : "DOWN");
+          dpdk_events_notification_dispatch(sev, dev_name,
+                                            ec->link_info[i].read_time, msg);
+        } else {
+          dpdk_events_gauge_submit(dev_name, "link_status",
+                                   (gauge_t)ec->link_info[i].link_status,
+                                   ec->link_info[i].read_time);
+        }
+        ec->link_info[i].status_updated = 0;
+      }
+    }
+  }
+
+  return 0;
+}
+
+static void dpdk_events_keep_alive_dispatch(dpdk_helper_ctx_t *phc) {
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(phc);
+
+  /* dispatch Keep Alive values to collectd */
+  for (int i = 0; i < RTE_KEEPALIVE_MAXCORES; i++) {
+    if (i < INT64_BIT_SIZE) {
+      if (!(ec->config.keep_alive.lcore_mask.low & ((uint64_t)1 << i)))
+        continue;
+    } else if (i >= INT64_BIT_SIZE && i < INT64_BIT_SIZE * 2) {
+      if (!(ec->config.keep_alive.lcore_mask.high &
+            ((uint64_t)1 << (i - INT64_BIT_SIZE))))
+        continue;
+    } else {
+      WARNING(DPDK_EVENTS_PLUGIN
+              ": %s:%d Core id %u is out of 0 to %u range, skipping",
+              __FUNCTION__, __LINE__, i, INT64_BIT_SIZE * 2);
+      continue;
+    }
+
+    char core_name[DATA_MAX_NAME_LEN];
+    ssnprintf(core_name, sizeof(core_name), "lcore%u", i);
+
+    if (!ec->config.keep_alive.send_updated ||
+        (ec->core_info[i].lcore_state !=
+         ec->config.keep_alive.shm->core_state[i])) {
+      ec->core_info[i].lcore_state = ec->config.keep_alive.shm->core_state[i];
+      ec->core_info[i].read_time = cdtime();
+
+      if (ec->config.keep_alive.notify) {
+        char msg[DATA_MAX_NAME_LEN];
+        int sev;
+
+        switch (ec->config.keep_alive.shm->core_state[i]) {
+        case RTE_KA_STATE_ALIVE:
+          sev = NOTIF_OKAY;
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: ALIVE", i);
+          break;
+        case RTE_KA_STATE_MISSING:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: MISSING", i);
+          sev = NOTIF_WARNING;
+          break;
+        case RTE_KA_STATE_DEAD:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DEAD", i);
+          sev = NOTIF_FAILURE;
+          break;
+        case RTE_KA_STATE_UNUSED:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNUSED", i);
+          sev = NOTIF_OKAY;
+          break;
+        case RTE_KA_STATE_GONE:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: GONE", i);
+          sev = NOTIF_FAILURE;
+          break;
+        case RTE_KA_STATE_DOZING:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DOZING", i);
+          sev = NOTIF_OKAY;
+          break;
+        case RTE_KA_STATE_SLEEP:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: SLEEP", i);
+          sev = NOTIF_OKAY;
+          break;
+        default:
+          ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNKNOWN", i);
+          sev = NOTIF_FAILURE;
+        }
+
+        dpdk_events_notification_dispatch(sev, KEEPALIVE_PLUGIN_INSTANCE,
+                                          ec->core_info[i].read_time, msg);
+      } else {
+        dpdk_events_gauge_submit(KEEPALIVE_PLUGIN_INSTANCE, core_name,
+                                 ec->config.keep_alive.shm->core_state[i],
+                                 ec->core_info[i].read_time);
+      }
+    }
+  }
+}
+
+static int dpdk_events_read(user_data_t *ud) {
+  DPDK_EVENTS_TRACE();
+
+  if (g_hc == NULL) {
+    ERROR(DPDK_EVENTS_PLUGIN ": plugin not initialized.");
+    return -1;
+  }
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+
+  if (ec->config.link_status.enabled) {
+    int cmd_res = 0;
+    int ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_EVENTS, &cmd_res,
+                                  ec->config.interval);
+    if (cmd_res == 0 && ret == 0) {
+      dpdk_events_link_status_dispatch(g_hc);
+    }
+  }
+
+  if (ec->config.keep_alive.enabled) {
+    dpdk_events_keep_alive_dispatch(g_hc);
+  }
+
+  return 0;
+}
+
+static int dpdk_events_init(void) {
+  DPDK_EVENTS_TRACE();
+
+  int ret = dpdk_events_preinit();
+  if (ret)
+    return ret;
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+
+  if (ec->config.keep_alive.enabled) {
+    ret = dpdk_event_keep_alive_shm_create();
+    if (ret) {
+      ERROR(DPDK_EVENTS_PLUGIN ": %s : error %d in ka_shm_create()",
+            __FUNCTION__, ret);
+      return ret;
+    }
+  }
+  return 0;
+}
+
+static int dpdk_events_shutdown(void) {
+  DPDK_EVENTS_TRACE();
+  int ret;
+
+  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
+  if (ec->config.keep_alive.enabled) {
+    ret = munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t));
+    if (ret) {
+      ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor returned %d", ret);
+      return ret;
+    }
+  }
+
+  ret = dpdk_helper_shutdown(g_hc);
+  g_hc = NULL;
+  if (ret)
+    ERROR(DPDK_EVENTS_PLUGIN ": failed to cleanup %s helper", DPDK_EVENTS_NAME);
+
+  return ret;
+}
+
+void module_register(void) {
+  plugin_register_init(DPDK_EVENTS_PLUGIN, dpdk_events_init);
+  plugin_register_complex_config(DPDK_EVENTS_PLUGIN, dpdk_events_config);
+  plugin_register_complex_read(NULL, DPDK_EVENTS_PLUGIN, dpdk_events_read, 0,
+                               NULL);
+  plugin_register_shutdown(DPDK_EVENTS_PLUGIN, dpdk_events_shutdown);
+}
index 6d0aabf..cc525e8 100644 (file)
@@ -1,4 +1,4 @@
-/*-
+/*
  * collectd - src/dpdkstat.c
  * MIT License
  *
  *   Maryam Tahhan <maryam.tahhan@intel.com>
  *   Harry van Haaren <harry.van.haaren@intel.com>
  *   Taras Chornyi <tarasx.chornyi@intel.com>
+ *   Serhiy Pshyk <serhiyx.pshyk@intel.com>
+ *   Krzysztof Matczak <krzysztofx.matczak@intel.com>
  */
 
 #include "collectd.h"
 
-#include "common.h" /* auxiliary functions */
-#include "plugin.h" /* plugin_register_*, plugin_dispatch_values */
-#include "utils_time.h"
-
-#include <getopt.h>
-#include <poll.h>
-#include <semaphore.h>
-#include <sys/mman.h>
-#include <sys/queue.h>
+#include "common.h"
+#include "utils_dpdk.h"
 
-#include <rte_atomic.h>
-#include <rte_branch_prediction.h>
-#include <rte_common.h>
 #include <rte_config.h>
-#include <rte_debug.h>
-#include <rte_debug.h>
-#include <rte_eal.h>
 #include <rte_ethdev.h>
-#include <rte_launch.h>
-#include <rte_lcore.h>
-#include <rte_log.h>
-#include <rte_malloc.h>
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_per_lcore.h>
-#include <rte_string_fns.h>
-#include <rte_tailq.h>
-#include <rte_version.h>
-
-#define DPDK_DEFAULT_RTE_CONFIG "/var/run/.rte_config"
-#define DPDK_MAX_ARGC 8
-#define DPDKSTAT_MAX_BUFFER_SIZE (4096 * 4)
-#define DPDK_SHM_NAME "dpdk_collectd_stats_shm"
-#define ERR_BUF_SIZE 1024
-#define REINIT_SHM 1
-#define RESET 1
-#define NO_RESET 0
+
+#define DPDK_STATS_PLUGIN "dpdkstat"
+#define DPDK_STATS_NAME "dpdk_collectd_stats"
+
+#define DPDK_STATS_TRACE()                                                     \
+  DEBUG("%s:%s:%d pid=%u", DPDK_STATS_PLUGIN, __FUNCTION__, __LINE__, getpid())
+
+struct dpdk_stats_config_s {
+  cdtime_t interval;
+  uint32_t enabled_port_mask;
+  char port_name[RTE_MAX_ETHPORTS][DATA_MAX_NAME_LEN];
+};
+typedef struct dpdk_stats_config_s dpdk_stats_config_t;
 
 #define RTE_VERSION_16_07 RTE_VERSION_NUM(16, 7, 0, 16)
 
     ctx->xstats = (struct rte_eth_xstat *)&ctx->raw_data[0];                   \
     ctx->xnames =                                                              \
         (struct rte_eth_xstat_name *)&ctx                                      \
-            ->raw_data[ctx->num_xstats * sizeof(struct rte_eth_xstat)];        \
+            ->raw_data[ctx->stats_count * sizeof(struct rte_eth_xstat)];       \
   } while (0)
 #endif
 
-enum DPDK_HELPER_ACTION {
-  DPDK_HELPER_ACTION_COUNT_STATS,
-  DPDK_HELPER_ACTION_SEND_STATS,
-};
-
-enum DPDK_HELPER_STATUS {
-  DPDK_HELPER_NOT_INITIALIZED = 0,
-  DPDK_HELPER_WAITING_ON_PRIMARY,
-  DPDK_HELPER_INITIALIZING_EAL,
-  DPDK_HELPER_ALIVE_SENDING_STATS,
-  DPDK_HELPER_GRACEFUL_QUIT,
-};
-
-struct dpdk_config_s {
-  /* General DPDK params */
-  char coremask[DATA_MAX_NAME_LEN];
-  char memory_channels[DATA_MAX_NAME_LEN];
-  char socket_memory[DATA_MAX_NAME_LEN];
-  char process_type[DATA_MAX_NAME_LEN];
-  char file_prefix[DATA_MAX_NAME_LEN];
-  cdtime_t interval;
-  uint32_t eal_initialized;
-  uint32_t enabled_port_mask;
-  char port_name[RTE_MAX_ETHPORTS][DATA_MAX_NAME_LEN];
-  uint32_t eal_argc;
-  /* Helper info */
-  int collectd_reinit_shm;
-  pid_t helper_pid;
-  sem_t sema_helper_get_stats;
-  sem_t sema_stats_in_shm;
-  int helper_pipes[2];
-  enum DPDK_HELPER_STATUS helper_status;
-  enum DPDK_HELPER_ACTION helper_action;
-  /* xstats info */
-  uint32_t num_ports;
-  uint32_t num_xstats;
+struct dpdk_stats_ctx_s {
+  dpdk_stats_config_t config;
+  uint32_t stats_count;
+  uint32_t ports_count;
   cdtime_t port_read_time[RTE_MAX_ETHPORTS];
-  uint32_t num_stats_in_port[RTE_MAX_ETHPORTS];
-  struct rte_eth_link link_status[RTE_MAX_ETHPORTS];
+  uint32_t port_stats_count[RTE_MAX_ETHPORTS];
 #if RTE_VERSION < RTE_VERSION_16_07
   struct rte_eth_xstats *xstats;
 #else
   struct rte_eth_xstat *xstats;
   struct rte_eth_xstat_name *xnames;
 #endif
-  char *raw_data;
-  /* rte_eth_xstats from here on until the end of the SHM */
+  char raw_data[];
 };
-typedef struct dpdk_config_s dpdk_config_t;
-
-static int g_configured;
-static dpdk_config_t *g_configuration;
-
-static void dpdk_config_init_default(void);
-static int dpdk_config(oconfig_item_t *ci);
-static int dpdk_helper_init_eal(void);
-static int dpdk_helper_run(void);
-static int dpdk_helper_spawn(enum DPDK_HELPER_ACTION action);
-static int dpdk_init(void);
-static int dpdk_read(user_data_t *ud);
-static int dpdk_shm_cleanup(void);
-static int dpdk_shm_init(size_t size);
-
-/* Write the default configuration to the g_configuration instances */
-static void dpdk_config_init_default(void) {
-  g_configuration->interval = plugin_get_interval();
-  if (g_configuration->interval == cf_get_default_interval())
-    WARNING("dpdkstat: No time interval was configured, default value %" PRIu64
-            " ms is set",
-            CDTIME_T_TO_MS(g_configuration->interval));
-  /* Default is all ports enabled */
-  g_configuration->enabled_port_mask = ~0;
-  g_configuration->eal_argc = DPDK_MAX_ARGC;
-  g_configuration->eal_initialized = 0;
-  ssnprintf(g_configuration->coremask, DATA_MAX_NAME_LEN, "%s", "0xf");
-  ssnprintf(g_configuration->memory_channels, DATA_MAX_NAME_LEN, "%s", "1");
-  ssnprintf(g_configuration->process_type, DATA_MAX_NAME_LEN, "%s",
-            "secondary");
-  ssnprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN, "%s",
-            DPDK_DEFAULT_RTE_CONFIG);
-
-  for (int i = 0; i < RTE_MAX_ETHPORTS; i++)
-    g_configuration->port_name[i][0] = 0;
+typedef struct dpdk_stats_ctx_s dpdk_stats_ctx_t;
+
+#define DPDK_STATS_CTX_GET(a) ((dpdk_stats_ctx_t *)dpdk_helper_priv_get(a))
+
+dpdk_helper_ctx_t *g_hc = NULL;
+static char g_shm_name[DATA_MAX_NAME_LEN] = DPDK_STATS_NAME;
+static int dpdk_stats_reinit_helper();
+static void dpdk_stats_default_config(void) {
+  dpdk_stats_ctx_t *ec = DPDK_STATS_CTX_GET(g_hc);
+
+  ec->config.interval = plugin_get_interval();
+  for (int i = 0; i < RTE_MAX_ETHPORTS; i++) {
+    ec->config.port_name[i][0] = 0;
+  }
+  /* Enable all ports by default */
+  ec->config.enabled_port_mask = ~0;
 }
 
-static int dpdk_config(oconfig_item_t *ci) {
-  int port_counter = 0;
-  /* Allocate g_configuration and
-   * initialize a POSIX SHared Memory (SHM) object.
-   */
-  int err = dpdk_shm_init(sizeof(dpdk_config_t));
-  if (err) {
+static int dpdk_stats_preinit(void) {
+  DPDK_STATS_TRACE();
+
+  if (g_hc != NULL) {
+    /* already initialized if config callback was called before init callback */
+    DEBUG("dpdk_stats_preinit: helper already initialized");
+    return 0;
+  }
+
+  int ret = dpdk_helper_init(g_shm_name, sizeof(dpdk_stats_ctx_t), &g_hc);
+  if (ret != 0) {
     char errbuf[ERR_BUF_SIZE];
-    ERROR("dpdkstat: error in shm_init, %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    return -1;
+    ERROR("%s: failed to initialize %s helper(error: %s)", DPDK_STATS_PLUGIN,
+          g_shm_name, sstrerror(errno, errbuf, sizeof(errbuf)));
+    return ret;
   }
 
-  /* Set defaults for config, overwritten by loop if config item exists */
-  dpdk_config_init_default();
+  dpdk_stats_default_config();
+  return ret;
+}
+
+static int dpdk_stats_config(oconfig_item_t *ci) {
+  DPDK_STATS_TRACE();
+
+  int ret = dpdk_stats_preinit();
+  if (ret)
+    return ret;
+
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc);
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
 
-    if (strcasecmp("Coremask", child->key) == 0) {
-      cf_util_get_string_buffer(child, g_configuration->coremask,
-                                sizeof(g_configuration->coremask));
-      DEBUG("dpdkstat:COREMASK %s ", g_configuration->coremask);
-    } else if (strcasecmp("MemoryChannels", child->key) == 0) {
-      cf_util_get_string_buffer(child, g_configuration->memory_channels,
-                                sizeof(g_configuration->memory_channels));
-      DEBUG("dpdkstat:Memory Channels %s ", g_configuration->memory_channels);
-    } else if (strcasecmp("SocketMemory", child->key) == 0) {
-      cf_util_get_string_buffer(child, g_configuration->socket_memory,
-                                sizeof(g_configuration->memory_channels));
-      DEBUG("dpdkstat: socket mem %s ", g_configuration->socket_memory);
-    } else if (strcasecmp("ProcessType", child->key) == 0) {
-      cf_util_get_string_buffer(child, g_configuration->process_type,
-                                sizeof(g_configuration->process_type));
-      DEBUG("dpdkstat: proc type %s ", g_configuration->process_type);
-    } else if ((strcasecmp("FilePrefix", child->key) == 0) &&
-               (child->values[0].type == OCONFIG_TYPE_STRING)) {
-      ssnprintf(g_configuration->file_prefix, DATA_MAX_NAME_LEN,
-                "/var/run/.%s_config", child->values[0].value.string);
-      DEBUG("dpdkstat: file prefix %s ", g_configuration->file_prefix);
-    } else if ((strcasecmp("EnabledPortMask", child->key) == 0) &&
-               (child->values[0].type == OCONFIG_TYPE_NUMBER)) {
-      g_configuration->enabled_port_mask =
-          (uint32_t)child->values[0].value.number;
-      DEBUG("dpdkstat: Enabled Port Mask %u",
-            g_configuration->enabled_port_mask);
-    } else if (strcasecmp("PortName", child->key) == 0) {
-      cf_util_get_string_buffer(
-          child, g_configuration->port_name[port_counter],
-          sizeof(g_configuration->port_name[port_counter]));
-      DEBUG("dpdkstat: Port %d Name: %s ", port_counter,
-            g_configuration->port_name[port_counter]);
-      port_counter++;
-    } else {
-      WARNING("dpdkstat: The config option \"%s\" is unknown.", child->key);
+    if ((strcasecmp("EnabledPortMask", child->key) == 0) &&
+        (child->values[0].type == OCONFIG_TYPE_NUMBER)) {
+      ctx->config.enabled_port_mask = child->values[0].value.number;
+      DEBUG("%s: Enabled Port Mask 0x%X", DPDK_STATS_PLUGIN,
+            ctx->config.enabled_port_mask);
+    } else if (strcasecmp("SharedMemObj", child->key) == 0) {
+      cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name));
+      DEBUG("%s: Shared memory object %s", DPDK_STATS_PLUGIN, g_shm_name);
+      dpdk_stats_reinit_helper();
+    } else if (strcasecmp("EAL", child->key) == 0) {
+      ret = dpdk_helper_eal_config_parse(g_hc, child);
+      if (ret)
+        return ret;
     }
-  }                 /* End for (int i = 0; i < ci->children_num; i++)*/
-  g_configured = 1; /* Bypass configuration in dpdk_shm_init(). */
+  }
 
-  return 0;
-}
+  int port_num = 0;
 
-/*
- * Allocate g_configuration and initialize SHared Memory (SHM)
- * for config and helper process
- */
-static int dpdk_shm_init(size_t size) {
-  /*
-   * Check if SHM is already configured: when config items are provided, the
-   * config function initializes SHM. If there is no config, then init() will
-   * just return.
-   */
-  if (g_configuration)
-    return 0;
+  /* parse port names after EnabledPortMask was parsed */
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
 
-  char errbuf[ERR_BUF_SIZE];
+    if (strcasecmp("PortName", child->key) == 0) {
 
-  /* Create and open a new object, or open an existing object. */
-  int fd = shm_open(DPDK_SHM_NAME, O_CREAT | O_TRUNC | O_RDWR, 0666);
-  if (fd < 0) {
-    WARNING("dpdkstat:Failed to open %s as SHM:%s", DPDK_SHM_NAME,
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-    goto fail;
-  }
-  /* Set the size of the shared memory object. */
-  int ret = ftruncate(fd, size);
-  if (ret != 0) {
-    WARNING("dpdkstat:Failed to resize SHM:%s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-    goto fail_close;
-  }
-  /* Map the shared memory object into this process' virtual address space. */
-  g_configuration = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-  if (g_configuration == MAP_FAILED) {
-    WARNING("dpdkstat:Failed to mmap SHM:%s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-    goto fail_close;
-  }
-  /*
-   * Close the file descriptor, the shared memory object still exists
-   * and can only be removed by calling shm_unlink().
-   */
-  close(fd);
-
-  /* Initialize g_configuration. */
-  memset(g_configuration, 0, size);
-
-  /* Initialize the semaphores for SHM use */
-  int err = sem_init(&g_configuration->sema_helper_get_stats, 1, 0);
-  if (err) {
-    ERROR("dpdkstat semaphore init failed: %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    goto fail;
-  }
-  err = sem_init(&g_configuration->sema_stats_in_shm, 1, 0);
-  if (err) {
-    ERROR("dpdkstat semaphore init failed: %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    goto fail;
-  }
+      while (!(ctx->config.enabled_port_mask & (1 << port_num)))
+        port_num++;
 
-  g_configuration->xstats = NULL;
+      cf_util_get_string_buffer(child, ctx->config.port_name[port_num],
+                                sizeof(ctx->config.port_name[port_num]));
+      DEBUG("%s: Port %d Name: %s", DPDK_STATS_PLUGIN, port_num,
+            ctx->config.port_name[port_num]);
 
-  return 0;
+      port_num++;
+    }
+  }
 
-fail_close:
-  close(fd);
-fail:
-  /* Reset to zero, as it was set to MAP_FAILED aka: (void *)-1. Avoid
-   * an issue if collectd attempts to run this plugin failure.
-   */
-  g_configuration = 0;
-  return -1;
+  return ret;
 }
 
-static int dpdk_re_init_shm() {
-  dpdk_config_t temp_config;
-  memcpy(&temp_config, g_configuration, sizeof(dpdk_config_t));
-  DEBUG("dpdkstat: %s: ports %" PRIu32 ", xstats %" PRIu32, __func__,
-        temp_config.num_ports, temp_config.num_xstats);
-
-  size_t shm_xstats_size =
-      sizeof(dpdk_config_t) +
-      (DPDK_STATS_CTX_GET_XSTAT_SIZE * g_configuration->num_xstats);
-  DEBUG("=== SHM new size for %" PRIu32 " xstats", g_configuration->num_xstats);
-
-  int err = dpdk_shm_cleanup();
-  if (err) {
-    ERROR("dpdkstat: Error in shm_cleanup in %s", __func__);
-    return err;
-  }
-  err = dpdk_shm_init(shm_xstats_size);
-  if (err) {
-    WARNING("dpdkstat: Error in shm_init in %s", __func__);
-    return err;
-  }
-  /* If the XML config() function has been run, don't re-initialize defaults */
-  if (!g_configured)
-    dpdk_config_init_default();
-
-  memcpy(g_configuration, &temp_config, sizeof(dpdk_config_t));
-  g_configuration->collectd_reinit_shm = 0;
-  g_configuration->raw_data = (char *)(g_configuration + 1);
-  DPDK_STATS_CTX_INIT(g_configuration);
-  return 0;
-}
+static int dpdk_helper_stats_get(dpdk_helper_ctx_t *phc) {
+  int len = 0;
+  int ret = 0;
+  int stats = 0;
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc);
 
-static int dpdk_init(void) {
-  int err = dpdk_shm_init(sizeof(dpdk_config_t));
-  if (err) {
-    ERROR("dpdkstat: %s : error %d in shm_init()", __func__, err);
-    return err;
-  }
+  /* get stats from DPDK */
+  for (uint8_t i = 0; i < ctx->ports_count; i++) {
+    if (!(ctx->config.enabled_port_mask & (1 << i)))
+      continue;
 
-  /* If the XML config() function has been run, dont re-initialize defaults */
-  if (!g_configured) {
-    dpdk_config_init_default();
+    ctx->port_read_time[i] = cdtime();
+    /* Store available stats array length for port */
+    len = ctx->port_stats_count[i];
+
+    ret = rte_eth_xstats_get(i, &ctx->xstats[stats], len);
+    if (ret < 0 || ret > len) {
+      DPDK_CHILD_LOG(DPDK_STATS_PLUGIN
+                     ": Error reading stats (port=%d; len=%d, ret=%d)\n",
+                     i, len, ret);
+      ctx->port_stats_count[i] = 0;
+      return -1;
+    }
+#if RTE_VERSION >= RTE_VERSION_16_07
+    ret = rte_eth_xstats_get_names(i, &ctx->xnames[stats], len);
+    if (ret < 0 || ret > len) {
+      DPDK_CHILD_LOG(DPDK_STATS_PLUGIN
+                     ": Error reading stat names (port=%d; len=%d ret=%d)\n",
+                     i, len, ret);
+      ctx->port_stats_count[i] = 0;
+      return -1;
+    }
+#endif
+    ctx->port_stats_count[i] = ret;
+    stats += ctx->port_stats_count[i];
   }
 
+  assert(stats <= ctx->stats_count);
   return 0;
 }
 
-static int dpdk_helper_stop(int reset) {
-  g_configuration->helper_status = DPDK_HELPER_GRACEFUL_QUIT;
-  if (reset) {
-    g_configuration->eal_initialized = 0;
-    g_configuration->num_ports = 0;
-    g_configuration->xstats = NULL;
-    g_configuration->num_xstats = 0;
-    for (int i = 0; i < RTE_MAX_ETHPORTS; i++)
-      g_configuration->num_stats_in_port[i] = 0;
-  }
-  close(g_configuration->helper_pipes[1]);
-  int err = kill(g_configuration->helper_pid, SIGKILL);
-  if (err) {
-    char errbuf[ERR_BUF_SIZE];
-    WARNING("dpdkstat: error sending kill to helper: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-  }
+static int dpdk_helper_stats_count_get(dpdk_helper_ctx_t *phc) {
+  uint8_t ports = dpdk_helper_eth_dev_count();
+  if (ports == 0)
+    return -ENODEV;
 
-  return 0;
-}
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc);
+  ctx->ports_count = ports;
 
-static int dpdk_helper_spawn(enum DPDK_HELPER_ACTION action) {
-  char errbuf[ERR_BUF_SIZE];
-  g_configuration->eal_initialized = 0;
-  g_configuration->helper_action = action;
-  /*
-   * Create a pipe for helper stdout back to collectd. This is necessary for
-   * logging EAL failures, as rte_eal_init() calls rte_panic().
-   */
-  if (pipe(g_configuration->helper_pipes) != 0) {
-    DEBUG("dpdkstat: Could not create helper pipe: %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    return -1;
+  int len = 0;
+  int stats_count = 0;
+  for (int i = 0; i < ports; i++) {
+    if (!(ctx->config.enabled_port_mask & (1 << i)))
+      continue;
+#if RTE_VERSION >= RTE_VERSION_16_07
+    len = rte_eth_xstats_get_names(i, NULL, 0);
+#else
+    len = rte_eth_xstats_get(i, NULL, 0);
+#endif
+    if (len < 0) {
+      DPDK_CHILD_LOG("%s: Cannot get stats count\n", DPDK_STATS_PLUGIN);
+      return -1;
+    }
+    ctx->port_stats_count[i] = len;
+    stats_count += len;
   }
 
-  int pipe0_flags = fcntl(g_configuration->helper_pipes[0], F_GETFL, 0);
-  int pipe1_flags = fcntl(g_configuration->helper_pipes[1], F_GETFL, 0);
-  if (pipe0_flags == -1 || pipe1_flags == -1) {
-    WARNING("dpdkstat: Failed setting up pipe flags: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-  }
-  int pipe0_err = fcntl(g_configuration->helper_pipes[0], F_SETFL,
-                        pipe1_flags | O_NONBLOCK);
-  int pipe1_err = fcntl(g_configuration->helper_pipes[1], F_SETFL,
-                        pipe0_flags | O_NONBLOCK);
-  if (pipe0_err == -1 || pipe1_err == -1) {
-    WARNING("dpdkstat: Failed setting up pipes: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-  }
+  DPDK_CHILD_LOG("%s:%s:%d stats_count=%d\n", DPDK_STATS_PLUGIN, __FUNCTION__,
+                 __LINE__, stats_count);
 
-  pid_t pid = fork();
-  if (pid > 0) {
-    close(g_configuration->helper_pipes[1]);
-    g_configuration->helper_pid = pid;
-    DEBUG("dpdkstat: helper pid %li", (long)g_configuration->helper_pid);
-    /* Kick helper once its alive to have it start processing */
-    sem_post(&g_configuration->sema_helper_get_stats);
-  } else if (pid == 0) {
-    /* Replace stdout with a pipe to collectd. */
-    close(g_configuration->helper_pipes[0]);
-    close(STDOUT_FILENO);
-    dup2(g_configuration->helper_pipes[1], STDOUT_FILENO);
-    dpdk_helper_run();
-    exit(0);
-  } else {
-    ERROR("dpdkstat: Failed to fork helper process: %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    return -1;
-  }
-  return 0;
+  return stats_count;
 }
 
-/*
- * Initialize the DPDK EAL, if this returns, EAL is successfully initialized.
- * On failure, the EAL prints an error message, and the helper process exits.
- */
-static int dpdk_helper_init_eal(void) {
-  g_configuration->helper_status = DPDK_HELPER_INITIALIZING_EAL;
-  char *argp[(g_configuration->eal_argc) + 1];
-  int i = 0;
-
-  argp[i++] = "collectd-dpdk";
-  if (strcasecmp(g_configuration->coremask, "") != 0) {
-    argp[i++] = "-c";
-    argp[i++] = g_configuration->coremask;
-  }
-  if (strcasecmp(g_configuration->memory_channels, "") != 0) {
-    argp[i++] = "-n";
-    argp[i++] = g_configuration->memory_channels;
-  }
-  if (strcasecmp(g_configuration->socket_memory, "") != 0) {
-    argp[i++] = "--socket-mem";
-    argp[i++] = g_configuration->socket_memory;
+static int dpdk_stats_get_size(dpdk_helper_ctx_t *phc) {
+  return dpdk_helper_data_size_get(phc) - sizeof(dpdk_stats_ctx_t);
+}
+
+int dpdk_helper_command_handler(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd) {
+  /* this function is called from helper context */
+
+  if (phc == NULL) {
+    DPDK_CHILD_LOG("%s: Invalid argument(phc)\n", DPDK_STATS_PLUGIN);
+    return -EINVAL;
   }
-  if (strcasecmp(g_configuration->file_prefix, "") != 0 &&
-      strcasecmp(g_configuration->file_prefix, DPDK_DEFAULT_RTE_CONFIG) != 0) {
-    argp[i++] = "--file-prefix";
-    argp[i++] = g_configuration->file_prefix;
+
+  if (cmd != DPDK_CMD_GET_STATS) {
+    DPDK_CHILD_LOG("%s: Unknown command (cmd=%d)\n", DPDK_STATS_PLUGIN, cmd);
+    return -EINVAL;
   }
-  if (strcasecmp(g_configuration->process_type, "") != 0) {
-    argp[i++] = "--proc-type";
-    argp[i++] = g_configuration->process_type;
+
+  int stats_count = dpdk_helper_stats_count_get(phc);
+  if (stats_count < 0) {
+    return stats_count;
   }
-  g_configuration->eal_argc = i;
 
-  g_configuration->eal_initialized = 1;
-  int ret = rte_eal_init(g_configuration->eal_argc, argp);
-  if (ret < 0) {
-    g_configuration->eal_initialized = 0;
-    return ret;
+  DPDK_STATS_CTX_GET(phc)->stats_count = stats_count;
+  int stats_size = stats_count * DPDK_STATS_CTX_GET_XSTAT_SIZE;
+
+  if (dpdk_stats_get_size(phc) < stats_size) {
+    DPDK_CHILD_LOG(
+        DPDK_STATS_PLUGIN
+        ":%s:%d not enough space for stats (available=%d, needed=%d)\n",
+        __FUNCTION__, __LINE__, (int)dpdk_stats_get_size(phc), stats_size);
+    return -ENOBUFS;
   }
-  return 0;
+
+  return dpdk_helper_stats_get(phc);
 }
 
-static int dpdk_helper_run(void) {
-  char errbuf[ERR_BUF_SIZE];
-  pid_t ppid = getppid();
-  g_configuration->helper_status = DPDK_HELPER_WAITING_ON_PRIMARY;
-
-  while (1) {
-    /* sem_timedwait() to avoid blocking forever */
-    cdtime_t now = cdtime();
-    cdtime_t safety_period = MS_TO_CDTIME_T(1500);
-    int ret =
-        sem_timedwait(&g_configuration->sema_helper_get_stats,
-                      &CDTIME_T_TO_TIMESPEC(now + safety_period +
-                                            g_configuration->interval * 2));
-
-    if (ret == -1 && errno == ETIMEDOUT) {
-      ERROR("dpdkstat-helper: sem timedwait()"
-            " timeout, did collectd terminate?");
-      dpdk_helper_stop(RESET);
-    }
-    /* Parent PID change means collectd died so quit the helper process. */
-    if (ppid != getppid()) {
-      WARNING("dpdkstat-helper: parent PID changed, quitting.");
-      dpdk_helper_stop(RESET);
+static void dpdk_stats_resolve_cnt_type(char *cnt_type, size_t cnt_type_len,
+                                        const char *cnt_name) {
+  char *type_end;
+  type_end = strrchr(cnt_name, '_');
+
+  if ((type_end != NULL) && (strncmp(cnt_name, "rx_", strlen("rx_")) == 0)) {
+    if (strstr(type_end, "bytes") != NULL) {
+      sstrncpy(cnt_type, "if_rx_octets", cnt_type_len);
+    } else if (strstr(type_end, "error") != NULL) {
+      sstrncpy(cnt_type, "if_rx_errors", cnt_type_len);
+    } else if (strstr(type_end, "dropped") != NULL) {
+      sstrncpy(cnt_type, "if_rx_dropped", cnt_type_len);
+    } else if (strstr(type_end, "packets") != NULL) {
+      sstrncpy(cnt_type, "if_rx_packets", cnt_type_len);
+    } else if (strstr(type_end, "_placement") != NULL) {
+      sstrncpy(cnt_type, "if_rx_errors", cnt_type_len);
+    } else if (strstr(type_end, "_buff") != NULL) {
+      sstrncpy(cnt_type, "if_rx_errors", cnt_type_len);
+    } else {
+      /* Does not fit obvious type: use a more generic one */
+      sstrncpy(cnt_type, "derive", cnt_type_len);
     }
 
-    /* Checking for DPDK primary process. */
-    if (!rte_eal_primary_proc_alive(g_configuration->file_prefix)) {
-      if (g_configuration->eal_initialized) {
-        WARNING("dpdkstat-helper: no primary alive but EAL initialized:"
-                " quitting.");
-        dpdk_helper_stop(RESET);
-      }
-      g_configuration->helper_status = DPDK_HELPER_WAITING_ON_PRIMARY;
-      /* Back to start of while() - waiting for primary process */
-      continue;
+  } else if ((type_end != NULL) &&
+             (strncmp(cnt_name, "tx_", strlen("tx_"))) == 0) {
+    if (strstr(type_end, "bytes") != NULL) {
+      sstrncpy(cnt_type, "if_tx_octets", cnt_type_len);
+    } else if (strstr(type_end, "error") != NULL) {
+      sstrncpy(cnt_type, "if_tx_errors", cnt_type_len);
+    } else if (strstr(type_end, "dropped") != NULL) {
+      sstrncpy(cnt_type, "if_tx_dropped", cnt_type_len);
+    } else if (strstr(type_end, "packets") != NULL) {
+      sstrncpy(cnt_type, "if_tx_packets", cnt_type_len);
+    } else {
+      /* Does not fit obvious type: use a more generic one */
+      sstrncpy(cnt_type, "derive", cnt_type_len);
     }
-
-    if (!g_configuration->eal_initialized) {
-      /* Initialize EAL. */
-      int ret = dpdk_helper_init_eal();
-      if (ret != 0) {
-        WARNING("ERROR INITIALIZING EAL");
-        dpdk_helper_stop(RESET);
-      }
+  } else if ((type_end != NULL) &&
+             (strncmp(cnt_name, "flow_", strlen("flow_"))) == 0) {
+
+    if (strstr(type_end, "_filters") != NULL) {
+      sstrncpy(cnt_type, "operations", cnt_type_len);
+    } else if (strstr(type_end, "error") != NULL)
+      sstrncpy(cnt_type, "errors", cnt_type_len);
+
+  } else if ((type_end != NULL) &&
+             (strncmp(cnt_name, "mac_", strlen("mac_"))) == 0) {
+    if (strstr(type_end, "error") != NULL) {
+      sstrncpy(cnt_type, "errors", cnt_type_len);
     }
+  } else {
+    /* Does not fit obvious type, or strrchr error:
+     *   use a more generic type */
+    sstrncpy(cnt_type, "derive", cnt_type_len);
+  }
+}
 
-    g_configuration->helper_status = DPDK_HELPER_ALIVE_SENDING_STATS;
+static void dpdk_stats_counter_submit(const char *plugin_instance,
+                                      const char *cnt_name, derive_t value,
+                                      cdtime_t port_read_time) {
+  value_list_t vl = VALUE_LIST_INIT;
+  vl.values = &(value_t){.derive = value};
+  vl.values_len = 1;
+  vl.time = port_read_time;
+  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
+  sstrncpy(vl.plugin, DPDK_STATS_PLUGIN, sizeof(vl.plugin));
+  sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
+  dpdk_stats_resolve_cnt_type(vl.type, sizeof(vl.type), cnt_name);
+  sstrncpy(vl.type_instance, cnt_name, sizeof(vl.type_instance));
+  plugin_dispatch_values(&vl);
+}
 
-    uint8_t nb_ports = rte_eth_dev_count();
-    if (nb_ports == 0) {
-      DEBUG("dpdkstat-helper: No DPDK ports available. "
-            "Check bound devices to DPDK driver.");
-      dpdk_helper_stop(RESET);
-    }
+static int dpdk_stats_counters_dispatch(dpdk_helper_ctx_t *phc) {
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(phc);
 
-    if (nb_ports > RTE_MAX_ETHPORTS)
-      nb_ports = RTE_MAX_ETHPORTS;
+  /* dispatch stats values to collectd */
 
-    int len = 0, enabled_port_count = 0, num_xstats = 0;
-    for (uint8_t i = 0; i < nb_ports; i++) {
-      if (!(g_configuration->enabled_port_mask & (1 << i)))
-        continue;
+  DEBUG("%s:%s:%d ports=%u", DPDK_STATS_PLUGIN, __FUNCTION__, __LINE__,
+        ctx->ports_count);
 
-      if (g_configuration->helper_action == DPDK_HELPER_ACTION_COUNT_STATS) {
-#if RTE_VERSION >= RTE_VERSION_16_07
-        len = rte_eth_xstats_get_names(i, NULL, 0);
-#else
-        len = rte_eth_xstats_get(i, NULL, 0);
-#endif
-        if (len < 0) {
-          ERROR("dpdkstat-helper: Cannot get xstats count on port %" PRIu8, i);
-          break;
-        }
-        num_xstats += len;
-        g_configuration->num_stats_in_port[enabled_port_count] = len;
-        enabled_port_count++;
-        continue;
-      } else {
-        len = g_configuration->num_stats_in_port[enabled_port_count];
-        g_configuration->port_read_time[enabled_port_count] = cdtime();
-        ret = rte_eth_xstats_get(
-            i, g_configuration->xstats + num_xstats,
-            g_configuration->num_stats_in_port[enabled_port_count]);
-        if (ret < 0 || ret != len) {
-          DEBUG("dpdkstat-helper: Error reading xstats on port %" PRIu8
-                " len = %d",
-                i, len);
-          break;
-        }
-#if RTE_VERSION >= RTE_VERSION_16_07
-        ret = rte_eth_xstats_get_names(i, g_configuration->xnames + num_xstats,
-                                       len);
-        if (ret < 0 || ret != len) {
-          ERROR("dpdkstat-helper: Error reading xstat names (port=%d; len=%d)",
-                i, len);
-          break;
-        }
-#endif
-        num_xstats += g_configuration->num_stats_in_port[enabled_port_count];
-        enabled_port_count++;
-      }
-    } /* for (nb_ports) */
-
-    if (g_configuration->helper_action == DPDK_HELPER_ACTION_COUNT_STATS) {
-      g_configuration->num_ports = enabled_port_count;
-      g_configuration->num_xstats = num_xstats;
-      DEBUG("dpdkstat-helper ports: %" PRIu32 ", num stats: %" PRIu32,
-            g_configuration->num_ports, g_configuration->num_xstats);
-      /* Exit, allowing collectd to re-init SHM to the right size */
-      g_configuration->collectd_reinit_shm = REINIT_SHM;
-      dpdk_helper_stop(NO_RESET);
+  int stats_count = 0;
+
+  for (int i = 0; i < ctx->ports_count; i++) {
+    if (!(ctx->config.enabled_port_mask & (1 << i)))
+      continue;
+
+    char dev_name[64];
+    if (ctx->config.port_name[i][0] != 0) {
+      ssnprintf(dev_name, sizeof(dev_name), "%s", ctx->config.port_name[i]);
+    } else {
+      ssnprintf(dev_name, sizeof(dev_name), "port.%d", i);
     }
-    /* Now kick collectd send thread to send the stats */
-    int err = sem_post(&g_configuration->sema_stats_in_shm);
-    if (err) {
-      WARNING("dpdkstat: error posting semaphore to helper %s",
-              sstrerror(errno, errbuf, sizeof(errbuf)));
-      dpdk_helper_stop(RESET);
+
+    DEBUG(" === Dispatch stats for port %d (name=%s; stats_count=%d)", i,
+          dev_name, ctx->port_stats_count[i]);
+
+    for (int j = 0; j < ctx->port_stats_count[i]; j++) {
+      const char *cnt_name = DPDK_STATS_XSTAT_GET_NAME(ctx, stats_count);
+      if (cnt_name == NULL)
+        WARNING("dpdkstat: Invalid counter name");
+      else
+        dpdk_stats_counter_submit(
+            dev_name, cnt_name,
+            (derive_t)DPDK_STATS_XSTAT_GET_VALUE(ctx, stats_count),
+            ctx->port_read_time[i]);
+      stats_count++;
+
+      assert(stats_count <= ctx->stats_count);
     }
-  } /* while(1) */
+  }
 
   return 0;
 }
 
-static void dpdk_submit_xstats(const char *dev_name, int count,
-                               uint32_t counters, cdtime_t port_read_time) {
-  for (uint32_t j = 0; j < counters; j++) {
-    value_list_t vl = VALUE_LIST_INIT;
-    char *counter_name;
-    char *type_end;
-
-    vl.values = &(value_t){.derive = (derive_t)DPDK_STATS_XSTAT_GET_VALUE(
-                               g_configuration, count + j)};
-    vl.values_len = 1; /* Submit stats one at a time */
-    vl.time = port_read_time;
-    sstrncpy(vl.plugin, "dpdkstat", sizeof(vl.plugin));
-    sstrncpy(vl.plugin_instance, dev_name, sizeof(vl.plugin_instance));
-    counter_name = DPDK_STATS_XSTAT_GET_NAME(g_configuration, count + j);
-    if (counter_name == NULL) {
-      WARNING("dpdkstat: Failed to get counter name.");
-      return;
-    }
+static int dpdk_stats_reinit_helper() {
+  DPDK_STATS_TRACE();
 
-    type_end = strrchr(counter_name, '_');
-
-    if ((type_end != NULL) &&
-        (strncmp(counter_name, "rx_", strlen("rx_")) == 0)) {
-      if (strstr(type_end, "bytes") != NULL) {
-        sstrncpy(vl.type, "if_rx_octets", sizeof(vl.type));
-      } else if (strstr(type_end, "error") != NULL) {
-        sstrncpy(vl.type, "if_rx_errors", sizeof(vl.type));
-      } else if (strstr(type_end, "dropped") != NULL) {
-        sstrncpy(vl.type, "if_rx_dropped", sizeof(vl.type));
-      } else if (strstr(type_end, "packets") != NULL) {
-        sstrncpy(vl.type, "if_rx_packets", sizeof(vl.type));
-      } else if (strstr(type_end, "_placement") != NULL) {
-        sstrncpy(vl.type, "if_rx_errors", sizeof(vl.type));
-      } else if (strstr(type_end, "_buff") != NULL) {
-        sstrncpy(vl.type, "if_rx_errors", sizeof(vl.type));
-      } else {
-        /* Does not fit obvious type: use a more generic one */
-        sstrncpy(vl.type, "derive", sizeof(vl.type));
-      }
-
-    } else if ((type_end != NULL) &&
-               (strncmp(counter_name, "tx_", strlen("tx_"))) == 0) {
-      if (strstr(type_end, "bytes") != NULL) {
-        sstrncpy(vl.type, "if_tx_octets", sizeof(vl.type));
-      } else if (strstr(type_end, "error") != NULL) {
-        sstrncpy(vl.type, "if_tx_errors", sizeof(vl.type));
-      } else if (strstr(type_end, "dropped") != NULL) {
-        sstrncpy(vl.type, "if_tx_dropped", sizeof(vl.type));
-      } else if (strstr(type_end, "packets") != NULL) {
-        sstrncpy(vl.type, "if_tx_packets", sizeof(vl.type));
-      } else {
-        /* Does not fit obvious type: use a more generic one */
-        sstrncpy(vl.type, "derive", sizeof(vl.type));
-      }
-    } else if ((type_end != NULL) &&
-               (strncmp(counter_name, "flow_", strlen("flow_"))) == 0) {
-
-      if (strstr(type_end, "_filters") != NULL) {
-        sstrncpy(vl.type, "operations", sizeof(vl.type));
-      } else if (strstr(type_end, "error") != NULL)
-        sstrncpy(vl.type, "errors", sizeof(vl.type));
-
-    } else if ((type_end != NULL) &&
-               (strncmp(counter_name, "mac_", strlen("mac_"))) == 0) {
-      if (strstr(type_end, "error") != NULL) {
-        sstrncpy(vl.type, "errors", sizeof(vl.type));
-      }
-    } else {
-      /* Does not fit obvious type, or strrchr error:
-       *   use a more generic type */
-      sstrncpy(vl.type, "derive", sizeof(vl.type));
-    }
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc);
 
-    sstrncpy(vl.type_instance, counter_name, sizeof(vl.type_instance));
-    plugin_dispatch_values(&vl);
-  }
-}
+  size_t data_size = sizeof(dpdk_stats_ctx_t) +
+                     (ctx->stats_count * DPDK_STATS_CTX_GET_XSTAT_SIZE);
 
-static int dpdk_read(user_data_t *ud) {
-  int ret = 0;
+  DEBUG("%s:%d helper reinit (new_size=%zu)", __FUNCTION__, __LINE__,
+        data_size);
 
-  /*
-   * Check if SHM flag is set to be re-initialized. AKA DPDK ports have been
-   * counted, so re-init SHM to be large enough to fit all the statistics.
-   */
-  if (g_configuration->collectd_reinit_shm) {
-    DEBUG("dpdkstat: read() now reinit SHM then launching send-thread");
-    dpdk_re_init_shm();
-  }
+  dpdk_stats_ctx_t tmp_ctx;
+  dpdk_eal_config_t tmp_eal;
 
-  /*
-   * Check if DPDK proc is alive, and has already counted port / stats. This
-   * must be done in dpdk_read(), because the DPDK primary process may not be
-   * alive at dpdk_init() time.
-   */
-  if (g_configuration->helper_status == DPDK_HELPER_NOT_INITIALIZED ||
-      g_configuration->helper_status == DPDK_HELPER_GRACEFUL_QUIT) {
-    int action = DPDK_HELPER_ACTION_SEND_STATS;
-    if (g_configuration->num_xstats == 0)
-      action = DPDK_HELPER_ACTION_COUNT_STATS;
-    /* Spawn the helper thread to count stats or to read stats. */
-    int err = dpdk_helper_spawn(action);
-    if (err) {
-      char errbuf[ERR_BUF_SIZE];
-      ERROR("dpdkstat: error spawning helper %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-      return -1;
-    }
-  }
+  memcpy(&tmp_ctx, ctx, sizeof(dpdk_stats_ctx_t));
+  dpdk_helper_eal_config_get(g_hc, &tmp_eal);
 
-  pid_t ws = waitpid(g_configuration->helper_pid, NULL, WNOHANG);
-  /*
-   * Conditions under which to respawn helper:
-   *  waitpid() fails, helper process died (or quit), so respawn
-   */
-  _Bool respawn_helper = 0;
-  if (ws != 0) {
-    respawn_helper = 1;
-  }
+  dpdk_helper_shutdown(g_hc);
 
-  char buf[DPDKSTAT_MAX_BUFFER_SIZE];
-  char out[DPDKSTAT_MAX_BUFFER_SIZE];
+  g_hc = NULL;
 
-  /* non blocking check on helper logging pipe */
-  struct pollfd fds = {
-      .fd = g_configuration->helper_pipes[0], .events = POLLIN,
-  };
-  int data_avail = poll(&fds, 1, 0);
-  if (data_avail < 0) {
+  int ret;
+  ret = dpdk_helper_init(g_shm_name, data_size, &g_hc);
+  if (ret != 0) {
     char errbuf[ERR_BUF_SIZE];
-    if (errno != EINTR || errno != EAGAIN)
-      ERROR("dpdkstats: poll(2) failed: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-  }
-  while (data_avail) {
-    int nbytes = read(g_configuration->helper_pipes[0], buf, sizeof(buf));
-    if (nbytes <= 0)
-      break;
-    ssnprintf(out, nbytes, "%s", buf);
-    DEBUG("dpdkstat: helper-proc: %s", out);
+    ERROR("%s: failed to initialize %s helper(error: %s)", DPDK_STATS_PLUGIN,
+          g_shm_name, sstrerror(errno, errbuf, sizeof(errbuf)));
+    return ret;
   }
 
-  if (respawn_helper) {
-    if (g_configuration->helper_pid)
-      dpdk_helper_stop(RESET);
-    dpdk_helper_spawn(DPDK_HELPER_ACTION_COUNT_STATS);
+  ctx = DPDK_STATS_CTX_GET(g_hc);
+  memcpy(ctx, &tmp_ctx, sizeof(dpdk_stats_ctx_t));
+  DPDK_STATS_CTX_INIT(ctx);
+  dpdk_helper_eal_config_set(g_hc, &tmp_eal);
+
+  return ret;
+}
+
+static int dpdk_stats_read(user_data_t *ud) {
+  DPDK_STATS_TRACE();
+
+  int ret = 0;
+
+  if (g_hc == NULL) {
+    ERROR("dpdk stats plugin not initialized");
+    return -EINVAL;
   }
 
-  /* Kick helper process through SHM */
-  sem_post(&g_configuration->sema_helper_get_stats);
+  dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc);
 
-  cdtime_t now = cdtime();
-  ret = sem_timedwait(&g_configuration->sema_stats_in_shm,
-                      &CDTIME_T_TO_TIMESPEC(now + g_configuration->interval));
-  if (ret == -1) {
-    if (errno == ETIMEDOUT)
-      DEBUG(
-          "dpdkstat: timeout in collectd thread: is a DPDK Primary running? ");
+  int result = 0;
+  ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_STATS, &result,
+                            ctx->config.interval);
+  if (ret != 0) {
     return 0;
   }
 
-  /* Dispatch the stats.*/
-  uint32_t count = 0, port_num = 0;
-
-  for (uint32_t i = 0; i < g_configuration->num_ports; i++) {
-    char dev_name[64];
-    cdtime_t port_read_time = g_configuration->port_read_time[i];
-    uint32_t counters_num = g_configuration->num_stats_in_port[i];
-    size_t ports_max = CHAR_BIT * sizeof(g_configuration->enabled_port_mask);
-    for (size_t j = port_num; j < ports_max; j++) {
-      if ((g_configuration->enabled_port_mask & (1 << j)) != 0)
-        break;
-      port_num++;
-    }
+  if (result == -ENOBUFS) {
+    dpdk_stats_reinit_helper();
+  } else if (result == -ENODEV) {
+    dpdk_helper_shutdown(g_hc);
+  } else if (result == 0) {
+    dpdk_stats_counters_dispatch(g_hc);
+  }
 
-    if (g_configuration->port_name[i][0] != 0)
-      ssnprintf(dev_name, sizeof(dev_name), "%s",
-                g_configuration->port_name[i]);
-    else
-      ssnprintf(dev_name, sizeof(dev_name), "port.%" PRIu32, port_num);
-    dpdk_submit_xstats(dev_name, count, counters_num, port_read_time);
-    count += counters_num;
-    port_num++;
-  } /* for each port */
   return 0;
 }
 
-static int dpdk_shm_cleanup(void) {
-  int ret = munmap(g_configuration, sizeof(dpdk_config_t));
-  g_configuration = 0;
-  if (ret) {
-    ERROR("dpdkstat: munmap returned %d", ret);
-    return ret;
-  }
-  ret = shm_unlink(DPDK_SHM_NAME);
-  if (ret) {
-    ERROR("dpdkstat: shm_unlink returned %d", ret);
+static int dpdk_stats_init(void) {
+  DPDK_STATS_TRACE();
+  int ret = 0;
+
+  ret = dpdk_stats_preinit();
+  if (ret != 0) {
     return ret;
   }
+
   return 0;
 }
 
-static int dpdk_shutdown(void) {
+static int dpdk_stats_shutdown(void) {
+  DPDK_STATS_TRACE();
+
   int ret = 0;
-  char errbuf[ERR_BUF_SIZE];
-  close(g_configuration->helper_pipes[1]);
-  int err = kill(g_configuration->helper_pid, SIGKILL);
-  if (err) {
-    ERROR("dpdkstat: error sending sigkill to helper %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    ret = -1;
-  }
-  err = dpdk_shm_cleanup();
-  if (err) {
-    ERROR("dpdkstat: error cleaning up SHM: %s",
-          sstrerror(errno, errbuf, sizeof(errbuf)));
-    ret = -1;
+
+  ret = dpdk_helper_shutdown(g_hc);
+  g_hc = NULL;
+  if (ret != 0) {
+    ERROR("%s: failed to cleanup %s helper", DPDK_STATS_PLUGIN, g_shm_name);
+    return ret;
   }
 
   return ret;
 }
 
 void module_register(void) {
-  plugin_register_complex_config("dpdkstat", dpdk_config);
-  plugin_register_init("dpdkstat", dpdk_init);
-  plugin_register_complex_read(NULL, "dpdkstat", dpdk_read, 0, NULL);
-  plugin_register_shutdown("dpdkstat", dpdk_shutdown);
+  plugin_register_init(DPDK_STATS_PLUGIN, dpdk_stats_init);
+  plugin_register_complex_config(DPDK_STATS_PLUGIN, dpdk_stats_config);
+  plugin_register_complex_read(NULL, DPDK_STATS_PLUGIN, dpdk_stats_read, 0,
+                               NULL);
+  plugin_register_shutdown(DPDK_STATS_PLUGIN, dpdk_stats_shutdown);
 }
index 2ee1656..97a4f03 100644 (file)
@@ -57,7 +57,7 @@ static const char *drbd_names[] = {
 };
 static size_t drbd_names_num = STATIC_ARRAY_SIZE(drbd_names);
 
-static int drbd_init(void) { return (0); }
+static int drbd_init(void) { return 0; }
 
 static int drbd_submit_fields(long int resource, char **fields,
                               size_t fields_num) {
@@ -67,14 +67,14 @@ static int drbd_submit_fields(long int resource, char **fields,
 
   if (resource < 0) {
     WARNING("drbd plugin: Unable to parse resource");
-    return (EINVAL);
+    return EINVAL;
   }
 
   if (fields_num != drbd_names_num) {
     WARNING("drbd plugin: Wrong number of fields for "
             "r%ld statistics. Expected %zu, got %zu.",
             resource, drbd_names_num, fields_num);
-    return (EINVAL);
+    return EINVAL;
   }
 
   ssnprintf(plugin_instance, sizeof(plugin_instance), "r%ld", resource);
@@ -86,7 +86,7 @@ static int drbd_submit_fields(long int resource, char **fields,
       continue;
     data = strchr(fields[i], ':');
     if (data == NULL)
-      return (EINVAL);
+      return EINVAL;
     (void)parse_value(++data, &values[i], DS_TYPE_DERIVE);
   }
 
@@ -103,7 +103,7 @@ static int drbd_submit_fields(long int resource, char **fields,
     plugin_dispatch_values(&vl);
   }
 
-  return (0);
+  return 0;
 } /* drbd_submit_fields */
 
 static int drbd_read(void) {
@@ -117,7 +117,7 @@ static int drbd_read(void) {
   fh = fopen(drbd_stats, "r");
   if (fh == NULL) {
     WARNING("drbd plugin: Unable to open %s", drbd_stats);
-    return (EINVAL);
+    return EINVAL;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -142,7 +142,7 @@ static int drbd_read(void) {
   } /* while (fgets) */
 
   fclose(fh);
-  return (0);
+  return 0;
 } /* void drbd_read */
 
 void module_register(void) {
index 50f7662..e5f015b 100644 (file)
@@ -159,18 +159,18 @@ static type_list_t list_check_copy;
  * Private functions
  */
 static int email_config(const char *key, const char *value) {
-  if (0 == strcasecmp(key, "SocketFile")) {
-    if (NULL != sock_file)
+  if (strcasecmp(key, "SocketFile") == 0) {
+    if (sock_file != NULL)
       free(sock_file);
     sock_file = sstrdup(value);
-  } else if (0 == strcasecmp(key, "SocketGroup")) {
-    if (NULL != sock_group)
+  } else if (strcasecmp(key, "SocketGroup") == 0) {
+    if (sock_group != NULL)
       free(sock_group);
     sock_group = sstrdup(value);
-  } else if (0 == strcasecmp(key, "SocketPerms")) {
+  } else if (strcasecmp(key, "SocketPerms") == 0) {
     /* the user is responsible for providing reasonable values */
     sock_perms = (int)strtol(value, NULL, 8);
-  } else if (0 == strcasecmp(key, "MaxConns")) {
+  } else if (strcasecmp(key, "MaxConns") == 0) {
     long int tmp = strtol(value, NULL, 0);
 
     if (tmp < 1) {
@@ -200,7 +200,7 @@ static int email_config(const char *key, const char *value) {
 
 /* Increment the value of the given name in the given list by incr. */
 static void type_list_incr(type_list_t *list, char *name, int incr) {
-  if (NULL == list->head) {
+  if (list->head == NULL) {
     list->head = smalloc(sizeof(*list->head));
 
     list->head->name = sstrdup(name);
@@ -212,11 +212,11 @@ static void type_list_incr(type_list_t *list, char *name, int incr) {
     type_t *ptr;
 
     for (ptr = list->head; NULL != ptr; ptr = ptr->next) {
-      if (0 == strcmp(name, ptr->name))
+      if (strcmp(name, ptr->name) == 0)
         break;
     }
 
-    if (NULL == ptr) {
+    if (ptr == NULL) {
       list->tail->next = smalloc(sizeof(*list->tail->next));
       list->tail = list->tail->next;
 
@@ -238,14 +238,14 @@ static void *collect(void *arg) {
 
     pthread_mutex_lock(&conns_mutex);
 
-    while (NULL == conns.head) {
+    while (conns.head == NULL) {
       pthread_cond_wait(&conn_available, &conns_mutex);
     }
 
     connection = conns.head;
     conns.head = conns.head->next;
 
-    if (NULL == conns.head) {
+    if (conns.head == NULL) {
       conns.tail = NULL;
     }
 
@@ -263,8 +263,8 @@ static void *collect(void *arg) {
       int len = 0;
 
       errno = 0;
-      if (NULL == fgets(line, sizeof(line), this->socket)) {
-        if (0 != errno) {
+      if (fgets(line, sizeof(line), this->socket) == NULL) {
+        if (errno != 0) {
           char errbuf[1024];
           log_err("collect: reading from socket (fd #%i) "
                   "failed: %s",
@@ -275,13 +275,13 @@ static void *collect(void *arg) {
       }
 
       len = strlen(line);
-      if (('\n' != line[len - 1]) && ('\r' != line[len - 1])) {
+      if ((line[len - 1] != '\n') && (line[len - 1] != '\r')) {
         log_warn("collect: line too long (> %zu characters): "
                  "'%s' (truncated)",
                  sizeof(line) - 1, line);
 
-        while (NULL != fgets(line, sizeof(line), this->socket))
-          if (('\n' == line[len - 1]) || ('\r' == line[len - 1]))
+        while (fgets(line, sizeof(line), this->socket) != NULL)
+          if ((line[len - 1] == '\n') || (line[len - 1] == '\r'))
             break;
         continue;
       }
@@ -293,18 +293,18 @@ static void *collect(void *arg) {
 
       log_debug("collect: line = '%s'", line);
 
-      if (':' != line[1]) {
+      if (line[1] != ':') {
         log_err("collect: syntax error in line '%s'", line);
         continue;
       }
 
-      if ('e' == line[0]) { /* e:<type>:<bytes> */
+      if (line[0] == 'e') { /* e:<type>:<bytes> */
         char *ptr = NULL;
         char *type = strtok_r(line + 2, ":", &ptr);
         char *tmp = strtok_r(NULL, ":", &ptr);
         int bytes = 0;
 
-        if (NULL == tmp) {
+        if (tmp == NULL) {
           log_err("collect: syntax error in line '%s'", line);
           continue;
         }
@@ -320,13 +320,13 @@ static void *collect(void *arg) {
           type_list_incr(&list_size, type, /* increment = */ bytes);
           pthread_mutex_unlock(&size_mutex);
         }
-      } else if ('s' == line[0]) { /* s:<value> */
+      } else if (line[0] == 's') { /* s:<value> */
         pthread_mutex_lock(&score_mutex);
         score = (score * (double)score_count + atof(line + 2)) /
                 (double)(score_count + 1);
         ++score_count;
         pthread_mutex_unlock(&score_mutex);
-      } else if ('c' == line[0]) { /* c:<type1>[,<type2>,...] */
+      } else if (line[0] == 'c') { /* c:<type1>[,<type2>,...] */
         char *dummy = line + 2;
         char *endptr = NULL;
         char *type;
@@ -357,7 +357,7 @@ static void *collect(void *arg) {
   } /* while (1) */
 
   pthread_exit((void *)0);
-  return ((void *)0);
+  return (void *)0;
 } /* static void *collect (void *) */
 
 static void *open_connection(void __attribute__((unused)) * arg) {
@@ -366,7 +366,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
 
   /* create UNIX socket */
   errno = 0;
-  if (-1 == (connector_socket = socket(PF_UNIX, SOCK_STREAM, 0))) {
+  if ((connector_socket = socket(PF_UNIX, SOCK_STREAM, 0)) == -1) {
     char errbuf[1024];
     disabled = 1;
     log_err("socket() failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
@@ -379,9 +379,8 @@ static void *open_connection(void __attribute__((unused)) * arg) {
   sstrncpy(addr.sun_path, path, (size_t)(UNIX_PATH_MAX - 1));
 
   errno = 0;
-  if (-1 ==
-      bind(connector_socket, (struct sockaddr *)&addr,
-           offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path))) {
+  if (bind(connector_socket, (struct sockaddr *)&addr,
+           offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path)) == -1) {
     char errbuf[1024];
     disabled = 1;
     close(connector_socket);
@@ -391,7 +390,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
   }
 
   errno = 0;
-  if (-1 == listen(connector_socket, 5)) {
+  if (listen(connector_socket, 5) == -1) {
     char errbuf[1024];
     disabled = 1;
     close(connector_socket);
@@ -425,7 +424,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
   }
 
   errno = 0;
-  if (0 != chmod(path, sock_perms)) {
+  if (chmod(path, sock_perms) != 0) {
     char errbuf[1024];
     log_warn("chmod() failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
   }
@@ -466,7 +465,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
 
     pthread_mutex_lock(&available_mutex);
 
-    while (0 == available_collectors) {
+    while (available_collectors == 0) {
       pthread_cond_wait(&collector_available, &available_mutex);
     }
 
@@ -505,7 +504,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
     connection->socket = fdopen(remote, "r");
     connection->next = NULL;
 
-    if (NULL == connection->socket) {
+    if (connection->socket == NULL) {
       close(remote);
       sfree(connection);
       continue;
@@ -513,7 +512,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
 
     pthread_mutex_lock(&conns_mutex);
 
-    if (NULL == conns.head) {
+    if (conns.head == NULL) {
       conns.head = connection;
       conns.tail = connection;
     } else {
@@ -527,7 +526,7 @@ static void *open_connection(void __attribute__((unused)) * arg) {
   }
 
   pthread_exit((void *)0);
-  return ((void *)0);
+  return (void *)0;
 } /* static void *open_connection (void *) */
 
 static int email_init(void) {
@@ -537,10 +536,10 @@ static int email_init(void) {
     disabled = 1;
     log_err("plugin_thread_create() failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int email_init */
 
 static void type_list_free(type_list_t *t) {
@@ -605,11 +604,11 @@ static int email_shutdown(void) {
   type_list_free(&list_check);
   type_list_free(&list_check_copy);
 
-  unlink((NULL == sock_file) ? SOCK_PATH : sock_file);
+  unlink((sock_file == NULL) ? SOCK_PATH : sock_file);
 
   sfree(sock_file);
   sfree(sock_group);
-  return (0);
+  return 0;
 } /* static void email_shutdown (void) */
 
 static void email_submit(const char *type, const char *type_instance,
@@ -632,14 +631,14 @@ static void email_submit(const char *type, const char *type_instance,
 static void copy_type_list(type_list_t *l1, type_list_t *l2) {
   type_t *last = NULL;
 
-  for (type_t *ptr1 = l1->head, *ptr2 = l2->head; NULL != ptr1;
+  for (type_t *ptr1 = l1->head, *ptr2 = l2->head; ptr1 != NULL;
        ptr1 = ptr1->next, last = ptr2, ptr2 = ptr2->next) {
-    if (NULL == ptr2) {
+    if (ptr2 == NULL) {
       ptr2 = smalloc(sizeof(*ptr2));
       ptr2->name = NULL;
       ptr2->next = NULL;
 
-      if (NULL == last) {
+      if (last == NULL) {
         l2->head = ptr2;
       } else {
         last->next = ptr2;
@@ -648,7 +647,7 @@ static void copy_type_list(type_list_t *l1, type_list_t *l2) {
       l2->tail = ptr2;
     }
 
-    if (NULL == ptr2->name) {
+    if (ptr2->name == NULL) {
       ptr2->name = sstrdup(ptr1->name);
     }
 
@@ -663,7 +662,7 @@ static int email_read(void) {
   int score_count_old;
 
   if (disabled)
-    return (-1);
+    return -1;
 
   /* email count */
   pthread_mutex_lock(&count_mutex);
@@ -672,7 +671,7 @@ static int email_read(void) {
 
   pthread_mutex_unlock(&count_mutex);
 
-  for (type_t *ptr = list_count_copy.head; NULL != ptr; ptr = ptr->next) {
+  for (type_t *ptr = list_count_copy.head; ptr != NULL; ptr = ptr->next) {
     email_submit("email_count", ptr->name, ptr->value);
   }
 
@@ -683,7 +682,7 @@ static int email_read(void) {
 
   pthread_mutex_unlock(&size_mutex);
 
-  for (type_t *ptr = list_size_copy.head; NULL != ptr; ptr = ptr->next) {
+  for (type_t *ptr = list_size_copy.head; ptr != NULL; ptr = ptr->next) {
     email_submit("email_size", ptr->name, ptr->value);
   }
 
@@ -707,10 +706,10 @@ static int email_read(void) {
 
   pthread_mutex_unlock(&check_mutex);
 
-  for (type_t *ptr = list_check_copy.head; NULL != ptr; ptr = ptr->next)
+  for (type_t *ptr = list_check_copy.head; ptr != NULL; ptr = ptr->next)
     email_submit("spam_check", ptr->name, ptr->value);
 
-  return (0);
+  return 0;
 } /* int email_read */
 
 void module_register(void) {
@@ -719,5 +718,3 @@ void module_register(void) {
   plugin_register_read("email", email_read);
   plugin_register_shutdown("email", email_shutdown);
 } /* void module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index de35291..c7b5b3f 100644 (file)
@@ -50,11 +50,11 @@ static int entropy_read(void) {
   value_t v;
   if (parse_value_file(ENTROPY_FILE, &v, DS_TYPE_GAUGE) != 0) {
     ERROR("entropy plugin: Reading \"" ENTROPY_FILE "\" failed.");
-    return (-1);
+    return -1;
   }
 
   entropy_submit(v);
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index bd55252..3c03e36 100644 (file)
@@ -62,19 +62,19 @@ static int ethstat_add_interface(const oconfig_item_t *ci) /* {{{ */
 
   tmp = realloc(interfaces, sizeof(*interfaces) * (interfaces_num + 1));
   if (tmp == NULL)
-    return (-1);
+    return -1;
   interfaces = tmp;
   interfaces[interfaces_num] = NULL;
 
   status = cf_util_get_string(ci, interfaces + interfaces_num);
   if (status != 0)
-    return (status);
+    return status;
 
   interfaces_num++;
   INFO("ethstat plugin: Registered interface %s",
        interfaces[interfaces_num - 1]);
 
-  return (0);
+  return 0;
 } /* }}} int ethstat_add_interface */
 
 static int ethstat_add_map(const oconfig_item_t *ci) /* {{{ */
@@ -90,20 +90,20 @@ static int ethstat_add_map(const oconfig_item_t *ci) /* {{{ */
     ERROR("ethstat plugin: The %s option requires "
           "two or three string arguments.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   key = strdup(ci->values[0].value.string);
   if (key == NULL) {
     ERROR("ethstat plugin: strdup(3) failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   map = calloc(1, sizeof(*map));
   if (map == NULL) {
     sfree(key);
     ERROR("ethstat plugin: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   sstrncpy(map->type, ci->values[1].value.string, sizeof(map->type));
@@ -117,7 +117,7 @@ static int ethstat_add_map(const oconfig_item_t *ci) /* {{{ */
       sfree(map);
       sfree(key);
       ERROR("ethstat plugin: c_avl_create() failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -132,10 +132,10 @@ static int ethstat_add_map(const oconfig_item_t *ci) /* {{{ */
 
     sfree(map);
     sfree(key);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ethstat_add_map */
 
 static int ethstat_config(oconfig_item_t *ci) /* {{{ */
@@ -154,7 +154,7 @@ static int ethstat_config(oconfig_item_t *ci) /* {{{ */
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} */
 
 static void ethstat_submit_value(const char *device, const char *type_instance,
@@ -223,14 +223,14 @@ static int ethstat_read_interface(char *device) {
     ERROR("ethstat plugin: Failed to get driver information "
           "from %s: %s",
           device, sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   n_stats = (size_t)drvinfo.n_stats;
   if (n_stats < 1) {
     close(fd);
     ERROR("ethstat plugin: No stats available for %s", device);
-    return (-1);
+    return -1;
   }
 
   strings_size = sizeof(struct ethtool_gstrings) + (n_stats * ETH_GSTRING_LEN);
@@ -243,7 +243,7 @@ static int ethstat_read_interface(char *device) {
     sfree(strings);
     sfree(stats);
     ERROR("ethstat plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   strings->cmd = ETHTOOL_GSTRINGS;
@@ -258,7 +258,7 @@ static int ethstat_read_interface(char *device) {
     free(stats);
     ERROR("ethstat plugin: Cannot get strings from %s: %s", device,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   stats->cmd = ETHTOOL_GSTATS;
@@ -272,7 +272,7 @@ static int ethstat_read_interface(char *device) {
     free(stats);
     ERROR("ethstat plugin: Reading statistics from %s failed: %s", device,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < n_stats; i++) {
@@ -292,7 +292,7 @@ static int ethstat_read_interface(char *device) {
   sfree(strings);
   sfree(stats);
 
-  return (0);
+  return 0;
 } /* }}} ethstat_read_interface */
 
 static int ethstat_read(void) {
@@ -307,7 +307,7 @@ static int ethstat_shutdown(void) {
   void *value = NULL;
 
   if (value_map == NULL)
-    return (0);
+    return 0;
 
   while (c_avl_pick(value_map, &key, &value) == 0) {
     sfree(key);
@@ -317,7 +317,7 @@ static int ethstat_shutdown(void) {
   c_avl_destroy(value_map);
   value_map = NULL;
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -325,5 +325,3 @@ void module_register(void) {
   plugin_register_read("ethstat", ethstat_read);
   plugin_register_shutdown("ethstat", ethstat_shutdown);
 }
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 28380ac..3d12a2d 100644 (file)
@@ -108,26 +108,26 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
 
   if (ci->children_num != 0) {
     WARNING("exec plugin: The config option `%s' may not be a block.", ci->key);
-    return (-1);
+    return -1;
   }
   if (ci->values_num < 2) {
     WARNING("exec plugin: The config option `%s' needs at least two "
             "arguments.",
             ci->key);
-    return (-1);
+    return -1;
   }
   if ((ci->values[0].type != OCONFIG_TYPE_STRING) ||
       (ci->values[1].type != OCONFIG_TYPE_STRING)) {
     WARNING("exec plugin: The first two arguments to the `%s' option must "
             "be string arguments.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   pl = calloc(1, sizeof(*pl));
   if (pl == NULL) {
     ERROR("exec plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp("NotificationExec", ci->key) == 0)
@@ -139,7 +139,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
   if (pl->user == NULL) {
     ERROR("exec plugin: strdup failed.");
     sfree(pl);
-    return (-1);
+    return -1;
   }
 
   pl->group = strchr(pl->user, ':');
@@ -153,7 +153,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
     ERROR("exec plugin: strdup failed.");
     sfree(pl->user);
     sfree(pl);
-    return (-1);
+    return -1;
   }
 
   pl->argv = calloc(ci->values_num, sizeof(*pl->argv));
@@ -162,7 +162,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
     sfree(pl->exec);
     sfree(pl->user);
     sfree(pl);
-    return (-1);
+    return -1;
   }
 
   {
@@ -179,7 +179,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
     sfree(pl->exec);
     sfree(pl->user);
     sfree(pl);
-    return (-1);
+    return -1;
   }
 
   for (i = 1; i < (ci->values_num - 1); i++) {
@@ -213,7 +213,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
     sfree(pl->exec);
     sfree(pl->user);
     sfree(pl);
-    return (-1);
+    return -1;
   }
 
   for (i = 0; pl->argv[i] != NULL; i++) {
@@ -223,7 +223,7 @@ static int exec_config_exec(oconfig_item_t *ci) /* {{{ */
   pl->next = pl_head;
   pl_head = pl;
 
-  return (0);
+  return 0;
 } /* int exec_config_exec }}} */
 
 static int exec_config(oconfig_item_t *ci) /* {{{ */
@@ -238,7 +238,7 @@ static int exec_config(oconfig_item_t *ci) /* {{{ */
     }
   } /* for (i) */
 
-  return (0);
+  return 0;
 } /* int exec_config }}} */
 
 static void set_environment(void) /* {{{ */
@@ -332,7 +332,7 @@ static int create_pipe(int fd_pipe[2]) /* {{{ */
   if (status != 0) {
     ERROR("exec plugin: pipe failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   return 0;
@@ -372,7 +372,7 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out,
   char nambuf[4096];
 
   if (pl->pid != 0)
-    return (-1);
+    return -1;
 
   if ((create_pipe(fd_pipe_in) == -1) || (create_pipe(fd_pipe_out) == -1) ||
       (create_pipe(fd_pipe_err) == -1))
@@ -401,19 +401,19 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out,
   /* The group configured in the configfile is set as effective group, because
    * this way the forked process can (re-)gain the user's primary group. */
   egid = -1;
-  if (NULL != pl->group) {
-    if ('\0' != *pl->group) {
+  if (pl->group != NULL) {
+    if (*pl->group != '\0') {
       struct group *gr_ptr = NULL;
       struct group gr;
 
       status = getgrnam_r(pl->group, &gr, nambuf, sizeof(nambuf), &gr_ptr);
-      if (0 != status) {
+      if (status != 0) {
         ERROR("exec plugin: Failed to get group information "
               "for group ``%s'': %s",
               pl->group, sstrerror(status, errbuf, sizeof(errbuf)));
         goto failed;
       }
-      if (NULL == gr_ptr) {
+      if (gr_ptr == NULL) {
         ERROR("exec plugin: No such group: `%s'", pl->group);
         goto failed;
       }
@@ -487,26 +487,26 @@ static int fork_child(program_list_t *pl, int *fd_in, int *fd_out,
   else
     close(fd_pipe_err[0]);
 
-  return (pid);
+  return pid;
 
 failed:
   close_pipe(fd_pipe_in);
   close_pipe(fd_pipe_out);
   close_pipe(fd_pipe_err);
 
-  return (-1);
+  return -1;
 } /* int fork_child }}} */
 
 static int parse_line(char *buffer) /* {{{ */
 {
   if (strncasecmp("PUTVAL", buffer, strlen("PUTVAL")) == 0)
-    return (cmd_handle_putval(stdout, buffer));
+    return cmd_handle_putval(stdout, buffer);
   else if (strncasecmp("PUTNOTIF", buffer, strlen("PUTNOTIF")) == 0)
-    return (handle_putnotif(stdout, buffer));
+    return handle_putnotif(stdout, buffer);
   else {
     ERROR("exec plugin: Unable to parse command, ignoring line: \"%s\"",
           buffer);
-    return (-1);
+    return -1;
   }
 } /* int parse_line }}} */
 
@@ -655,7 +655,7 @@ static void *exec_read_one(void *arg) /* {{{ */
     close(fd_err);
 
   pthread_exit((void *)0);
-  return (NULL);
+  return NULL;
 } /* void *exec_read_one }}} */
 
 static void *exec_notification_one(void *arg) /* {{{ */
@@ -737,7 +737,7 @@ static void *exec_notification_one(void *arg) /* {{{ */
   n->meta = NULL;
   sfree(arg);
   pthread_exit((void *)0);
-  return (NULL);
+  return NULL;
 } /* void *exec_notification_one }}} */
 
 static int exec_init(void) /* {{{ */
@@ -763,7 +763,7 @@ static int exec_init(void) /* {{{ */
   }
 #endif
 
-  return (0);
+  return 0;
 } /* int exec_init }}} */
 
 static int exec_read(void) /* {{{ */
@@ -791,7 +791,7 @@ static int exec_read(void) /* {{{ */
     pthread_attr_destroy(&attr);
   } /* for (pl) */
 
-  return (0);
+  return 0;
 } /* int exec_read }}} */
 
 static int exec_notification(const notification_t *n, /* {{{ */
@@ -831,7 +831,7 @@ static int exec_notification(const notification_t *n, /* {{{ */
     pthread_attr_destroy(&attr);
   } /* for (pl) */
 
-  return (0);
+  return 0;
 } /* }}} int exec_notification */
 
 static int exec_shutdown(void) /* {{{ */
@@ -855,7 +855,7 @@ static int exec_shutdown(void) /* {{{ */
   } /* while (pl) */
   pl_head = NULL;
 
-  return (0);
+  return 0;
 } /* int exec_shutdown }}} */
 
 void module_register(void) {
@@ -866,7 +866,3 @@ void module_register(void) {
                                /* user_data = */ NULL);
   plugin_register_shutdown("exec", exec_shutdown);
 } /* void module_register */
-
-/*
- * vim:shiftwidth=2:softtabstop=2:tabstop=8:fdm=marker
- */
index 9210783..3611530 100644 (file)
@@ -49,7 +49,7 @@ static int fhcount_config(const char *key, const char *value) {
     ret = 0;
   }
 
-  return (ret);
+  return ret;
 }
 
 static void fhcount_submit(const char *type, const char *type_instance,
@@ -82,12 +82,12 @@ static int fhcount_read(void) {
   fp = fopen("/proc/sys/fs/file-nr", "r");
   if (fp == NULL) {
     ERROR("fhcount: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (EXIT_FAILURE);
+    return EXIT_FAILURE;
   }
   if (fgets(buffer, buffer_len, fp) == NULL) {
     ERROR("fhcount: fgets: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
     fclose(fp);
-    return (EXIT_FAILURE);
+    return EXIT_FAILURE;
   }
   fclose(fp);
 
@@ -96,7 +96,7 @@ static int fhcount_read(void) {
 
   if (numfields != 3) {
     ERROR("fhcount: Line doesn't contain 3 fields");
-    return (EXIT_FAILURE);
+    return EXIT_FAILURE;
   }
 
   // Define the values
@@ -117,7 +117,7 @@ static int fhcount_read(void) {
     fhcount_submit("percent", "unused", (gauge_t)prc_unused);
   }
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index a78b880..7eb5104 100644 (file)
@@ -105,16 +105,16 @@ static int fc_config_set_instance(fc_directory_conf_t *dir, const char *str) {
     /* do nothing */;
 
   if (*ptr == 0)
-    return (-1);
+    return -1;
 
   copy = strdup(ptr);
   if (copy == NULL)
-    return (-1);
+    return -1;
 
   sfree(dir->instance);
   dir->instance = copy;
 
-  return (0);
+  return 0;
 } /* int fc_config_set_instance */
 
 static int fc_config_add_dir_instance(fc_directory_conf_t *dir,
@@ -122,10 +122,10 @@ static int fc_config_add_dir_instance(fc_directory_conf_t *dir,
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("filecount plugin: The `Instance' config option needs exactly "
             "one string argument.");
-    return (-1);
+    return -1;
   }
 
-  return (fc_config_set_instance(dir, ci->values[0].value.string));
+  return fc_config_set_instance(dir, ci->values[0].value.string);
 } /* int fc_config_add_dir_instance */
 
 static int fc_config_add_dir_name(fc_directory_conf_t *dir,
@@ -135,19 +135,19 @@ static int fc_config_add_dir_name(fc_directory_conf_t *dir,
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("filecount plugin: The `Name' config option needs exactly one "
             "string argument.");
-    return (-1);
+    return -1;
   }
 
   temp = strdup(ci->values[0].value.string);
   if (temp == NULL) {
     ERROR("filecount plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   sfree(dir->name);
   dir->name = temp;
 
-  return (0);
+  return 0;
 } /* int fc_config_add_dir_name */
 
 static int fc_config_add_dir_mtime(fc_directory_conf_t *dir,
@@ -159,12 +159,12 @@ static int fc_config_add_dir_mtime(fc_directory_conf_t *dir,
                                 (ci->values[0].type != OCONFIG_TYPE_NUMBER))) {
     WARNING("filecount plugin: The `MTime' config option needs exactly one "
             "string or numeric argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].type == OCONFIG_TYPE_NUMBER) {
     dir->mtime = (int64_t)ci->values[0].value.number;
-    return (0);
+    return 0;
   }
 
   errno = 0;
@@ -174,7 +174,7 @@ static int fc_config_add_dir_mtime(fc_directory_conf_t *dir,
       (endptr == ci->values[0].value.string)) {
     WARNING("filecount plugin: Converting `%s' to a number failed.",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   switch (*endptr) {
@@ -210,12 +210,12 @@ static int fc_config_add_dir_mtime(fc_directory_conf_t *dir,
 
   default:
     WARNING("filecount plugin: Invalid suffix for `MTime': `%c'", *endptr);
-    return (-1);
+    return -1;
   } /* switch (*endptr) */
 
   dir->mtime = (int64_t)temp;
 
-  return (0);
+  return 0;
 } /* int fc_config_add_dir_mtime */
 
 static int fc_config_add_dir_size(fc_directory_conf_t *dir,
@@ -227,12 +227,12 @@ static int fc_config_add_dir_size(fc_directory_conf_t *dir,
                                 (ci->values[0].type != OCONFIG_TYPE_NUMBER))) {
     WARNING("filecount plugin: The `Size' config option needs exactly one "
             "string or numeric argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].type == OCONFIG_TYPE_NUMBER) {
     dir->size = (int64_t)ci->values[0].value.number;
-    return (0);
+    return 0;
   }
 
   errno = 0;
@@ -242,7 +242,7 @@ static int fc_config_add_dir_size(fc_directory_conf_t *dir,
       (endptr == ci->values[0].value.string)) {
     WARNING("filecount plugin: Converting `%s' to a number failed.",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   switch (*endptr) {
@@ -278,12 +278,12 @@ static int fc_config_add_dir_size(fc_directory_conf_t *dir,
 
   default:
     WARNING("filecount plugin: Invalid suffix for `Size': `%c'", *endptr);
-    return (-1);
+    return -1;
   } /* switch (*endptr) */
 
   dir->size = (int64_t)temp;
 
-  return (0);
+  return 0;
 } /* int fc_config_add_dir_size */
 
 static int fc_config_add_dir_option(fc_directory_conf_t *dir,
@@ -291,7 +291,7 @@ static int fc_config_add_dir_option(fc_directory_conf_t *dir,
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) {
     WARNING("filecount plugin: The `Recursive' config options needs exactly "
             "one boolean argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.boolean)
@@ -299,7 +299,7 @@ static int fc_config_add_dir_option(fc_directory_conf_t *dir,
   else
     dir->options &= ~bit;
 
-  return (0);
+  return 0;
 } /* int fc_config_add_dir_option */
 
 static int fc_config_add_dir(oconfig_item_t *ci) {
@@ -309,21 +309,21 @@ static int fc_config_add_dir(oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("filecount plugin: `Directory' needs exactly one string "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   /* Initialize `dir' */
   dir = calloc(1, sizeof(*dir));
   if (dir == NULL) {
     ERROR("filecount plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   dir->path = strdup(ci->values[0].value.string);
   if (dir->path == NULL) {
     ERROR("filecount plugin: strdup failed.");
     sfree(dir);
-    return (-1);
+    return -1;
   }
 
   fc_config_set_instance(dir, dir->path);
@@ -380,10 +380,10 @@ static int fc_config_add_dir(oconfig_item_t *ci) {
     sfree(dir->instance);
     sfree(dir->path);
     sfree(dir);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int fc_config_add_dir */
 
 static int fc_config(oconfig_item_t *ci) {
@@ -397,16 +397,16 @@ static int fc_config(oconfig_item_t *ci) {
     }
   } /* for (ci->children) */
 
-  return (0);
+  return 0;
 } /* int fc_config */
 
 static int fc_init(void) {
   if (directories_num < 1) {
     WARNING("filecount plugin: No directories have been configured.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int fc_init */
 
 static int fc_read_dir_callback(const char *dirname, const char *filename,
@@ -417,29 +417,29 @@ static int fc_read_dir_callback(const char *dirname, const char *filename,
   int status;
 
   if (dir == NULL)
-    return (-1);
+    return -1;
 
   ssnprintf(abs_path, sizeof(abs_path), "%s/%s", dirname, filename);
 
   status = lstat(abs_path, &statbuf);
   if (status != 0) {
     ERROR("filecount plugin: stat (%s) failed.", abs_path);
-    return (-1);
+    return -1;
   }
 
   if (S_ISDIR(statbuf.st_mode) && (dir->options & FC_RECURSIVE)) {
     status = walk_directory(
         abs_path, fc_read_dir_callback, dir,
         /* include hidden = */ (dir->options & FC_HIDDEN) ? 1 : 0);
-    return (status);
+    return status;
   } else if (!S_ISREG(statbuf.st_mode)) {
-    return (0);
+    return 0;
   }
 
   if (dir->name != NULL) {
     status = fnmatch(dir->name, filename, /* flags = */ 0);
     if (status != 0)
-      return (0);
+      return 0;
   }
 
   if (dir->mtime != 0) {
@@ -455,7 +455,7 @@ static int fc_read_dir_callback(const char *dirname, const char *filename,
 
     if (((dir->mtime < 0) && (statbuf.st_mtime < mtime)) ||
         ((dir->mtime > 0) && (statbuf.st_mtime > mtime)))
-      return (0);
+      return 0;
   }
 
   if (dir->size != 0) {
@@ -468,13 +468,13 @@ static int fc_read_dir_callback(const char *dirname, const char *filename,
 
     if (((dir->size < 0) && (statbuf.st_size > size)) ||
         ((dir->size > 0) && (statbuf.st_size < size)))
-      return (0);
+      return 0;
   }
 
   dir->files_num++;
   dir->files_size += (uint64_t)statbuf.st_size;
 
-  return (0);
+  return 0;
 } /* int fc_read_dir_callback */
 
 static int fc_read_dir(fc_directory_conf_t *dir) {
@@ -491,19 +491,19 @@ static int fc_read_dir(fc_directory_conf_t *dir) {
                      /* include hidden */ (dir->options & FC_HIDDEN) ? 1 : 0);
   if (status != 0) {
     WARNING("filecount plugin: walk_directory (%s) failed.", dir->path);
-    return (-1);
+    return -1;
   }
 
   fc_submit_dir(dir);
 
-  return (0);
+  return 0;
 } /* int fc_read_dir */
 
 static int fc_read(void) {
   for (size_t i = 0; i < directories_num; i++)
     fc_read_dir(directories[i]);
 
-  return (0);
+  return 0;
 } /* int fc_read */
 
 void module_register(void) {
@@ -511,7 +511,3 @@ void module_register(void) {
   plugin_register_init("filecount", fc_init);
   plugin_register_read("filecount", fc_read);
 } /* void module_register */
-
-/*
- * vim: set sw=2 sts=2 et :
- */
index c410ea3..dd36b8b 100644 (file)
@@ -209,13 +209,11 @@ static int fscache_read(void) {
 
   } else {
     printf("cant open file\n");
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
   plugin_register_read("fscache", fscache_read);
 } /* void module_register */
-
-/* vim: set sw=4 sts=4 et : */
index fc9a232..c680427 100644 (file)
@@ -152,7 +152,7 @@ static metric_map_t *metric_lookup(const char *key) /* {{{ */
   }
 
   if (i >= map_len)
-    return (NULL);
+    return NULL;
 
   /* Look up the DS type and ds_index. */
   if (map[i].ds_type < 0) /* {{{ */
@@ -162,14 +162,14 @@ static metric_map_t *metric_lookup(const char *key) /* {{{ */
     ds = plugin_get_ds(map[i].type);
     if (ds == NULL) {
       WARNING("gmond plugin: Type not defined: %s", map[i].type);
-      return (NULL);
+      return NULL;
     }
 
     if ((map[i].ds_name == NULL) && (ds->ds_num != 1)) {
       WARNING("gmond plugin: No data source name defined for metric %s, "
               "but type %s has more than one data source.",
               map[i].ganglia_name, map[i].type);
-      return (NULL);
+      return NULL;
     }
 
     if (map[i].ds_name == NULL) {
@@ -185,7 +185,7 @@ static metric_map_t *metric_lookup(const char *key) /* {{{ */
         WARNING("gmond plugin: There is no data source "
                 "named `%s' in type `%s'.",
                 map[i].ds_name, ds->type);
-        return (NULL);
+        return NULL;
       }
       map[i].ds_index = j;
     }
@@ -193,7 +193,7 @@ static metric_map_t *metric_lookup(const char *key) /* {{{ */
     map[i].ds_type = ds->ds[map[i].ds_index].type;
   } /* }}} if ((map[i].ds_type < 0) || (map[i].ds_index < 0)) */
 
-  return (map + i);
+  return map + i;
 } /* }}} metric_map_t *metric_lookup */
 
 static int create_sockets(socket_entry_t **ret_sockets, /* {{{ */
@@ -208,7 +208,7 @@ static int create_sockets(socket_entry_t **ret_sockets, /* {{{ */
   int status;
 
   if (*ret_sockets != NULL)
-    return (EINVAL);
+    return EINVAL;
 
   struct addrinfo ai_hints = {.ai_family = AF_UNSPEC,
                               .ai_flags = AI_ADDRCONFIG | AI_PASSIVE,
@@ -223,7 +223,7 @@ static int create_sockets(socket_entry_t **ret_sockets, /* {{{ */
           (service == NULL) ? "(null)" : service,
           (ai_return == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                     : gai_strerror(ai_return));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -348,12 +348,12 @@ static int create_sockets(socket_entry_t **ret_sockets, /* {{{ */
 
   if (sockets_num == 0) {
     sfree(sockets);
-    return (-1);
+    return -1;
   }
 
   *ret_sockets = sockets;
   *ret_sockets_num = sockets_num;
-  return (0);
+  return 0;
 } /* }}} int create_sockets */
 
 static int request_meta_data(const char *host, const char *name) /* {{{ */
@@ -371,7 +371,7 @@ static int request_meta_data(const char *host, const char *name) /* {{{ */
       (msg.Ganglia_metadata_msg_u.grequest.metric_id.name == NULL)) {
     sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.host);
     sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.name);
-    return (-1);
+    return -1;
   }
 
   xdrmem_create(&xdr, buffer, sizeof(buffer), XDR_ENCODE);
@@ -379,7 +379,7 @@ static int request_meta_data(const char *host, const char *name) /* {{{ */
   if (!xdr_Ganglia_metadata_msg(&xdr, &msg)) {
     sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.host);
     sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.name);
-    return (-1);
+    return -1;
   }
 
   buffer_size = xdr_getpos(&xdr);
@@ -403,7 +403,7 @@ static int request_meta_data(const char *host, const char *name) /* {{{ */
 
   sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.host);
   sfree(msg.Ganglia_metadata_msg_u.grequest.metric_id.name);
-  return (0);
+  return 0;
 } /* }}} int request_meta_data */
 
 static staging_entry_t *staging_entry_get(const char *host, /* {{{ */
@@ -415,7 +415,7 @@ static staging_entry_t *staging_entry_get(const char *host, /* {{{ */
   int status;
 
   if (staging_tree == NULL)
-    return (NULL);
+    return NULL;
 
   ssnprintf(key, sizeof(key), "%s/%s/%s", host, type,
             (type_instance != NULL) ? type_instance : "");
@@ -423,12 +423,12 @@ static staging_entry_t *staging_entry_get(const char *host, /* {{{ */
   se = NULL;
   status = c_avl_get(staging_tree, key, (void *)&se);
   if (status == 0)
-    return (se);
+    return se;
 
   /* insert new entry */
   se = calloc(1, sizeof(*se));
   if (se == NULL)
-    return (NULL);
+    return NULL;
 
   sstrncpy(se->key, key, sizeof(se->key));
   se->flags = 0;
@@ -436,7 +436,7 @@ static staging_entry_t *staging_entry_get(const char *host, /* {{{ */
   se->vl.values = (value_t *)calloc(values_len, sizeof(*se->vl.values));
   if (se->vl.values == NULL) {
     sfree(se);
-    return (NULL);
+    return NULL;
   }
   se->vl.values_len = values_len;
 
@@ -453,10 +453,10 @@ static staging_entry_t *staging_entry_get(const char *host, /* {{{ */
     ERROR("gmond plugin: c_avl_insert failed.");
     sfree(se->vl.values);
     sfree(se);
-    return (NULL);
+    return NULL;
   }
 
-  return (se);
+  return se;
 } /* }}} staging_entry_t *staging_entry_get */
 
 static int staging_entry_update(const char *host, const char *name, /* {{{ */
@@ -468,13 +468,13 @@ static int staging_entry_update(const char *host, const char *name, /* {{{ */
   ds = plugin_get_ds(type);
   if (ds == NULL) {
     ERROR("gmond plugin: Looking up type %s failed.", type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num <= ds_index) {
     ERROR("gmond plugin: Invalid index %zu: %s has only %zu data source(s).",
           ds_index, ds->type, ds->ds_num);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_lock(&staging_lock);
@@ -483,11 +483,11 @@ static int staging_entry_update(const char *host, const char *name, /* {{{ */
   if (se == NULL) {
     pthread_mutex_unlock(&staging_lock);
     ERROR("gmond plugin: staging_entry_get failed.");
-    return (-1);
+    return -1;
   }
   if (se->vl.values_len != ds->ds_num) {
     pthread_mutex_unlock(&staging_lock);
-    return (-1);
+    return -1;
   }
 
   if (ds_type == DS_TYPE_COUNTER)
@@ -506,7 +506,7 @@ static int staging_entry_update(const char *host, const char *name, /* {{{ */
   /* Check if all data sources have been set. If not, return here. */
   if (se->flags != ((0x01 << se->vl.values_len) - 1)) {
     pthread_mutex_unlock(&staging_lock);
-    return (0);
+    return 0;
   }
 
   /* Check if the interval of this metric is known. If not, request meta data
@@ -517,7 +517,7 @@ static int staging_entry_update(const char *host, const char *name, /* {{{ */
     pthread_mutex_unlock(&staging_lock);
 
     request_meta_data(host, name);
-    return (0);
+    return 0;
   }
 
   plugin_dispatch_values(&se->vl);
@@ -525,7 +525,7 @@ static int staging_entry_update(const char *host, const char *name, /* {{{ */
   se->flags = 0;
   pthread_mutex_unlock(&staging_lock);
 
-  return (0);
+  return 0;
 } /* }}} int staging_entry_update */
 
 static int mc_handle_value_msg(Ganglia_value_msg *msg) /* {{{ */
@@ -606,7 +606,7 @@ static int mc_handle_value_msg(Ganglia_value_msg *msg) /* {{{ */
   }
   default:
     DEBUG("gmond plugin: Value type not handled: %i", msg->id);
-    return (-1);
+    return -1;
   } /* }}} switch (msg->id) */
 
   assert(host != NULL);
@@ -625,12 +625,12 @@ static int mc_handle_value_msg(Ganglia_value_msg *msg) /* {{{ */
     else
       assert(23 == 42);
 
-    return (staging_entry_update(host, name, map->type, map->type_instance,
-                                 map->ds_index, map->ds_type, val_copy));
+    return staging_entry_update(host, name, map->type, map->type_instance,
+                                map->ds_index, map->ds_type, val_copy);
   }
 
   DEBUG("gmond plugin: Cannot find a translation for %s.", name);
-  return (-1);
+  return -1;
 } /* }}} int mc_handle_value_msg */
 
 static int mc_handle_metadata_msg(Ganglia_metadata_msg *msg) /* {{{ */
@@ -645,19 +645,19 @@ static int mc_handle_metadata_msg(Ganglia_metadata_msg *msg) /* {{{ */
     msg_meta = msg->Ganglia_metadata_msg_u.gfull;
 
     if (msg_meta.metric.tmax == 0)
-      return (-1);
+      return -1;
 
     map = metric_lookup(msg_meta.metric_id.name);
     if (map == NULL) {
       DEBUG("gmond plugin: Not handling meta data %s.",
             msg_meta.metric_id.name);
-      return (0);
+      return 0;
     }
 
     ds = plugin_get_ds(map->type);
     if (ds == NULL) {
       WARNING("gmond plugin: Could not find data set %s.", map->type);
-      return (-1);
+      return -1;
     }
 
     DEBUG("gmond plugin: Received meta data for %s/%s.",
@@ -672,16 +672,16 @@ static int mc_handle_metadata_msg(Ganglia_metadata_msg *msg) /* {{{ */
 
     if (se == NULL) {
       ERROR("gmond plugin: staging_entry_get failed.");
-      return (-1);
+      return -1;
     }
 
     break;
   }
 
-  default: { return (-1); }
+  default: { return -1; }
   }
 
-  return (0);
+  return 0;
 } /* }}} int mc_handle_metadata_msg */
 
 static int mc_handle_metric(void *buffer, size_t buffer_size) /* {{{ */
@@ -719,10 +719,10 @@ static int mc_handle_metric(void *buffer, size_t buffer_size) /* {{{ */
 
   default:
     DEBUG("gmond plugin: Unknown format: %i", format);
-    return (-1);
+    return -1;
   } /* switch (format) */
 
-  return (0);
+  return 0;
 } /* }}} int mc_handle_metric */
 
 static int mc_handle_socket(struct pollfd *p) /* {{{ */
@@ -732,7 +732,7 @@ static int mc_handle_socket(struct pollfd *p) /* {{{ */
 
   if ((p->revents & (POLLIN | POLLPRI)) == 0) {
     p->revents = 0;
-    return (-1);
+    return -1;
   }
 
   buffer_size = recv(p->fd, buffer, sizeof(buffer), /* flags = */ 0);
@@ -741,11 +741,11 @@ static int mc_handle_socket(struct pollfd *p) /* {{{ */
     ERROR("gmond plugin: recv failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     p->revents = 0;
-    return (-1);
+    return -1;
   }
 
   mc_handle_metric(buffer, (size_t)buffer_size);
-  return (0);
+  return 0;
 } /* }}} int mc_handle_socket */
 
 static void *mc_receive_thread(void *arg) /* {{{ */
@@ -761,7 +761,7 @@ static void *mc_receive_thread(void *arg) /* {{{ */
       /* listen = */ 1);
   if (status != 0) {
     ERROR("gmond plugin: create_sockets failed.");
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   mc_receive_sockets = (struct pollfd *)calloc(mc_receive_sockets_num,
@@ -773,7 +773,7 @@ static void *mc_receive_thread(void *arg) /* {{{ */
     free(mc_receive_socket_entries);
     mc_receive_socket_entries = NULL;
     mc_receive_sockets_num = 0;
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   for (size_t i = 0; i < mc_receive_sockets_num; i++) {
@@ -800,7 +800,7 @@ static void *mc_receive_thread(void *arg) /* {{{ */
   } /* while (mc_receive_thread_loop != 0) */
 
   free(mc_receive_socket_entries);
-  return ((void *)0);
+  return (void *)0;
 } /* }}} void *mc_receive_thread */
 
 static int mc_receive_thread_start(void) /* {{{ */
@@ -808,7 +808,7 @@ static int mc_receive_thread_start(void) /* {{{ */
   int status;
 
   if (mc_receive_thread_running != 0)
-    return (-1);
+    return -1;
 
   mc_receive_thread_loop = 1;
 
@@ -818,17 +818,17 @@ static int mc_receive_thread_start(void) /* {{{ */
   if (status != 0) {
     ERROR("gmond plugin: Starting receive thread failed.");
     mc_receive_thread_loop = 0;
-    return (-1);
+    return -1;
   }
 
   mc_receive_thread_running = 1;
-  return (0);
+  return 0;
 } /* }}} int start_receive_thread */
 
 static int mc_receive_thread_stop(void) /* {{{ */
 {
   if (mc_receive_thread_running == 0)
-    return (-1);
+    return -1;
 
   mc_receive_thread_loop = 0;
 
@@ -839,7 +839,7 @@ static int mc_receive_thread_stop(void) /* {{{ */
 
   mc_receive_thread_running = 0;
 
-  return (0);
+  return 0;
 } /* }}} int mc_receive_thread_stop */
 
 /*
@@ -862,18 +862,18 @@ static int gmond_config_set_string(oconfig_item_t *ci, char **str) /* {{{ */
     WARNING("gmond plugin: The `%s' option needs "
             "exactly one string argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   tmp = strdup(ci->values[0].value.string);
   if (tmp == NULL) {
     ERROR("gmond plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   sfree(*str);
   *str = tmp;
-  return (0);
+  return 0;
 } /* }}} int gmond_config_set_string */
 
 static int gmond_config_add_metric(oconfig_item_t *ci) /* {{{ */
@@ -883,13 +883,13 @@ static int gmond_config_add_metric(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("gmond plugin: `Metric' blocks need "
             "exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   map = realloc(metric_map, (metric_map_len + 1) * sizeof(*metric_map));
   if (map == NULL) {
     ERROR("gmond plugin: realloc failed.");
-    return (-1);
+    return -1;
   }
   metric_map = map;
   map = metric_map + metric_map_len;
@@ -904,7 +904,7 @@ static int gmond_config_add_metric(oconfig_item_t *ci) /* {{{ */
   map->ganglia_name = strdup(ci->values[0].value.string);
   if (map->ganglia_name == NULL) {
     ERROR("gmond plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -925,11 +925,11 @@ static int gmond_config_add_metric(oconfig_item_t *ci) /* {{{ */
     ERROR("gmond plugin: No type is set for metric %s.", map->ganglia_name);
     sfree(map->ganglia_name);
     sfree(map->type_instance);
-    return (-1);
+    return -1;
   }
 
   metric_map_len++;
-  return (0);
+  return 0;
 } /* }}} int gmond_config_add_metric */
 
 static int gmond_config_set_address(oconfig_item_t *ci, /* {{{ */
@@ -941,14 +941,14 @@ static int gmond_config_set_address(oconfig_item_t *ci, /* {{{ */
     WARNING("gmond plugin: The `%s' config option needs "
             "one or two string arguments.",
             ci->key);
-    return (-1);
+    return -1;
   }
   if ((ci->values[0].type != OCONFIG_TYPE_STRING) ||
       ((ci->values_num == 2) && (ci->values[1].type != OCONFIG_TYPE_STRING))) {
     WARNING("gmond plugin: The `%s' config option needs "
             "one or two string arguments.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   addr = strdup(ci->values[0].value.string);
@@ -961,7 +961,7 @@ static int gmond_config_set_address(oconfig_item_t *ci, /* {{{ */
     ERROR("gmond plugin: strdup failed.");
     sfree(addr);
     sfree(port);
-    return (-1);
+    return -1;
   }
 
   sfree(*ret_addr);
@@ -970,7 +970,7 @@ static int gmond_config_set_address(oconfig_item_t *ci, /* {{{ */
   *ret_addr = addr;
   *ret_port = port;
 
-  return (0);
+  return 0;
 } /* }}} int gmond_config_set_address */
 
 static int gmond_config(oconfig_item_t *ci) /* {{{ */
@@ -987,7 +987,7 @@ static int gmond_config(oconfig_item_t *ci) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int gmond_config */
 
 static int gmond_init(void) /* {{{ */
@@ -1001,12 +1001,12 @@ static int gmond_init(void) /* {{{ */
   staging_tree = c_avl_create((int (*)(const void *, const void *))strcmp);
   if (staging_tree == NULL) {
     ERROR("gmond plugin: c_avl_create failed.");
-    return (-1);
+    return -1;
   }
 
   mc_receive_thread_start();
 
-  return (0);
+  return 0;
 } /* }}} int gmond_init */
 
 static int gmond_shutdown(void) /* {{{ */
@@ -1022,7 +1022,7 @@ static int gmond_shutdown(void) /* {{{ */
   mc_send_sockets_num = 0;
   pthread_mutex_unlock(&mc_send_sockets_lock);
 
-  return (0);
+  return 0;
 } /* }}} int gmond_shutdown */
 
 void module_register(void) {
@@ -1030,5 +1030,3 @@ void module_register(void) {
   plugin_register_init("gmond", gmond_init);
   plugin_register_shutdown("gmond", gmond_shutdown);
 }
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index a4b3e2e..210c293 100644 (file)
--- a/src/gps.c
+++ b/src/gps.c
@@ -226,7 +226,7 @@ static int cgps_read(void) {
   cgps_submit("satellites", data_copy.sats_used, "used");
   cgps_submit("satellites", data_copy.sats_visible, "visible");
 
-  return (0);
+  return 0;
 }
 
 /**
@@ -262,7 +262,7 @@ static int cgps_config(oconfig_item_t *ci) {
     cgps_config_data.timeout = CGPS_DEFAULT_TIMEOUT;
   }
 
-  return (0);
+  return 0;
 }
 
 /**
@@ -286,10 +286,10 @@ static int cgps_init(void) {
       plugin_thread_create(&cgps_thread_id, NULL, cgps_thread, NULL, "gps");
   if (status != 0) {
     ERROR("gps plugin: pthread_create() failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 /**
@@ -315,7 +315,7 @@ static int cgps_shutdown(void) {
   sfree(cgps_config_data.port);
   sfree(cgps_config_data.host);
 
-  return (0);
+  return 0;
 }
 
 /**
index 0ae80bb..2f16dbc 100644 (file)
@@ -26,8 +26,8 @@
  *   Florian octo Forster <octo at collectd.org>
  **/
 
-#include <grpc++/grpc++.h>
 #include <google/protobuf/util/time_util.h>
+#include <grpc++/grpc++.h>
 
 #include <fstream>
 #include <iostream>
@@ -61,10 +61,10 @@ using google::protobuf::util::TimeUtil;
  */
 
 struct Listener {
-       grpc::string addr;
-       grpc::string port;
+  grpc::string addr;
+  grpc::string port;
 
-       grpc::SslServerCredentialsOptions *ssl;
+  grpc::SslServerCredentialsOptions *ssl;
 };
 static std::vector<Listener> listeners;
 static grpc::string default_addr("0.0.0.0:50051");
@@ -73,189 +73,187 @@ static grpc::string default_addr("0.0.0.0:50051");
  * helper functions
  */
 
-static bool ident_matches(const value_list_t *vl, const value_list_t *matcher)
-{
-       if (fnmatch(matcher->host, vl->host, 0))
-               return false;
+static bool ident_matches(const value_list_t *vl, const value_list_t *matcher) {
+  if (fnmatch(matcher->host, vl->host, 0))
+    return false;
 
-       if (fnmatch(matcher->plugin, vl->plugin, 0))
-               return false;
-       if (fnmatch(matcher->plugin_instance, vl->plugin_instance, 0))
-               return false;
+  if (fnmatch(matcher->plugin, vl->plugin, 0))
+    return false;
+  if (fnmatch(matcher->plugin_instance, vl->plugin_instance, 0))
+    return false;
 
-       if (fnmatch(matcher->type, vl->type, 0))
-               return false;
-       if (fnmatch(matcher->type_instance, vl->type_instance, 0))
-               return false;
+  if (fnmatch(matcher->type, vl->type, 0))
+    return false;
+  if (fnmatch(matcher->type_instance, vl->type_instance, 0))
+    return false;
 
-       return true;
+  return true;
 } /* ident_matches */
 
-static grpc::string read_file(const char *filename)
-{
-       std::ifstream f;
-       grpc::string s, content;
-
-       f.open(filename);
-       if (!f.is_open()) {
-               ERROR("grpc: Failed to open '%s'", filename);
-               return "";
-       }
-
-       while (std::getline(f, s)) {
-               content += s;
-               content.push_back('\n');
-       }
-       f.close();
-       return content;
+static grpc::string read_file(const char *filename) {
+  std::ifstream f;
+  grpc::string s, content;
+
+  f.open(filename);
+  if (!f.is_open()) {
+    ERROR("grpc: Failed to open '%s'", filename);
+    return "";
+  }
+
+  while (std::getline(f, s)) {
+    content += s;
+    content.push_back('\n');
+  }
+  f.close();
+  return content;
 } /* read_file */
 
 /*
  * proto conversion
  */
 
-static void marshal_ident(const value_list_t *vl, collectd::types::Identifier *msg)
-{
-       msg->set_host(vl->host);
-       msg->set_plugin(vl->plugin);
-       if (vl->plugin_instance[0] != '\0')
-               msg->set_plugin_instance(vl->plugin_instance);
-       msg->set_type(vl->type);
-       if (vl->type_instance[0] != '\0')
-               msg->set_type_instance(vl->type_instance);
+static void marshal_ident(const value_list_t *vl,
+                          collectd::types::Identifier *msg) {
+  msg->set_host(vl->host);
+  msg->set_plugin(vl->plugin);
+  if (vl->plugin_instance[0] != '\0')
+    msg->set_plugin_instance(vl->plugin_instance);
+  msg->set_type(vl->type);
+  if (vl->type_instance[0] != '\0')
+    msg->set_type_instance(vl->type_instance);
 } /* marshal_ident */
 
-static grpc::Status unmarshal_ident(const collectd::types::Identifier &msg, value_list_t *vl,
-               bool require_fields)
-{
-       std::string s;
+static grpc::Status unmarshal_ident(const collectd::types::Identifier &msg,
+                                    value_list_t *vl, bool require_fields) {
+  std::string s;
 
-       s = msg.host();
-       if (!s.length() && require_fields)
-               return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
-                               grpc::string("missing host name"));
-       sstrncpy(vl->host, s.c_str(), sizeof(vl->host));
+  s = msg.host();
+  if (!s.length() && require_fields)
+    return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
+                        grpc::string("missing host name"));
+  sstrncpy(vl->host, s.c_str(), sizeof(vl->host));
 
-       s = msg.plugin();
-       if (!s.length() && require_fields)
-               return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
-                               grpc::string("missing plugin name"));
-       sstrncpy(vl->plugin, s.c_str(), sizeof(vl->plugin));
+  s = msg.plugin();
+  if (!s.length() && require_fields)
+    return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
+                        grpc::string("missing plugin name"));
+  sstrncpy(vl->plugin, s.c_str(), sizeof(vl->plugin));
 
-       s = msg.type();
-       if (!s.length() && require_fields)
-               return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
-                               grpc::string("missing type name"));
-       sstrncpy(vl->type, s.c_str(), sizeof(vl->type));
+  s = msg.type();
+  if (!s.length() && require_fields)
+    return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
+                        grpc::string("missing type name"));
+  sstrncpy(vl->type, s.c_str(), sizeof(vl->type));
 
-       s = msg.plugin_instance();
-       sstrncpy(vl->plugin_instance, s.c_str(), sizeof(vl->plugin_instance));
+  s = msg.plugin_instance();
+  sstrncpy(vl->plugin_instance, s.c_str(), sizeof(vl->plugin_instance));
 
-       s = msg.type_instance();
-       sstrncpy(vl->type_instance, s.c_str(), sizeof(vl->type_instance));
+  s = msg.type_instance();
+  sstrncpy(vl->type_instance, s.c_str(), sizeof(vl->type_instance));
 
-       return grpc::Status::OK;
+  return grpc::Status::OK;
 } /* unmarshal_ident() */
 
-static grpc::Status marshal_value_list(const value_list_t *vl, collectd::types::ValueList *msg)
-{
-       auto id = msg->mutable_identifier();
-       marshal_ident(vl, id);
-
-       auto ds = plugin_get_ds(vl->type);
-       if ((ds == NULL) || (ds->ds_num != vl->values_len)) {
-               return grpc::Status(grpc::StatusCode::INTERNAL,
-                               grpc::string("failed to retrieve data-set for values"));
-       }
-
-       auto t = TimeUtil::NanosecondsToTimestamp(CDTIME_T_TO_NS(vl->time));
-       auto d = TimeUtil::NanosecondsToDuration(CDTIME_T_TO_NS(vl->interval));
-       msg->set_allocated_time(new google::protobuf::Timestamp(t));
-       msg->set_allocated_interval(new google::protobuf::Duration(d));
-
-       for (size_t i = 0; i < vl->values_len; ++i) {
-               auto v = msg->add_values();
-               switch (ds->ds[i].type) {
-                       case DS_TYPE_COUNTER:
-                               v->set_counter(vl->values[i].counter);
-                               break;
-                       case DS_TYPE_GAUGE:
-                               v->set_gauge(vl->values[i].gauge);
-                               break;
-                       case DS_TYPE_DERIVE:
-                               v->set_derive(vl->values[i].derive);
-                               break;
-                       case DS_TYPE_ABSOLUTE:
-                               v->set_absolute(vl->values[i].absolute);
-                               break;
-                       default:
-                               return grpc::Status(grpc::StatusCode::INTERNAL,
-                                               grpc::string("unknown value type"));
-               }
-
-               auto name = msg->add_ds_names();
-               name->assign(ds->ds[i].name);
-       }
-
-       return grpc::Status::OK;
+static grpc::Status marshal_value_list(const value_list_t *vl,
+                                       collectd::types::ValueList *msg) {
+  auto id = msg->mutable_identifier();
+  marshal_ident(vl, id);
+
+  auto ds = plugin_get_ds(vl->type);
+  if ((ds == NULL) || (ds->ds_num != vl->values_len)) {
+    return grpc::Status(grpc::StatusCode::INTERNAL,
+                        grpc::string("failed to retrieve data-set for values"));
+  }
+
+  auto t = TimeUtil::NanosecondsToTimestamp(CDTIME_T_TO_NS(vl->time));
+  auto d = TimeUtil::NanosecondsToDuration(CDTIME_T_TO_NS(vl->interval));
+  msg->set_allocated_time(new google::protobuf::Timestamp(t));
+  msg->set_allocated_interval(new google::protobuf::Duration(d));
+
+  for (size_t i = 0; i < vl->values_len; ++i) {
+    auto v = msg->add_values();
+    switch (ds->ds[i].type) {
+    case DS_TYPE_COUNTER:
+      v->set_counter(vl->values[i].counter);
+      break;
+    case DS_TYPE_GAUGE:
+      v->set_gauge(vl->values[i].gauge);
+      break;
+    case DS_TYPE_DERIVE:
+      v->set_derive(vl->values[i].derive);
+      break;
+    case DS_TYPE_ABSOLUTE:
+      v->set_absolute(vl->values[i].absolute);
+      break;
+    default:
+      return grpc::Status(grpc::StatusCode::INTERNAL,
+                          grpc::string("unknown value type"));
+    }
+
+    auto name = msg->add_ds_names();
+    name->assign(ds->ds[i].name);
+  }
+
+  return grpc::Status::OK;
 } /* marshal_value_list */
 
-static grpc::Status unmarshal_value_list(const collectd::types::ValueList &msg, value_list_t *vl)
-{
-       vl->time = NS_TO_CDTIME_T(TimeUtil::TimestampToNanoseconds(msg.time()));
-       vl->interval = NS_TO_CDTIME_T(TimeUtil::DurationToNanoseconds(msg.interval()));
-
-       auto status = unmarshal_ident(msg.identifier(), vl, true);
-       if (!status.ok())
-               return status;
-
-       value_t *values = NULL;
-       size_t values_len = 0;
-
-       status = grpc::Status::OK;
-       for (auto v : msg.values()) {
-               value_t *val = (value_t *)realloc(values, (values_len + 1) * sizeof(*values));
-               if (!val) {
-                       status = grpc::Status(grpc::StatusCode::RESOURCE_EXHAUSTED,
-                                       grpc::string("failed to allocate values array"));
-                       break;
-               }
-
-               values = val;
-               val = values + values_len;
-               values_len++;
-
-               switch (v.value_case()) {
-               case collectd::types::Value::ValueCase::kCounter:
-                       val->counter = counter_t(v.counter());
-                       break;
-               case collectd::types::Value::ValueCase::kGauge:
-                       val->gauge = gauge_t(v.gauge());
-                       break;
-               case collectd::types::Value::ValueCase::kDerive:
-                       val->derive = derive_t(v.derive());
-                       break;
-               case collectd::types::Value::ValueCase::kAbsolute:
-                       val->absolute = absolute_t(v.absolute());
-                       break;
-               default:
-                       status = grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
-                                       grpc::string("unknown value type"));
-                       break;
-               }
-
-               if (!status.ok())
-                       break;
-       }
-       if (status.ok()) {
-               vl->values = values;
-               vl->values_len = values_len;
-       }
-       else if (values) {
-               free(values);
-       }
-
-       return status;
+static grpc::Status unmarshal_value_list(const collectd::types::ValueList &msg,
+                                         value_list_t *vl) {
+  vl->time = NS_TO_CDTIME_T(TimeUtil::TimestampToNanoseconds(msg.time()));
+  vl->interval =
+      NS_TO_CDTIME_T(TimeUtil::DurationToNanoseconds(msg.interval()));
+
+  auto status = unmarshal_ident(msg.identifier(), vl, true);
+  if (!status.ok())
+    return status;
+
+  value_t *values = NULL;
+  size_t values_len = 0;
+
+  status = grpc::Status::OK;
+  for (auto v : msg.values()) {
+    value_t *val =
+        (value_t *)realloc(values, (values_len + 1) * sizeof(*values));
+    if (!val) {
+      status = grpc::Status(grpc::StatusCode::RESOURCE_EXHAUSTED,
+                            grpc::string("failed to allocate values array"));
+      break;
+    }
+
+    values = val;
+    val = values + values_len;
+    values_len++;
+
+    switch (v.value_case()) {
+    case collectd::types::Value::ValueCase::kCounter:
+      val->counter = counter_t(v.counter());
+      break;
+    case collectd::types::Value::ValueCase::kGauge:
+      val->gauge = gauge_t(v.gauge());
+      break;
+    case collectd::types::Value::ValueCase::kDerive:
+      val->derive = derive_t(v.derive());
+      break;
+    case collectd::types::Value::ValueCase::kAbsolute:
+      val->absolute = absolute_t(v.absolute());
+      break;
+    default:
+      status = grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
+                            grpc::string("unknown value type"));
+      break;
+    }
+
+    if (!status.ok())
+      break;
+  }
+  if (status.ok()) {
+    vl->values = values;
+    vl->values_len = values_len;
+  } else if (values) {
+    free(values);
+  }
+
+  return status;
 } /* unmarshal_value_list() */
 
 /*
@@ -263,200 +261,200 @@ static grpc::Status unmarshal_value_list(const collectd::types::ValueList &msg,
  */
 class CollectdImpl : public collectd::Collectd::Service {
 public:
-       grpc::Status QueryValues(grpc::ServerContext *ctx, QueryValuesRequest const *req, grpc::ServerWriter<QueryValuesResponse> *writer) override {
-               value_list_t match;
-               auto status = unmarshal_ident(req->identifier(), &match, false);
-               if (!status.ok()) {
-                       return status;
-               }
-
-               std::queue<value_list_t> value_lists;
-               status = this->queryValuesRead(&match, &value_lists);
-               if (status.ok()) {
-                       status = this->queryValuesWrite(ctx, writer, &value_lists);
-               }
-
-               while (!value_lists.empty()) {
-                       auto vl = value_lists.front();
-                       value_lists.pop();
-                       sfree(vl.values);
-               }
-
-               return status;
-       }
-
-       grpc::Status PutValues(grpc::ServerContext *ctx,
-                                                  grpc::ServerReader<PutValuesRequest> *reader,
-                                                  PutValuesResponse *res) override {
-               PutValuesRequest req;
-
-               while (reader->Read(&req)) {
-                       value_list_t vl = {0};
-                       auto status = unmarshal_value_list(req.value_list(), &vl);
-                       if (!status.ok())
-                               return status;
-
-                       if (plugin_dispatch_values(&vl))
-                               return grpc::Status(grpc::StatusCode::INTERNAL,
-                                                                       grpc::string("failed to enqueue values for writing"));
-               }
-
-               res->Clear();
-               return grpc::Status::OK;
-       }
+  grpc::Status
+  QueryValues(grpc::ServerContext *ctx, QueryValuesRequest const *req,
+              grpc::ServerWriter<QueryValuesResponse> *writer) override {
+    value_list_t match;
+    auto status = unmarshal_ident(req->identifier(), &match, false);
+    if (!status.ok()) {
+      return status;
+    }
+
+    std::queue<value_list_t> value_lists;
+    status = this->queryValuesRead(&match, &value_lists);
+    if (status.ok()) {
+      status = this->queryValuesWrite(ctx, writer, &value_lists);
+    }
+
+    while (!value_lists.empty()) {
+      auto vl = value_lists.front();
+      value_lists.pop();
+      sfree(vl.values);
+    }
+
+    return status;
+  }
+
+  grpc::Status PutValues(grpc::ServerContext *ctx,
+                         grpc::ServerReader<PutValuesRequest> *reader,
+                         PutValuesResponse *res) override {
+    PutValuesRequest req;
+
+    while (reader->Read(&req)) {
+      value_list_t vl = {0};
+      auto status = unmarshal_value_list(req.value_list(), &vl);
+      if (!status.ok())
+        return status;
+
+      if (plugin_dispatch_values(&vl))
+        return grpc::Status(
+            grpc::StatusCode::INTERNAL,
+            grpc::string("failed to enqueue values for writing"));
+    }
+
+    res->Clear();
+    return grpc::Status::OK;
+  }
 
 private:
-       grpc::Status queryValuesRead(value_list_t const *match, std::queue<value_list_t> *value_lists) {
-               uc_iter_t *iter;
-               if ((iter = uc_get_iterator()) == NULL) {
-                       return grpc::Status(grpc::StatusCode::INTERNAL,
-                                                               grpc::string("failed to query values: cannot create iterator"));
-               }
-
-               grpc::Status status = grpc::Status::OK;
-               char *name = NULL;
-               while (uc_iterator_next(iter, &name) == 0) {
-                       value_list_t vl;
-                       if (parse_identifier_vl(name, &vl) != 0) {
-                               status = grpc::Status(grpc::StatusCode::INTERNAL,
-                                                                         grpc::string("failed to parse identifier"));
-                               break;
-                       }
-
-                       if (!ident_matches(&vl, match))
-                               continue;
-
-                       if (uc_iterator_get_time(iter, &vl.time) < 0) {
-                               status = grpc::Status(grpc::StatusCode::INTERNAL,
-                                                                         grpc::string("failed to retrieve value timestamp"));
-                               break;
-                       }
-                       if (uc_iterator_get_interval(iter, &vl.interval) < 0) {
-                               status = grpc::Status(grpc::StatusCode::INTERNAL,
-                                                                         grpc::string("failed to retrieve value interval"));
-                               break;
-                       }
-                       if (uc_iterator_get_values(iter, &vl.values, &vl.values_len) < 0) {
-                               status = grpc::Status(grpc::StatusCode::INTERNAL,
-                                                                         grpc::string("failed to retrieve values"));
-                               break;
-                       }
-
-                       value_lists->push(vl);
-               } // while (uc_iterator_next(iter, &name) == 0)
-
-               uc_iterator_destroy(iter);
-               return status;
-       }
-
-       grpc::Status queryValuesWrite(grpc::ServerContext *ctx,
-                                          grpc::ServerWriter<QueryValuesResponse> *writer,
-                                          std::queue<value_list_t> *value_lists) {
-               while (!value_lists->empty()) {
-                       auto vl = value_lists->front();
-                       QueryValuesResponse res;
-                       res.Clear();
-
-                       auto status = marshal_value_list(&vl, res.mutable_value_list());
-                       if (!status.ok()) {
-                               return status;
-                       }
-
-                       if (!writer->Write(res)) {
-                               return grpc::Status::CANCELLED;
-                       }
-
-                       value_lists->pop();
-                       sfree(vl.values);
-               }
-
-               return grpc::Status::OK;
-       }
+  grpc::Status queryValuesRead(value_list_t const *match,
+                               std::queue<value_list_t> *value_lists) {
+    uc_iter_t *iter;
+    if ((iter = uc_get_iterator()) == NULL) {
+      return grpc::Status(
+          grpc::StatusCode::INTERNAL,
+          grpc::string("failed to query values: cannot create iterator"));
+    }
+
+    grpc::Status status = grpc::Status::OK;
+    char *name = NULL;
+    while (uc_iterator_next(iter, &name) == 0) {
+      value_list_t vl;
+      if (parse_identifier_vl(name, &vl) != 0) {
+        status = grpc::Status(grpc::StatusCode::INTERNAL,
+                              grpc::string("failed to parse identifier"));
+        break;
+      }
+
+      if (!ident_matches(&vl, match))
+        continue;
+
+      if (uc_iterator_get_time(iter, &vl.time) < 0) {
+        status =
+            grpc::Status(grpc::StatusCode::INTERNAL,
+                         grpc::string("failed to retrieve value timestamp"));
+        break;
+      }
+      if (uc_iterator_get_interval(iter, &vl.interval) < 0) {
+        status =
+            grpc::Status(grpc::StatusCode::INTERNAL,
+                         grpc::string("failed to retrieve value interval"));
+        break;
+      }
+      if (uc_iterator_get_values(iter, &vl.values, &vl.values_len) < 0) {
+        status = grpc::Status(grpc::StatusCode::INTERNAL,
+                              grpc::string("failed to retrieve values"));
+        break;
+      }
+
+      value_lists->push(vl);
+    } // while (uc_iterator_next(iter, &name) == 0)
+
+    uc_iterator_destroy(iter);
+    return status;
+  }
+
+  grpc::Status queryValuesWrite(grpc::ServerContext *ctx,
+                                grpc::ServerWriter<QueryValuesResponse> *writer,
+                                std::queue<value_list_t> *value_lists) {
+    while (!value_lists->empty()) {
+      auto vl = value_lists->front();
+      QueryValuesResponse res;
+      res.Clear();
+
+      auto status = marshal_value_list(&vl, res.mutable_value_list());
+      if (!status.ok()) {
+        return status;
+      }
+
+      if (!writer->Write(res)) {
+        return grpc::Status::CANCELLED;
+      }
+
+      value_lists->pop();
+      sfree(vl.values);
+    }
+
+    return grpc::Status::OK;
+  }
 };
 
 /*
  * gRPC server implementation
  */
-class CollectdServer final
-{
+class CollectdServer final {
 public:
-       void Start()
-       {
-               auto auth = grpc::InsecureServerCredentials();
-
-               grpc::ServerBuilder builder;
-
-               if (listeners.empty()) {
-                       builder.AddListeningPort(default_addr, auth);
-                       INFO("grpc: Listening on %s", default_addr.c_str());
-               }
-               else {
-                       for (auto l : listeners) {
-                               grpc::string addr = l.addr + ":" + l.port;
-
-                               auto use_ssl = grpc::string("");
-                               auto a = auth;
-                               if (l.ssl != nullptr) {
-                                       use_ssl = grpc::string(" (SSL enabled)");
-                                       a = grpc::SslServerCredentials(*l.ssl);
-                               }
-
-                               builder.AddListeningPort(addr, a);
-                               INFO("grpc: Listening on %s%s", addr.c_str(), use_ssl.c_str());
-                       }
-               }
-
-               builder.RegisterService(&collectd_service_);
-
-               server_ = builder.BuildAndStart();
-       } /* Start() */
-
-       void Shutdown()
-       {
-               server_->Shutdown();
-       } /* Shutdown() */
+  void Start() {
+    auto auth = grpc::InsecureServerCredentials();
+
+    grpc::ServerBuilder builder;
+
+    if (listeners.empty()) {
+      builder.AddListeningPort(default_addr, auth);
+      INFO("grpc: Listening on %s", default_addr.c_str());
+    } else {
+      for (auto l : listeners) {
+        grpc::string addr = l.addr + ":" + l.port;
+
+        auto use_ssl = grpc::string("");
+        auto a = auth;
+        if (l.ssl != nullptr) {
+          use_ssl = grpc::string(" (SSL enabled)");
+          a = grpc::SslServerCredentials(*l.ssl);
+        }
+
+        builder.AddListeningPort(addr, a);
+        INFO("grpc: Listening on %s%s", addr.c_str(), use_ssl.c_str());
+      }
+    }
+
+    builder.RegisterService(&collectd_service_);
+
+    server_ = builder.BuildAndStart();
+  } /* Start() */
+
+  void Shutdown() { server_->Shutdown(); } /* Shutdown() */
 
 private:
-       CollectdImpl collectd_service_;
+  CollectdImpl collectd_service_;
 
-       std::unique_ptr<grpc::Server> server_;
+  std::unique_ptr<grpc::Server> server_;
 }; /* class CollectdServer */
 
-class CollectdClient final
-{
+class CollectdClient final {
 public:
-       CollectdClient(std::shared_ptr<grpc::ChannelInterface> channel) : stub_(Collectd::NewStub(channel)) {
-       }
-
-       int PutValues(value_list_t const *vl) {
-               grpc::ClientContext ctx;
-
-               PutValuesRequest req;
-               auto status = marshal_value_list(vl, req.mutable_value_list());
-               if (!status.ok()) {
-                       ERROR("grpc: Marshalling value_list_t failed.");
-                       return -1;
-               }
-
-               PutValuesResponse res;
-               auto stream = stub_->PutValues(&ctx, &res);
-               if (!stream->Write(req)) {
-                       NOTICE("grpc: Broken stream.");
-                       /* intentionally not returning. */
-               }
-
-               stream->WritesDone();
-               status = stream->Finish();
-               if (!status.ok()) {
-                       ERROR ("grpc: Error while closing stream.");
-                       return -1;
-               }
-
-               return 0;
-       } /* int PutValues */
+  CollectdClient(std::shared_ptr<grpc::ChannelInterface> channel)
+      : stub_(Collectd::NewStub(channel)) {}
+
+  int PutValues(value_list_t const *vl) {
+    grpc::ClientContext ctx;
+
+    PutValuesRequest req;
+    auto status = marshal_value_list(vl, req.mutable_value_list());
+    if (!status.ok()) {
+      ERROR("grpc: Marshalling value_list_t failed.");
+      return -1;
+    }
+
+    PutValuesResponse res;
+    auto stream = stub_->PutValues(&ctx, &res);
+    if (!stream->Write(req)) {
+      NOTICE("grpc: Broken stream.");
+      /* intentionally not returning. */
+    }
+
+    stream->WritesDone();
+    status = stream->Finish();
+    if (!status.ok()) {
+      ERROR("grpc: Error while closing stream.");
+      return -1;
+    }
+
+    return 0;
+  } /* int PutValues */
 
 private:
-       std::unique_ptr<Collectd::Stub> stub_;
+  std::unique_ptr<Collectd::Stub> stub_;
 };
 
 static CollectdServer *server = nullptr;
@@ -465,216 +463,194 @@ static CollectdServer *server = nullptr;
  * collectd plugin interface
  */
 extern "C" {
-       static void c_grpc_destroy_write_callback (void *ptr) {
-               delete (CollectdClient *) ptr;
-       }
-
-       static int c_grpc_write(__attribute__((unused)) data_set_t const *ds,
-                       value_list_t const *vl,
-                       user_data_t *ud) {
-               CollectdClient *c = (CollectdClient *) ud->data;
-               return c->PutValues(vl);
-       }
-
-       static int c_grpc_config_listen(oconfig_item_t *ci)
-       {
-               if ((ci->values_num != 2)
-                               || (ci->values[0].type != OCONFIG_TYPE_STRING)
-                               || (ci->values[1].type != OCONFIG_TYPE_STRING)) {
-                       ERROR("grpc: The `%s` config option needs exactly "
-                                       "two string argument (address and port).", ci->key);
-                       return -1;
-               }
-
-               auto listener = Listener();
-               listener.addr = grpc::string(ci->values[0].value.string);
-               listener.port = grpc::string(ci->values[1].value.string);
-               listener.ssl = nullptr;
-
-               auto ssl_opts = new(grpc::SslServerCredentialsOptions);
-               grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {};
-               bool use_ssl = false;
-
-               for (int i = 0; i < ci->children_num; i++) {
-                       oconfig_item_t *child = ci->children + i;
-
-                       if (!strcasecmp("EnableSSL", child->key)) {
-                               if (cf_util_get_boolean(child, &use_ssl)) {
-                                       ERROR("grpc: Option `%s` expects a boolean value",
-                                                       child->key);
-                                       return -1;
-                               }
-                       }
-                       else if (!strcasecmp("SSLCACertificateFile", child->key)) {
-                               char *certs = NULL;
-                               if (cf_util_get_string(child, &certs)) {
-                                       ERROR("grpc: Option `%s` expects a string value",
-                                                       child->key);
-                                       return -1;
-                               }
-                               ssl_opts->pem_root_certs = read_file(certs);
-                       }
-                       else if (!strcasecmp("SSLCertificateKeyFile", child->key)) {
-                               char *key = NULL;
-                               if (cf_util_get_string(child, &key)) {
-                                       ERROR("grpc: Option `%s` expects a string value",
-                                                       child->key);
-                                       return -1;
-                               }
-                               pkcp.private_key = read_file(key);
-                       }
-                       else if (!strcasecmp("SSLCertificateFile", child->key)) {
-                               char *cert = NULL;
-                               if (cf_util_get_string(child, &cert)) {
-                                       ERROR("grpc: Option `%s` expects a string value",
-                                                       child->key);
-                                       return -1;
-                               }
-                               pkcp.cert_chain = read_file(cert);
-                       }
-                       else {
-                               WARNING("grpc: Option `%s` not allowed in <%s> block.",
-                                               child->key, ci->key);
-                       }
-               }
-
-               ssl_opts->pem_key_cert_pairs.push_back(pkcp);
-               if (use_ssl)
-                       listener.ssl = ssl_opts;
-               else
-                       delete(ssl_opts);
-
-               listeners.push_back(listener);
-               return 0;
-       } /* c_grpc_config_listen() */
-
-       static int c_grpc_config_server(oconfig_item_t *ci)
-       {
-               if ((ci->values_num != 2)
-                               || (ci->values[0].type != OCONFIG_TYPE_STRING)
-                               || (ci->values[1].type != OCONFIG_TYPE_STRING)) {
-                       ERROR("grpc: The `%s` config option needs exactly "
-                                       "two string argument (address and port).", ci->key);
-                       return -1;
-               }
-
-               grpc::SslCredentialsOptions ssl_opts;
-               bool use_ssl = false;
-
-               for (int i = 0; i < ci->children_num; i++) {
-                       oconfig_item_t *child = ci->children + i;
-
-                       if (!strcasecmp("EnableSSL", child->key)) {
-                               if (cf_util_get_boolean(child, &use_ssl)) {
-                                       return -1;
-                               }
-                       }
-                       else if (!strcasecmp("SSLCACertificateFile", child->key)) {
-                               char *certs = NULL;
-                               if (cf_util_get_string(child, &certs)) {
-                                       return -1;
-                               }
-                               ssl_opts.pem_root_certs = read_file(certs);
-                       }
-                       else if (!strcasecmp("SSLCertificateKeyFile", child->key)) {
-                               char *key = NULL;
-                               if (cf_util_get_string(child, &key)) {
-                                       return -1;
-                               }
-                               ssl_opts.pem_private_key = read_file(key);
-                       }
-                       else if (!strcasecmp("SSLCertificateFile", child->key)) {
-                               char *cert = NULL;
-                               if (cf_util_get_string(child, &cert)) {
-                                       return -1;
-                               }
-                               ssl_opts.pem_cert_chain = read_file(cert);
-                       }
-                       else {
-                               WARNING("grpc: Option `%s` not allowed in <%s> block.",
-                                               child->key, ci->key);
-                       }
-               }
-
-               auto node    = grpc::string(ci->values[0].value.string);
-               auto service = grpc::string(ci->values[1].value.string);
-               auto addr    = node + ":" + service;
-
-               CollectdClient *client;
-               if (use_ssl) {
-                       auto channel_creds = grpc::SslCredentials(ssl_opts);
-                       auto channel = grpc::CreateChannel(addr, channel_creds);
-                       client = new CollectdClient(channel);
-               } else {
-                       auto channel = grpc::CreateChannel(addr, grpc::InsecureChannelCredentials());
-                       client = new CollectdClient(channel);
-               }
-
-               auto callback_name = grpc::string("grpc/") + addr;
-               user_data_t ud = {
-                       .data = client,
-                       .free_func = c_grpc_destroy_write_callback,
-               };
-
-               plugin_register_write (callback_name.c_str(), c_grpc_write, &ud);
-               return 0;
-       } /* c_grpc_config_server() */
-
-       static int c_grpc_config(oconfig_item_t *ci)
-       {
-               int i;
-
-               for (i = 0; i < ci->children_num; i++) {
-                       oconfig_item_t *child = ci->children + i;
-
-                       if (!strcasecmp("Listen", child->key)) {
-                               if (c_grpc_config_listen(child))
-                                       return -1;
-                       }
-                       else if (!strcasecmp("Server", child->key)) {
-                               if (c_grpc_config_server(child))
-                                       return -1;
-                       }
-
-                       else {
-                               WARNING("grpc: Option `%s` not allowed here.", child->key);
-                       }
-               }
-
-               return 0;
-       } /* c_grpc_config() */
-
-       static int c_grpc_init(void)
-       {
-               server = new CollectdServer();
-               if (!server) {
-                       ERROR("grpc: Failed to create server");
-                       return -1;
-               }
-
-               server->Start();
-               return 0;
-       } /* c_grpc_init() */
-
-       static int c_grpc_shutdown(void)
-       {
-               if (!server)
-                       return 0;
-
-               server->Shutdown();
-
-               delete server;
-               server = nullptr;
-
-               return 0;
-       } /* c_grpc_shutdown() */
-
-       void module_register(void)
-       {
-               plugin_register_complex_config("grpc", c_grpc_config);
-               plugin_register_init("grpc", c_grpc_init);
-               plugin_register_shutdown("grpc", c_grpc_shutdown);
-       } /* module_register() */
-} /* extern "C" */
+static void c_grpc_destroy_write_callback(void *ptr) {
+  delete (CollectdClient *)ptr;
+}
 
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
+static int c_grpc_write(__attribute__((unused)) data_set_t const *ds,
+                        value_list_t const *vl, user_data_t *ud) {
+  CollectdClient *c = (CollectdClient *)ud->data;
+  return c->PutValues(vl);
+}
+
+static int c_grpc_config_listen(oconfig_item_t *ci) {
+  if ((ci->values_num != 2) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
+      (ci->values[1].type != OCONFIG_TYPE_STRING)) {
+    ERROR("grpc: The `%s` config option needs exactly "
+          "two string argument (address and port).",
+          ci->key);
+    return -1;
+  }
+
+  auto listener = Listener();
+  listener.addr = grpc::string(ci->values[0].value.string);
+  listener.port = grpc::string(ci->values[1].value.string);
+  listener.ssl = nullptr;
+
+  auto ssl_opts = new (grpc::SslServerCredentialsOptions);
+  grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {};
+  bool use_ssl = false;
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+
+    if (!strcasecmp("EnableSSL", child->key)) {
+      if (cf_util_get_boolean(child, &use_ssl)) {
+        ERROR("grpc: Option `%s` expects a boolean value", child->key);
+        return -1;
+      }
+    } else if (!strcasecmp("SSLCACertificateFile", child->key)) {
+      char *certs = NULL;
+      if (cf_util_get_string(child, &certs)) {
+        ERROR("grpc: Option `%s` expects a string value", child->key);
+        return -1;
+      }
+      ssl_opts->pem_root_certs = read_file(certs);
+    } else if (!strcasecmp("SSLCertificateKeyFile", child->key)) {
+      char *key = NULL;
+      if (cf_util_get_string(child, &key)) {
+        ERROR("grpc: Option `%s` expects a string value", child->key);
+        return -1;
+      }
+      pkcp.private_key = read_file(key);
+    } else if (!strcasecmp("SSLCertificateFile", child->key)) {
+      char *cert = NULL;
+      if (cf_util_get_string(child, &cert)) {
+        ERROR("grpc: Option `%s` expects a string value", child->key);
+        return -1;
+      }
+      pkcp.cert_chain = read_file(cert);
+    } else {
+      WARNING("grpc: Option `%s` not allowed in <%s> block.", child->key,
+              ci->key);
+    }
+  }
+
+  ssl_opts->pem_key_cert_pairs.push_back(pkcp);
+  if (use_ssl)
+    listener.ssl = ssl_opts;
+  else
+    delete (ssl_opts);
+
+  listeners.push_back(listener);
+  return 0;
+} /* c_grpc_config_listen() */
+
+static int c_grpc_config_server(oconfig_item_t *ci) {
+  if ((ci->values_num != 2) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
+      (ci->values[1].type != OCONFIG_TYPE_STRING)) {
+    ERROR("grpc: The `%s` config option needs exactly "
+          "two string argument (address and port).",
+          ci->key);
+    return -1;
+  }
+
+  grpc::SslCredentialsOptions ssl_opts;
+  bool use_ssl = false;
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+
+    if (!strcasecmp("EnableSSL", child->key)) {
+      if (cf_util_get_boolean(child, &use_ssl)) {
+        return -1;
+      }
+    } else if (!strcasecmp("SSLCACertificateFile", child->key)) {
+      char *certs = NULL;
+      if (cf_util_get_string(child, &certs)) {
+        return -1;
+      }
+      ssl_opts.pem_root_certs = read_file(certs);
+    } else if (!strcasecmp("SSLCertificateKeyFile", child->key)) {
+      char *key = NULL;
+      if (cf_util_get_string(child, &key)) {
+        return -1;
+      }
+      ssl_opts.pem_private_key = read_file(key);
+    } else if (!strcasecmp("SSLCertificateFile", child->key)) {
+      char *cert = NULL;
+      if (cf_util_get_string(child, &cert)) {
+        return -1;
+      }
+      ssl_opts.pem_cert_chain = read_file(cert);
+    } else {
+      WARNING("grpc: Option `%s` not allowed in <%s> block.", child->key,
+              ci->key);
+    }
+  }
+
+  auto node = grpc::string(ci->values[0].value.string);
+  auto service = grpc::string(ci->values[1].value.string);
+  auto addr = node + ":" + service;
+
+  CollectdClient *client;
+  if (use_ssl) {
+    auto channel_creds = grpc::SslCredentials(ssl_opts);
+    auto channel = grpc::CreateChannel(addr, channel_creds);
+    client = new CollectdClient(channel);
+  } else {
+    auto channel =
+        grpc::CreateChannel(addr, grpc::InsecureChannelCredentials());
+    client = new CollectdClient(channel);
+  }
+
+  auto callback_name = grpc::string("grpc/") + addr;
+  user_data_t ud = {
+      .data = client, .free_func = c_grpc_destroy_write_callback,
+  };
+
+  plugin_register_write(callback_name.c_str(), c_grpc_write, &ud);
+  return 0;
+} /* c_grpc_config_server() */
+
+static int c_grpc_config(oconfig_item_t *ci) {
+  int i;
+
+  for (i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+
+    if (!strcasecmp("Listen", child->key)) {
+      if (c_grpc_config_listen(child))
+        return -1;
+    } else if (!strcasecmp("Server", child->key)) {
+      if (c_grpc_config_server(child))
+        return -1;
+    }
+
+    else {
+      WARNING("grpc: Option `%s` not allowed here.", child->key);
+    }
+  }
+
+  return 0;
+} /* c_grpc_config() */
+
+static int c_grpc_init(void) {
+  server = new CollectdServer();
+  if (!server) {
+    ERROR("grpc: Failed to create server");
+    return -1;
+  }
+
+  server->Start();
+  return 0;
+} /* c_grpc_init() */
+
+static int c_grpc_shutdown(void) {
+  if (!server)
+    return 0;
+
+  server->Shutdown();
+
+  delete server;
+  server = nullptr;
+
+  return 0;
+} /* c_grpc_shutdown() */
+
+void module_register(void) {
+  plugin_register_complex_config("grpc", c_grpc_config);
+  plugin_register_init("grpc", c_grpc_init);
+  plugin_register_shutdown("grpc", c_grpc_shutdown);
+} /* module_register() */
+} /* extern "C" */
index 321c165..3af9c0f 100644 (file)
@@ -112,7 +112,7 @@ static char *hddtemp_query_daemon(void) {
     ERROR("hddtemp plugin: getaddrinfo (%s, %s): %s", host, port,
           (ai_return == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                     : gai_strerror(ai_return));
-    return (NULL);
+    return NULL;
   }
 
   fd = -1;
@@ -146,7 +146,7 @@ static char *hddtemp_query_daemon(void) {
 
   if (fd < 0) {
     ERROR("hddtemp plugin: Could not connect to daemon.");
-    return (NULL);
+    return NULL;
   }
 
   /* receive data from the hddtemp daemon */
@@ -169,7 +169,7 @@ static char *hddtemp_query_daemon(void) {
         close(fd);
         free(buffer);
         ERROR("hddtemp plugin: Allocation failed.");
-        return (NULL);
+        return NULL;
       }
       buffer = new_buffer;
     }
@@ -186,7 +186,7 @@ static char *hddtemp_query_daemon(void) {
             sstrerror(errno, errbuf, sizeof(errbuf)));
       close(fd);
       free(buffer);
-      return (NULL);
+      return NULL;
     }
     buffer_fill += status;
   }
@@ -197,13 +197,13 @@ static char *hddtemp_query_daemon(void) {
             buffer);
     close(fd);
     free(buffer);
-    return (NULL);
+    return NULL;
   }
 
   assert(buffer_fill < buffer_size);
   buffer[buffer_fill] = '\0';
   close(fd);
-  return (buffer);
+  return buffer;
 }
 
 static int hddtemp_config(const char *key, const char *value) {
@@ -218,10 +218,10 @@ static int hddtemp_config(const char *key, const char *value) {
     else
       sstrncpy(hddtemp_port, value, sizeof(hddtemp_port));
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void hddtemp_submit(char *type_instance, double value) {
@@ -248,7 +248,7 @@ static int hddtemp_read(void) {
   /* get data from daemon */
   buf = hddtemp_query_daemon();
   if (buf == NULL)
-    return (-1);
+    return -1;
 
   /* NB: strtok_r will eat up "||" and leading "|"'s */
   ptr = buf;
@@ -276,7 +276,7 @@ static int hddtemp_read(void) {
   }
 
   free(buf);
-  return (0);
+  return 0;
 } /* int hddtemp_read */
 
 /* module_register
index f23a6e2..871e625 100644 (file)
@@ -76,7 +76,7 @@ static int hp_config(oconfig_item_t *ci) {
             child->key);
   }
 
-  return (0);
+  return 0;
 }
 
 static void submit_hp(const struct entry_info *info) {
index 6f157b8..7966daa 100644 (file)
@@ -80,10 +80,10 @@ static int strtouint64(const char *s, uint64_t *n) {
 
   if (!(*s != '\0' && *endptr == '\0')) {
     DEBUG(RDT_PLUGIN ": Error converting '%s' to unsigned number.", s);
-    return (-EINVAL);
+    return -EINVAL;
   }
 
-  return (0);
+  return 0;
 }
 
 /*
@@ -136,12 +136,12 @@ static size_t strlisttonums(char *s, uint64_t *nums, size_t max) {
       *p = '\0';
       ret = strtouint64(token, &start);
       if (ret < 0)
-        return (0);
+        return 0;
       ret = strtouint64(p + 1, &end);
       if (ret < 0)
-        return (0);
+        return 0;
       if (start > end) {
-        return (0);
+        return 0;
       }
       for (n = start; n <= end; n++) {
         if (!(isdup(nums, index, n))) {
@@ -156,7 +156,7 @@ static size_t strlisttonums(char *s, uint64_t *nums, size_t max) {
 
       ret = strtouint64(token, &val);
       if (ret < 0)
-        return (0);
+        return 0;
 
       if (!(isdup(nums, index, val))) {
         nums[index] = val;
@@ -223,14 +223,14 @@ static int cgroup_set(rdt_core_group_t *cg, char *desc, uint64_t *cores,
   cg->cores = calloc(num_cores, sizeof(unsigned));
   if (cg->cores == NULL) {
     ERROR(RDT_PLUGIN ": Error allocating core group table");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
   cg->num_cores = num_cores;
   cg->desc = strdup(desc);
   if (cg->desc == NULL) {
     ERROR(RDT_PLUGIN ": Error allocating core group description");
     sfree(cg->cores);
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   for (size_t i = 0; i < num_cores; i++)
@@ -252,14 +252,13 @@ static int cgroup_set(rdt_core_group_t *cg, char *desc, uint64_t *cores,
  *   `item'        Config option containing core groups.
  *   `groups'      Table of core groups to set values in.
  *   `max_groups'  Maximum number of core groups allowed.
- *   `max_core'    Maximum allowed core value.
  *
  * RETURN VALUE
  *   On success, the number of core groups set up. On error, appropriate
  *   negative error value.
  */
 static int oconfig_to_cgroups(oconfig_item_t *item, rdt_core_group_t *groups,
-                              size_t max_groups, uint64_t max_core) {
+                              size_t max_groups) {
   int index = 0;
 
   assert(groups != NULL);
@@ -282,15 +281,7 @@ static int oconfig_to_cgroups(oconfig_item_t *item, rdt_core_group_t *groups,
     if (n == 0) {
       ERROR(RDT_PLUGIN ": Error parsing core group (%s)",
             item->values[j].value.string);
-      return (-EINVAL);
-    }
-
-    for (int i = 0; i < n; i++) {
-      if (cores[i] > max_core) {
-        ERROR(RDT_PLUGIN ": Core group (%s) contains invalid core id (%d)",
-              item->values[j].value.string, (int)cores[i]);
-        return (-EINVAL);
-      }
+      return -EINVAL;
     }
 
     /* set core group info */
@@ -395,30 +386,52 @@ static int rdt_default_cgroups(void) {
   return g_rdt->pqos_cpu->num_cores;
 }
 
+static int rdt_is_core_id_valid(int core_id) {
+
+  for (int i = 0; i < g_rdt->pqos_cpu->num_cores; i++)
+    if (core_id == g_rdt->pqos_cpu->cores[i].lcore)
+      return 1;
+
+  return 0;
+}
+
 static int rdt_config_cgroups(oconfig_item_t *item) {
   int n = 0;
   enum pqos_mon_event events = 0;
 
   if (item == NULL) {
     DEBUG(RDT_PLUGIN ": cgroups_config: Invalid argument.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   DEBUG(RDT_PLUGIN ": Core groups [%d]:", item->values_num);
   for (int j = 0; j < item->values_num; j++) {
     if (item->values[j].type != OCONFIG_TYPE_STRING) {
       ERROR(RDT_PLUGIN ": given core group value is not a string [idx=%d]", j);
-      return (-EINVAL);
+      return -EINVAL;
     }
     DEBUG(RDT_PLUGIN ":  [%d]: %s", j, item->values[j].value.string);
   }
 
-  n = oconfig_to_cgroups(item, g_rdt->cgroups, RDT_MAX_CORES,
-                         g_rdt->pqos_cpu->num_cores - 1);
+  n = oconfig_to_cgroups(item, g_rdt->cgroups, g_rdt->pqos_cpu->num_cores);
   if (n < 0) {
     rdt_free_cgroups();
     ERROR(RDT_PLUGIN ": Error parsing core groups configuration.");
-    return (-EINVAL);
+    return -EINVAL;
+  }
+
+  /* validate configured core id values */
+  for (int group_idx = 0; group_idx < n; group_idx++) {
+    for (int core_idx = 0; core_idx < g_rdt->cgroups[group_idx].num_cores;
+         core_idx++) {
+      if (!rdt_is_core_id_valid(g_rdt->cgroups[group_idx].cores[core_idx])) {
+        ERROR(RDT_PLUGIN ": Core group '%s' contains invalid core id '%d'",
+                g_rdt->cgroups[group_idx].desc,
+                (int)g_rdt->cgroups[group_idx].cores[core_idx]);
+        rdt_free_cgroups();
+        return -EINVAL;
+      }
+    }
   }
 
   if (n == 0) {
@@ -451,7 +464,7 @@ static int rdt_config_cgroups(oconfig_item_t *item) {
       if (found != 0) {
         rdt_free_cgroups();
         ERROR(RDT_PLUGIN ": Cannot monitor same cores in different groups.");
-        return (-EINVAL);
+        return -EINVAL;
       }
     }
 
@@ -460,11 +473,15 @@ static int rdt_config_cgroups(oconfig_item_t *item) {
     if (g_rdt->pgroups[i] == NULL) {
       rdt_free_cgroups();
       ERROR(RDT_PLUGIN ": Failed to allocate memory for monitoring data.");
-      return (-ENOMEM);
+      return -ENOMEM;
     }
   }
 
-  return (0);
+  return 0;
+}
+
+static void rdt_pqos_log(void *context, const size_t size, const char *msg) {
+  DEBUG(RDT_PLUGIN ": %s", msg);
 }
 
 static int rdt_preinit(void) {
@@ -472,24 +489,21 @@ static int rdt_preinit(void) {
 
   if (g_rdt != NULL) {
     /* already initialized if config callback was called before init callback */
-    return (0);
+    return 0;
   }
 
   g_rdt = calloc(1, sizeof(*g_rdt));
   if (g_rdt == NULL) {
     ERROR(RDT_PLUGIN ": Failed to allocate memory for rdt context.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
-  /* In case previous instance of the application was not closed properly
-   * call fini and ignore return code. */
-  pqos_fini();
+  struct pqos_config pqos = {.fd_log = -1,
+                             .callback_log = rdt_pqos_log,
+                             .context_log = NULL,
+                             .verbose = 0};
 
-  /* TODO:
-   * stdout should not be used here. Will be reworked when support of log
-   * callback is added to PQoS library.
-  */
-  ret = pqos_init(&(struct pqos_config){.fd_log = STDOUT_FILENO});
+  ret = pqos_init(&pqos);
   if (ret != PQOS_RETVAL_OK) {
     ERROR(RDT_PLUGIN ": Error initializing PQoS library!");
     goto rdt_preinit_error1;
@@ -514,7 +528,10 @@ static int rdt_preinit(void) {
     goto rdt_preinit_error2;
   }
 
-  return (0);
+  /* Reset pqos monitoring groups registers */
+  pqos_mon_reset();
+
+  return 0;
 
 rdt_preinit_error2:
   pqos_fini();
@@ -523,7 +540,7 @@ rdt_preinit_error1:
 
   sfree(g_rdt);
 
-  return (-1);
+  return -1;
 }
 
 static int rdt_config(oconfig_item_t *ci) {
@@ -546,7 +563,7 @@ static int rdt_config(oconfig_item_t *ci) {
            reports a failure in configuration and
            aborts
          */
-       return (0);
+        return (0);
       }
 
 #if COLLECT_DEBUG
@@ -557,7 +574,7 @@ static int rdt_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 static void rdt_submit_derive(char *cgroup, char *type, char *type_instance,
@@ -597,13 +614,13 @@ static int rdt_read(__attribute__((unused)) user_data_t *ud) {
 
   if (g_rdt == NULL) {
     ERROR(RDT_PLUGIN ": rdt_read: plugin not initialized.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   ret = pqos_mon_poll(&g_rdt->pgroups[0], (unsigned)g_rdt->num_groups);
   if (ret != PQOS_RETVAL_OK) {
     ERROR(RDT_PLUGIN ": Failed to poll monitoring data.");
-    return (-1);
+    return -1;
   }
 
 #if COLLECT_DEBUG
@@ -633,14 +650,14 @@ static int rdt_read(__attribute__((unused)) user_data_t *ud) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 static int rdt_init(void) {
   int ret;
 
   if(g_state == CONFIGURATION_ERROR)
-    return (-1);
+    return -1;
 
   ret = rdt_preinit();
   if (ret != 0)
@@ -658,7 +675,7 @@ static int rdt_init(void) {
             cg->desc, ret);
   }
 
-  return (0);
+  return 0;
 }
 
 static int rdt_shutdown(void) {
@@ -667,7 +684,7 @@ static int rdt_shutdown(void) {
   DEBUG(RDT_PLUGIN ": rdt_shutdown.");
 
   if (g_rdt == NULL)
-    return (0);
+    return 0;
 
   /* Stop monitoring */
   for (int i = 0; i < g_rdt->num_groups; i++) {
@@ -681,7 +698,7 @@ static int rdt_shutdown(void) {
   rdt_free_cgroups();
   sfree(g_rdt);
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index b7c6f90..78a0d69 100644 (file)
@@ -120,10 +120,10 @@ static int interface_config(const char *key, const char *value) {
             "Solaris.");
 #endif /* HAVE_LIBKSTAT */
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 #if HAVE_LIBKSTAT
@@ -133,7 +133,7 @@ static int interface_init(void) {
   numif = 0;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (numif = 0, ksp_chain = kc->kc_chain;
        (numif < MAX_NUMIF) && (ksp_chain != NULL);
@@ -149,7 +149,7 @@ static int interface_init(void) {
     ksp[numif++] = ksp_chain;
   }
 
-  return (0);
+  return 0;
 } /* int interface_init */
 #endif /* HAVE_LIBKSTAT */
 
@@ -202,7 +202,7 @@ static int interface_read(void) {
   struct IFA_DATA *if_data;
 
   if (getifaddrs(&if_list) != 0)
-    return (-1);
+    return -1;
 
   for (struct ifaddrs *if_ptr = if_list; if_ptr != NULL;
        if_ptr = if_ptr->ifa_next) {
@@ -239,7 +239,7 @@ static int interface_read(void) {
     char errbuf[1024];
     WARNING("interface plugin: fopen: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, 1024, fh) != NULL) {
@@ -289,7 +289,7 @@ static int interface_read(void) {
   char iname[DATA_MAX_NAME_LEN];
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (int i = 0; i < numif; i++) {
     if (kstat_read(kc, ksp[i], NULL) == -1)
@@ -355,7 +355,7 @@ static int interface_read(void) {
     char errbuf[1024];
     WARNING("interface plugin: perfstat_netinterface: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (pnif != nif || ifstat == NULL) {
@@ -370,7 +370,7 @@ static int interface_read(void) {
     char errbuf[1024];
     WARNING("interface plugin: perfstat_netinterface (interfaces=%d): %s", nif,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ifs; i++) {
@@ -385,7 +385,7 @@ static int interface_read(void) {
   }
 #endif /* HAVE_PERFSTAT */
 
-  return (0);
+  return 0;
 } /* int interface_read */
 
 void module_register(void) {
index c9fb003..432c5e0 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -123,13 +123,13 @@ static int ipc_read_sem(void) /* {{{ */
     ERROR("ipc plugin: semctl(2) failed: %s. "
           "Maybe the kernel is not configured for semaphores?",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   ipc_submit_g("sem", "count", "arrays", seminfo.semusz);
   ipc_submit_g("sem", "count", "total", seminfo.semaem);
 
-  return (0);
+  return 0;
 } /* }}} int ipc_read_sem */
 
 static int ipc_read_shm(void) /* {{{ */
@@ -143,14 +143,14 @@ static int ipc_read_shm(void) /* {{{ */
     ERROR("ipc plugin: shmctl(2) failed: %s. "
           "Maybe the kernel is not configured for shared memory?",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   ipc_submit_g("shm", "segments", NULL, shm_info.used_ids);
   ipc_submit_g("shm", "bytes", "total", shm_info.shm_tot * pagesize_g);
   ipc_submit_g("shm", "bytes", "rss", shm_info.shm_rss * pagesize_g);
   ipc_submit_g("shm", "bytes", "swapped", shm_info.shm_swp * pagesize_g);
-  return (0);
+  return 0;
 }
 /* }}} int ipc_read_shm */
 
@@ -160,20 +160,20 @@ static int ipc_read_msg(void) /* {{{ */
 
   if (msgctl(0, MSG_INFO, (struct msqid_ds *)(void *)&msginfo) < 0) {
     ERROR("Kernel is not configured for message queues");
-    return (-1);
+    return -1;
   }
   ipc_submit_g("msg", "count", "queues", msginfo.msgmni);
   ipc_submit_g("msg", "count", "headers", msginfo.msgmap);
   ipc_submit_g("msg", "count", "space", msginfo.msgtql);
 
-  return (0);
+  return 0;
 }
 /* }}} int ipc_read_msg */
 
 static int ipc_init(void) /* {{{ */
 {
   pagesize_g = sysconf(_SC_PAGESIZE);
-  return (0);
+  return 0;
 }
 /* }}} */
 /* #endif KERNEL_LINUX */
@@ -190,7 +190,7 @@ static caddr_t ipc_get_info(cid_t cid, int cmd, int version, int stsize,
       char errbuf[1024];
       WARNING("ipc plugin: get_ipc_info: %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (NULL);
+      return NULL;
     }
   }
 
@@ -199,7 +199,7 @@ static caddr_t ipc_get_info(cid_t cid, int cmd, int version, int stsize,
 
   if (size % stsize) {
     ERROR("ipc plugin: ipc_get_info: missmatch struct size and buffer size");
-    return (NULL);
+    return NULL;
   }
 
   *nmemb = size / stsize;
@@ -207,7 +207,7 @@ static caddr_t ipc_get_info(cid_t cid, int cmd, int version, int stsize,
   buff = malloc(size);
   if (buff == NULL) {
     ERROR("ipc plugin: ipc_get_info malloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   if (get_ipc_info(cid, cmd, version, buff, &size) < 0) {
@@ -215,7 +215,7 @@ static caddr_t ipc_get_info(cid_t cid, int cmd, int version, int stsize,
     WARNING("ipc plugin: get_ipc_info: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
     free(buff);
-    return (NULL);
+    return NULL;
   }
 
   return buff;
@@ -242,7 +242,7 @@ static int ipc_read_sem(void) /* {{{ */
   ipc_submit_g("sem", "count", "arrays", sem_nsems);
   ipc_submit_g("sem", "count", "total", sems);
 
-  return (0);
+  return 0;
 } /* }}} int ipc_read_sem */
 
 static int ipc_read_shm(void) /* {{{ */
@@ -267,7 +267,7 @@ static int ipc_read_shm(void) /* {{{ */
   ipc_submit_g("shm", "segments", NULL, shm_segments);
   ipc_submit_g("shm", "bytes", "total", shm_bytes);
 
-  return (0);
+  return 0;
 }
 /* }}} int ipc_read_shm */
 
@@ -295,7 +295,7 @@ static int ipc_read_msg(void) /* {{{ */
   ipc_submit_g("msg", "count", "headers", msg_qnum);
   ipc_submit_g("msg", "count", "space", msg_used_space);
 
-  return (0);
+  return 0;
 }
 /* }}} */
 #endif /* KERNEL_AIX */
@@ -307,7 +307,7 @@ static int ipc_read(void) /* {{{ */
   x |= ipc_read_sem();
   x |= ipc_read_msg();
 
-  return (x);
+  return x;
 }
 /* }}} */
 
@@ -319,5 +319,3 @@ void module_register(void) /* {{{ */
   plugin_register_read("ipc", ipc_read);
 }
 /* }}} */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 1bbaf41..98e77bf 100644 (file)
@@ -253,7 +253,7 @@ static int sensor_list_add(ipmi_sensor_t *sensor) {
 
   /* Both `ignorelist' and `plugin_instance' may be NULL. */
   if (ignorelist_match(ignorelist, sensor_name_ptr) != 0)
-    return (0);
+    return 0;
 
   /* FIXME: Use rate unit or base unit to scale the value */
 
@@ -283,7 +283,7 @@ static int sensor_list_add(ipmi_sensor_t *sensor) {
          "because I don't know how to handle its type (%#x, %s). "
          "If you need this sensor, please file a bug report.",
          sensor_name_ptr, sensor_type, sensor_type_str);
-    return (-1);
+    return -1;
   }
   } /* switch (sensor_type) */
 
@@ -299,13 +299,13 @@ static int sensor_list_add(ipmi_sensor_t *sensor) {
 
   if (list_item != NULL) {
     pthread_mutex_unlock(&sensor_list_lock);
-    return (0);
+    return 0;
   }
 
   list_item = (c_ipmi_sensor_list_t *)calloc(1, sizeof(c_ipmi_sensor_list_t));
   if (list_item == NULL) {
     pthread_mutex_unlock(&sensor_list_lock);
-    return (-1);
+    return -1;
   }
 
   list_item->sensor_id = ipmi_sensor_convert_to_id(sensor);
@@ -333,7 +333,7 @@ static int sensor_list_add(ipmi_sensor_t *sensor) {
     plugin_dispatch_notification(&n);
   }
 
-  return (0);
+  return 0;
 } /* int sensor_list_add */
 
 static int sensor_list_remove(ipmi_sensor_t *sensor) {
@@ -355,7 +355,7 @@ static int sensor_list_remove(ipmi_sensor_t *sensor) {
 
   if (list_item == NULL) {
     pthread_mutex_unlock(&sensor_list_lock);
-    return (-1);
+    return -1;
   }
 
   if (list_prev == NULL)
@@ -382,7 +382,7 @@ static int sensor_list_remove(ipmi_sensor_t *sensor) {
   }
 
   free(list_item);
-  return (0);
+  return 0;
 } /* int sensor_list_remove */
 
 static int sensor_list_read_all(void) {
@@ -396,7 +396,7 @@ static int sensor_list_read_all(void) {
 
   pthread_mutex_unlock(&sensor_list_lock);
 
-  return (0);
+  return 0;
 } /* int sensor_list_read_all */
 
 static int sensor_list_remove_all(void) {
@@ -417,7 +417,7 @@ static int sensor_list_remove_all(void) {
     list_item = list_next;
   } /* while (list_item) */
 
-  return (0);
+  return 0;
 } /* int sensor_list_remove_all */
 
 /*
@@ -487,7 +487,7 @@ static int thread_init(os_handler_t **ret_os_handler) {
   os_handler = ipmi_posix_thread_setup_os_handler(SIGIO);
   if (os_handler == NULL) {
     ERROR("ipmi plugin: ipmi_posix_thread_setup_os_handler failed.");
-    return (-1);
+    return -1;
   }
 
   ipmi_init(os_handler);
@@ -496,7 +496,7 @@ static int thread_init(os_handler_t **ret_os_handler) {
                               /* user data = */ NULL, &smi_connection);
   if (status != 0) {
     c_ipmi_error("ipmi_smi_setup_con", status);
-    return (-1);
+    return -1;
   }
 
   ipmi_open_option_t open_option[1] = {[0] = {.option = IPMI_OPEN_OPTION_ALL,
@@ -509,11 +509,11 @@ static int thread_init(os_handler_t **ret_os_handler) {
       sizeof(open_option) / sizeof(open_option[0]), &domain_id);
   if (status != 0) {
     c_ipmi_error("ipmi_open_domain", status);
-    return (-1);
+    return -1;
   }
 
   *ret_os_handler = os_handler;
-  return (0);
+  return 0;
 } /* int thread_init */
 
 static void *thread_main(void __attribute__((unused)) * user_data) {
@@ -523,7 +523,7 @@ static void *thread_main(void __attribute__((unused)) * user_data) {
   status = thread_init(&os_handler);
   if (status != 0) {
     ERROR("ipmi plugin: thread_init failed.\n");
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   while (c_ipmi_active != 0) {
@@ -533,14 +533,14 @@ static void *thread_main(void __attribute__((unused)) * user_data) {
 
   ipmi_posix_thread_free_os_handler(os_handler);
 
-  return ((void *)0);
+  return (void *)0;
 } /* void *thread_main */
 
 static int c_ipmi_config(const char *key, const char *value) {
   if (ignorelist == NULL)
     ignorelist = ignorelist_create(/* invert = */ 1);
   if (ignorelist == NULL)
-    return (1);
+    return 1;
 
   if (strcasecmp("Sensor", key) == 0) {
     ignorelist_add(ignorelist, value);
@@ -559,10 +559,10 @@ static int c_ipmi_config(const char *key, const char *value) {
     if (IS_TRUE(value))
       c_ipmi_nofiy_notpresent = 1;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int c_ipmi_config */
 
 static int c_ipmi_init(void) {
@@ -580,16 +580,16 @@ static int c_ipmi_init(void) {
     c_ipmi_active = 0;
     thread_id = (pthread_t)0;
     ERROR("ipmi plugin: pthread_create failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int c_ipmi_init */
 
 static int c_ipmi_read(void) {
   if ((c_ipmi_active == 0) || (thread_id == (pthread_t)0)) {
     INFO("ipmi plugin: c_ipmi_read: I'm not active, returning false.");
-    return (-1);
+    return -1;
   }
 
   sensor_list_read_all();
@@ -599,7 +599,7 @@ static int c_ipmi_read(void) {
   else
     c_ipmi_init_in_progress = 0;
 
-  return (0);
+  return 0;
 } /* int c_ipmi_read */
 
 static int c_ipmi_shutdown(void) {
@@ -612,7 +612,7 @@ static int c_ipmi_shutdown(void) {
 
   sensor_list_remove_all();
 
-  return (0);
+  return 0;
 } /* int c_ipmi_shutdown */
 
 void module_register(void) {
@@ -621,5 +621,3 @@ void module_register(void) {
   plugin_register_read("ipmi", c_ipmi_read);
   plugin_register_shutdown("ipmi", c_ipmi_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 fdm=marker et : */
index bf17cfb..1d127bf 100644 (file)
@@ -98,7 +98,7 @@ static int iptables_config(const char *key, const char *value) {
   else if (strcasecmp(key, "Chain6") == 0)
     ip_version = IPV6;
   else
-    return (1);
+    return 1;
 
   ip_chain_t temp = {0};
   ip_chain_t * final, **list;
@@ -115,7 +115,7 @@ static int iptables_config(const char *key, const char *value) {
   if (value_copy == NULL) {
     char errbuf[1024];
     ERROR("strdup failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   /*
@@ -131,7 +131,7 @@ static int iptables_config(const char *key, const char *value) {
   fields_num = strsplit(value_copy, fields, 4);
   if (fields_num < 2) {
     free(value_copy);
-    return (1);
+    return 1;
   }
 
   table = fields[0];
@@ -141,7 +141,7 @@ static int iptables_config(const char *key, const char *value) {
   if ((unsigned int)table_len > sizeof(temp.table)) {
     ERROR("Table `%s' too long.", table);
     free(value_copy);
-    return (1);
+    return 1;
   }
   sstrncpy(temp.table, table, table_len);
 
@@ -149,7 +149,7 @@ static int iptables_config(const char *key, const char *value) {
   if ((unsigned int)chain_len > sizeof(temp.chain)) {
     ERROR("Chain `%s' too long.", chain);
     free(value_copy);
-    return (1);
+    return 1;
   }
   sstrncpy(temp.chain, chain, chain_len);
 
@@ -164,7 +164,7 @@ static int iptables_config(const char *key, const char *value) {
       temp.rule.comment = strdup(comment);
       if (temp.rule.comment == NULL) {
         free(value_copy);
-        return (1);
+        return 1;
       }
       temp.rule_type = RTYPE_COMMENT;
     }
@@ -185,7 +185,7 @@ static int iptables_config(const char *key, const char *value) {
     char errbuf[1024];
     ERROR("realloc failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
     sfree(temp.rule.comment);
-    return (1);
+    return 1;
   }
 
   chain_list = list;
@@ -194,7 +194,7 @@ static int iptables_config(const char *key, const char *value) {
     char errbuf[1024];
     ERROR("malloc failed: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
     sfree(temp.rule.comment);
-    return (1);
+    return 1;
   }
   memcpy(final, &temp, sizeof(temp));
   chain_list[chain_num] = final;
@@ -203,7 +203,7 @@ static int iptables_config(const char *key, const char *value) {
   DEBUG("Chain #%i: table = %s; chain = %s;", chain_num, final->table,
         final->chain);
 
-  return (0);
+  return 0;
 } /* int iptables_config */
 
 static int submit6_match(const struct ip6t_entry_match *match,
@@ -215,13 +215,13 @@ static int submit6_match(const struct ip6t_entry_match *match,
   /* Select the rules to collect */
   if (chain->rule_type == RTYPE_NUM) {
     if (chain->rule.num != rule_num)
-      return (0);
+      return 0;
   } else {
     if (strcmp(match->u.user.name, "comment") != 0)
-      return (0);
+      return 0;
     if ((chain->rule_type == RTYPE_COMMENT) &&
         (strcmp(chain->rule.comment, (char *)match->data) != 0))
-      return (0);
+      return 0;
   }
 
   sstrncpy(vl.plugin, "ip6tables", sizeof(vl.plugin));
@@ -229,7 +229,7 @@ static int submit6_match(const struct ip6t_entry_match *match,
   status = ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s-%s",
                      chain->table, chain->chain);
   if ((status < 1) || ((unsigned int)status >= sizeof(vl.plugin_instance)))
-    return (0);
+    return 0;
 
   if (chain->name[0] != '\0') {
     sstrncpy(vl.type_instance, chain->name, sizeof(vl.type_instance));
@@ -250,7 +250,7 @@ static int submit6_match(const struct ip6t_entry_match *match,
   vl.values = &(value_t){.derive = (derive_t)entry->counters.pcnt};
   plugin_dispatch_values(&vl);
 
-  return (0);
+  return 0;
 } /* int submit6_match */
 
 /* This needs to return `int' for IPT_MATCH_ITERATE to work. */
@@ -263,13 +263,13 @@ static int submit_match(const struct ipt_entry_match *match,
   /* Select the rules to collect */
   if (chain->rule_type == RTYPE_NUM) {
     if (chain->rule.num != rule_num)
-      return (0);
+      return 0;
   } else {
     if (strcmp(match->u.user.name, "comment") != 0)
-      return (0);
+      return 0;
     if ((chain->rule_type == RTYPE_COMMENT) &&
         (strcmp(chain->rule.comment, (char *)match->data) != 0))
-      return (0);
+      return 0;
   }
 
   sstrncpy(vl.plugin, "iptables", sizeof(vl.plugin));
@@ -277,7 +277,7 @@ static int submit_match(const struct ipt_entry_match *match,
   status = ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s-%s",
                      chain->table, chain->chain);
   if ((status < 1) || ((unsigned int)status >= sizeof(vl.plugin_instance)))
-    return (0);
+    return 0;
 
   if (chain->name[0] != '\0') {
     sstrncpy(vl.type_instance, chain->name, sizeof(vl.type_instance));
@@ -298,7 +298,7 @@ static int submit_match(const struct ipt_entry_match *match,
   vl.values = &(value_t){.derive = (derive_t)entry->counters.pcnt};
   plugin_dispatch_values(&vl);
 
-  return (0);
+  return 0;
 } /* int submit_match */
 
 /* ipv6 submit_chain */
@@ -407,7 +407,7 @@ static int iptables_read(void) {
       num_failures++;
   } /* for (i = 0 .. chain_num) */
 
-  return ((num_failures < chain_num) ? 0 : -1);
+  return (num_failures < chain_num) ? 0 : -1;
 } /* int iptables_read */
 
 static int iptables_shutdown(void) {
@@ -418,7 +418,7 @@ static int iptables_shutdown(void) {
   }
   sfree(chain_list);
 
-  return (0);
+  return 0;
 } /* int iptables_shutdown */
 
 static int iptables_init(void) {
@@ -435,7 +435,7 @@ static int iptables_init(void) {
               "running \"setcap cap_net_admin=ep\" on the collectd binary.");
   }
 #endif
-  return (0);
+  return 0;
 } /* int iptables_init */
 
 void module_register(void) {
index 2446bd1..da67970 100644 (file)
 #include <netinet/in.h>
 #endif /* HAVE_NETINET_IN_H */
 
-/* this can probably only be found in the kernel sources */
-#if HAVE_LINUX_IP_VS_H
 #include <linux/ip_vs.h>
-#elif HAVE_NET_IP_VS_H
-#include <net/ip_vs.h>
-#elif HAVE_IP_VS_H
-#include <ip_vs.h>
-#endif /* HAVE_IP_VS_H */
 
 #define log_err(...) ERROR("ipvs: " __VA_ARGS__)
 #define log_info(...) INFO("ipvs: " __VA_ARGS__)
@@ -64,68 +57,67 @@ static int sockfd = -1;
  */
 static struct ip_vs_get_services *ipvs_get_services(void) {
   struct ip_vs_getinfo ipvs_info;
-  struct ip_vs_get_services *ret;
+  struct ip_vs_get_services *services;
 
-  socklen_t len;
+  socklen_t len = sizeof(ipvs_info);
 
-  len = sizeof(ipvs_info);
-
-  if (0 != getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_INFO, (void *)&ipvs_info,
-                      &len)) {
+  if (getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_INFO, &ipvs_info, &len) ==
+      -1) {
     char errbuf[1024];
     log_err("ip_vs_get_services: getsockopt() failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
     return NULL;
   }
 
-  len = sizeof(*ret) +
+  len = sizeof(*services) +
         sizeof(struct ip_vs_service_entry) * ipvs_info.num_services;
 
-  if (NULL == (ret = malloc(len))) {
+  services = malloc(len);
+  if (services == NULL) {
     log_err("ipvs_get_services: Out of memory.");
-    exit(3);
+    return NULL;
   }
 
-  ret->num_services = ipvs_info.num_services;
+  services->num_services = ipvs_info.num_services;
 
-  if (0 != getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_SERVICES, (void *)ret,
-                      &len)) {
+  if (getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_SERVICES, services, &len) ==
+      -1) {
     char errbuf[1024];
     log_err("ipvs_get_services: getsockopt failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
 
-    free(ret);
+    free(services);
     return NULL;
   }
-  return ret;
+  return services;
 } /* ipvs_get_services */
 
 static struct ip_vs_get_dests *ipvs_get_dests(struct ip_vs_service_entry *se) {
-  struct ip_vs_get_dests *ret;
-  socklen_t len;
+  struct ip_vs_get_dests *dests;
 
-  len = sizeof(*ret) + sizeof(struct ip_vs_dest_entry) * se->num_dests;
+  socklen_t len =
+      sizeof(*dests) + sizeof(struct ip_vs_dest_entry) * se->num_dests;
 
-  if (NULL == (ret = malloc(len))) {
+  dests = malloc(len);
+  if (dests == NULL) {
     log_err("ipvs_get_dests: Out of memory.");
-    exit(3);
+    return NULL;
   }
 
-  ret->fwmark = se->fwmark;
-  ret->protocol = se->protocol;
-  ret->addr = se->addr;
-  ret->port = se->port;
-  ret->num_dests = se->num_dests;
+  dests->fwmark = se->fwmark;
+  dests->protocol = se->protocol;
+  dests->addr = se->addr;
+  dests->port = se->port;
+  dests->num_dests = se->num_dests;
 
-  if (0 !=
-      getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_DESTS, (void *)ret, &len)) {
+  if (getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_DESTS, dests, &len) == -1) {
     char errbuf[1024];
     log_err("ipvs_get_dests: getsockopt() failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    free(ret);
+    free(dests);
     return NULL;
   }
-  return ret;
+  return dests;
 } /* ip_vs_get_dests */
 
 /*
@@ -134,19 +126,17 @@ static struct ip_vs_get_dests *ipvs_get_dests(struct ip_vs_service_entry *se) {
 static int cipvs_init(void) {
   struct ip_vs_getinfo ipvs_info;
 
-  socklen_t len;
-
-  if (-1 == (sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))) {
+  if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
     char errbuf[1024];
     log_err("cipvs_init: socket() failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
     return -1;
   }
 
-  len = sizeof(ipvs_info);
+  socklen_t len = sizeof(ipvs_info);
 
-  if (0 != getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_INFO, (void *)&ipvs_info,
-                      &len)) {
+  if (getsockopt(sockfd, IPPROTO_IP, IP_VS_SO_GET_INFO, &ipvs_info, &len) ==
+      -1) {
     char errbuf[1024];
     log_err("cipvs_init: getsockopt() failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
@@ -176,21 +166,16 @@ static int cipvs_init(void) {
 
 /* plugin instance */
 static int get_pi(struct ip_vs_service_entry *se, char *pi, size_t size) {
-  struct in_addr addr;
-  int len = 0;
-
-  if ((NULL == se) || (NULL == pi))
+  if ((se == NULL) || (pi == NULL))
     return 0;
 
-  addr.s_addr = se->addr;
+  struct in_addr addr = {.s_addr = se->addr};
 
-  /* inet_ntoa() returns a pointer to a statically allocated buffer
-   * I hope non-glibc systems behave the same */
-  len =
+  int len =
       ssnprintf(pi, size, "%s_%s%u", inet_ntoa(addr),
                 (se->protocol == IPPROTO_TCP) ? "TCP" : "UDP", ntohs(se->port));
 
-  if ((0 > len) || (size <= ((size_t)len))) {
+  if ((len < 0) || (size <= ((size_t)len))) {
     log_err("plugin instance truncated: %s", pi);
     return -1;
   }
@@ -199,19 +184,14 @@ static int get_pi(struct ip_vs_service_entry *se, char *pi, size_t size) {
 
 /* type instance */
 static int get_ti(struct ip_vs_dest_entry *de, char *ti, size_t size) {
-  struct in_addr addr;
-  int len = 0;
-
-  if ((NULL == de) || (NULL == ti))
+  if ((de == NULL) || (ti == NULL))
     return 0;
 
-  addr.s_addr = de->addr;
+  struct in_addr addr = {.s_addr = de->addr};
 
-  /* inet_ntoa() returns a pointer to a statically allocated buffer
-   * I hope non-glibc systems behave the same */
-  len = ssnprintf(ti, size, "%s_%u", inet_ntoa(addr), ntohs(de->port));
+  int len = ssnprintf(ti, size, "%s_%u", inet_ntoa(addr), ntohs(de->port));
 
-  if ((0 > len) || (size <= ((size_t)len))) {
+  if ((len < 0) || (size <= ((size_t)len))) {
     log_err("type instance truncated: %s", ti);
     return -1;
   }
@@ -228,11 +208,10 @@ static void cipvs_submit_connections(const char *pi, const char *ti,
   sstrncpy(vl.plugin, "ipvs", sizeof(vl.plugin));
   sstrncpy(vl.plugin_instance, pi, sizeof(vl.plugin_instance));
   sstrncpy(vl.type, "connections", sizeof(vl.type));
-  sstrncpy(vl.type_instance, (NULL != ti) ? ti : "total",
+  sstrncpy(vl.type_instance, (ti != NULL) ? ti : "total",
            sizeof(vl.type_instance));
 
   plugin_dispatch_values(&vl);
-  return;
 } /* cipvs_submit_connections */
 
 static void cipvs_submit_if(const char *pi, const char *t, const char *ti,
@@ -248,11 +227,10 @@ static void cipvs_submit_if(const char *pi, const char *t, const char *ti,
   sstrncpy(vl.plugin, "ipvs", sizeof(vl.plugin));
   sstrncpy(vl.plugin_instance, pi, sizeof(vl.plugin_instance));
   sstrncpy(vl.type, t, sizeof(vl.type));
-  sstrncpy(vl.type_instance, (NULL != ti) ? ti : "total",
+  sstrncpy(vl.type_instance, (ti != NULL) ? ti : "total",
            sizeof(vl.type_instance));
 
   plugin_dispatch_values(&vl);
-  return;
 } /* cipvs_submit_if */
 
 static void cipvs_submit_dest(const char *pi, struct ip_vs_dest_entry *de) {
@@ -260,13 +238,12 @@ static void cipvs_submit_dest(const char *pi, struct ip_vs_dest_entry *de) {
 
   char ti[DATA_MAX_NAME_LEN];
 
-  if (0 != get_ti(de, ti, sizeof(ti)))
+  if (get_ti(de, ti, sizeof(ti)) != 0)
     return;
 
   cipvs_submit_connections(pi, ti, stats.conns);
   cipvs_submit_if(pi, "if_packets", ti, stats.inpkts, stats.outpkts);
   cipvs_submit_if(pi, "if_octets", ti, stats.inbytes, stats.outbytes);
-  return;
 } /* cipvs_submit_dest */
 
 static void cipvs_submit_service(struct ip_vs_service_entry *se) {
@@ -275,7 +252,7 @@ static void cipvs_submit_service(struct ip_vs_service_entry *se) {
 
   char pi[DATA_MAX_NAME_LEN];
 
-  if (0 != get_pi(se, pi, sizeof(pi))) {
+  if (get_pi(se, pi, sizeof(pi)) != 0) {
     free(dests);
     return;
   }
@@ -292,12 +269,11 @@ static void cipvs_submit_service(struct ip_vs_service_entry *se) {
 } /* cipvs_submit_service */
 
 static int cipvs_read(void) {
-  struct ip_vs_get_services *services = NULL;
-
   if (sockfd < 0)
-    return (-1);
+    return -1;
 
-  if (NULL == (services = ipvs_get_services()))
+  struct ip_vs_get_services *services = ipvs_get_services();
+  if (services == NULL)
     return -1;
 
   for (size_t i = 0; i < services->num_services; ++i)
@@ -321,5 +297,3 @@ void module_register(void) {
   plugin_register_shutdown("ipvs", cipvs_shutdown);
   return;
 } /* module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 371ba64..d540415 100644 (file)
--- a/src/irq.c
+++ b/src/irq.c
@@ -54,10 +54,10 @@ static int irq_config(const char *key, const char *value) {
       invert = 0;
     ignorelist_set_invert(ignorelist, invert);
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void irq_submit(const char *irq_name, derive_t value) {
@@ -93,7 +93,7 @@ static int irq_read(void) {
     char errbuf[1024];
     ERROR("irq plugin: fopen (/proc/interrupts): %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* Get CPU count from the first line */
@@ -103,7 +103,7 @@ static int irq_read(void) {
     ERROR("irq plugin: unable to get CPU count from first line "
           "of /proc/interrupts");
     fclose(fh);
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -165,7 +165,7 @@ static int irq_read(void) {
 
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* int irq_read */
 
 void module_register(void) {
index 63b5e31..e3d3442 100644 (file)
@@ -137,7 +137,7 @@ static int ctoj_string(JNIEnv *jvm_env, /* {{{ */
   o_string = (*jvm_env)->NewStringUTF(jvm_env, (string != NULL) ? string : "");
   if (o_string == NULL) {
     ERROR("java plugin: ctoj_string: NewStringUTF failed.");
-    return (-1);
+    return -1;
   }
 
   /* Search for the `void setFoo (String s)' method. */
@@ -147,7 +147,7 @@ static int ctoj_string(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_string: Cannot find method `void %s (String)'.",
           method_name);
     (*jvm_env)->DeleteLocalRef(jvm_env, o_string);
-    return (-1);
+    return -1;
   }
 
   /* Call the method. */
@@ -156,7 +156,7 @@ static int ctoj_string(JNIEnv *jvm_env, /* {{{ */
   /* Decrease reference counter on the java.lang.String object. */
   (*jvm_env)->DeleteLocalRef(jvm_env, o_string);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_string */
 
 static jstring ctoj_output_string(JNIEnv *jvm_env, /* {{{ */
@@ -170,7 +170,7 @@ static jstring ctoj_output_string(JNIEnv *jvm_env, /* {{{ */
     return NULL;
   }
 
-  return (o_string);
+  return o_string;
 } /* }}} int ctoj_output_string */
 
 static int ctoj_int(JNIEnv *jvm_env, /* {{{ */
@@ -183,12 +183,12 @@ static int ctoj_int(JNIEnv *jvm_env, /* {{{ */
   if (m_set == NULL) {
     ERROR("java plugin: ctoj_int: Cannot find method `void %s (int)'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   (*jvm_env)->CallVoidMethod(jvm_env, object_ptr, m_set, value);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_int */
 
 static int ctoj_long(JNIEnv *jvm_env, /* {{{ */
@@ -201,12 +201,12 @@ static int ctoj_long(JNIEnv *jvm_env, /* {{{ */
   if (m_set == NULL) {
     ERROR("java plugin: ctoj_long: Cannot find method `void %s (long)'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   (*jvm_env)->CallVoidMethod(jvm_env, object_ptr, m_set, value);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_long */
 
 static int ctoj_double(JNIEnv *jvm_env, /* {{{ */
@@ -219,12 +219,12 @@ static int ctoj_double(JNIEnv *jvm_env, /* {{{ */
   if (m_set == NULL) {
     ERROR("java plugin: ctoj_double: Cannot find method `void %s (double)'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   (*jvm_env)->CallVoidMethod(jvm_env, object_ptr, m_set, value);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_double */
 
 /* Convert a jlong to a java.lang.Number */
@@ -238,7 +238,7 @@ static jobject ctoj_jlong_to_number(JNIEnv *jvm_env, jlong value) /* {{{ */
   if (c_long == NULL) {
     ERROR("java plugin: ctoj_jlong_to_number: Looking up the "
           "java.lang.Long class failed.");
-    return (NULL);
+    return NULL;
   }
 
   m_long_constructor =
@@ -246,10 +246,10 @@ static jobject ctoj_jlong_to_number(JNIEnv *jvm_env, jlong value) /* {{{ */
   if (m_long_constructor == NULL) {
     ERROR("java plugin: ctoj_jlong_to_number: Looking up the "
           "`Long (long)' constructor failed.");
-    return (NULL);
+    return NULL;
   }
 
-  return ((*jvm_env)->NewObject(jvm_env, c_long, m_long_constructor, value));
+  return (*jvm_env)->NewObject(jvm_env, c_long, m_long_constructor, value);
 } /* }}} jobject ctoj_jlong_to_number */
 
 /* Convert a jdouble to a java.lang.Number */
@@ -263,7 +263,7 @@ static jobject ctoj_jdouble_to_number(JNIEnv *jvm_env, jdouble value) /* {{{ */
   if (c_double == NULL) {
     ERROR("java plugin: ctoj_jdouble_to_number: Looking up the "
           "java.lang.Double class failed.");
-    return (NULL);
+    return NULL;
   }
 
   m_double_constructor =
@@ -271,26 +271,25 @@ static jobject ctoj_jdouble_to_number(JNIEnv *jvm_env, jdouble value) /* {{{ */
   if (m_double_constructor == NULL) {
     ERROR("java plugin: ctoj_jdouble_to_number: Looking up the "
           "`Double (double)' constructor failed.");
-    return (NULL);
+    return NULL;
   }
 
-  return (
-      (*jvm_env)->NewObject(jvm_env, c_double, m_double_constructor, value));
+  return (*jvm_env)->NewObject(jvm_env, c_double, m_double_constructor, value);
 } /* }}} jobject ctoj_jdouble_to_number */
 
 /* Convert a value_t to a java.lang.Number */
 static jobject ctoj_value_to_number(JNIEnv *jvm_env, /* {{{ */
                                     value_t value, int ds_type) {
   if (ds_type == DS_TYPE_COUNTER)
-    return (ctoj_jlong_to_number(jvm_env, (jlong)value.counter));
+    return ctoj_jlong_to_number(jvm_env, (jlong)value.counter);
   else if (ds_type == DS_TYPE_GAUGE)
-    return (ctoj_jdouble_to_number(jvm_env, (jdouble)value.gauge));
+    return ctoj_jdouble_to_number(jvm_env, (jdouble)value.gauge);
   if (ds_type == DS_TYPE_DERIVE)
-    return (ctoj_jlong_to_number(jvm_env, (jlong)value.derive));
+    return ctoj_jlong_to_number(jvm_env, (jlong)value.derive);
   if (ds_type == DS_TYPE_ABSOLUTE)
-    return (ctoj_jlong_to_number(jvm_env, (jlong)value.absolute));
+    return ctoj_jlong_to_number(jvm_env, (jlong)value.absolute);
   else
-    return (NULL);
+    return NULL;
 } /* }}} jobject ctoj_value_to_number */
 
 /* Convert a data_source_t to a org/collectd/api/DataSource */
@@ -306,7 +305,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
   if (c_datasource == NULL) {
     ERROR("java plugin: ctoj_data_source: "
           "FindClass (org/collectd/api/DataSource) failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Lookup the `ValueList ()' constructor. */
@@ -315,7 +314,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
   if (m_datasource_constructor == NULL) {
     ERROR("java plugin: ctoj_data_source: Cannot find the "
           "`DataSource ()' constructor.");
-    return (NULL);
+    return NULL;
   }
 
   /* Create a new instance. */
@@ -324,7 +323,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
   if (o_datasource == NULL) {
     ERROR("java plugin: ctoj_data_source: "
           "Creating a new DataSource instance failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Set name via `void setName (String name)' */
@@ -334,7 +333,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_data_source: "
           "ctoj_string (setName) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_datasource);
-    return (NULL);
+    return NULL;
   }
 
   /* Set type via `void setType (int type)' */
@@ -343,7 +342,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_data_source: "
           "ctoj_int (setType) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_datasource);
-    return (NULL);
+    return NULL;
   }
 
   /* Set min via `void setMin (double min)' */
@@ -353,7 +352,7 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_data_source: "
           "ctoj_double (setMin) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_datasource);
-    return (NULL);
+    return NULL;
   }
 
   /* Set max via `void setMax (double max)' */
@@ -363,10 +362,10 @@ static jobject ctoj_data_source(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_data_source: "
           "ctoj_double (setMax) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_datasource);
-    return (NULL);
+    return NULL;
   }
 
-  return (o_datasource);
+  return o_datasource;
 } /* }}} jobject ctoj_data_source */
 
 /* Convert a oconfig_value_t to a org/collectd/api/OConfigValue */
@@ -384,7 +383,7 @@ static jobject ctoj_oconfig_value(JNIEnv *jvm_env, /* {{{ */
   if (c_ocvalue == NULL) {
     ERROR("java plugin: ctoj_oconfig_value: "
           "FindClass (org/collectd/api/OConfigValue) failed.");
-    return (NULL);
+    return NULL;
   }
 
   if (ocvalue.type == OCONFIG_TYPE_BOOLEAN) {
@@ -397,11 +396,11 @@ static jobject ctoj_oconfig_value(JNIEnv *jvm_env, /* {{{ */
     if (m_ocvalue_constructor == NULL) {
       ERROR("java plugin: ctoj_oconfig_value: Cannot find the "
             "`OConfigValue (boolean)' constructor.");
-      return (NULL);
+      return NULL;
     }
 
-    return ((*jvm_env)->NewObject(jvm_env, c_ocvalue, m_ocvalue_constructor,
-                                  tmp_boolean));
+    return (*jvm_env)->NewObject(jvm_env, c_ocvalue, m_ocvalue_constructor,
+                                 tmp_boolean);
   } /* if (ocvalue.type == OCONFIG_TYPE_BOOLEAN) */
   else if (ocvalue.type == OCONFIG_TYPE_STRING) {
     m_ocvalue_constructor = (*jvm_env)->GetMethodID(
@@ -409,14 +408,14 @@ static jobject ctoj_oconfig_value(JNIEnv *jvm_env, /* {{{ */
     if (m_ocvalue_constructor == NULL) {
       ERROR("java plugin: ctoj_oconfig_value: Cannot find the "
             "`OConfigValue (String)' constructor.");
-      return (NULL);
+      return NULL;
     }
 
     o_argument = (*jvm_env)->NewStringUTF(jvm_env, ocvalue.value.string);
     if (o_argument == NULL) {
       ERROR("java plugin: ctoj_oconfig_value: "
             "Creating a String object failed.");
-      return (NULL);
+      return NULL;
     }
   } else if (ocvalue.type == OCONFIG_TYPE_NUMBER) {
     m_ocvalue_constructor = (*jvm_env)->GetMethodID(
@@ -424,17 +423,17 @@ static jobject ctoj_oconfig_value(JNIEnv *jvm_env, /* {{{ */
     if (m_ocvalue_constructor == NULL) {
       ERROR("java plugin: ctoj_oconfig_value: Cannot find the "
             "`OConfigValue (Number)' constructor.");
-      return (NULL);
+      return NULL;
     }
 
     o_argument = ctoj_jdouble_to_number(jvm_env, (jdouble)ocvalue.value.number);
     if (o_argument == NULL) {
       ERROR("java plugin: ctoj_oconfig_value: "
             "Creating a Number object failed.");
-      return (NULL);
+      return NULL;
     }
   } else {
-    return (NULL);
+    return NULL;
   }
 
   assert(m_ocvalue_constructor != NULL);
@@ -446,11 +445,11 @@ static jobject ctoj_oconfig_value(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_oconfig_value: "
           "Creating an OConfigValue object failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_argument);
-    return (NULL);
+    return NULL;
   }
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_argument);
-  return (o_ocvalue);
+  return o_ocvalue;
 } /* }}} jobject ctoj_oconfig_value */
 
 /* Convert a oconfig_item_t to a org/collectd/api/OConfigItem */
@@ -467,7 +466,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
   if (c_ocitem == NULL) {
     ERROR("java plugin: ctoj_oconfig_item: "
           "FindClass (org/collectd/api/OConfigItem) failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Get the required methods: m_ocitem_constructor, m_addvalue, and m_addchild
@@ -477,7 +476,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
   if (m_ocitem_constructor == NULL) {
     ERROR("java plugin: ctoj_oconfig_item: Cannot find the "
           "`OConfigItem (String)' constructor.");
-    return (NULL);
+    return NULL;
   }
 
   m_addvalue = (*jvm_env)->GetMethodID(jvm_env, c_ocitem, "addValue",
@@ -485,7 +484,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
   if (m_addvalue == NULL) {
     ERROR("java plugin: ctoj_oconfig_item: Cannot find the "
           "`addValue (OConfigValue)' method.");
-    return (NULL);
+    return NULL;
   }
 
   m_addchild = (*jvm_env)->GetMethodID(jvm_env, c_ocitem, "addChild",
@@ -493,7 +492,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
   if (m_addchild == NULL) {
     ERROR("java plugin: ctoj_oconfig_item: Cannot find the "
           "`addChild (OConfigItem)' method.");
-    return (NULL);
+    return NULL;
   }
   /* }}} */
 
@@ -503,7 +502,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
   if (o_key == NULL) {
     ERROR("java plugin: ctoj_oconfig_item: "
           "Creating String object failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Create an OConfigItem object */
@@ -513,7 +512,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_oconfig_item: "
           "Creating an OConfigItem object failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_key);
-    return (NULL);
+    return NULL;
   }
 
   /* We don't need the String object any longer.. */
@@ -529,7 +528,7 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
       ERROR("java plugin: ctoj_oconfig_item: "
             "Creating an OConfigValue object failed.");
       (*jvm_env)->DeleteLocalRef(jvm_env, o_ocitem);
-      return (NULL);
+      return NULL;
     }
 
     (*jvm_env)->CallVoidMethod(jvm_env, o_ocitem, m_addvalue, o_value);
@@ -546,14 +545,14 @@ static jobject ctoj_oconfig_item(JNIEnv *jvm_env, /* {{{ */
       ERROR("java plugin: ctoj_oconfig_item: "
             "Creating an OConfigItem object failed.");
       (*jvm_env)->DeleteLocalRef(jvm_env, o_ocitem);
-      return (NULL);
+      return NULL;
     }
 
     (*jvm_env)->CallVoidMethod(jvm_env, o_ocitem, m_addchild, o_child);
     (*jvm_env)->DeleteLocalRef(jvm_env, o_child);
   } /* }}} for (i = 0; i < ci->children_num; i++) */
 
-  return (o_ocitem);
+  return o_ocitem;
 } /* }}} jobject ctoj_oconfig_item */
 
 /* Convert a data_set_t to a org/collectd/api/DataSet */
@@ -570,7 +569,7 @@ static jobject ctoj_data_set(JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */
   if (c_dataset == NULL) {
     ERROR("java plugin: ctoj_data_set: Looking up the "
           "org/collectd/api/DataSet class failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Search for the `DataSet (String type)' constructor. */
@@ -579,7 +578,7 @@ static jobject ctoj_data_set(JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */
   if (m_constructor == NULL) {
     ERROR("java plugin: ctoj_data_set: Looking up the "
           "`DataSet (String)' constructor failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Search for the `void addDataSource (DataSource)' method. */
@@ -588,20 +587,20 @@ static jobject ctoj_data_set(JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */
   if (m_add == NULL) {
     ERROR("java plugin: ctoj_data_set: Looking up the "
           "`addDataSource (DataSource)' method failed.");
-    return (NULL);
+    return NULL;
   }
 
   o_type = (*jvm_env)->NewStringUTF(jvm_env, ds->type);
   if (o_type == NULL) {
     ERROR("java plugin: ctoj_data_set: Creating a String object failed.");
-    return (NULL);
+    return NULL;
   }
 
   o_dataset = (*jvm_env)->NewObject(jvm_env, c_dataset, m_constructor, o_type);
   if (o_dataset == NULL) {
     ERROR("java plugin: ctoj_data_set: Creating a DataSet object failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_type);
-    return (NULL);
+    return NULL;
   }
 
   /* Decrease reference counter on the java.lang.String object. */
@@ -615,7 +614,7 @@ static jobject ctoj_data_set(JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */
       ERROR("java plugin: ctoj_data_set: ctoj_data_source (%s.%s) failed",
             ds->type, ds->ds[i].name);
       (*jvm_env)->DeleteLocalRef(jvm_env, o_dataset);
-      return (NULL);
+      return NULL;
     }
 
     (*jvm_env)->CallVoidMethod(jvm_env, o_dataset, m_add, o_datasource);
@@ -623,7 +622,7 @@ static jobject ctoj_data_set(JNIEnv *jvm_env, const data_set_t *ds) /* {{{ */
     (*jvm_env)->DeleteLocalRef(jvm_env, o_datasource);
   } /* for (i = 0; i < ds->ds_num; i++) */
 
-  return (o_dataset);
+  return o_dataset;
 } /* }}} jobject ctoj_data_set */
 
 static int ctoj_value_list_add_value(JNIEnv *jvm_env, /* {{{ */
@@ -637,21 +636,21 @@ static int ctoj_value_list_add_value(JNIEnv *jvm_env, /* {{{ */
   if (m_addvalue == NULL) {
     ERROR("java plugin: ctoj_value_list_add_value: "
           "Cannot find method `void addValue (Number)'.");
-    return (-1);
+    return -1;
   }
 
   o_number = ctoj_value_to_number(jvm_env, value, ds_type);
   if (o_number == NULL) {
     ERROR("java plugin: ctoj_value_list_add_value: "
           "ctoj_value_to_number failed.");
-    return (-1);
+    return -1;
   }
 
   (*jvm_env)->CallVoidMethod(jvm_env, object_ptr, m_addvalue, o_number);
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_number);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_value_list_add_value */
 
 static int ctoj_value_list_add_data_set(JNIEnv *jvm_env, /* {{{ */
@@ -666,7 +665,7 @@ static int ctoj_value_list_add_data_set(JNIEnv *jvm_env, /* {{{ */
   if (m_setdataset == NULL) {
     ERROR("java plugin: ctoj_value_list_add_data_set: "
           "Cannot find the `void setDataSet (DataSet)' method.");
-    return (-1);
+    return -1;
   }
 
   /* Create a DataSet object. */
@@ -675,7 +674,7 @@ static int ctoj_value_list_add_data_set(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_value_list_add_data_set: "
           "ctoj_data_set (%s) failed.",
           ds->type);
-    return (-1);
+    return -1;
   }
 
   /* Actually call the method. */
@@ -684,7 +683,7 @@ static int ctoj_value_list_add_data_set(JNIEnv *jvm_env, /* {{{ */
   /* Decrease reference counter on the List<DataSource> object. */
   (*jvm_env)->DeleteLocalRef(jvm_env, o_dataset);
 
-  return (0);
+  return 0;
 } /* }}} int ctoj_value_list_add_data_set */
 
 /* Convert a value_list_t (and data_set_t) to a org/collectd/api/ValueList */
@@ -701,7 +700,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
   if (c_valuelist == NULL) {
     ERROR("java plugin: ctoj_value_list: "
           "FindClass (org/collectd/api/ValueList) failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Lookup the `ValueList ()' constructor. */
@@ -710,7 +709,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
   if (m_valuelist_constructor == NULL) {
     ERROR("java plugin: ctoj_value_list: Cannot find the "
           "`ValueList ()' constructor.");
-    return (NULL);
+    return NULL;
   }
 
   /* Create a new instance. */
@@ -719,7 +718,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
   if (o_valuelist == NULL) {
     ERROR("java plugin: ctoj_value_list: Creating a new ValueList instance "
           "failed.");
-    return (NULL);
+    return NULL;
   }
 
   status = ctoj_value_list_add_data_set(jvm_env, c_valuelist, o_valuelist, ds);
@@ -727,7 +726,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: ctoj_value_list: "
           "ctoj_value_list_add_data_set failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_valuelist);
-    return (NULL);
+    return NULL;
   }
 
 /* Set the strings.. */
@@ -738,7 +737,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
       ERROR("java plugin: ctoj_value_list: ctoj_string (%s) failed.",          \
             method_name);                                                      \
       (*jvm_env)->DeleteLocalRef(jvm_env, o_valuelist);                        \
-      return (NULL);                                                           \
+      return NULL;                                                             \
     }                                                                          \
   } while (0)
 
@@ -756,7 +755,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
   if (status != 0) {
     ERROR("java plugin: ctoj_value_list: ctoj_long (setTime) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_valuelist);
-    return (NULL);
+    return NULL;
   }
 
   /* Set the `interval' member.. */
@@ -765,7 +764,7 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
   if (status != 0) {
     ERROR("java plugin: ctoj_value_list: ctoj_long (setInterval) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_valuelist);
-    return (NULL);
+    return NULL;
   }
 
   for (size_t i = 0; i < vl->values_len; i++) {
@@ -775,11 +774,11 @@ static jobject ctoj_value_list(JNIEnv *jvm_env, /* {{{ */
       ERROR("java plugin: ctoj_value_list: "
             "ctoj_value_list_add_value failed.");
       (*jvm_env)->DeleteLocalRef(jvm_env, o_valuelist);
-      return (NULL);
+      return NULL;
     }
   }
 
-  return (o_valuelist);
+  return o_valuelist;
 } /* }}} jobject ctoj_value_list */
 
 /* Convert a notification_t to a org/collectd/api/Notification */
@@ -797,7 +796,7 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
   if (c_notification == NULL) {
     ERROR("java plugin: ctoj_notification: "
           "FindClass (org/collectd/api/Notification) failed.");
-    return (NULL);
+    return NULL;
   }
 
   /* Lookup the `Notification ()' constructor. */
@@ -806,7 +805,7 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
   if (m_constructor == NULL) {
     ERROR("java plugin: ctoj_notification: Cannot find the "
           "`Notification ()' constructor.");
-    return (NULL);
+    return NULL;
   }
 
   /* Create a new instance. */
@@ -815,7 +814,7 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
   if (o_notification == NULL) {
     ERROR("java plugin: ctoj_notification: Creating a new Notification "
           "instance failed.");
-    return (NULL);
+    return NULL;
   }
 
 /* Set the strings.. */
@@ -827,7 +826,7 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
       ERROR("java plugin: ctoj_notification: ctoj_string (%s) failed.",        \
             method_name);                                                      \
       (*jvm_env)->DeleteLocalRef(jvm_env, o_notification);                     \
-      return (NULL);                                                           \
+      return NULL;                                                             \
     }                                                                          \
   } while (0)
 
@@ -846,7 +845,7 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
   if (status != 0) {
     ERROR("java plugin: ctoj_notification: ctoj_long (setTime) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_notification);
-    return (NULL);
+    return NULL;
   }
 
   /* Set the `severity' member.. */
@@ -855,10 +854,10 @@ static jobject ctoj_notification(JNIEnv *jvm_env, /* {{{ */
   if (status != 0) {
     ERROR("java plugin: ctoj_notification: ctoj_int (setSeverity) failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, o_notification);
-    return (NULL);
+    return NULL;
   }
 
-  return (o_notification);
+  return o_notification;
 } /* }}} jobject ctoj_notification */
 
 /*
@@ -878,24 +877,24 @@ static int jtoc_string(JNIEnv *jvm_env, /* {{{ */
   if (method_id == NULL) {
     ERROR("java plugin: jtoc_string: Cannot find method `String %s ()'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   string_obj = (*jvm_env)->CallObjectMethod(jvm_env, object_ptr, method_id);
   if ((string_obj == NULL) && (empty_okay == 0)) {
     ERROR("java plugin: jtoc_string: CallObjectMethod (%s) failed.",
           method_name);
-    return (-1);
+    return -1;
   } else if ((string_obj == NULL) && (empty_okay != 0)) {
     memset(buffer, 0, buffer_size);
-    return (0);
+    return 0;
   }
 
   c_str = (*jvm_env)->GetStringUTFChars(jvm_env, string_obj, 0);
   if (c_str == NULL) {
     ERROR("java plugin: jtoc_string: GetStringUTFChars failed.");
     (*jvm_env)->DeleteLocalRef(jvm_env, string_obj);
-    return (-1);
+    return -1;
   }
 
   sstrncpy(buffer, c_str, buffer_size);
@@ -903,7 +902,7 @@ static int jtoc_string(JNIEnv *jvm_env, /* {{{ */
   (*jvm_env)->ReleaseStringUTFChars(jvm_env, string_obj, c_str);
   (*jvm_env)->DeleteLocalRef(jvm_env, string_obj);
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_string */
 
 /* Call an `int <method> ()' method. */
@@ -916,12 +915,12 @@ static int jtoc_int(JNIEnv *jvm_env, /* {{{ */
   if (method_id == NULL) {
     ERROR("java plugin: jtoc_int: Cannot find method `int %s ()'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   *ret_value = (*jvm_env)->CallIntMethod(jvm_env, object_ptr, method_id);
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_int */
 
 /* Call a `long <method> ()' method. */
@@ -934,12 +933,12 @@ static int jtoc_long(JNIEnv *jvm_env, /* {{{ */
   if (method_id == NULL) {
     ERROR("java plugin: jtoc_long: Cannot find method `long %s ()'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   *ret_value = (*jvm_env)->CallLongMethod(jvm_env, object_ptr, method_id);
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_long */
 
 /* Call a `double <method> ()' method. */
@@ -952,12 +951,12 @@ static int jtoc_double(JNIEnv *jvm_env, /* {{{ */
   if (method_id == NULL) {
     ERROR("java plugin: jtoc_double: Cannot find method `double %s ()'.",
           method_name);
-    return (-1);
+    return -1;
   }
 
   *ret_value = (*jvm_env)->CallDoubleMethod(jvm_env, object_ptr, method_id);
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_double */
 
 static int jtoc_value(JNIEnv *jvm_env, /* {{{ */
@@ -975,7 +974,7 @@ static int jtoc_value(JNIEnv *jvm_env, /* {{{ */
     if (status != 0) {
       ERROR("java plugin: jtoc_value: "
             "jtoc_double failed.");
-      return (-1);
+      return -1;
     }
     (*ret_value).gauge = (gauge_t)tmp_double;
   } else {
@@ -985,7 +984,7 @@ static int jtoc_value(JNIEnv *jvm_env, /* {{{ */
     if (status != 0) {
       ERROR("java plugin: jtoc_value: "
             "jtoc_long failed.");
-      return (-1);
+      return -1;
     }
 
     if (ds_type == DS_TYPE_DERIVE)
@@ -996,7 +995,7 @@ static int jtoc_value(JNIEnv *jvm_env, /* {{{ */
       (*ret_value).counter = (counter_t)tmp_long;
   }
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_value */
 
 /* Read a List<Number>, convert it to `value_t' and add it to the given
@@ -1024,7 +1023,7 @@ static int jtoc_values_array(JNIEnv *jvm_env, /* {{{ */
     (*jvm_env)->DeleteLocalRef(jvm_env, o_number_array);                       \
   if (o_list != NULL)                                                          \
     (*jvm_env)->DeleteLocalRef(jvm_env, o_list);                               \
-  return (status);
+  return status;
 
   /* Call: List<Number> ValueList.getValues () */
   m_getvalues = (*jvm_env)->GetMethodID(jvm_env, class_ptr, "getValues",
@@ -1093,7 +1092,7 @@ static int jtoc_values_array(JNIEnv *jvm_env, /* {{{ */
 #undef BAIL_OUT
   (*jvm_env)->DeleteLocalRef(jvm_env, o_number_array);
   (*jvm_env)->DeleteLocalRef(jvm_env, o_list);
-  return (0);
+  return 0;
 } /* }}} int jtoc_values_array */
 
 /* Convert a org/collectd/api/ValueList to a value_list_t. */
@@ -1107,7 +1106,7 @@ static int jtoc_value_list(JNIEnv *jvm_env, value_list_t *vl, /* {{{ */
   class_ptr = (*jvm_env)->GetObjectClass(jvm_env, object_ptr);
   if (class_ptr == NULL) {
     ERROR("java plugin: jtoc_value_list: GetObjectClass failed.");
-    return (-1);
+    return -1;
   }
 
 /* eo == empty okay */
@@ -1117,7 +1116,7 @@ static int jtoc_value_list(JNIEnv *jvm_env, value_list_t *vl, /* {{{ */
                          object_ptr, method);                                  \
     if (status != 0) {                                                         \
       ERROR("java plugin: jtoc_value_list: jtoc_string (%s) failed.", method); \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
   } while (0)
 
@@ -1128,7 +1127,7 @@ static int jtoc_value_list(JNIEnv *jvm_env, value_list_t *vl, /* {{{ */
     ERROR("java plugin: jtoc_value_list: Data-set `%s' is not defined. "
           "Please consult the types.db(5) manpage for mor information.",
           vl->type);
-    return (-1);
+    return -1;
   }
 
   SET_STRING(vl->host, "getHost", /* empty = */ 0);
@@ -1141,7 +1140,7 @@ static int jtoc_value_list(JNIEnv *jvm_env, value_list_t *vl, /* {{{ */
   status = jtoc_long(jvm_env, &tmp_long, class_ptr, object_ptr, "getTime");
   if (status != 0) {
     ERROR("java plugin: jtoc_value_list: jtoc_long (getTime) failed.");
-    return (-1);
+    return -1;
   }
   /* Java measures time in milliseconds. */
   vl->time = MS_TO_CDTIME_T(tmp_long);
@@ -1149,17 +1148,17 @@ static int jtoc_value_list(JNIEnv *jvm_env, value_list_t *vl, /* {{{ */
   status = jtoc_long(jvm_env, &tmp_long, class_ptr, object_ptr, "getInterval");
   if (status != 0) {
     ERROR("java plugin: jtoc_value_list: jtoc_long (getInterval) failed.");
-    return (-1);
+    return -1;
   }
   vl->interval = MS_TO_CDTIME_T(tmp_long);
 
   status = jtoc_values_array(jvm_env, ds, vl, class_ptr, object_ptr);
   if (status != 0) {
     ERROR("java plugin: jtoc_value_list: jtoc_values_array failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_value_list */
 
 /* Convert a org/collectd/api/Notification to a notification_t. */
@@ -1173,7 +1172,7 @@ static int jtoc_notification(JNIEnv *jvm_env, notification_t *n, /* {{{ */
   class_ptr = (*jvm_env)->GetObjectClass(jvm_env, object_ptr);
   if (class_ptr == NULL) {
     ERROR("java plugin: jtoc_notification: GetObjectClass failed.");
-    return (-1);
+    return -1;
   }
 
 /* eo == empty okay */
@@ -1184,7 +1183,7 @@ static int jtoc_notification(JNIEnv *jvm_env, notification_t *n, /* {{{ */
     if (status != 0) {                                                         \
       ERROR("java plugin: jtoc_notification: jtoc_string (%s) failed.",        \
             method);                                                           \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
   } while (0)
 
@@ -1200,7 +1199,7 @@ static int jtoc_notification(JNIEnv *jvm_env, notification_t *n, /* {{{ */
   status = jtoc_long(jvm_env, &tmp_long, class_ptr, object_ptr, "getTime");
   if (status != 0) {
     ERROR("java plugin: jtoc_notification: jtoc_long (getTime) failed.");
-    return (-1);
+    return -1;
   }
   /* Java measures time in milliseconds. */
   n->time = MS_TO_CDTIME_T(tmp_long);
@@ -1208,11 +1207,11 @@ static int jtoc_notification(JNIEnv *jvm_env, notification_t *n, /* {{{ */
   status = jtoc_int(jvm_env, &tmp_int, class_ptr, object_ptr, "getSeverity");
   if (status != 0) {
     ERROR("java plugin: jtoc_notification: jtoc_int (getSeverity) failed.");
-    return (-1);
+    return -1;
   }
   n->severity = (int)tmp_int;
 
-  return (0);
+  return 0;
 } /* }}} int jtoc_notification */
   /*
    * Functions accessible from Java
@@ -1227,14 +1226,14 @@ static jint JNICALL cjni_api_dispatch_values(JNIEnv *jvm_env, /* {{{ */
   status = jtoc_value_list(jvm_env, &vl, java_vl);
   if (status != 0) {
     ERROR("java plugin: cjni_api_dispatch_values: jtoc_value_list failed.");
-    return (-1);
+    return -1;
   }
 
   status = plugin_dispatch_values(&vl);
 
   sfree(vl.values);
 
-  return (status);
+  return status;
 } /* }}} jint cjni_api_dispatch_values */
 
 static jint JNICALL cjni_api_dispatch_notification(JNIEnv *jvm_env, /* {{{ */
@@ -1247,12 +1246,12 @@ static jint JNICALL cjni_api_dispatch_notification(JNIEnv *jvm_env, /* {{{ */
   if (status != 0) {
     ERROR("java plugin: cjni_api_dispatch_notification: jtoc_notification "
           "failed.");
-    return (-1);
+    return -1;
   }
 
   status = plugin_dispatch_notification(&n);
 
-  return (status);
+  return status;
 } /* }}} jint cjni_api_dispatch_notification */
 
 static jobject JNICALL cjni_api_get_ds(JNIEnv *jvm_env, /* {{{ */
@@ -1264,7 +1263,7 @@ static jobject JNICALL cjni_api_get_ds(JNIEnv *jvm_env, /* {{{ */
   ds_name = (*jvm_env)->GetStringUTFChars(jvm_env, o_string_type, 0);
   if (ds_name == NULL) {
     ERROR("java plugin: cjni_api_get_ds: GetStringUTFChars failed.");
-    return (NULL);
+    return NULL;
   }
 
   ds = plugin_get_ds(ds_name);
@@ -1275,22 +1274,22 @@ static jobject JNICALL cjni_api_get_ds(JNIEnv *jvm_env, /* {{{ */
   (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_string_type, ds_name);
 
   if (ds == NULL)
-    return (NULL);
+    return NULL;
 
   o_dataset = ctoj_data_set(jvm_env, ds);
-  return (o_dataset);
+  return o_dataset;
 } /* }}} jint cjni_api_get_ds */
 
 static jint JNICALL cjni_api_register_config(JNIEnv *jvm_env, /* {{{ */
                                              jobject this, jobject o_name,
                                              jobject o_config) {
-  return (cjni_callback_register(jvm_env, o_name, o_config, CB_TYPE_CONFIG));
+  return cjni_callback_register(jvm_env, o_name, o_config, CB_TYPE_CONFIG);
 } /* }}} jint cjni_api_register_config */
 
 static jint JNICALL cjni_api_register_init(JNIEnv *jvm_env, /* {{{ */
                                            jobject this, jobject o_name,
                                            jobject o_config) {
-  return (cjni_callback_register(jvm_env, o_name, o_config, CB_TYPE_INIT));
+  return cjni_callback_register(jvm_env, o_name, o_config, CB_TYPE_INIT);
 } /* }}} jint cjni_api_register_init */
 
 static jint JNICALL cjni_api_register_read(JNIEnv *jvm_env, /* {{{ */
@@ -1300,7 +1299,7 @@ static jint JNICALL cjni_api_register_read(JNIEnv *jvm_env, /* {{{ */
 
   cbi = cjni_callback_info_create(jvm_env, o_name, o_read, CB_TYPE_READ);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("java plugin: Registering new read callback: %s", cbi->name);
 
@@ -1313,7 +1312,7 @@ static jint JNICALL cjni_api_register_read(JNIEnv *jvm_env, /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_read);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_read */
 
 static jint JNICALL cjni_api_register_write(JNIEnv *jvm_env, /* {{{ */
@@ -1323,7 +1322,7 @@ static jint JNICALL cjni_api_register_write(JNIEnv *jvm_env, /* {{{ */
 
   cbi = cjni_callback_info_create(jvm_env, o_name, o_write, CB_TYPE_WRITE);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("java plugin: Registering new write callback: %s", cbi->name);
 
@@ -1335,7 +1334,7 @@ static jint JNICALL cjni_api_register_write(JNIEnv *jvm_env, /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_write);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_write */
 
 static jint JNICALL cjni_api_register_flush(JNIEnv *jvm_env, /* {{{ */
@@ -1345,7 +1344,7 @@ static jint JNICALL cjni_api_register_flush(JNIEnv *jvm_env, /* {{{ */
 
   cbi = cjni_callback_info_create(jvm_env, o_name, o_flush, CB_TYPE_FLUSH);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("java plugin: Registering new flush callback: %s", cbi->name);
 
@@ -1357,14 +1356,13 @@ static jint JNICALL cjni_api_register_flush(JNIEnv *jvm_env, /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_flush);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_flush */
 
 static jint JNICALL cjni_api_register_shutdown(JNIEnv *jvm_env, /* {{{ */
                                                jobject this, jobject o_name,
                                                jobject o_shutdown) {
-  return (
-      cjni_callback_register(jvm_env, o_name, o_shutdown, CB_TYPE_SHUTDOWN));
+  return cjni_callback_register(jvm_env, o_name, o_shutdown, CB_TYPE_SHUTDOWN);
 } /* }}} jint cjni_api_register_shutdown */
 
 static jint JNICALL cjni_api_register_log(JNIEnv *jvm_env, /* {{{ */
@@ -1374,7 +1372,7 @@ static jint JNICALL cjni_api_register_log(JNIEnv *jvm_env, /* {{{ */
 
   cbi = cjni_callback_info_create(jvm_env, o_name, o_log, CB_TYPE_LOG);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("java plugin: Registering new log callback: %s", cbi->name);
 
@@ -1385,7 +1383,7 @@ static jint JNICALL cjni_api_register_log(JNIEnv *jvm_env, /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_log);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_log */
 
 static jint JNICALL cjni_api_register_notification(JNIEnv *jvm_env, /* {{{ */
@@ -1396,7 +1394,7 @@ static jint JNICALL cjni_api_register_notification(JNIEnv *jvm_env, /* {{{ */
   cbi = cjni_callback_info_create(jvm_env, o_name, o_notification,
                                   CB_TYPE_NOTIFICATION);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
   DEBUG("java plugin: Registering new notification callback: %s", cbi->name);
 
@@ -1408,7 +1406,7 @@ static jint JNICALL cjni_api_register_notification(JNIEnv *jvm_env, /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_notification);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_notification */
 
 static jint JNICALL cjni_api_register_match_target(JNIEnv *jvm_env, /* {{{ */
@@ -1421,13 +1419,13 @@ static jint JNICALL cjni_api_register_match_target(JNIEnv *jvm_env, /* {{{ */
   if (c_name == NULL) {
     ERROR("java plugin: cjni_api_register_match_target: "
           "GetStringUTFChars failed.");
-    return (-1);
+    return -1;
   }
 
   status = cjni_callback_register(jvm_env, o_name, o_match, type);
   if (status != 0) {
     (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
-    return (-1);
+    return -1;
   }
 
   if (type == CB_TYPE_MATCH) {
@@ -1450,7 +1448,7 @@ static jint JNICALL cjni_api_register_match_target(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: cjni_api_register_match_target: "
           "Don't know whether to create a match or a target.");
     (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
-    return (-1);
+    return -1;
   }
 
   if (status != 0) {
@@ -1458,26 +1456,26 @@ static jint JNICALL cjni_api_register_match_target(JNIEnv *jvm_env, /* {{{ */
           "%s failed.",
           (type == CB_TYPE_MATCH) ? "fc_register_match" : "fc_register_target");
     (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
-    return (-1);
+    return -1;
   }
 
   (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
 
-  return (0);
+  return 0;
 } /* }}} jint cjni_api_register_match_target */
 
 static jint JNICALL cjni_api_register_match(JNIEnv *jvm_env, /* {{{ */
                                             jobject this, jobject o_name,
                                             jobject o_match) {
-  return (cjni_api_register_match_target(jvm_env, this, o_name, o_match,
-                                         CB_TYPE_MATCH));
+  return cjni_api_register_match_target(jvm_env, this, o_name, o_match,
+                                        CB_TYPE_MATCH);
 } /* }}} jint cjni_api_register_match */
 
 static jint JNICALL cjni_api_register_target(JNIEnv *jvm_env, /* {{{ */
                                              jobject this, jobject o_name,
                                              jobject o_target) {
-  return (cjni_api_register_match_target(jvm_env, this, o_name, o_target,
-                                         CB_TYPE_TARGET));
+  return cjni_api_register_match_target(jvm_env, this, o_name, o_target,
+                                        CB_TYPE_TARGET);
 } /* }}} jint cjni_api_register_target */
 
 static void JNICALL cjni_api_log(JNIEnv *jvm_env, /* {{{ */
@@ -1635,21 +1633,21 @@ cjni_callback_info_create(JNIEnv *jvm_env, /* {{{ */
 
   default:
     ERROR("java plugin: cjni_callback_info_create: Unknown type: %#x", type);
-    return (NULL);
+    return NULL;
   }
 
   c_name = (*jvm_env)->GetStringUTFChars(jvm_env, o_name, 0);
   if (c_name == NULL) {
     ERROR("java plugin: cjni_callback_info_create: "
           "GetStringUTFChars failed.");
-    return (NULL);
+    return NULL;
   }
 
   cbi = calloc(1, sizeof(*cbi));
   if (cbi == NULL) {
     ERROR("java plugin: cjni_callback_info_create: calloc failed.");
     (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
-    return (NULL);
+    return NULL;
   }
   cbi->type = type;
 
@@ -1659,7 +1657,7 @@ cjni_callback_info_create(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: cjni_callback_info_create: strdup failed.");
     (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
     sfree(cbi);
-    return (NULL);
+    return NULL;
   }
 
   (*jvm_env)->ReleaseStringUTFChars(jvm_env, o_name, c_name);
@@ -1669,7 +1667,7 @@ cjni_callback_info_create(JNIEnv *jvm_env, /* {{{ */
     ERROR("java plugin: cjni_callback_info_create: NewGlobalRef failed.");
     sfree(cbi->name);
     sfree(cbi);
-    return (NULL);
+    return NULL;
   }
 
   cbi->class = (*jvm_env)->GetObjectClass(jvm_env, cbi->object);
@@ -1678,7 +1676,7 @@ cjni_callback_info_create(JNIEnv *jvm_env, /* {{{ */
     (*jvm_env)->DeleteGlobalRef(jvm_env, cbi->object);
     sfree(cbi->name);
     sfree(cbi);
-    return (NULL);
+    return NULL;
   }
 
   cbi->method = (*jvm_env)->GetMethodID(jvm_env, cbi->class, method_name,
@@ -1690,10 +1688,10 @@ cjni_callback_info_create(JNIEnv *jvm_env, /* {{{ */
     (*jvm_env)->DeleteGlobalRef(jvm_env, cbi->object);
     sfree(cbi->name);
     sfree(cbi);
-    return (NULL);
+    return NULL;
   }
 
-  return (cbi);
+  return cbi;
 } /* }}} cjni_callback_info_t cjni_callback_info_create */
 
 /* Allocate a `cjni_callback_info_t' via `cjni_callback_info_create' and add it
@@ -1710,7 +1708,7 @@ static int cjni_callback_register(JNIEnv *jvm_env, /* {{{ */
 
   cbi = cjni_callback_info_create(jvm_env, o_name, o_callback, type);
   if (cbi == NULL)
-    return (-1);
+    return -1;
 
 #if COLLECT_DEBUG
   switch (type) {
@@ -1751,7 +1749,7 @@ static int cjni_callback_register(JNIEnv *jvm_env, /* {{{ */
     (*jvm_env)->DeleteGlobalRef(jvm_env, cbi->object);
     free(cbi);
 
-    return (-1);
+    return -1;
   }
   java_callbacks = tmp;
   java_callbacks[java_callbacks_num] = *cbi;
@@ -1760,7 +1758,7 @@ static int cjni_callback_register(JNIEnv *jvm_env, /* {{{ */
   pthread_mutex_unlock(&java_callbacks_lock);
 
   free(cbi);
-  return (0);
+  return 0;
 } /* }}} int cjni_callback_register */
 
 /* Callback for `pthread_key_create'. It frees the data contained in
@@ -1801,17 +1799,17 @@ static int cjni_init_native(JNIEnv *jvm_env) /* {{{ */
     ERROR("cjni_init_native: Cannot find the API class \"org.collectd.api"
           ".Collectd\". Please set the correct class path "
           "using 'JVMArg \"-Djava.class.path=...\"'.");
-    return (-1);
+    return -1;
   }
 
   status = (*jvm_env)->RegisterNatives(
       jvm_env, api_class_ptr, jni_api_functions, (jint)jni_api_functions_num);
   if (status != 0) {
     ERROR("cjni_init_native: RegisterNatives failed with status %i.", status);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cjni_init_native */
 
 /* Create the JVM. This is called when the first thread tries to access the JVM
@@ -1825,14 +1823,14 @@ static int cjni_create_jvm(void) /* {{{ */
   int status;
 
   if (jvm != NULL)
-    return (0);
+    return 0;
 
   status = pthread_key_create(&jvm_env_key, cjni_jvm_env_destroy);
   if (status != 0) {
     ERROR("java plugin: cjni_create_jvm: pthread_key_create failed "
           "with status %i.",
           status);
-    return (-1);
+    return -1;
   }
 
   jvm_env = NULL;
@@ -1851,7 +1849,7 @@ static int cjni_create_jvm(void) /* {{{ */
     ERROR("java plugin: cjni_create_jvm: "
           "JNI_CreateJavaVM failed with status %i.",
           status);
-    return (-1);
+    return -1;
   }
   assert(jvm != NULL);
   assert(jvm_env != NULL);
@@ -1860,11 +1858,11 @@ static int cjni_create_jvm(void) /* {{{ */
   status = cjni_init_native(jvm_env);
   if (status != 0) {
     ERROR("java plugin: cjni_create_jvm: cjni_init_native failed.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("java plugin: The JVM has been created.");
-  return (0);
+  return 0;
 } /* }}} int cjni_create_jvm */
 
 /* Increase the reference counter to the JVM for this thread. If it was zero,
@@ -1882,7 +1880,7 @@ static JNIEnv *cjni_thread_attach(void) /* {{{ */
     status = cjni_create_jvm();
     if (status != 0) {
       ERROR("java plugin: cjni_thread_attach: cjni_create_jvm failed.");
-      return (NULL);
+      return NULL;
     }
   }
   assert(jvm != NULL);
@@ -1893,7 +1891,7 @@ static JNIEnv *cjni_thread_attach(void) /* {{{ */
     cjni_env = calloc(1, sizeof(*cjni_env));
     if (cjni_env == NULL) {
       ERROR("java plugin: cjni_thread_attach: calloc failed.");
-      return (NULL);
+      return NULL;
     }
     cjni_env->reference_counter = 0;
     cjni_env->jvm_env = NULL;
@@ -1917,7 +1915,7 @@ static JNIEnv *cjni_thread_attach(void) /* {{{ */
       ERROR("java plugin: cjni_thread_attach: AttachCurrentThread failed "
             "with status %i.",
             status);
-      return (NULL);
+      return NULL;
     }
 
     cjni_env->reference_counter = 1;
@@ -1927,7 +1925,7 @@ static JNIEnv *cjni_thread_attach(void) /* {{{ */
   DEBUG("java plugin: cjni_thread_attach: cjni_env->reference_counter = %i",
         cjni_env->reference_counter);
   assert(jvm_env != NULL);
-  return (jvm_env);
+  return jvm_env;
 } /* }}} JNIEnv *cjni_thread_attach */
 
 /* Decrease the reference counter of this thread. If it reaches zero, detach
@@ -1940,7 +1938,7 @@ static int cjni_thread_detach(void) /* {{{ */
   cjni_env = pthread_getspecific(jvm_env_key);
   if (cjni_env == NULL) {
     ERROR("java plugin: cjni_thread_detach: pthread_getspecific failed.");
-    return (-1);
+    return -1;
   }
 
   assert(cjni_env->reference_counter > 0);
@@ -1951,7 +1949,7 @@ static int cjni_thread_detach(void) /* {{{ */
         cjni_env->reference_counter);
 
   if (cjni_env->reference_counter > 0)
-    return (0);
+    return 0;
 
   status = (*jvm)->DetachCurrentThread(jvm);
   if (status != 0) {
@@ -1963,7 +1961,7 @@ static int cjni_thread_detach(void) /* {{{ */
   cjni_env->reference_counter = 0;
   cjni_env->jvm_env = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int cjni_thread_detach */
 
 static int cjni_config_add_jvm_arg(oconfig_item_t *ci) /* {{{ */
@@ -1972,7 +1970,7 @@ static int cjni_config_add_jvm_arg(oconfig_item_t *ci) /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("java plugin: `JVMArg' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   if (jvm != NULL) {
@@ -1980,24 +1978,24 @@ static int cjni_config_add_jvm_arg(oconfig_item_t *ci) /* {{{ */
           "`LoadPlugin' options! The JVM is already started and I have to "
           "ignore this argument: %s",
           ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   tmp = realloc(jvm_argv, sizeof(char *) * (jvm_argc + 1));
   if (tmp == NULL) {
     ERROR("java plugin: realloc failed.");
-    return (-1);
+    return -1;
   }
   jvm_argv = tmp;
 
   jvm_argv[jvm_argc] = strdup(ci->values[0].value.string);
   if (jvm_argv[jvm_argc] == NULL) {
     ERROR("java plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
   jvm_argc++;
 
-  return (0);
+  return 0;
 } /* }}} int cjni_config_add_jvm_arg */
 
 static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
@@ -2009,19 +2007,19 @@ static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("java plugin: `LoadPlugin' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   class = realloc(java_classes_list,
                   (java_classes_list_len + 1) * sizeof(*java_classes_list));
   if (class == NULL) {
     ERROR("java plugin: realloc failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
   java_classes_list = class;
   class = java_classes_list + java_classes_list_len;
@@ -2031,7 +2029,7 @@ static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
   if (class->name == NULL) {
     ERROR("java plugin: strdup failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
   class->class = NULL;
   class->object = NULL;
@@ -2052,7 +2050,7 @@ static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
           class->name);
     cjni_thread_detach();
     free(class->name);
-    return (-1);
+    return -1;
   }
 
   constructor_id =
@@ -2063,7 +2061,7 @@ static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
           class->name);
     cjni_thread_detach();
     free(class->name);
-    return (-1);
+    return -1;
   }
 
   tmp_object = (*jvm_env)->NewObject(jvm_env, class->class, constructor_id);
@@ -2077,14 +2075,14 @@ static int cjni_config_load_plugin(oconfig_item_t *ci) /* {{{ */
           class->name);
     cjni_thread_detach();
     free(class->name);
-    return (-1);
+    return -1;
   }
 
   cjni_thread_detach();
 
   java_classes_list_len++;
 
-  return (0);
+  return 0;
 } /* }}} int cjni_config_load_plugin */
 
 static int cjni_config_plugin_block(oconfig_item_t *ci) /* {{{ */
@@ -2100,7 +2098,7 @@ static int cjni_config_plugin_block(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("java plugin: `Plugin' blocks "
             "need exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   name = ci->values[0].value.string;
@@ -2122,20 +2120,20 @@ static int cjni_config_plugin_block(oconfig_item_t *ci) /* {{{ */
            "configuration callback has been registered. Please make sure, the "
            "`LoadPlugin' lines precede the `Plugin' blocks.",
            name);
-    return (0);
+    return 0;
   }
 
   DEBUG("java plugin: Configuring %s", name);
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   o_ocitem = ctoj_oconfig_item(jvm_env, ci);
   if (o_ocitem == NULL) {
     ERROR("java plugin: cjni_config_plugin_block: ctoj_oconfig_item failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   class = (*jvm_env)->GetObjectClass(jvm_env, cbi->object);
@@ -2146,7 +2144,7 @@ static int cjni_config_plugin_block(oconfig_item_t *ci) /* {{{ */
 
   (*jvm_env)->DeleteLocalRef(jvm_env, o_ocitem);
   cjni_thread_detach();
-  return (0);
+  return 0;
 } /* }}} int cjni_config_plugin_block */
 
 static int cjni_config_perform(oconfig_item_t *ci) /* {{{ */
@@ -2190,10 +2188,10 @@ static int cjni_config_perform(oconfig_item_t *ci) /* {{{ */
 
   if ((success == 0) && (errors > 0)) {
     ERROR("java plugin: All statements failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cjni_config_perform */
 
 /* Copy the children of `ci' to the global `config_block' variable. */
@@ -2204,17 +2202,17 @@ static int cjni_config_callback(oconfig_item_t *ci) /* {{{ */
 
   assert(ci != NULL);
   if (ci->children_num == 0)
-    return (0); /* nothing to do */
+    return 0; /* nothing to do */
 
   ci_copy = oconfig_clone(ci);
   if (ci_copy == NULL) {
     ERROR("java plugin: oconfig_clone failed.");
-    return (-1);
+    return -1;
   }
 
   if (config_block == NULL) {
     config_block = ci_copy;
-    return (0);
+    return 0;
   }
 
   tmp = realloc(config_block->children,
@@ -2223,7 +2221,7 @@ static int cjni_config_callback(oconfig_item_t *ci) /* {{{ */
   if (tmp == NULL) {
     ERROR("java plugin: realloc failed.");
     oconfig_free(ci_copy);
-    return (-1);
+    return -1;
   }
   config_block->children = tmp;
 
@@ -2239,7 +2237,7 @@ static int cjni_config_callback(oconfig_item_t *ci) /* {{{ */
 
   oconfig_free(ci_copy);
 
-  return (0);
+  return 0;
 } /* }}} int cjni_config_callback */
 
 /* Free the data contained in the `user_data_t' pointer passed to `cjni_read'
@@ -2289,24 +2287,24 @@ static int cjni_read(user_data_t *ud) /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_read: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("java plugin: cjni_read: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cbi = (cjni_callback_info_t *)ud->data;
 
   ret_status = (*jvm_env)->CallIntMethod(jvm_env, cbi->object, cbi->method);
 
   cjni_thread_detach();
-  return (ret_status);
+  return ret_status;
 } /* }}} int cjni_read */
 
 /* Call the CB_TYPE_WRITE callback pointed to by the `user_data_t' pointer. */
@@ -2319,17 +2317,17 @@ static int cjni_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_write: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("java plugin: cjni_write: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cbi = (cjni_callback_info_t *)ud->data;
 
@@ -2337,7 +2335,7 @@ static int cjni_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   if (vl_java == NULL) {
     ERROR("java plugin: cjni_write: ctoj_value_list failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   ret_status =
@@ -2346,7 +2344,7 @@ static int cjni_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   (*jvm_env)->DeleteLocalRef(jvm_env, vl_java);
 
   cjni_thread_detach();
-  return (ret_status);
+  return ret_status;
 } /* }}} int cjni_write */
 
 /* Call the CB_TYPE_FLUSH callback pointed to by the `user_data_t' pointer. */
@@ -2360,17 +2358,17 @@ static int cjni_flush(cdtime_t timeout, const char *identifier, /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_flush: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("java plugin: cjni_flush: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cbi = (cjni_callback_info_t *)ud->data;
 
@@ -2380,7 +2378,7 @@ static int cjni_flush(cdtime_t timeout, const char *identifier, /* {{{ */
     ERROR("java plugin: cjni_flush: Converting double "
           "to Number object failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   o_identifier = NULL;
@@ -2390,7 +2388,7 @@ static int cjni_flush(cdtime_t timeout, const char *identifier, /* {{{ */
       (*jvm_env)->DeleteLocalRef(jvm_env, o_timeout);
       ERROR("java plugin: cjni_flush: NewStringUTF failed.");
       cjni_thread_detach();
-      return (-1);
+      return -1;
     }
   }
 
@@ -2401,7 +2399,7 @@ static int cjni_flush(cdtime_t timeout, const char *identifier, /* {{{ */
   (*jvm_env)->DeleteLocalRef(jvm_env, o_timeout);
 
   cjni_thread_detach();
-  return (ret_status);
+  return ret_status;
 } /* }}} int cjni_flush */
 
 /* Call the CB_TYPE_LOG callback pointed to by the `user_data_t' pointer. */
@@ -2448,17 +2446,17 @@ static int cjni_notification(const notification_t *n, /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_read: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("java plugin: cjni_read: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cbi = (cjni_callback_info_t *)ud->data;
 
@@ -2466,7 +2464,7 @@ static int cjni_notification(const notification_t *n, /* {{{ */
   if (o_notification == NULL) {
     ERROR("java plugin: cjni_notification: ctoj_notification failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   ret_status = (*jvm_env)->CallIntMethod(jvm_env, cbi->object, cbi->method,
@@ -2475,7 +2473,7 @@ static int cjni_notification(const notification_t *n, /* {{{ */
   (*jvm_env)->DeleteLocalRef(jvm_env, o_notification);
 
   cjni_thread_detach();
-  return (ret_status);
+  return ret_status;
 } /* }}} int cjni_notification */
 
 /* Callbacks for matches implemented in Java */
@@ -2507,12 +2505,12 @@ static int cjni_match_target_create(const oconfig_item_t *ci, /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_read: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   /* Find out whether to create a match or a target. */
   if (strcasecmp("Match", ci->key) == 0)
@@ -2617,7 +2615,7 @@ static int cjni_match_target_create(const oconfig_item_t *ci, /* {{{ */
         cbi_ret->name, (type == CB_TYPE_MATCH) ? "match" : "target");
 
   /* Success! */
-  return (0);
+  return 0;
 #undef BAIL_OUT
 } /* }}} int cjni_match_target_create */
 
@@ -2626,7 +2624,7 @@ static int cjni_match_target_destroy(void **user_data) /* {{{ */
   cjni_callback_info_destroy(*user_data);
   *user_data = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int cjni_match_target_destroy */
 
 static int cjni_match_target_invoke(const data_set_t *ds, /* {{{ */
@@ -2642,12 +2640,12 @@ static int cjni_match_target_invoke(const data_set_t *ds, /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_match_target_invoke: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cbi = (cjni_callback_info_t *)*user_data;
 
@@ -2655,14 +2653,14 @@ static int cjni_match_target_invoke(const data_set_t *ds, /* {{{ */
   if (o_vl == NULL) {
     ERROR("java plugin: cjni_match_target_invoke: ctoj_value_list failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   o_ds = ctoj_data_set(jvm_env, ds);
   if (o_ds == NULL) {
     ERROR("java plugin: cjni_match_target_invoke: ctoj_value_list failed.");
     cjni_thread_detach();
-    return (-1);
+    return -1;
   }
 
   ret_status =
@@ -2693,7 +2691,7 @@ static int cjni_match_target_invoke(const data_set_t *ds, /* {{{ */
   } /* if (cbi->type == CB_TYPE_TARGET) */
 
   cjni_thread_detach();
-  return (ret_status);
+  return ret_status;
 } /* }}} int cjni_match_target_invoke */
 
 /* Iterate over `java_callbacks' and call all CB_TYPE_INIT callbacks. */
@@ -2717,7 +2715,7 @@ static int cjni_init_plugins(JNIEnv *jvm_env) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int cjni_init_plugins */
 
 /* Iterate over `java_callbacks' and call all CB_TYPE_SHUTDOWN callbacks. */
@@ -2739,7 +2737,7 @@ static int cjni_shutdown_plugins(JNIEnv *jvm_env) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int cjni_shutdown_plugins */
 
 static int cjni_shutdown(void) /* {{{ */
@@ -2749,7 +2747,7 @@ static int cjni_shutdown(void) /* {{{ */
   int status;
 
   if (jvm == NULL)
-    return (0);
+    return 0;
 
   jvm_env = NULL;
   args.version = JNI_VERSION_1_2;
@@ -2759,7 +2757,7 @@ static int cjni_shutdown(void) /* {{{ */
     ERROR("java plugin: cjni_shutdown: AttachCurrentThread failed with status "
           "%i.",
           status);
-    return (-1);
+    return -1;
   }
 
   /* Execute all the shutdown functions registered by plugins. */
@@ -2801,7 +2799,7 @@ static int cjni_shutdown(void) /* {{{ */
   jvm_argc = 0;
   sfree(jvm_argv);
 
-  return (0);
+  return 0;
 } /* }}} int cjni_shutdown */
 
 /* Initialization: Create a JVM, load all configured classes and call their
@@ -2813,7 +2811,7 @@ static int cjni_init(void) /* {{{ */
   if ((config_block == NULL) && (jvm == NULL)) {
     ERROR("java plugin: cjni_init: No configuration block for "
           "the java plugin was found.");
-    return (-1);
+    return -1;
   }
 
   if (config_block != NULL) {
@@ -2823,17 +2821,17 @@ static int cjni_init(void) /* {{{ */
 
   if (jvm == NULL) {
     ERROR("java plugin: cjni_init: jvm == NULL");
-    return (-1);
+    return -1;
   }
 
   jvm_env = cjni_thread_attach();
   if (jvm_env == NULL)
-    return (-1);
+    return -1;
 
   cjni_init_plugins(jvm_env);
 
   cjni_thread_detach();
-  return (0);
+  return 0;
 } /* }}} int cjni_init */
 
 void module_register(void) {
@@ -2841,5 +2839,3 @@ void module_register(void) {
   plugin_register_init("java", cjni_init);
   plugin_register_shutdown("java", cjni_shutdown);
 } /* void module_register (void) */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
diff --git a/src/libcollectdclient/Makefile.am b/src/libcollectdclient/Makefile.am
deleted file mode 100644 (file)
index e81a594..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-AUTOMAKE_OPTIONS = foreign no-dependencies
-
-pkginclude_HEADERS = collectd/client.h collectd/network.h collectd/network_buffer.h collectd/lcc_features.h
-lib_LTLIBRARIES = libcollectdclient.la
-nodist_pkgconfig_DATA = libcollectdclient.pc
-
-BUILT_SOURCES = collectd/lcc_features.h
-
-libcollectdclient_la_SOURCES = client.c network.c network_buffer.c
-libcollectdclient_la_CPPFLAGS = $(AM_CPPFLAGS) \
-                               -I$(top_srcdir)/src/libcollectdclient/collectd \
-                               -I$(top_builddir)/src/libcollectdclient/collectd \
-                               -I$(top_srcdir)/src/daemon
-libcollectdclient_la_LDFLAGS = -version-info 1:0:0
-libcollectdclient_la_LIBADD = 
-if BUILD_WITH_LIBGCRYPT
-libcollectdclient_la_CPPFLAGS += $(GCRYPT_CPPFLAGS)
-libcollectdclient_la_LDFLAGS += $(GCRYPT_LDFLAGS)
-libcollectdclient_la_LIBADD += $(GCRYPT_LIBS)
-endif
index f61e967..c3cd414 100644 (file)
@@ -165,18 +165,18 @@ static char *sstrerror(int errnum, char *buf, size_t buflen) {
 
   buf[buflen - 1] = 0;
 
-  return (buf);
+  return buf;
 } /* char *sstrerror */
 
 static int lcc_set_errno(lcc_connection_t *c, int err) /* {{{ */
 {
   if (c == NULL)
-    return (-1);
+    return -1;
 
   sstrerror(err, c->errbuf, sizeof(c->errbuf));
   c->errbuf[sizeof(c->errbuf) - 1] = 0;
 
-  return (0);
+  return 0;
 } /* }}} int lcc_set_errno */
 
 static char *lcc_strescape(char *dest, const char *src,
@@ -186,7 +186,7 @@ static char *lcc_strescape(char *dest, const char *src,
   size_t src_pos;
 
   if ((dest == NULL) || (src == NULL))
-    return (NULL);
+    return NULL;
 
   dest_pos = 0;
   src_pos = 0;
@@ -223,7 +223,7 @@ static char *lcc_strescape(char *dest, const char *src,
   dest_pos++;
   src_pos++;
 
-  return (dest);
+  return dest;
 } /* }}} char *lcc_strescape */
 
 /* lcc_chomp: Removes all control-characters at the end of a string. */
@@ -260,11 +260,11 @@ static int lcc_send(lcc_connection_t *c, const char *command) /* {{{ */
   status = fprintf(c->fh, "%s\r\n", command);
   if (status < 0) {
     lcc_set_errno(c, errno);
-    return (-1);
+    return -1;
   }
   fflush(c->fh);
 
-  return (0);
+  return 0;
 } /* }}} int lcc_send */
 
 static int lcc_receive(lcc_connection_t *c, /* {{{ */
@@ -278,7 +278,7 @@ static int lcc_receive(lcc_connection_t *c, /* {{{ */
   ptr = fgets(buffer, sizeof(buffer), c->fh);
   if (ptr == NULL) {
     lcc_set_errno(c, errno);
-    return (-1);
+    return -1;
   }
   lcc_chomp(buffer);
   lcc_tracef("receive: <-- %s\n", buffer);
@@ -290,7 +290,7 @@ static int lcc_receive(lcc_connection_t *c, /* {{{ */
   res.status = (int)strtol(buffer, &ptr, 0);
   if ((errno != 0) || (ptr == &buffer[0])) {
     lcc_set_errno(c, errno);
-    return (-1);
+    return -1;
   }
 
   /* Skip white spaces after the status number */
@@ -304,7 +304,7 @@ static int lcc_receive(lcc_connection_t *c, /* {{{ */
   /* Error or no lines follow: We're done. */
   if (res.status <= 0) {
     memcpy(ret_res, &res, sizeof(res));
-    return (0);
+    return 0;
   }
 
   /* Allocate space for the char-pointers */
@@ -313,7 +313,7 @@ static int lcc_receive(lcc_connection_t *c, /* {{{ */
   res.lines = malloc(res.lines_num * sizeof(*res.lines));
   if (res.lines == NULL) {
     lcc_set_errno(c, ENOMEM);
-    return (-1);
+    return -1;
   }
 
   /* Now receive all the lines */
@@ -340,11 +340,11 @@ static int lcc_receive(lcc_connection_t *c, /* {{{ */
       free(res.lines[i]);
     }
     free(res.lines);
-    return (-1);
+    return -1;
   }
 
   memcpy(ret_res, &res, sizeof(res));
-  return (0);
+  return 0;
 } /* }}} int lcc_receive */
 
 static int lcc_sendreceive(lcc_connection_t *c, /* {{{ */
@@ -354,18 +354,18 @@ static int lcc_sendreceive(lcc_connection_t *c, /* {{{ */
 
   if (c->fh == NULL) {
     lcc_set_errno(c, EBADF);
-    return (-1);
+    return -1;
   }
 
   status = lcc_send(c, command);
   if (status != 0)
-    return (status);
+    return status;
 
   status = lcc_receive(c, &res);
   if (status == 0)
     memcpy(ret_res, &res, sizeof(*ret_res));
 
-  return (status);
+  return status;
 } /* }}} int lcc_sendreceive */
 
 static int lcc_open_unixsocket(lcc_connection_t *c, const char *path) /* {{{ */
@@ -383,7 +383,7 @@ static int lcc_open_unixsocket(lcc_connection_t *c, const char *path) /* {{{ */
   fd = socket(AF_UNIX, SOCK_STREAM, /* protocol = */ 0);
   if (fd < 0) {
     lcc_set_errno(c, errno);
-    return (-1);
+    return -1;
   }
 
   sa.sun_family = AF_UNIX;
@@ -393,17 +393,17 @@ static int lcc_open_unixsocket(lcc_connection_t *c, const char *path) /* {{{ */
   if (status != 0) {
     lcc_set_errno(c, errno);
     close(fd);
-    return (-1);
+    return -1;
   }
 
   c->fh = fdopen(fd, "r+");
   if (c->fh == NULL) {
     lcc_set_errno(c, errno);
     close(fd);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int lcc_open_unixsocket */
 
 static int lcc_open_netsocket(lcc_connection_t *c, /* {{{ */
@@ -432,7 +432,7 @@ static int lcc_open_netsocket(lcc_connection_t *c, /* {{{ */
     port = strchr(addr, ']');
     if (port == NULL) {
       LCC_SET_ERRSTR(c, "malformed address: %s", addr_orig);
-      return (-1);
+      return -1;
     }
     *port = 0;
     port++;
@@ -443,7 +443,7 @@ static int lcc_open_netsocket(lcc_connection_t *c, /* {{{ */
       port = NULL;
     else {
       LCC_SET_ERRSTR(c, "garbage after address: %s", port);
-      return (-1);
+      return -1;
     }
   }                                   /* if (*addr = ']') */
   else if (strchr(addr, '.') != NULL) /* Hostname or IPv4 */
@@ -463,7 +463,7 @@ static int lcc_open_netsocket(lcc_connection_t *c, /* {{{ */
                        &ai_res);
   if (status != 0) {
     LCC_SET_ERRSTR(c, "getaddrinfo: %s", gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_res; ai_ptr != NULL;
@@ -495,11 +495,11 @@ static int lcc_open_netsocket(lcc_connection_t *c, /* {{{ */
   if (status != 0) {
     lcc_set_errno(c, status);
     freeaddrinfo(ai_res);
-    return (-1);
+    return -1;
   }
 
   freeaddrinfo(ai_res);
-  return (0);
+  return 0;
 } /* }}} int lcc_open_netsocket */
 
 static int lcc_open_socket(lcc_connection_t *c, const char *addr) /* {{{ */
@@ -507,7 +507,7 @@ static int lcc_open_socket(lcc_connection_t *c, const char *addr) /* {{{ */
   int status = 0;
 
   if (addr == NULL)
-    return (-1);
+    return -1;
 
   assert(c != NULL);
   assert(c->fh == NULL);
@@ -520,7 +520,7 @@ static int lcc_open_socket(lcc_connection_t *c, const char *addr) /* {{{ */
   else
     status = lcc_open_netsocket(c, addr);
 
-  return (status);
+  return status;
 } /* }}} int lcc_open_socket */
 
 /*
@@ -528,17 +528,17 @@ static int lcc_open_socket(lcc_connection_t *c, const char *addr) /* {{{ */
  */
 unsigned int lcc_version(void) /* {{{ */
 {
-  return (LCC_VERSION);
+  return LCC_VERSION;
 } /* }}} unsigned int lcc_version */
 
 const char *lcc_version_string(void) /* {{{ */
 {
-  return (LCC_VERSION_STRING);
+  return LCC_VERSION_STRING;
 } /* }}} const char *lcc_version_string */
 
 const char *lcc_version_extra(void) /* {{{ */
 {
-  return (LCC_VERSION_EXTRA);
+  return LCC_VERSION_EXTRA;
 } /* }}} const char *lcc_version_extra */
 
 int lcc_connect(const char *address, lcc_connection_t **ret_con) /* {{{ */
@@ -547,29 +547,29 @@ int lcc_connect(const char *address, lcc_connection_t **ret_con) /* {{{ */
   int status;
 
   if (address == NULL)
-    return (-1);
+    return -1;
 
   if (ret_con == NULL)
-    return (-1);
+    return -1;
 
   c = calloc(1, sizeof(*c));
   if (c == NULL)
-    return (-1);
+    return -1;
 
   status = lcc_open_socket(c, address);
   if (status != 0) {
     lcc_disconnect(c);
-    return (status);
+    return status;
   }
 
   *ret_con = c;
-  return (0);
+  return 0;
 } /* }}} int lcc_connect */
 
 int lcc_disconnect(lcc_connection_t *c) /* {{{ */
 {
   if (c == NULL)
-    return (-1);
+    return -1;
 
   if (c->fh != NULL) {
     fclose(c->fh);
@@ -577,7 +577,7 @@ int lcc_disconnect(lcc_connection_t *c) /* {{{ */
   }
 
   free(c);
-  return (0);
+  return 0;
 } /* }}} int lcc_disconnect */
 
 int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
@@ -596,17 +596,17 @@ int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
   int status;
 
   if (c == NULL)
-    return (-1);
+    return -1;
 
   if (ident == NULL) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   /* Build a commend with an escaped version of the identifier string. */
   status = lcc_identifier_to_string(c, ident_str, sizeof(ident_str), ident);
   if (status != 0)
-    return (status);
+    return status;
 
   snprintf(command, sizeof(command), "GETVAL %s",
            lcc_strescape(ident_esc, ident_str, sizeof(ident_esc)));
@@ -615,12 +615,12 @@ int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
   /* Send talk to the daemon.. */
   status = lcc_sendreceive(c, command, &res);
   if (status != 0)
-    return (status);
+    return status;
 
   if (res.status != 0) {
     LCC_SET_ERRSTR(c, "Server error: %s", res.message);
     lcc_response_free(&res);
-    return (-1);
+    return -1;
   }
 
   values_num = res.lines_num;
@@ -636,7 +636,7 @@ int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
     }                                                                          \
     free(values_names);                                                        \
     lcc_response_free(&res);                                                   \
-    return (-1);                                                               \
+    return -1;                                                                 \
   } while (0)
 
   /* If neither the values nor the names are requested, return here.. */
@@ -644,7 +644,7 @@ int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
     if (ret_values_num != NULL)
       *ret_values_num = values_num;
     lcc_response_free(&res);
-    return (0);
+    return 0;
   }
 
   /* Allocate space for the values */
@@ -698,7 +698,7 @@ int lcc_getval(lcc_connection_t *c, lcc_identifier_t *ident, /* {{{ */
 
   lcc_response_free(&res);
 
-  return (0);
+  return 0;
 } /* }}} int lcc_getval */
 
 int lcc_putval(lcc_connection_t *c, const lcc_value_list_t *vl) /* {{{ */
@@ -712,13 +712,13 @@ int lcc_putval(lcc_connection_t *c, const lcc_value_list_t *vl) /* {{{ */
   if ((c == NULL) || (vl == NULL) || (vl->values_len < 1) ||
       (vl->values == NULL) || (vl->values_types == NULL)) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   status = lcc_identifier_to_string(c, ident_str, sizeof(ident_str),
                                     &vl->identifier);
   if (status != 0)
-    return (status);
+    return status;
 
   SSTRCATF(command, "PUTVAL %s",
            lcc_strescape(ident_esc, ident_str, sizeof(ident_esc)));
@@ -748,16 +748,16 @@ int lcc_putval(lcc_connection_t *c, const lcc_value_list_t *vl) /* {{{ */
 
   status = lcc_sendreceive(c, command, &res);
   if (status != 0)
-    return (status);
+    return status;
 
   if (res.status != 0) {
     LCC_SET_ERRSTR(c, "Server error: %s", res.message);
     lcc_response_free(&res);
-    return (-1);
+    return -1;
   }
 
   lcc_response_free(&res);
-  return (0);
+  return 0;
 } /* }}} int lcc_putval */
 
 int lcc_flush(lcc_connection_t *c, const char *plugin, /* {{{ */
@@ -768,7 +768,7 @@ int lcc_flush(lcc_connection_t *c, const char *plugin, /* {{{ */
 
   if (c == NULL) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   SSTRCPY(command, "FLUSH");
@@ -788,7 +788,7 @@ int lcc_flush(lcc_connection_t *c, const char *plugin, /* {{{ */
 
     status = lcc_identifier_to_string(c, ident_str, sizeof(ident_str), ident);
     if (status != 0)
-      return (status);
+      return status;
 
     SSTRCATF(command, " identifier=%s",
              lcc_strescape(ident_esc, ident_str, sizeof(ident_esc)));
@@ -796,16 +796,16 @@ int lcc_flush(lcc_connection_t *c, const char *plugin, /* {{{ */
 
   status = lcc_sendreceive(c, command, &res);
   if (status != 0)
-    return (status);
+    return status;
 
   if (res.status != 0) {
     LCC_SET_ERRSTR(c, "Server error: %s", res.message);
     lcc_response_free(&res);
-    return (-1);
+    return -1;
   }
 
   lcc_response_free(&res);
-  return (0);
+  return 0;
 } /* }}} int lcc_flush */
 
 /* TODO: Implement lcc_putnotif */
@@ -819,21 +819,21 @@ int lcc_listval(lcc_connection_t *c, /* {{{ */
   size_t ident_num;
 
   if (c == NULL)
-    return (-1);
+    return -1;
 
   if ((ret_ident == NULL) || (ret_ident_num == NULL)) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   status = lcc_sendreceive(c, "LISTVAL", &res);
   if (status != 0)
-    return (status);
+    return status;
 
   if (res.status != 0) {
     LCC_SET_ERRSTR(c, "Server error: %s", res.message);
     lcc_response_free(&res);
-    return (-1);
+    return -1;
   }
 
   ident_num = res.lines_num;
@@ -841,7 +841,7 @@ int lcc_listval(lcc_connection_t *c, /* {{{ */
   if (ident == NULL) {
     lcc_response_free(&res);
     lcc_set_errno(c, ENOMEM);
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < res.lines_num; i++) {
@@ -875,20 +875,20 @@ int lcc_listval(lcc_connection_t *c, /* {{{ */
 
   if (status != 0) {
     free(ident);
-    return (-1);
+    return -1;
   }
 
   *ret_ident = ident;
   *ret_ident_num = ident_num;
 
-  return (0);
+  return 0;
 } /* }}} int lcc_listval */
 
 const char *lcc_strerror(lcc_connection_t *c) /* {{{ */
 {
   if (c == NULL)
-    return ("Invalid object");
-  return (c->errbuf);
+    return "Invalid object";
+  return c->errbuf;
 } /* }}} const char *lcc_strerror */
 
 int lcc_identifier_to_string(lcc_connection_t *c, /* {{{ */
@@ -896,7 +896,7 @@ int lcc_identifier_to_string(lcc_connection_t *c, /* {{{ */
                              const lcc_identifier_t *ident) {
   if ((string == NULL) || (string_size < 6) || (ident == NULL)) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   if (ident->plugin_instance[0] == 0) {
@@ -917,7 +917,7 @@ int lcc_identifier_to_string(lcc_connection_t *c, /* {{{ */
   }
 
   string[string_size - 1] = 0;
-  return (0);
+  return 0;
 } /* }}} int lcc_identifier_to_string */
 
 int lcc_string_to_identifier(lcc_connection_t *c, /* {{{ */
@@ -932,7 +932,7 @@ int lcc_string_to_identifier(lcc_connection_t *c, /* {{{ */
   string_copy = strdup(string);
   if (string_copy == NULL) {
     lcc_set_errno(c, ENOMEM);
-    return (-1);
+    return -1;
   }
 
   host = string_copy;
@@ -940,7 +940,7 @@ int lcc_string_to_identifier(lcc_connection_t *c, /* {{{ */
   if (plugin == NULL) {
     LCC_SET_ERRSTR(c, "Malformed identifier string: %s", string);
     free(string_copy);
-    return (-1);
+    return -1;
   }
   *plugin = 0;
   plugin++;
@@ -949,7 +949,7 @@ int lcc_string_to_identifier(lcc_connection_t *c, /* {{{ */
   if (type == NULL) {
     LCC_SET_ERRSTR(c, "Malformed identifier string: %s", string);
     free(string_copy);
-    return (-1);
+    return -1;
   }
   *type = 0;
   type++;
@@ -977,7 +977,7 @@ int lcc_string_to_identifier(lcc_connection_t *c, /* {{{ */
     SSTRCPY(ident->type_instance, type_instance);
 
   free(string_copy);
-  return (0);
+  return 0;
 } /* }}} int lcc_string_to_identifier */
 
 int lcc_identifier_compare(const void *a, /* {{{ */
@@ -987,17 +987,17 @@ int lcc_identifier_compare(const void *a, /* {{{ */
   int status;
 
   if ((i0 == NULL) && (i1 == NULL))
-    return (0);
+    return 0;
   else if (i0 == NULL)
-    return (-1);
+    return -1;
   else if (i1 == NULL)
-    return (1);
+    return 1;
 
 #define CMP_FIELD(f)                                                           \
   do {                                                                         \
     status = strcmp(i0->f, i1->f);                                             \
     if (status != 0)                                                           \
-      return (status);                                                         \
+      return status;                                                           \
   } while (0);
 
   CMP_FIELD(host);
@@ -1008,18 +1008,16 @@ int lcc_identifier_compare(const void *a, /* {{{ */
 
 #undef CMP_FIELD
 
-  return (0);
+  return 0;
 } /* }}} int lcc_identifier_compare */
 
 int lcc_sort_identifiers(lcc_connection_t *c, /* {{{ */
                          lcc_identifier_t *idents, size_t idents_num) {
   if (idents == NULL) {
     lcc_set_errno(c, EINVAL);
-    return (-1);
+    return -1;
   }
 
   qsort(idents, idents_num, sizeof(*idents), lcc_identifier_compare);
-  return (0);
+  return 0;
 } /* }}} int lcc_sort_identifiers */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 36aaf92..8604ff6 100644 (file)
@@ -39,9 +39,7 @@
 /*
  * Includes (for data types)
  */
-#if HAVE_STDINT_H
 #include <stdint.h>
-#endif
 #include <inttypes.h>
 #include <time.h>
 
@@ -141,5 +139,4 @@ int lcc_sort_identifiers(lcc_connection_t *c, lcc_identifier_t *idents,
 
 LCC_END_DECLS
 
-/* vim: set sw=2 sts=2 et : */
 #endif /* LIBCOLLECTD_COLLECTDCLIENT_H */
index 0e6fcd4..304845e 100644 (file)
@@ -62,6 +62,3 @@ const char *lcc_version_extra (void);
 LCC_END_DECLS
 
 #endif /* ! LIBCOLLECTD_LCC_FEATURES_H */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
-
index fdb9b33..35fd7d6 100644 (file)
@@ -73,5 +73,4 @@ int lcc_network_notification_send (lcc_network_t *net,
     const lcc_notification_t *notif);
 #endif
 
-/* vim: set sw=2 sts=2 et : */
 #endif /* LIBCOLLECTDCLIENT_NETWORK_H */
index 5612458..9f39310 100644 (file)
@@ -55,4 +55,3 @@ int lcc_network_buffer_get(lcc_network_buffer_t *nb, void *buffer,
                            size_t *buffer_size);
 
 #endif /* LIBCOLLECTDCLIENT_NETWORK_BUFFER_H */
-/* vim: set sw=2 sts=2 et : */
index a21799c..49257d4 100644 (file)
@@ -81,10 +81,10 @@ struct lcc_server_s {
 static int server_close_socket(lcc_server_t *srv) /* {{{ */
 {
   if (srv == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (srv->fd < 0)
-    return (0);
+    return 0;
 
   close(srv->fd);
   srv->fd = -1;
@@ -92,7 +92,7 @@ static int server_close_socket(lcc_server_t *srv) /* {{{ */
   srv->sa = NULL;
   srv->sa_len = 0;
 
-  return (0);
+  return 0;
 } /* }}} int server_close_socket */
 
 static void int_server_destroy(lcc_server_t *srv) /* {{{ */
@@ -121,7 +121,7 @@ static int server_open_socket(lcc_server_t *srv) /* {{{ */
   int status;
 
   if (srv == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (srv->fd >= 0)
     server_close_socket(srv);
@@ -132,7 +132,7 @@ static int server_open_socket(lcc_server_t *srv) /* {{{ */
 
   status = getaddrinfo(srv->node, srv->service, &ai_hints, &ai_list);
   if (status != 0)
-    return (status);
+    return status;
   assert(ai_list != NULL);
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -189,8 +189,8 @@ static int server_open_socket(lcc_server_t *srv) /* {{{ */
   freeaddrinfo(ai_list);
 
   if (srv->fd < 0)
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* }}} int server_open_socket */
 
 static int server_send_buffer(lcc_server_t *srv) /* {{{ */
@@ -202,7 +202,7 @@ static int server_send_buffer(lcc_server_t *srv) /* {{{ */
   if (srv->fd < 0) {
     status = server_open_socket(srv);
     if (status != 0)
-      return (status);
+      return status;
   }
 
   buffer_size = sizeof(buffer);
@@ -210,14 +210,14 @@ static int server_send_buffer(lcc_server_t *srv) /* {{{ */
   status = lcc_network_buffer_finalize(srv->buffer);
   if (status != 0) {
     lcc_network_buffer_initialize(srv->buffer);
-    return (status);
+    return status;
   }
 
   status = lcc_network_buffer_get(srv->buffer, buffer, &buffer_size);
   lcc_network_buffer_initialize(srv->buffer);
 
   if (status != 0)
-    return (status);
+    return status;
 
   if (buffer_size > sizeof(buffer))
     buffer_size = sizeof(buffer);
@@ -234,8 +234,8 @@ static int server_send_buffer(lcc_server_t *srv) /* {{{ */
   }
 
   if (status < 0)
-    return (status);
-  return (0);
+    return status;
+  return 0;
 } /* }}} int server_send_buffer */
 
 static int server_value_add(lcc_server_t *srv, /* {{{ */
@@ -244,10 +244,10 @@ static int server_value_add(lcc_server_t *srv, /* {{{ */
 
   status = lcc_network_buffer_add_value(srv->buffer, vl);
   if (status == 0)
-    return (0);
+    return 0;
 
   server_send_buffer(srv);
-  return (lcc_network_buffer_add_value(srv->buffer, vl));
+  return lcc_network_buffer_add_value(srv->buffer, vl);
 } /* }}} int server_value_add */
 
 /*
@@ -259,11 +259,11 @@ lcc_network_t *lcc_network_create(void) /* {{{ */
 
   net = calloc(1, sizeof(*net));
   if (net == NULL)
-    return (NULL);
+    return NULL;
 
   net->servers = NULL;
 
-  return (net);
+  return net;
 } /* }}} lcc_network_t *lcc_network_create */
 
 void lcc_network_destroy(lcc_network_t *net) /* {{{ */
@@ -279,13 +279,13 @@ lcc_server_t *lcc_server_create(lcc_network_t *net, /* {{{ */
   lcc_server_t *srv;
 
   if ((net == NULL) || (node == NULL))
-    return (NULL);
+    return NULL;
   if (service == NULL)
     service = NET_DEFAULT_PORT;
 
   srv = calloc(1, sizeof(*srv));
   if (srv == NULL)
-    return (NULL);
+    return NULL;
 
   srv->fd = -1;
   srv->security_level = NONE;
@@ -296,14 +296,14 @@ lcc_server_t *lcc_server_create(lcc_network_t *net, /* {{{ */
   srv->node = strdup(node);
   if (srv->node == NULL) {
     free(srv);
-    return (NULL);
+    return NULL;
   }
 
   srv->service = strdup(service);
   if (srv->service == NULL) {
     free(srv->node);
     free(srv);
-    return (NULL);
+    return NULL;
   }
 
   srv->buffer = lcc_network_buffer_create(/* size = */ 0);
@@ -311,7 +311,7 @@ lcc_server_t *lcc_server_create(lcc_network_t *net, /* {{{ */
     free(srv->service);
     free(srv->node);
     free(srv);
-    return (NULL);
+    return NULL;
   }
 
   if (net->servers == NULL) {
@@ -325,13 +325,13 @@ lcc_server_t *lcc_server_create(lcc_network_t *net, /* {{{ */
     last->next = srv;
   }
 
-  return (srv);
+  return srv;
 } /* }}} lcc_server_t *lcc_server_create */
 
 int lcc_server_destroy(lcc_network_t *net, lcc_server_t *srv) /* {{{ */
 {
   if ((net == NULL) || (srv == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (net->servers == srv) {
     net->servers = srv->next;
@@ -343,7 +343,7 @@ int lcc_server_destroy(lcc_network_t *net, lcc_server_t *srv) /* {{{ */
       prev = prev->next;
 
     if (prev == NULL)
-      return (ENOENT);
+      return ENOENT;
 
     prev->next = srv->next;
     srv->next = NULL;
@@ -351,17 +351,17 @@ int lcc_server_destroy(lcc_network_t *net, lcc_server_t *srv) /* {{{ */
 
   int_server_destroy(srv);
 
-  return (0);
+  return 0;
 } /* }}} int lcc_server_destroy */
 
 int lcc_server_set_ttl(lcc_server_t *srv, uint8_t ttl) /* {{{ */
 {
   if (srv == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   srv->ttl = (int)ttl;
 
-  return (0);
+  return 0;
 } /* }}} int lcc_server_set_ttl */
 
 int lcc_server_set_interface(lcc_server_t *srv, char const *interface) /* {{{ */
@@ -370,11 +370,11 @@ int lcc_server_set_interface(lcc_server_t *srv, char const *interface) /* {{{ */
   int status;
 
   if ((srv == NULL) || (interface == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if_index = if_nametoindex(interface);
   if (if_index == 0)
-    return (ENOENT);
+    return ENOENT;
 
   /* IPv4 multicast */
   if (srv->sa->sa_family == AF_INET) {
@@ -398,9 +398,9 @@ int lcc_server_set_interface(lcc_server_t *srv, char const *interface) /* {{{ */
       status =
           setsockopt(srv->fd, IPPROTO_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq));
       if (status != 0)
-        return (status);
+        return status;
 
-      return (0);
+      return 0;
     }
   }
 
@@ -412,9 +412,9 @@ int lcc_server_set_interface(lcc_server_t *srv, char const *interface) /* {{{ */
       status = setsockopt(srv->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &if_index,
                           sizeof(if_index));
       if (status != 0)
-        return (status);
+        return status;
 
-      return (0);
+      return 0;
     }
   }
 
@@ -423,28 +423,26 @@ int lcc_server_set_interface(lcc_server_t *srv, char const *interface) /* {{{ */
   status = setsockopt(srv->fd, SOL_SOCKET, SO_BINDTODEVICE, interface,
                       (socklen_t)(strlen(interface) + 1));
   if (status != 0)
-    return (-1);
+    return -1;
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int lcc_server_set_interface */
 
 int lcc_server_set_security_level(lcc_server_t *srv, /* {{{ */
                                   lcc_security_level_t level,
                                   const char *username, const char *password) {
-  return (lcc_network_buffer_set_security_level(srv->buffer, level, username,
-                                                password));
+  return lcc_network_buffer_set_security_level(srv->buffer, level, username,
+                                               password);
 } /* }}} int lcc_server_set_security_level */
 
 int lcc_network_values_send(lcc_network_t *net, /* {{{ */
                             const lcc_value_list_t *vl) {
   if ((net == NULL) || (vl == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   for (lcc_server_t *srv = net->servers; srv != NULL; srv = srv->next)
     server_value_add(srv, vl);
 
-  return (0);
+  return 0;
 } /* }}} int lcc_network_values_send */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index aa4941d..662265d 100644 (file)
@@ -35,7 +35,7 @@
 
 #include <pthread.h>
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 #if defined __APPLE__
 /* default xcode compiler throws warnings even when deprecated functionality
  * is not used. -Werror breaks the build because of erroneous warnings.
@@ -106,7 +106,7 @@ struct lcc_network_buffer_s {
   char *username;
   char *password;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   gcry_cipher_hd_t encr_cypher;
   size_t encr_header_len;
   char encr_iv[16];
@@ -128,27 +128,27 @@ static _Bool have_gcrypt(void) /* {{{ */
   static _Bool need_init = 1;
 
   if (!need_init)
-    return (result);
+    return result;
   need_init = 0;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 #if GCRYPT_VERSION_NUMBER < 0x010600
   if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread))
-    return (0);
+    return 0;
 #endif
 
   if (!gcry_check_version(GCRYPT_VERSION))
-    return (0);
+    return 0;
 
   if (!gcry_control(GCRYCTL_INIT_SECMEM, 32768, 0))
-    return (0);
+    return 0;
 
   gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
 
   result = 1;
-  return (1);
+  return 1;
 #else
-  return (0);
+  return 0;
 #endif
 } /* }}} _Bool have_gcrypt */
 
@@ -171,7 +171,7 @@ static uint64_t htonll(uint64_t val) /* {{{ */
   }
 
   if (config == 1)
-    return (val);
+    return val;
 
   hi = (uint32_t)(val >> 32);
   lo = (uint32_t)(val & 0x00000000FFFFFFFF);
@@ -179,7 +179,7 @@ static uint64_t htonll(uint64_t val) /* {{{ */
   hi = htonl(hi);
   lo = htonl(lo);
 
-  return ((((uint64_t)lo) << 32) | ((uint64_t)hi));
+  return (((uint64_t)lo) << 32) | ((uint64_t)hi);
 } /* }}} uint64_t htonll */
 #endif
 
@@ -222,9 +222,9 @@ static double htond(double val) /* {{{ */
     out.byte[4] = out.byte[5] = 0x00;
     out.byte[6] = 0xf8;
     out.byte[7] = 0x7f;
-    return (out.floating);
+    return out.floating;
   } else if (config == 1)
-    return (val);
+    return val;
   else if (config == 2) {
     in.floating = val;
     out.byte[0] = in.byte[7];
@@ -235,7 +235,7 @@ static double htond(double val) /* {{{ */
     out.byte[5] = in.byte[2];
     out.byte[6] = in.byte[1];
     out.byte[7] = in.byte[0];
-    return (out.floating);
+    return out.floating;
   } else if (config == 3) {
     in.floating = val;
     out.byte[0] = in.byte[4];
@@ -246,10 +246,10 @@ static double htond(double val) /* {{{ */
     out.byte[5] = in.byte[1];
     out.byte[6] = in.byte[2];
     out.byte[7] = in.byte[3];
-    return (out.floating);
+    return out.floating;
   } else {
     /* If in doubt, just copy the value back to the caller. */
-    return (val);
+    return val;
   }
 } /* }}} double htond */
 
@@ -270,7 +270,7 @@ static int nb_add_values(char **ret_buffer, /* {{{ */
                sizeof(pkg_values_types) + sizeof(pkg_values);
 
   if (*ret_buffer_len < packet_len)
-    return (ENOMEM);
+    return ENOMEM;
 
   pkg_type = htons(TYPE_VALUES);
   pkg_length = htons((uint16_t)packet_len);
@@ -296,7 +296,7 @@ static int nb_add_values(char **ret_buffer, /* {{{ */
       break;
 
     default:
-      return (EINVAL);
+      return EINVAL;
     } /* switch (vl->values_types[i]) */
   }   /* for (vl->values_len) */
 
@@ -322,7 +322,7 @@ static int nb_add_values(char **ret_buffer, /* {{{ */
 
   *ret_buffer = packet_ptr + packet_len;
   *ret_buffer_len -= packet_len;
-  return (0);
+  return 0;
 } /* }}} int nb_add_values */
 
 static int nb_add_number(char **ret_buffer, /* {{{ */
@@ -340,7 +340,7 @@ static int nb_add_number(char **ret_buffer, /* {{{ */
   packet_len = sizeof(pkg_type) + sizeof(pkg_length) + sizeof(pkg_value);
 
   if (*ret_buffer_len < packet_len)
-    return (ENOMEM);
+    return ENOMEM;
 
   pkg_type = htons(type);
   pkg_length = htons((uint16_t)packet_len);
@@ -359,14 +359,14 @@ static int nb_add_number(char **ret_buffer, /* {{{ */
 
   *ret_buffer = packet_ptr + packet_len;
   *ret_buffer_len -= packet_len;
-  return (0);
+  return 0;
 } /* }}} int nb_add_number */
 
 static int nb_add_time(char **ret_buffer, /* {{{ */
                        size_t *ret_buffer_len, uint16_t type, double value) {
   /* Convert to collectd's "cdtime" representation. */
   uint64_t cdtime_value = (uint64_t)(value * 1073741824.0);
-  return (nb_add_number(ret_buffer, ret_buffer_len, type, cdtime_value));
+  return nb_add_number(ret_buffer, ret_buffer_len, type, cdtime_value);
 } /* }}} int nb_add_time */
 
 static int nb_add_string(char **ret_buffer, /* {{{ */
@@ -382,7 +382,7 @@ static int nb_add_string(char **ret_buffer, /* {{{ */
 
   packet_len = sizeof(pkg_type) + sizeof(pkg_length) + str_len + 1;
   if (*ret_buffer_len < packet_len)
-    return (ENOMEM);
+    return ENOMEM;
 
   pkg_type = htons(type);
   pkg_length = htons((uint16_t)packet_len);
@@ -402,7 +402,7 @@ static int nb_add_string(char **ret_buffer, /* {{{ */
 
   *ret_buffer = packet_ptr + packet_len;
   *ret_buffer_len -= packet_len;
-  return (0);
+  return 0;
 } /* }}} int nb_add_string */
 
 static int nb_add_value_list(lcc_network_buffer_t *nb, /* {{{ */
@@ -419,14 +419,14 @@ static int nb_add_value_list(lcc_network_buffer_t *nb, /* {{{ */
   if (strcmp(ident_dst->host, ident_src->host) != 0) {
     if (nb_add_string(&buffer, &buffer_size, TYPE_HOST, ident_src->host,
                       strlen(ident_src->host)) != 0)
-      return (-1);
+      return -1;
     SSTRNCPY(ident_dst->host, ident_src->host, sizeof(ident_dst->host));
   }
 
   if (strcmp(ident_dst->plugin, ident_src->plugin) != 0) {
     if (nb_add_string(&buffer, &buffer_size, TYPE_PLUGIN, ident_src->plugin,
                       strlen(ident_src->plugin)) != 0)
-      return (-1);
+      return -1;
     SSTRNCPY(ident_dst->plugin, ident_src->plugin, sizeof(ident_dst->plugin));
   }
 
@@ -434,7 +434,7 @@ static int nb_add_value_list(lcc_network_buffer_t *nb, /* {{{ */
     if (nb_add_string(&buffer, &buffer_size, TYPE_PLUGIN_INSTANCE,
                       ident_src->plugin_instance,
                       strlen(ident_src->plugin_instance)) != 0)
-      return (-1);
+      return -1;
     SSTRNCPY(ident_dst->plugin_instance, ident_src->plugin_instance,
              sizeof(ident_dst->plugin_instance));
   }
@@ -442,7 +442,7 @@ static int nb_add_value_list(lcc_network_buffer_t *nb, /* {{{ */
   if (strcmp(ident_dst->type, ident_src->type) != 0) {
     if (nb_add_string(&buffer, &buffer_size, TYPE_TYPE, ident_src->type,
                       strlen(ident_src->type)) != 0)
-      return (-1);
+      return -1;
     SSTRNCPY(ident_dst->type, ident_src->type, sizeof(ident_dst->type));
   }
 
@@ -450,32 +450,32 @@ static int nb_add_value_list(lcc_network_buffer_t *nb, /* {{{ */
     if (nb_add_string(&buffer, &buffer_size, TYPE_TYPE_INSTANCE,
                       ident_src->type_instance,
                       strlen(ident_src->type_instance)) != 0)
-      return (-1);
+      return -1;
     SSTRNCPY(ident_dst->type_instance, ident_src->type_instance,
              sizeof(ident_dst->type_instance));
   }
 
   if (nb->state.time != vl->time) {
     if (nb_add_time(&buffer, &buffer_size, TYPE_TIME_HR, vl->time))
-      return (-1);
+      return -1;
     nb->state.time = vl->time;
   }
 
   if (nb->state.interval != vl->interval) {
     if (nb_add_time(&buffer, &buffer_size, TYPE_INTERVAL_HR, vl->interval))
-      return (-1);
+      return -1;
     nb->state.interval = vl->interval;
   }
 
   if (nb_add_values(&buffer, &buffer_size, vl) != 0)
-    return (-1);
+    return -1;
 
   nb->ptr = buffer;
   nb->free = buffer_size;
-  return (0);
+  return 0;
 } /* }}} int nb_add_value_list */
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 static int nb_add_signature(lcc_network_buffer_t *nb) /* {{{ */
 {
   char *buffer;
@@ -497,27 +497,27 @@ static int nb_add_signature(lcc_network_buffer_t *nb) /* {{{ */
   hd = NULL;
   err = gcry_md_open(&hd, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC);
   if (err != 0)
-    return (-1);
+    return -1;
 
   assert(nb->password != NULL);
   err = gcry_md_setkey(hd, nb->password, strlen(nb->password));
   if (err != 0) {
     gcry_md_close(hd);
-    return (-1);
+    return -1;
   }
 
   gcry_md_write(hd, buffer, buffer_size);
   hash = gcry_md_read(hd, GCRY_MD_SHA256);
   if (hash == NULL) {
     gcry_md_close(hd);
-    return (-1);
+    return -1;
   }
 
   assert(((2 * sizeof(uint16_t)) + hash_length) == PART_SIGNATURE_SHA256_SIZE);
   memcpy(nb->buffer + (2 * sizeof(uint16_t)), hash, hash_length);
 
   gcry_md_close(hd);
-  return (0);
+  return 0;
 } /* }}} int nb_add_signature */
 
 static int nb_add_encryption(lcc_network_buffer_t *nb) /* {{{ */
@@ -556,7 +556,7 @@ static int nb_add_encryption(lcc_network_buffer_t *nb) /* {{{ */
     err = gcry_cipher_open(&nb->encr_cypher, GCRY_CIPHER_AES256,
                            GCRY_CIPHER_MODE_OFB, /* flags = */ 0);
     if (err != 0)
-      return (-1);
+      return -1;
 
     /* Calculate our 256bit key used for AES */
     gcry_md_hash_buffer(GCRY_MD_SHA256, password_hash, nb->password,
@@ -567,7 +567,7 @@ static int nb_add_encryption(lcc_network_buffer_t *nb) /* {{{ */
     if (err != 0) {
       gcry_cipher_close(nb->encr_cypher);
       nb->encr_cypher = NULL;
-      return (-1);
+      return -1;
     }
   } else /* if (nb->encr_cypher != NULL) */
   {
@@ -579,7 +579,7 @@ static int nb_add_encryption(lcc_network_buffer_t *nb) /* {{{ */
   if (err != 0) {
     gcry_cipher_close(nb->encr_cypher);
     nb->encr_cypher = NULL;
-    return (-1);
+    return -1;
   }
 
   /* Encrypt the buffer in-place */
@@ -588,10 +588,10 @@ static int nb_add_encryption(lcc_network_buffer_t *nb) /* {{{ */
   if (err != 0) {
     gcry_cipher_close(nb->encr_cypher);
     nb->encr_cypher = NULL;
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int nb_add_encryption */
 #endif
 
@@ -607,18 +607,18 @@ lcc_network_buffer_t *lcc_network_buffer_create(size_t size) /* {{{ */
 
   if (size < 128) {
     errno = EINVAL;
-    return (NULL);
+    return NULL;
   }
 
   nb = calloc(1, sizeof(*nb));
   if (nb == NULL)
-    return (NULL);
+    return NULL;
 
   nb->size = size;
   nb->buffer = calloc(1, nb->size);
   if (nb->buffer == NULL) {
     free(nb);
-    return (NULL);
+    return NULL;
   }
 
   nb->ptr = nb->buffer;
@@ -628,7 +628,7 @@ lcc_network_buffer_t *lcc_network_buffer_create(size_t size) /* {{{ */
   nb->username = NULL;
   nb->password = NULL;
 
-  return (nb);
+  return nb;
 } /* }}} lcc_network_buffer_t *lcc_network_buffer_create */
 
 void lcc_network_buffer_destroy(lcc_network_buffer_t *nb) /* {{{ */
@@ -654,18 +654,18 @@ int lcc_network_buffer_set_security_level(lcc_network_buffer_t *nb, /* {{{ */
     nb->password = NULL;
     nb->seclevel = NONE;
     lcc_network_buffer_initialize(nb);
-    return (0);
+    return 0;
   }
 
   if (!have_gcrypt())
-    return (ENOTSUP);
+    return ENOTSUP;
 
   username_copy = strdup(username);
   password_copy = strdup(password);
   if ((username_copy == NULL) || (password_copy == NULL)) {
     free(username_copy);
     free(password_copy);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   free(nb->username);
@@ -675,20 +675,20 @@ int lcc_network_buffer_set_security_level(lcc_network_buffer_t *nb, /* {{{ */
   nb->seclevel = level;
 
   lcc_network_buffer_initialize(nb);
-  return (0);
+  return 0;
 } /* }}} int lcc_network_buffer_set_security_level */
 
 int lcc_network_buffer_initialize(lcc_network_buffer_t *nb) /* {{{ */
 {
   if (nb == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   memset(nb->buffer, 0, nb->size);
   memset(&nb->state, 0, sizeof(nb->state));
   nb->ptr = nb->buffer;
   nb->free = nb->size;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   if (nb->seclevel == SIGN) {
     size_t username_len;
     uint16_t pkg_type = htons(TYPE_SIGN_SHA256);
@@ -731,22 +731,22 @@ int lcc_network_buffer_initialize(lcc_network_buffer_t *nb) /* {{{ */
   }
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int lcc_network_buffer_initialize */
 
 int lcc_network_buffer_finalize(lcc_network_buffer_t *nb) /* {{{ */
 {
   if (nb == NULL)
-    return (EINVAL);
+    return EINVAL;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   if (nb->seclevel == SIGN)
     return nb_add_signature(nb);
   else if (nb->seclevel == ENCRYPT)
     return nb_add_encryption(nb);
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int lcc_network_buffer_finalize */
 
 int lcc_network_buffer_add_value(lcc_network_buffer_t *nb, /* {{{ */
@@ -754,10 +754,10 @@ int lcc_network_buffer_add_value(lcc_network_buffer_t *nb, /* {{{ */
   int status;
 
   if ((nb == NULL) || (vl == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   status = nb_add_value_list(nb, vl);
-  return (status);
+  return status;
 } /* }}} int lcc_network_buffer_add_value */
 
 int lcc_network_buffer_get(lcc_network_buffer_t *nb, /* {{{ */
@@ -766,7 +766,7 @@ int lcc_network_buffer_get(lcc_network_buffer_t *nb, /* {{{ */
   size_t sz_available;
 
   if ((nb == NULL) || (buffer_size == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   assert(nb->size >= nb->free);
   sz_required = nb->size - nb->free;
@@ -777,7 +777,5 @@ int lcc_network_buffer_get(lcc_network_buffer_t *nb, /* {{{ */
     memcpy(buffer, nb->buffer,
            (sz_available < sz_required) ? sz_available : sz_required);
 
-  return (0);
+  return 0;
 } /* }}} int lcc_network_buffer_get */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
diff --git a/src/liboconfig/Makefile.am b/src/liboconfig/Makefile.am
deleted file mode 100644 (file)
index 5ac0ef3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-BUILT_SOURCES = parser.h
-#CLEANFILES = parser.[ch] scanner.c
-AM_YFLAGS = -d
-
-noinst_LTLIBRARIES = liboconfig.la
-
-liboconfig_la_LDFLAGS = -avoid-version $(LEXLIB)
-liboconfig_la_SOURCES = oconfig.c oconfig.h aux_types.h scanner.l parser.y
index 76134db..0ffda3a 100644 (file)
@@ -62,7 +62,7 @@ static oconfig_item_t *oconfig_parse_fh(FILE *fh) {
   status = yyparse();
   if (status != 0) {
     fprintf(stderr, "yyparse returned error #%i\n", status);
-    return (NULL);
+    return NULL;
   }
 
   c_file = NULL;
@@ -71,7 +71,7 @@ static oconfig_item_t *oconfig_parse_fh(FILE *fh) {
   ci_root = NULL;
   yyset_in((FILE *)0);
 
-  return (ret);
+  return ret;
 } /* oconfig_item_t *oconfig_parse_fh */
 
 oconfig_item_t *oconfig_parse_file(const char *file) {
@@ -83,7 +83,7 @@ oconfig_item_t *oconfig_parse_file(const char *file) {
   fh = fopen(file, "r");
   if (fh == NULL) {
     fprintf(stderr, "fopen (%s) failed: %s\n", file, strerror(errno));
-    return (NULL);
+    return NULL;
   }
 
   ret = oconfig_parse_fh(fh);
@@ -91,7 +91,7 @@ oconfig_item_t *oconfig_parse_file(const char *file) {
 
   c_file = NULL;
 
-  return (ret);
+  return ret;
 } /* oconfig_item_t *oconfig_parse_file */
 
 oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
@@ -100,7 +100,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
   ci_copy = calloc(1, sizeof(*ci_copy));
   if (ci_copy == NULL) {
     fprintf(stderr, "calloc failed.\n");
-    return (NULL);
+    return NULL;
   }
   ci_copy->values = NULL;
   ci_copy->parent = NULL;
@@ -110,7 +110,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
   if (ci_copy->key == NULL) {
     fprintf(stderr, "strdup failed.\n");
     free(ci_copy);
-    return (NULL);
+    return NULL;
   }
 
   if (ci_orig->values_num > 0) /* {{{ */
@@ -121,7 +121,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
       fprintf(stderr, "calloc failed.\n");
       free(ci_copy->key);
       free(ci_copy);
-      return (NULL);
+      return NULL;
     }
     ci_copy->values_num = ci_orig->values_num;
 
@@ -133,7 +133,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
         if (ci_copy->values[i].value.string == NULL) {
           fprintf(stderr, "strdup failed.\n");
           oconfig_free(ci_copy);
-          return (NULL);
+          return NULL;
         }
       } else /* ci_copy->values[i].type != OCONFIG_TYPE_STRING) */
       {
@@ -149,7 +149,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
     if (ci_copy->children == NULL) {
       fprintf(stderr, "calloc failed.\n");
       oconfig_free(ci_copy);
-      return (NULL);
+      return NULL;
     }
     ci_copy->children_num = ci_orig->children_num;
 
@@ -159,7 +159,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
       child = oconfig_clone(ci_orig->children + i);
       if (child == NULL) {
         oconfig_free(ci_copy);
-        return (NULL);
+        return NULL;
       }
       child->parent = ci_copy;
       ci_copy->children[i] = *child;
@@ -167,7 +167,7 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci_orig) {
     } /* for (i = 0; i < ci_copy->children_num; i++) */
   }   /* }}} if (ci_orig->children_num > 0) */
 
-  return (ci_copy);
+  return ci_copy;
 } /* oconfig_item_t *oconfig_clone */
 
 static void oconfig_free_all(oconfig_item_t *ci) {
@@ -196,7 +196,3 @@ void oconfig_free(oconfig_item_t *ci) {
   oconfig_free_all(ci);
   free(ci);
 }
-
-/*
- * vim:shiftwidth=2:tabstop=8:softtabstop=2:fdm=marker
- */
index d27f6f5..3b81062 100644 (file)
@@ -67,7 +67,4 @@ oconfig_item_t *oconfig_clone(const oconfig_item_t *ci);
 
 void oconfig_free(oconfig_item_t *ci);
 
-/*
- * vim: shiftwidth=2:tabstop=8:softtabstop=2
- */
 #endif /* OCONFIG_H */
index c738860..d6584d5 100644 (file)
@@ -69,7 +69,7 @@ static int load_config(const char *key, const char *value) {
             "is not available, because I can't determine the "
             "number of CPUS on this system. Sorry.");
 #endif
-  return (-1);
+  return -1;
 }
 static void load_submit(gauge_t snum, gauge_t mnum, gauge_t lnum) {
   int cores = 0;
@@ -131,14 +131,14 @@ static int load_read(void) {
   if ((loadavg = fopen("/proc/loadavg", "r")) == NULL) {
     char errbuf[1024];
     WARNING("load: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (fgets(buffer, 16, loadavg) == NULL) {
     char errbuf[1024];
     WARNING("load: fgets: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
     fclose(loadavg);
-    return (-1);
+    return -1;
   }
 
   if (fclose(loadavg)) {
@@ -149,7 +149,7 @@ static int load_read(void) {
   numfields = strsplit(buffer, fields, 8);
 
   if (numfields < 3)
-    return (-1);
+    return -1;
 
   snum = atof(fields[0]);
   mnum = atof(fields[1]);
@@ -180,7 +180,7 @@ static int load_read(void) {
     char errbuf[1024];
     WARNING("load: perfstat_cpu : %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   snum = (float)cputotal.loadavg[0] / (float)(1 << SBITS);
@@ -193,7 +193,7 @@ static int load_read(void) {
 #error "No applicable input method."
 #endif
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index 8df4313..28cc34c 100644 (file)
@@ -236,7 +236,7 @@ static int log_logstash_notification(const notification_t *n,
 
   if (g == NULL) {
     fprintf(stderr, "Could not allocate JSON generator.\n");
-    return (0);
+    return 0;
   }
 
   if (yajl_gen_map_open(g) != yajl_gen_status_ok)
@@ -323,12 +323,12 @@ static int log_logstash_notification(const notification_t *n,
   }
 
   log_logstash_print(g, LOG_INFO, (n->time != 0) ? n->time : cdtime());
-  return (0);
+  return 0;
 
 err:
   yajl_gen_free(g);
   fprintf(stderr, "Could not correctly generate JSON notification\n");
-  return (0);
+  return 0;
 } /* int log_logstash_notification */
 
 void module_register(void) {
@@ -339,5 +339,3 @@ void module_register(void) {
   plugin_register_notification("log_logstash", log_logstash_notification,
                                /* user_data = */ NULL);
 } /* void module_register (void) */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 6629c0b..e5807f1 100644 (file)
@@ -53,7 +53,7 @@ static int logfile_config(const char *key, const char *value) {
     if (log_level < 0) {
       log_level = LOG_INFO;
       ERROR("logfile: invalid loglevel [%s] defaulting to 'info'", value);
-      return (1);
+      return 1;
     }
   } else if (0 == strcasecmp(key, "File")) {
     sfree(log_file);
@@ -194,7 +194,7 @@ static int logfile_notification(const notification_t *n,
 
   logfile_print(buf, LOG_INFO, (n->time != 0) ? n->time : cdtime());
 
-  return (0);
+  return 0;
 } /* int logfile_notification */
 
 void module_register(void) {
@@ -204,5 +204,3 @@ void module_register(void) {
   plugin_register_notification("logfile", logfile_notification,
                                /* user_data = */ NULL);
 } /* void module_register (void) */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index df4424c..a0dde32 100644 (file)
@@ -61,10 +61,10 @@ static int lpar_config(const char *key, const char *value) {
     else
       report_by_serial = 0;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int lpar_config */
 
 static int lpar_init(void) {
@@ -79,7 +79,7 @@ static int lpar_init(void) {
     char errbuf[1024];
     ERROR("lpar plugin: perfstat_partition_total failed: %s (%i)",
           sstrerror(errno, errbuf, sizeof(errbuf)), status);
-    return (-1);
+    return -1;
   }
 
 #if PERFSTAT_SUPPORTS_DONATION
@@ -95,7 +95,7 @@ static int lpar_init(void) {
     pool_stats = 0;
   }
 
-  return (0);
+  return 0;
 } /* int lpar_init */
 
 static void lpar_submit(const char *type_instance, double value) {
@@ -128,7 +128,7 @@ static int lpar_read(void) {
      from chassis to chassis through Live Partition Mobility (LPM). */
   if (uname(&name) != 0) {
     ERROR("lpar plugin: uname failed.");
-    return (-1);
+    return -1;
   }
   sstrncpy(serial, name.machine, sizeof(serial));
 
@@ -141,7 +141,7 @@ static int lpar_read(void) {
     char errbuf[1024];
     ERROR("lpar plugin: perfstat_partition_total failed: %s (%i)",
           sstrerror(errno, errbuf, sizeof(errbuf)), status);
-    return (-1);
+    return -1;
   }
 
   /* Number of ticks since we last run. */
@@ -149,7 +149,7 @@ static int lpar_read(void) {
   if (ticks == 0) {
     /* The stats have not been updated. Return now to avoid
      * dividing by zero */
-    return (0);
+    return 0;
   }
 
   /*
@@ -235,7 +235,7 @@ static int lpar_read(void) {
 
   memcpy(&lparstats_old, &lparstats, sizeof(lparstats_old));
 
-  return (0);
+  return 0;
 } /* int lpar_read */
 
 void module_register(void) {
@@ -243,5 +243,3 @@ void module_register(void) {
   plugin_register_init("lpar", lpar_init);
   plugin_register_read("lpar", lpar_read);
 } /* void module_register */
-
-/* vim: set sw=8 noet : */
index 2bd56a1..aeaeff2 100644 (file)
--- a/src/lua.c
+++ b/src/lua.c
@@ -79,10 +79,10 @@ static int clua_load_callback(lua_State *L, int callback_ref) /* {{{ */
 
   if (!lua_isfunction(L, -1)) {
     lua_pop(L, 1);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int clua_load_callback */
 
 /* Store the threads in a global variable so they are not cleaned up by the
@@ -96,12 +96,12 @@ static int clua_store_thread(lua_State *L, int idx) /* {{{ */
   lua_pushvalue(L, idx); /* +1 = 3 */
   if (!lua_isthread(L, -1)) {
     lua_pop(L, 3); /* -3 = 0 */
-    return (-1);
+    return -1;
   }
 
   luaL_ref(L, LUA_REGISTRYINDEX);
   lua_pop(L, 1); /* -1 = 0 */
-  return (0);
+  return 0;
 } /* }}} int clua_store_thread */
 
 static int clua_read(user_data_t *ud) /* {{{ */
@@ -117,7 +117,7 @@ static int clua_read(user_data_t *ud) /* {{{ */
     ERROR("Lua plugin: Unable to load callback \"%s\" (id %i).",
           cb->lua_function_name, cb->callback_id);
     pthread_mutex_unlock(&cb->lock);
-    return (-1);
+    return -1;
   }
   /* +1 = 1 */
 
@@ -131,7 +131,7 @@ static int clua_read(user_data_t *ud) /* {{{ */
       ERROR("Lua plugin: Calling a read callback failed: %s", errmsg);
     lua_pop(L, 1);
     pthread_mutex_unlock(&cb->lock);
-    return (-1);
+    return -1;
   }
 
   if (!lua_isnumber(L, -1)) {
@@ -147,7 +147,7 @@ static int clua_read(user_data_t *ud) /* {{{ */
   lua_pop(L, 1); /* -1 = 0 */
 
   pthread_mutex_unlock(&cb->lock);
-  return (status);
+  return status;
 } /* }}} int clua_read */
 
 static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
@@ -163,7 +163,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
     ERROR("Lua plugin: Unable to load callback \"%s\" (id %i).",
           cb->lua_function_name, cb->callback_id);
     pthread_mutex_unlock(&cb->lock);
-    return (-1);
+    return -1;
   }
   /* +1 = 1 */
 
@@ -172,7 +172,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
     lua_pop(L, 1); /* -1 = 0 */
     pthread_mutex_unlock(&cb->lock);
     ERROR("Lua plugin: luaC_pushvaluelist failed.");
-    return (-1);
+    return -1;
   }
   /* +1 = 2 */
 
@@ -186,7 +186,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
       ERROR("Lua plugin: Calling the write callback failed:\n%s", errmsg);
     lua_pop(L, 1); /* -1 = 0 */
     pthread_mutex_unlock(&cb->lock);
-    return (-1);
+    return -1;
   }
 
   if (!lua_isnumber(L, -1)) {
@@ -200,7 +200,7 @@ static int clua_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
 
   lua_pop(L, 1); /* -1 = 0 */
   pthread_mutex_unlock(&cb->lock);
-  return (status);
+  return status;
 } /* }}} int clua_write */
 
 /*
@@ -404,7 +404,7 @@ static int lua_script_init(lua_script_t *script) /* {{{ */
   script->lua_state = luaL_newstate();
   if (script->lua_state == NULL) {
     ERROR("Lua plugin: luaL_newstate() failed.");
-    return (-1);
+    return -1;
   }
 
   /* Open up all the standard Lua libraries. */
@@ -437,7 +437,7 @@ static int lua_script_init(lua_script_t *script) /* {{{ */
     lua_pop(script->lua_state, 1);
   }
 
-  return (0);
+  return 0;
 } /* }}} int lua_script_init */
 
 static int lua_script_load(const char *script_path) /* {{{ */
@@ -445,20 +445,20 @@ static int lua_script_load(const char *script_path) /* {{{ */
   lua_script_t *script = malloc(sizeof(*script));
   if (script == NULL) {
     ERROR("Lua plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   int status = lua_script_init(script);
   if (status != 0) {
     lua_script_free(script);
-    return (status);
+    return status;
   }
 
   script->script_path = strdup(script_path);
   if (script->script_path == NULL) {
     ERROR("Lua plugin: strdup failed.");
     lua_script_free(script);
-    return (-1);
+    return -1;
   }
 
   status = luaL_loadfile(script->lua_state, script->script_path);
@@ -467,7 +467,7 @@ static int lua_script_load(const char *script_path) /* {{{ */
           lua_tostring(script->lua_state, -1));
     lua_pop(script->lua_state, 1);
     lua_script_free(script);
-    return (-1);
+    return -1;
   }
 
   status = lua_pcall(script->lua_state,
@@ -486,7 +486,7 @@ static int lua_script_load(const char *script_path) /* {{{ */
             script->script_path, errmsg);
 
     lua_script_free(script);
-    return (-1);
+    return -1;
   }
 
   /* Append this script to the global list of scripts. */
@@ -500,14 +500,14 @@ static int lua_script_load(const char *script_path) /* {{{ */
     scripts = script;
   }
 
-  return (0);
+  return 0;
 } /* }}} int lua_script_load */
 
 static int lua_config_base_path(const oconfig_item_t *ci) /* {{{ */
 {
   int status = cf_util_get_string_buffer(ci, base_path, sizeof(base_path));
   if (status != 0)
-    return (status);
+    return status;
 
   size_t len = strlen(base_path);
   while ((len > 0) && (base_path[len - 1] == '/')) {
@@ -517,7 +517,7 @@ static int lua_config_base_path(const oconfig_item_t *ci) /* {{{ */
 
   DEBUG("Lua plugin: base_path = \"%s\";", base_path);
 
-  return (0);
+  return 0;
 } /* }}} int lua_config_base_path */
 
 static int lua_config_script(const oconfig_item_t *ci) /* {{{ */
@@ -526,7 +526,7 @@ static int lua_config_script(const oconfig_item_t *ci) /* {{{ */
 
   int status = cf_util_get_string_buffer(ci, rel_path, sizeof(rel_path));
   if (status != 0)
-    return (status);
+    return status;
 
   char abs_path[PATH_MAX];
 
@@ -539,7 +539,7 @@ static int lua_config_script(const oconfig_item_t *ci) /* {{{ */
 
   status = lua_script_load(abs_path);
   if (status != 0)
-    return (status);
+    return status;
 
   INFO("Lua plugin: File \"%s\" loaded successfully", abs_path);
 
@@ -576,12 +576,10 @@ static int lua_shutdown(void) /* {{{ */
 {
   lua_script_free(scripts);
 
-  return (0);
+  return 0;
 } /* }}} int lua_shutdown */
 
 void module_register(void) {
   plugin_register_complex_config("lua", lua_config);
   plugin_register_shutdown("lua", lua_shutdown);
 }
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 3a84a6d..c3214b0 100644 (file)
--- a/src/lvm.c
+++ b/src/lvm.c
@@ -156,14 +156,14 @@ static int lvm_read(void) {
   lvm = lvm_init(NULL);
   if (!lvm) {
     ERROR("lvm plugin: lvm_init failed.");
-    return (-1);
+    return -1;
   }
 
   vg_names = lvm_list_vg_names(lvm);
   if (!vg_names) {
     ERROR("lvm plugin lvm_list_vg_name failed %s", lvm_errmsg(lvm));
     lvm_quit(lvm);
-    return (-1);
+    return -1;
   }
 
   dm_list_iterate_items(name_list, vg_names) {
@@ -181,7 +181,7 @@ static int lvm_read(void) {
   }
 
   lvm_quit(lvm);
-  return (0);
+  return 0;
 } /*lvm_read */
 
 void module_register(void) {
index 99e4224..5a915b6 100644 (file)
@@ -418,7 +418,7 @@ static int madwifi_real_init(void) {
   for (size_t i = 0; i < STATIC_ARRAY_SIZE(bounds); i++)
     bounds[i]++;
 
-  return (0);
+  return 0;
 }
 
 static int madwifi_config(const char *key, const char *value) {
@@ -461,7 +461,7 @@ static int madwifi_config(const char *key, const char *value) {
     int id = watchitem_find(value);
 
     if (id < 0)
-      return (-1);
+      return -1;
     else
       watchlist_add(watch_items, id);
   }
@@ -470,7 +470,7 @@ static int madwifi_config(const char *key, const char *value) {
     int id = watchitem_find(value);
 
     if (id < 0)
-      return (-1);
+      return -1;
     else
       watchlist_remove(watch_items, id);
   }
@@ -488,7 +488,7 @@ static int madwifi_config(const char *key, const char *value) {
     int id = watchitem_find(value);
 
     if (id < 0)
-      return (-1);
+      return -1;
     else
       watchlist_add(misc_items, id);
   }
@@ -497,15 +497,15 @@ static int madwifi_config(const char *key, const char *value) {
     int id = watchitem_find(value);
 
     if (id < 0)
-      return (-1);
+      return -1;
     else
       watchlist_remove(misc_items, id);
   }
 
   else
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 }
 
 static void submit(const char *dev, const char *type, const char *ti1,
@@ -600,7 +600,7 @@ static int process_athstats(int sk, const char *dev) {
           "SIOCGATHSTATS to device %s "
           "failed with status %i.",
           dev, status);
-    return (status);
+    return status;
   }
 
   /* These stats are handled as a special case, because they are
@@ -616,7 +616,7 @@ static int process_athstats(int sk, const char *dev) {
 
   /* All other ath statistics */
   process_stat_struct(ATH_STAT, &stats, dev, NULL, "ath_stat", "ast_misc");
-  return (0);
+  return 0;
 }
 
 static int process_80211stats(int sk, const char *dev) {
@@ -633,11 +633,11 @@ static int process_80211stats(int sk, const char *dev) {
           "SIOCG80211STATS to device %s "
           "failed with status %i.",
           dev, status);
-    return (status);
+    return status;
   }
 
   process_stat_struct(IFA_STAT, &stats, dev, NULL, "ath_stat", "is_misc");
-  return (0);
+  return 0;
 }
 
 static int process_station(int sk, const char *dev,
@@ -668,7 +668,7 @@ static int process_station(int sk, const char *dev,
           "IEEE80211_IOCTL_STA_STATS to device %s "
           "failed with status %i.",
           dev, status);
-    return (status);
+    return status;
   }
 
   /* These two stats are handled as a special case as they are
@@ -685,7 +685,7 @@ static int process_station(int sk, const char *dev,
 
   /* All other node statistics */
   process_stat_struct(NOD_STAT, ns, dev, mac, "node_stat", "ns_misc");
-  return (0);
+  return 0;
 }
 
 static int process_stations(int sk, const char *dev) {
@@ -706,7 +706,7 @@ static int process_stations(int sk, const char *dev) {
           "IEEE80211_IOCTL_STA_INFO to device %s "
           "failed with status %i.",
           dev, status);
-    return (status);
+    return status;
   }
 
   len = iwr.u.data.length;
@@ -723,7 +723,7 @@ static int process_stations(int sk, const char *dev) {
 
   if (item_watched(STAT_ATH_NODES))
     submit_gauge(dev, "ath_nodes", NULL, NULL, nodes);
-  return (0);
+  return 0;
 }
 
 static int process_device(int sk, const char *dev) {
@@ -742,7 +742,7 @@ static int process_device(int sk, const char *dev) {
   if (status == 0)
     num_success++;
 
-  return ((num_success == 0) ? -1 : 0);
+  return (num_success == 0) ? -1 : 0;
 }
 
 static int check_devname(const char *dev) {
@@ -777,7 +777,7 @@ static int sysfs_iterate(int sk) {
   nets = opendir("/sys/class/net/");
   if (nets == NULL) {
     WARNING("madwifi plugin: opening /sys/class/net failed");
-    return (-1);
+    return -1;
   }
 
   num_success = 0;
@@ -803,8 +803,8 @@ static int sysfs_iterate(int sk) {
   closedir(nets);
 
   if ((num_success == 0) && (num_fail != 0))
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 }
 
 static int procfs_iterate(int sk) {
@@ -817,7 +817,7 @@ static int procfs_iterate(int sk) {
 
   if ((fh = fopen("/proc/net/dev", "r")) == NULL) {
     WARNING("madwifi plugin: opening /proc/net/dev failed");
-    return (-1);
+    return -1;
   }
 
   num_success = 0;
@@ -852,7 +852,7 @@ static int procfs_iterate(int sk) {
   fclose(fh);
 
   if ((num_success == 0) && (num_fail != 0))
-    return (-1);
+    return -1;
   return 0;
 }
 
@@ -866,7 +866,7 @@ static int madwifi_read(void) {
 
   sk = socket(AF_INET, SOCK_DGRAM, 0);
   if (sk < 0)
-    return (-1);
+    return -1;
 
   /* procfs iteration is not safe because it does not check whether given
      interface is madwifi interface and there are private ioctls used, which
index 67c5578..27817fe 100644 (file)
@@ -40,12 +40,12 @@ static int mec_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   }
 
   *user_data = NULL;
-  return (0);
+  return 0;
 } /* }}} int mec_create */
 
 static int mec_destroy(__attribute__((unused)) void **user_data) /* {{{ */
 {
-  return (0);
+  return 0;
 } /* }}} int mec_destroy */
 
 static int mec_match(__attribute__((unused)) const data_set_t *ds, /* {{{ */
@@ -67,9 +67,9 @@ static int mec_match(__attribute__((unused)) const data_set_t *ds, /* {{{ */
   }
 
   if ((num_counters != 0) && (num_counters == num_empty))
-    return (FC_MATCH_MATCHES);
+    return FC_MATCH_MATCHES;
 
-  return (FC_MATCH_NO_MATCH);
+  return FC_MATCH_NO_MATCH;
 } /* }}} int mec_match */
 
 void module_register(void) {
@@ -79,5 +79,3 @@ void module_register(void) {
           .create = mec_create, .destroy = mec_destroy, .match = mec_match,
       });
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index fad5271..c0554b2 100644 (file)
@@ -56,19 +56,19 @@ static int mh_config_match(const oconfig_item_t *ci, /* {{{ */
       (ci->values[1].type != OCONFIG_TYPE_NUMBER)) {
     ERROR("hashed match: The `Match' option requires "
           "exactly two numeric arguments.");
-    return (-1);
+    return -1;
   }
 
   if ((ci->values[0].value.number < 0) || (ci->values[1].value.number < 0)) {
     ERROR("hashed match: The arguments of the `Match' "
           "option must be positive.");
-    return (-1);
+    return -1;
   }
 
   tmp = realloc(m->matches, sizeof(*tmp) * (m->matches_num + 1));
   if (tmp == NULL) {
     ERROR("hashed match: realloc failed.");
-    return (-1);
+    return -1;
   }
   m->matches = tmp;
   tmp = m->matches + m->matches_num;
@@ -79,12 +79,12 @@ static int mh_config_match(const oconfig_item_t *ci, /* {{{ */
   if (tmp->match >= tmp->total) {
     ERROR("hashed match: The first argument of the `Match' option "
           "must be smaller than the second argument.");
-    return (-1);
+    return -1;
   }
   assert(tmp->total != 0);
 
   m->matches_num++;
-  return (0);
+  return 0;
 } /* }}} int mh_config_match */
 
 static int mh_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -94,7 +94,7 @@ static int mh_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   m = calloc(1, sizeof(*m));
   if (m == NULL) {
     ERROR("mh_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -110,11 +110,11 @@ static int mh_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
     sfree(m->matches);
     sfree(m);
     ERROR("hashed match: No matches were configured. Not creating match.");
-    return (-1);
+    return -1;
   }
 
   *user_data = m;
-  return (0);
+  return 0;
 } /* }}} int mh_create */
 
 static int mh_destroy(void **user_data) /* {{{ */
@@ -122,13 +122,13 @@ static int mh_destroy(void **user_data) /* {{{ */
   mh_match_t *mh;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (0);
+    return 0;
 
   mh = *user_data;
   sfree(mh->matches);
   sfree(mh);
 
-  return (0);
+  return 0;
 } /* }}} int mh_destroy */
 
 static int mh_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
@@ -139,7 +139,7 @@ static int mh_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
   uint32_t hash_val;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (-1);
+    return -1;
 
   m = *user_data;
 
@@ -153,9 +153,9 @@ static int mh_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
 
   for (size_t i = 0; i < m->matches_num; i++)
     if ((hash_val % m->matches[i].total) == m->matches[i].match)
-      return (FC_MATCH_MATCHES);
+      return FC_MATCH_MATCHES;
 
-  return (FC_MATCH_NO_MATCH);
+  return FC_MATCH_NO_MATCH;
 } /* }}} int mh_match */
 
 void module_register(void) {
@@ -166,5 +166,3 @@ void module_register(void) {
   mproc.match = mh_match;
   fc_register_match("hashed", mproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 209f773..6b45f6c 100644 (file)
@@ -107,7 +107,7 @@ static void mr_free_match(mr_match_t *m) /* {{{ */
 static int mr_match_regexen(mr_regex_t *re_head, /* {{{ */
                             const char *string) {
   if (re_head == NULL)
-    return (FC_MATCH_MATCHES);
+    return FC_MATCH_MATCHES;
 
   for (mr_regex_t *re = re_head; re != NULL; re = re->next) {
     int status;
@@ -121,11 +121,11 @@ static int mr_match_regexen(mr_regex_t *re_head, /* {{{ */
     } else {
       DEBUG("regex match: Regular expression `%s' does not match `%s'.",
             re->re_str, string);
-      return (FC_MATCH_NO_MATCH);
+      return FC_MATCH_NO_MATCH;
     }
   }
 
-  return (FC_MATCH_MATCHES);
+  return FC_MATCH_MATCHES;
 } /* }}} int mr_match_regexen */
 
 static int mr_add_regex(mr_regex_t **re_head, const char *re_str, /* {{{ */
@@ -136,7 +136,7 @@ static int mr_add_regex(mr_regex_t **re_head, const char *re_str, /* {{{ */
   re = calloc(1, sizeof(*re));
   if (re == NULL) {
     log_err("mr_add_regex: calloc failed.");
-    return (-1);
+    return -1;
   }
   re->next = NULL;
 
@@ -144,7 +144,7 @@ static int mr_add_regex(mr_regex_t **re_head, const char *re_str, /* {{{ */
   if (re->re_str == NULL) {
     sfree(re);
     log_err("mr_add_regex: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   status = regcomp(&re->re, re->re_str, REG_EXTENDED | REG_NOSUB);
@@ -156,7 +156,7 @@ static int mr_add_regex(mr_regex_t **re_head, const char *re_str, /* {{{ */
             errmsg);
     sfree(re->re_str);
     sfree(re);
-    return (-1);
+    return -1;
   }
 
   if (*re_head == NULL) {
@@ -171,14 +171,14 @@ static int mr_add_regex(mr_regex_t **re_head, const char *re_str, /* {{{ */
     ptr->next = re;
   }
 
-  return (0);
+  return 0;
 } /* }}} int mr_add_regex */
 
 static int mr_config_add_regex(mr_regex_t **re_head, /* {{{ */
                                oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     log_warn("`%s' needs exactly one string argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   return mr_add_regex(re_head, ci->values[0].value.string, ci->key);
@@ -195,14 +195,14 @@ static int mr_config_add_meta_regex(llist_t **meta, /* {{{ */
   if ((ci->values_num != 2) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
       (ci->values[1].type != OCONFIG_TYPE_STRING)) {
     log_warn("`%s' needs exactly two string arguments.", ci->key);
-    return (-1);
+    return -1;
   }
 
   if (*meta == NULL) {
     *meta = llist_create();
     if (*meta == NULL) {
       log_err("mr_config_add_meta_regex: llist_create failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -212,13 +212,13 @@ static int mr_config_add_meta_regex(llist_t **meta, /* {{{ */
     meta_key = strdup(meta_key);
     if (meta_key == NULL) {
       log_err("mr_config_add_meta_regex: strdup failed.");
-      return (-1);
+      return -1;
     }
     entry = llentry_create(meta_key, NULL);
     if (entry == NULL) {
       log_err("mr_config_add_meta_regex: llentry_create failed.");
       sfree(meta_key);
-      return (-1);
+      return -1;
     }
     /* meta_key and entry will now be freed by mr_free_match(). */
     llist_append(*meta, entry);
@@ -242,7 +242,7 @@ static int mr_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   m = calloc(1, sizeof(*m));
   if (m == NULL) {
     log_err("mr_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   m->invert = 0;
@@ -292,18 +292,18 @@ static int mr_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     mr_free_match(m);
-    return (status);
+    return status;
   }
 
   *user_data = m;
-  return (0);
+  return 0;
 } /* }}} int mr_create */
 
 static int mr_destroy(void **user_data) /* {{{ */
 {
   if ((user_data != NULL) && (*user_data != NULL))
     mr_free_match(*user_data);
-  return (0);
+  return 0;
 } /* }}} int mr_destroy */
 
 static int mr_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
@@ -315,7 +315,7 @@ static int mr_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
   int nomatch_value = FC_MATCH_NO_MATCH;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (-1);
+    return -1;
 
   m = *user_data;
 
@@ -325,35 +325,35 @@ static int mr_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
   }
 
   if (mr_match_regexen(m->host, vl->host) == FC_MATCH_NO_MATCH)
-    return (nomatch_value);
+    return nomatch_value;
   if (mr_match_regexen(m->plugin, vl->plugin) == FC_MATCH_NO_MATCH)
-    return (nomatch_value);
+    return nomatch_value;
   if (mr_match_regexen(m->plugin_instance, vl->plugin_instance) ==
       FC_MATCH_NO_MATCH)
-    return (nomatch_value);
+    return nomatch_value;
   if (mr_match_regexen(m->type, vl->type) == FC_MATCH_NO_MATCH)
-    return (nomatch_value);
+    return nomatch_value;
   if (mr_match_regexen(m->type_instance, vl->type_instance) ==
       FC_MATCH_NO_MATCH)
-    return (nomatch_value);
+    return nomatch_value;
   if (vl->meta != NULL) {
     for (llentry_t *e = llist_head(m->meta); e != NULL; e = e->next) {
       mr_regex_t *meta_re = (mr_regex_t *)e->value;
       char *value;
       int status = meta_data_get_string(vl->meta, e->key, &value);
       if (status == (-ENOENT)) /* key is not present */
-        return (nomatch_value);
+        return nomatch_value;
       if (status != 0) /* some other problem */
         continue;      /* error will have already been printed. */
       if (mr_match_regexen(meta_re, value) == FC_MATCH_NO_MATCH) {
         sfree(value);
-        return (nomatch_value);
+        return nomatch_value;
       }
       sfree(value);
     }
   }
 
-  return (match_value);
+  return match_value;
 } /* }}} int mr_match */
 
 void module_register(void) {
@@ -364,5 +364,3 @@ void module_register(void) {
   mproc.match = mr_match;
   fc_register_match("regex", mproc);
 } /* module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab fdm=marker : */
index 6d00ed2..c80694d 100644 (file)
@@ -53,7 +53,7 @@ static int mt_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   m = calloc(1, sizeof(*m));
   if (m == NULL) {
     ERROR("mt_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   m->future = 0;
@@ -91,11 +91,11 @@ static int mt_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     free(m);
-    return (status);
+    return status;
   }
 
   *user_data = m;
-  return (0);
+  return 0;
 } /* }}} int mt_create */
 
 static int mt_destroy(void **user_data) /* {{{ */
@@ -104,7 +104,7 @@ static int mt_destroy(void **user_data) /* {{{ */
     sfree(*user_data);
   }
 
-  return (0);
+  return 0;
 } /* }}} int mt_destroy */
 
 static int mt_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
@@ -115,22 +115,22 @@ static int mt_match(const data_set_t __attribute__((unused)) * ds, /* {{{ */
   cdtime_t now;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (-1);
+    return -1;
 
   m = *user_data;
   now = cdtime();
 
   if (m->future != 0) {
     if (vl->time >= (now + m->future))
-      return (FC_MATCH_MATCHES);
+      return FC_MATCH_MATCHES;
   }
 
   if (m->past != 0) {
     if (vl->time <= (now - m->past))
-      return (FC_MATCH_MATCHES);
+      return FC_MATCH_MATCHES;
   }
 
-  return (FC_MATCH_NO_MATCH);
+  return FC_MATCH_NO_MATCH;
 } /* }}} int mt_match */
 
 void module_register(void) {
@@ -141,5 +141,3 @@ void module_register(void) {
   mproc.match = mt_match;
   fc_register_match("timediff", mproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 3c94375..44cea26 100644 (file)
@@ -74,7 +74,7 @@ static int mv_config_add_satisfy(mv_match_t *m, /* {{{ */
                                  oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     ERROR("`value' match: `%s' needs exactly one string argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp("All", ci->values[0].value.string) == 0)
@@ -85,10 +85,10 @@ static int mv_config_add_satisfy(mv_match_t *m, /* {{{ */
     ERROR("`value' match: Passing `%s' to the `%s' option is invalid. "
           "The argument must either be `All' or `Any'.",
           ci->values[0].value.string, ci->key);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int mv_config_add_satisfy */
 
 static int mv_config_add_data_source(mv_match_t *m, /* {{{ */
@@ -99,7 +99,7 @@ static int mv_config_add_data_source(mv_match_t *m, /* {{{ */
   /* Check number of arbuments. */
   if (ci->values_num < 1) {
     ERROR("`value' match: `%s' needs at least one argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   /* Check type of arguments */
@@ -112,7 +112,7 @@ static int mv_config_add_data_source(mv_match_t *m, /* {{{ */
           ci->key, i + 1,
           (ci->values[i].type == OCONFIG_TYPE_BOOLEAN) ? "truth value"
                                                        : "number");
-    return (-1);
+    return -1;
   }
 
   /* Allocate space for the char pointers */
@@ -120,7 +120,7 @@ static int mv_config_add_data_source(mv_match_t *m, /* {{{ */
   temp = realloc(m->data_sources, new_data_sources_num * sizeof(char *));
   if (temp == NULL) {
     ERROR("`value' match: realloc failed.");
-    return (-1);
+    return -1;
   }
   m->data_sources = temp;
 
@@ -138,7 +138,7 @@ static int mv_config_add_data_source(mv_match_t *m, /* {{{ */
     m->data_sources_num++;
   }
 
-  return (0);
+  return 0;
 } /* }}} int mv_config_add_data_source */
 
 static int mv_config_add_gauge(gauge_t *ret_value, /* {{{ */
@@ -146,12 +146,12 @@ static int mv_config_add_gauge(gauge_t *ret_value, /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) {
     ERROR("`value' match: `%s' needs exactly one numeric argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_value = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* }}} int mv_config_add_gauge */
 
 static int mv_config_add_boolean(int *ret_value, /* {{{ */
@@ -159,7 +159,7 @@ static int mv_config_add_boolean(int *ret_value, /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) {
     ERROR("`value' match: `%s' needs exactly one boolean argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.boolean)
@@ -167,7 +167,7 @@ static int mv_config_add_boolean(int *ret_value, /* {{{ */
   else
     *ret_value = 0;
 
-  return (0);
+  return 0;
 } /* }}} int mv_config_add_boolean */
 
 static int mv_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -178,7 +178,7 @@ static int mv_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   m = calloc(1, sizeof(*m));
   if (m == NULL) {
     ERROR("mv_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   m->min = NAN;
@@ -226,18 +226,18 @@ static int mv_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     mv_free_match(m);
-    return (status);
+    return status;
   }
 
   *user_data = m;
-  return (0);
+  return 0;
 } /* }}} int mv_create */
 
 static int mv_destroy(void **user_data) /* {{{ */
 {
   if ((user_data != NULL) && (*user_data != NULL))
     mv_free_match(*user_data);
-  return (0);
+  return 0;
 } /* }}} int mv_destroy */
 
 static int mv_match(const data_set_t *ds, const value_list_t *vl, /* {{{ */
@@ -248,7 +248,7 @@ static int mv_match(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   int status;
 
   if ((user_data == NULL) || (*user_data == NULL))
-    return (-1);
+    return -1;
 
   m = *user_data;
 
@@ -256,7 +256,7 @@ static int mv_match(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   if (values == NULL) {
     ERROR("`value' match: Retrieving the current rate from the cache "
           "failed.");
-    return (-1);
+    return -1;
   }
 
   status = FC_MATCH_NO_MATCH;
@@ -305,7 +305,7 @@ static int mv_match(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   } /* for (i = 0; i < ds->ds_num; i++) */
 
   free(values);
-  return (status);
+  return status;
 } /* }}} int mv_match */
 
 void module_register(void) {
@@ -316,5 +316,3 @@ void module_register(void) {
   mproc.match = mv_match;
   fc_register_match("value", mproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index aa593a0..b5352bf 100644 (file)
@@ -99,7 +99,7 @@ static int mbmon_query_daemon(char *buffer, int buffer_size) {
     ERROR("mbmon: getaddrinfo (%s, %s): %s", host, port,
           (ai_return == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                     : gai_strerror(ai_return));
-    return (-1);
+    return -1;
   }
 
   fd = -1;
@@ -132,7 +132,7 @@ static int mbmon_query_daemon(char *buffer, int buffer_size) {
 
   if (fd < 0) {
     ERROR("mbmon: Could not connect to daemon.");
-    return (-1);
+    return -1;
   }
 
   /* receive data from the mbmon daemon */
@@ -150,7 +150,7 @@ static int mbmon_query_daemon(char *buffer, int buffer_size) {
       ERROR("mbmon: Error reading from socket: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
       close(fd);
-      return (-1);
+      return -1;
     }
     buffer_fill += status;
 
@@ -166,11 +166,11 @@ static int mbmon_query_daemon(char *buffer, int buffer_size) {
             "Buffer: `%s'",
             buffer);
     close(fd);
-    return (-1);
+    return -1;
   }
 
   close(fd);
-  return (0);
+  return 0;
 }
 
 static int mbmon_config(const char *key, const char *value) {
@@ -183,10 +183,10 @@ static int mbmon_config(const char *key, const char *value) {
       free(mbmon_port);
     mbmon_port = strdup(value);
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void mbmon_submit(const char *type, const char *type_instance,
@@ -214,7 +214,7 @@ static int mbmon_read(void) {
 
   /* get data from daemon */
   if (mbmon_query_daemon(buf, sizeof(buf)) < 0)
-    return (-1);
+    return -1;
 
   s = buf;
   while ((t = strchr(s, ':')) != NULL) {
@@ -254,7 +254,7 @@ static int mbmon_read(void) {
     s = nextc + 1;
   }
 
-  return (0);
+  return 0;
 } /* void mbmon_read */
 
 /* module_register
diff --git a/src/mcelog.c b/src/mcelog.c
new file mode 100644 (file)
index 0000000..fad18d5
--- /dev/null
@@ -0,0 +1,551 @@
+/*-
+ * collectd - src/mcelog.c
+ * MIT License
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Maryam Tahhan <maryam.tahhan@intel.com>
+ *   Volodymyr Mytnyk <volodymyrx.mytnyk@intel.com>
+ *   Taras Chornyi <tarasx.chornyi@intel.com>
+ *   Krzysztof Matczak <krzysztofx.matczak@intel.com>
+ */
+
+#include "common.h"
+#include "collectd.h"
+
+#include <poll.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+#define MCELOG_PLUGIN "mcelog"
+#define MCELOG_BUFF_SIZE 1024
+#define MCELOG_POLL_TIMEOUT 1000 /* ms */
+#define MCELOG_SOCKET_STR "SOCKET"
+#define MCELOG_DIMM_NAME "DMI_NAME"
+#define MCELOG_CORRECTED_ERR "corrected memory errors"
+#define MCELOG_UNCORRECTED_ERR "uncorrected memory errors"
+
+typedef struct mcelog_config_s {
+  char logfile[PATH_MAX]; /* mcelog logfile */
+  pthread_t tid;          /* poll thread id */
+} mcelog_config_t;
+
+typedef struct socket_adapter_s socket_adapter_t;
+
+struct socket_adapter_s {
+  int sock_fd;                  /* mcelog server socket fd */
+  struct sockaddr_un unix_sock; /* mcelog client socket */
+  pthread_rwlock_t lock;
+  /* function pointers for socket operations */
+  int (*write)(socket_adapter_t *self, const char *msg, const size_t len);
+  int (*reinit)(socket_adapter_t *self);
+  int (*receive)(socket_adapter_t *self, FILE **p_file);
+  int (*close)(socket_adapter_t *self);
+};
+
+typedef struct mcelog_memory_rec_s {
+  int corrected_err_total; /* x total*/
+  int corrected_err_timed; /* x in 24h*/
+  char corrected_err_timed_period[DATA_MAX_NAME_LEN];
+  int uncorrected_err_total; /* x total*/
+  int uncorrected_err_timed; /* x in 24h*/
+  char uncorrected_err_timed_period[DATA_MAX_NAME_LEN];
+  char location[DATA_MAX_NAME_LEN];  /* SOCKET x CHANNEL x DIMM x*/
+  char dimm_name[DATA_MAX_NAME_LEN]; /* DMI_NAME "DIMM_F1" */
+} mcelog_memory_rec_t;
+
+static int socket_close(socket_adapter_t *self);
+static int socket_write(socket_adapter_t *self, const char *msg,
+                        const size_t len);
+static int socket_reinit(socket_adapter_t *self);
+static int socket_receive(socket_adapter_t *self, FILE **p_file);
+
+static mcelog_config_t g_mcelog_config = {.logfile = "/var/log/mcelog"};
+
+static socket_adapter_t socket_adapter = {
+    .sock_fd = -1,
+    .unix_sock =
+        {
+            .sun_family = AF_UNIX, .sun_path = "/var/run/mcelog-client",
+        },
+    .lock = PTHREAD_RWLOCK_INITIALIZER,
+    .close = socket_close,
+    .write = socket_write,
+    .reinit = socket_reinit,
+    .receive = socket_receive,
+};
+
+static _Bool mcelog_thread_running;
+
+static int mcelog_config(oconfig_item_t *ci) {
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("McelogClientSocket", child->key) == 0) {
+      if (cf_util_get_string_buffer(child, socket_adapter.unix_sock.sun_path,
+                                    sizeof(socket_adapter.unix_sock.sun_path)) <
+          0) {
+        ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".",
+              child->key);
+        return -1;
+      }
+    } else if (strcasecmp("McelogLogfile", child->key) == 0) {
+      if (cf_util_get_string_buffer(child, g_mcelog_config.logfile,
+                                    sizeof(g_mcelog_config.logfile)) < 0) {
+        ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".",
+              child->key);
+        return -1;
+      }
+    } else {
+      ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".",
+            child->key);
+      return -1;
+    }
+  }
+  return 0;
+}
+
+static int socket_close(socket_adapter_t *self) {
+  int ret = 0;
+  pthread_rwlock_rdlock(&self->lock);
+  if (fcntl(self->sock_fd, F_GETFL) != -1) {
+    char errbuf[MCELOG_BUFF_SIZE];
+    if (shutdown(self->sock_fd, SHUT_RDWR) != 0) {
+      ERROR(MCELOG_PLUGIN ": Socket shutdown failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+      ret = -1;
+    }
+    if (close(self->sock_fd) != 0) {
+      ERROR(MCELOG_PLUGIN ": Socket close failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+      ret = -1;
+    }
+  }
+  pthread_rwlock_unlock(&self->lock);
+  return ret;
+}
+
+static int socket_write(socket_adapter_t *self, const char *msg,
+                        const size_t len) {
+  int ret = 0;
+  pthread_rwlock_rdlock(&self->lock);
+  if (swrite(self->sock_fd, msg, len) < 0)
+    ret = -1;
+  pthread_rwlock_unlock(&self->lock);
+  return ret;
+}
+
+static void mcelog_dispatch_notification(notification_t *n) {
+  if (!n) {
+    ERROR(MCELOG_PLUGIN ": %s: NULL pointer", __FUNCTION__);
+    return;
+  }
+
+  sstrncpy(n->host, hostname_g, sizeof(n->host));
+  sstrncpy(n->type, "gauge", sizeof(n->type));
+  plugin_dispatch_notification(n);
+  if (n->meta)
+    plugin_notification_meta_free(n->meta);
+}
+
+static int socket_reinit(socket_adapter_t *self) {
+  char errbuff[MCELOG_BUFF_SIZE];
+  int ret = -1;
+  cdtime_t interval = plugin_get_interval();
+  struct timeval socket_timeout = CDTIME_T_TO_TIMEVAL(interval);
+
+  /* synchronization via write lock since sock_fd may be changed here */
+  pthread_rwlock_wrlock(&self->lock);
+  self->sock_fd =
+      socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0);
+  if (self->sock_fd < 0) {
+    ERROR(MCELOG_PLUGIN ": Could not create a socket. %s",
+          sstrerror(errno, errbuff, sizeof(errbuff)));
+    pthread_rwlock_unlock(&self->lock);
+    return ret;
+  }
+
+  /* Set socket timeout option */
+  if (setsockopt(self->sock_fd, SOL_SOCKET, SO_SNDTIMEO, &socket_timeout,
+                 sizeof(socket_timeout)) < 0)
+    ERROR(MCELOG_PLUGIN ": Failed to set the socket timeout option.");
+
+  /* downgrading to read lock due to possible recursive read locks
+   * in self->close(self) call */
+  pthread_rwlock_unlock(&self->lock);
+  pthread_rwlock_rdlock(&self->lock);
+  if (connect(self->sock_fd, (struct sockaddr *)&(self->unix_sock),
+              sizeof(self->unix_sock)) < 0) {
+    ERROR(MCELOG_PLUGIN ": Failed to connect to mcelog server. %s",
+          sstrerror(errno, errbuff, sizeof(errbuff)));
+    self->close(self);
+    ret = -1;
+  } else {
+    ret = 0;
+    mcelog_dispatch_notification(
+        &(notification_t){.severity = NOTIF_OKAY,
+                          .time = cdtime(),
+                          .message = "Connected to mcelog server",
+                          .plugin = MCELOG_PLUGIN,
+                          .type_instance = "mcelog_status"});
+  }
+  pthread_rwlock_unlock(&self->lock);
+  return ret;
+}
+
+static int mcelog_prepare_notification(notification_t *n,
+                                       const mcelog_memory_rec_t *mr) {
+  if (n == NULL || mr == NULL)
+    return -1;
+
+  if ((mr->location[0] != '\0') &&
+      (plugin_notification_meta_add_string(n, MCELOG_SOCKET_STR, mr->location) <
+       0)) {
+    ERROR(MCELOG_PLUGIN ": add memory location meta data failed");
+    return -1;
+  }
+  if ((mr->dimm_name[0] != '\0') &&
+      (plugin_notification_meta_add_string(n, MCELOG_DIMM_NAME, mr->dimm_name) <
+       0)) {
+    ERROR(MCELOG_PLUGIN ": add DIMM name meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if (plugin_notification_meta_add_signed_int(n, MCELOG_CORRECTED_ERR,
+                                              mr->corrected_err_total) < 0) {
+    ERROR(MCELOG_PLUGIN ": add corrected errors meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if (plugin_notification_meta_add_signed_int(
+          n, "corrected memory timed errors", mr->corrected_err_timed) < 0) {
+    ERROR(MCELOG_PLUGIN ": add corrected timed errors meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if ((mr->corrected_err_timed_period[0] != '\0') &&
+      (plugin_notification_meta_add_string(n, "corrected errors time period",
+                                           mr->corrected_err_timed_period) <
+       0)) {
+    ERROR(MCELOG_PLUGIN ": add corrected errors period meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if (plugin_notification_meta_add_signed_int(n, MCELOG_UNCORRECTED_ERR,
+                                              mr->uncorrected_err_total) < 0) {
+    ERROR(MCELOG_PLUGIN ": add corrected errors meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if (plugin_notification_meta_add_signed_int(n,
+                                              "uncorrected memory timed errors",
+                                              mr->uncorrected_err_timed) < 0) {
+    ERROR(MCELOG_PLUGIN ": add corrected timed errors meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+  if ((mr->uncorrected_err_timed_period[0] != '\0') &&
+      (plugin_notification_meta_add_string(n, "uncorrected errors time period",
+                                           mr->uncorrected_err_timed_period) <
+       0)) {
+    ERROR(MCELOG_PLUGIN ": add corrected errors period meta data failed");
+    plugin_notification_meta_free(n->meta);
+    return -1;
+  }
+
+  return 0;
+}
+
+static int mcelog_submit(const mcelog_memory_rec_t *mr) {
+
+  if (!mr) {
+    ERROR(MCELOG_PLUGIN ": %s: NULL pointer", __FUNCTION__);
+    return -1;
+  }
+
+  value_list_t vl = {
+      .values_len = 1,
+      .values = &(value_t){.derive = (derive_t)mr->corrected_err_total},
+      .time = cdtime(),
+      .plugin = MCELOG_PLUGIN,
+      .type = "errors",
+      .type_instance = "corrected_memory_errors"};
+
+  if (mr->dimm_name[0] != '\0')
+    ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s_%s",
+              mr->location, mr->dimm_name);
+  else
+    sstrncpy(vl.plugin_instance, mr->location, sizeof(vl.plugin_instance));
+
+  plugin_dispatch_values(&vl);
+
+  ssnprintf(vl.type_instance, sizeof(vl.type_instance),
+            "corrected_memory_errors_in_%s", mr->corrected_err_timed_period);
+  vl.values = &(value_t){.derive = (derive_t)mr->corrected_err_timed};
+  plugin_dispatch_values(&vl);
+
+  sstrncpy(vl.type_instance, "uncorrected_memory_errors",
+           sizeof(vl.type_instance));
+  vl.values = &(value_t){.derive = (derive_t)mr->uncorrected_err_total};
+  plugin_dispatch_values(&vl);
+
+  ssnprintf(vl.type_instance, sizeof(vl.type_instance),
+            "uncorrected_memory_errors_in_%s",
+            mr->uncorrected_err_timed_period);
+  vl.values = &(value_t){.derive = (derive_t)mr->uncorrected_err_timed};
+  plugin_dispatch_values(&vl);
+
+  return 0;
+}
+
+static int parse_memory_info(FILE *p_file, mcelog_memory_rec_t *memory_record) {
+  char buf[DATA_MAX_NAME_LEN] = {0};
+  while (fgets(buf, sizeof(buf), p_file)) {
+    /* Got empty line or "done" */
+    if ((!strncmp("\n", buf, strlen(buf))) ||
+        (!strncmp(buf, "done\n", strlen(buf))))
+      return 1;
+    if (strlen(buf) < 5)
+      continue;
+    if (!strncmp(buf, MCELOG_SOCKET_STR, strlen(MCELOG_SOCKET_STR))) {
+      sstrncpy(memory_record->location, buf, strlen(buf));
+      /* replace spaces with '_' */
+      for (size_t i = 0; i < strlen(memory_record->location); i++)
+        if (memory_record->location[i] == ' ')
+          memory_record->location[i] = '_';
+      DEBUG(MCELOG_PLUGIN ": Got SOCKET INFO %s", memory_record->location);
+    }
+    if (!strncmp(buf, MCELOG_DIMM_NAME, strlen(MCELOG_DIMM_NAME))) {
+      char *name = NULL;
+      char *saveptr = NULL;
+      name = strtok_r(buf, "\"", &saveptr);
+      if (name != NULL && saveptr != NULL) {
+        name = strtok_r(NULL, "\"", &saveptr);
+        if (name != NULL) {
+          sstrncpy(memory_record->dimm_name, name,
+                   sizeof(memory_record->dimm_name));
+          DEBUG(MCELOG_PLUGIN ": Got DIMM NAME %s", memory_record->dimm_name);
+        }
+      }
+    }
+    if (!strncmp(buf, MCELOG_CORRECTED_ERR, strlen(MCELOG_CORRECTED_ERR))) {
+      /* Get next line*/
+      if (fgets(buf, sizeof(buf), p_file) != NULL) {
+        sscanf(buf, "\t%d total", &(memory_record->corrected_err_total));
+        DEBUG(MCELOG_PLUGIN ": Got corrected error total %d",
+              memory_record->corrected_err_total);
+      }
+      if (fgets(buf, sizeof(buf), p_file) != NULL) {
+        sscanf(buf, "\t%d in %s", &(memory_record->corrected_err_timed),
+               memory_record->corrected_err_timed_period);
+        DEBUG(MCELOG_PLUGIN ": Got timed corrected errors %d in %s",
+              memory_record->corrected_err_total,
+              memory_record->corrected_err_timed_period);
+      }
+    }
+    if (!strncmp(buf, MCELOG_UNCORRECTED_ERR, strlen(MCELOG_UNCORRECTED_ERR))) {
+      if (fgets(buf, sizeof(buf), p_file) != NULL) {
+        sscanf(buf, "\t%d total", &(memory_record->uncorrected_err_total));
+        DEBUG(MCELOG_PLUGIN ": Got uncorrected error total %d",
+              memory_record->uncorrected_err_total);
+      }
+      if (fgets(buf, sizeof(buf), p_file) != NULL) {
+        sscanf(buf, "\t%d in %s", &(memory_record->uncorrected_err_timed),
+               memory_record->uncorrected_err_timed_period);
+        DEBUG(MCELOG_PLUGIN ": Got timed uncorrected errors %d in %s",
+              memory_record->uncorrected_err_total,
+              memory_record->uncorrected_err_timed_period);
+      }
+    }
+    memset(buf, 0, sizeof(buf));
+  }
+  /* parsing definitely finished */
+  return 0;
+}
+
+static void poll_worker_cleanup(void *arg) {
+  mcelog_thread_running = 0;
+  FILE *p_file = *((FILE **)arg);
+  if (p_file != NULL)
+    fclose(p_file);
+  free(arg);
+}
+
+static int socket_receive(socket_adapter_t *self, FILE **pp_file) {
+  int res = -1;
+  pthread_rwlock_rdlock(&self->lock);
+  struct pollfd poll_fd = {
+      .fd = self->sock_fd, .events = POLLIN | POLLPRI,
+  };
+
+  if ((res = poll(&poll_fd, 1, MCELOG_POLL_TIMEOUT)) <= 0) {
+    if (res != 0 && errno != EINTR) {
+      char errbuf[MCELOG_BUFF_SIZE];
+      ERROR("mcelog: poll failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+    pthread_rwlock_unlock(&self->lock);
+    return res;
+  }
+
+  if (poll_fd.revents & (POLLERR | POLLHUP | POLLNVAL)) {
+    /* connection is broken */
+    ERROR(MCELOG_PLUGIN ": Connection to socket is broken");
+    if (poll_fd.revents & (POLLERR | POLLHUP)) {
+      mcelog_dispatch_notification(
+          &(notification_t){.severity = NOTIF_FAILURE,
+                            .time = cdtime(),
+                            .message = "Connection to mcelog socket is broken.",
+                            .plugin = MCELOG_PLUGIN,
+                            .type_instance = "mcelog_status"});
+    }
+    pthread_rwlock_unlock(&self->lock);
+    return -1;
+  }
+
+  if (!(poll_fd.revents & (POLLIN | POLLPRI))) {
+    INFO(MCELOG_PLUGIN ": No data to read");
+    pthread_rwlock_unlock(&self->lock);
+    return 0;
+  }
+
+  if ((*pp_file = fdopen(dup(self->sock_fd), "r")) == NULL)
+    res = -1;
+
+  pthread_rwlock_unlock(&self->lock);
+  return res;
+}
+
+static void *poll_worker(__attribute__((unused)) void *arg) {
+  char errbuf[MCELOG_BUFF_SIZE];
+  mcelog_thread_running = 1;
+  FILE **pp_file = calloc(1, sizeof(*pp_file));
+  if (pp_file == NULL) {
+    ERROR("mcelog: memory allocation failed: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    pthread_exit((void *)1);
+  }
+
+  pthread_cleanup_push(poll_worker_cleanup, pp_file);
+
+  while (1) {
+    /* blocking call */
+    int res = socket_adapter.receive(&socket_adapter, pp_file);
+    if (res < 0) {
+      socket_adapter.close(&socket_adapter);
+      while (socket_adapter.reinit(&socket_adapter) != 0) {
+        nanosleep(&CDTIME_T_TO_TIMESPEC(MS_TO_CDTIME_T(MCELOG_POLL_TIMEOUT)),
+                  NULL);
+      }
+      continue;
+    }
+    /* timeout or no data to read */
+    else if (res == 0)
+      continue;
+
+    if (*pp_file == NULL)
+      continue;
+
+    mcelog_memory_rec_t memory_record = {0};
+    while (parse_memory_info(*pp_file, &memory_record)) {
+      /* Check if location was successfully parsed */
+      if (memory_record.location[0] == '\0') {
+        memset(&memory_record, 0, sizeof(memory_record));
+        continue;
+      }
+
+      notification_t n = {.severity = NOTIF_OKAY,
+                          .time = cdtime(),
+                          .message = "Got memory errors info.",
+                          .plugin = MCELOG_PLUGIN,
+                          .type_instance = "memory_erros"};
+
+      if (mcelog_prepare_notification(&n, &memory_record) == 0)
+        mcelog_dispatch_notification(&n);
+      if (mcelog_submit(&memory_record) != 0)
+        ERROR(MCELOG_PLUGIN ": Failed to submit memory errors");
+      memset(&memory_record, 0, sizeof(memory_record));
+    }
+
+    fclose(*pp_file);
+    *pp_file = NULL;
+  }
+
+  mcelog_thread_running = 0;
+  pthread_cleanup_pop(1);
+  return NULL;
+}
+
+static int mcelog_init(void) {
+  if (socket_adapter.reinit(&socket_adapter) != 0) {
+    ERROR(MCELOG_PLUGIN ": Cannot connect to client socket");
+    return -1;
+  }
+
+  if (plugin_thread_create(&g_mcelog_config.tid, NULL, poll_worker, NULL,
+                           NULL) != 0) {
+    ERROR(MCELOG_PLUGIN ": Error creating poll thread.");
+    return -1;
+  }
+  return 0;
+}
+
+static int get_memory_machine_checks(void) {
+  static const char dump[] = "dump all bios\n";
+  int ret = socket_adapter.write(&socket_adapter, dump, sizeof(dump));
+  if (ret != 0)
+    ERROR(MCELOG_PLUGIN ": SENT DUMP REQUEST FAILED");
+  else
+    DEBUG(MCELOG_PLUGIN ": SENT DUMP REQUEST OK");
+  return ret;
+}
+
+static int mcelog_read(__attribute__((unused)) user_data_t *ud) {
+  DEBUG(MCELOG_PLUGIN ": %s", __FUNCTION__);
+
+  if (get_memory_machine_checks() != 0)
+    ERROR(MCELOG_PLUGIN ": MACHINE CHECK INFO NOT AVAILABLE");
+
+  return 0;
+}
+
+static int mcelog_shutdown(void) {
+  int ret = 0;
+  if (mcelog_thread_running) {
+    pthread_cancel(g_mcelog_config.tid);
+    if (pthread_join(g_mcelog_config.tid, NULL) != 0) {
+      ERROR(MCELOG_PLUGIN ": Stopping thread failed.");
+      ret = -1;
+    }
+  }
+
+  ret = socket_adapter.close(&socket_adapter) || ret;
+  pthread_rwlock_destroy(&(socket_adapter.lock));
+  return -ret;
+}
+
+void module_register(void) {
+  plugin_register_complex_config(MCELOG_PLUGIN, mcelog_config);
+  plugin_register_init(MCELOG_PLUGIN, mcelog_init);
+  plugin_register_complex_read(NULL, MCELOG_PLUGIN, mcelog_read, 0, NULL);
+  plugin_register_shutdown(MCELOG_PLUGIN, mcelog_shutdown);
+}
index 5e6b3ac..98cef1d 100644 (file)
--- a/src/md.c
+++ b/src/md.c
@@ -46,17 +46,17 @@ static int md_config(const char *key, const char *value) {
   if (ignorelist == NULL)
     ignorelist = ignorelist_create(/* invert = */ 1);
   if (ignorelist == NULL)
-    return (1);
+    return 1;
 
   if (strcasecmp(key, "Device") == 0) {
     ignorelist_add(ignorelist, value);
   } else if (strcasecmp(key, "IgnoreSelected") == 0) {
     ignorelist_set_invert(ignorelist, IS_TRUE(value) ? 0 : 1);
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void md_submit(const int minor, const char *type_instance,
@@ -149,7 +149,7 @@ static int md_read(void) {
     char errbuf[1024];
     WARNING("md: Unable to open %s: %s", PROC_DISKSTATS,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* Iterate md devices */
@@ -187,7 +187,7 @@ static int md_read(void) {
 
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* int md_read */
 
 void module_register(void) {
index bebbe40..c2147fd 100644 (file)
@@ -111,29 +111,29 @@ static int cmc_page_init_memc(web_page_t *wp) /* {{{ */
   wp->memc = memcached_create(NULL);
   if (wp->memc == NULL) {
     ERROR("memcachec plugin: memcached_create failed.");
-    return (-1);
+    return -1;
   }
 
   server = memcached_servers_parse(wp->server);
   memcached_server_push(wp->memc, server);
   memcached_server_list_free(server);
 
-  return (0);
+  return 0;
 } /* }}} int cmc_page_init_memc */
 
 static int cmc_config_add_string(const char *name, char **dest, /* {{{ */
                                  oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("memcachec plugin: `%s' needs exactly one string argument.", name);
-    return (-1);
+    return -1;
   }
 
   sfree(*dest);
   *dest = strdup(ci->values[0].value.string);
   if (*dest == NULL)
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* }}} int cmc_config_add_string */
 
 static int cmc_config_add_match_dstype(int *dstype_ret, /* {{{ */
@@ -142,7 +142,7 @@ static int cmc_config_add_match_dstype(int *dstype_ret, /* {{{ */
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("memcachec plugin: `DSType' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   if (strncasecmp("Gauge", ci->values[0].value.string, strlen("Gauge")) == 0) {
@@ -175,11 +175,11 @@ static int cmc_config_add_match_dstype(int *dstype_ret, /* {{{ */
   if (dstype == 0) {
     WARNING("memcachec plugin: `%s' is not a valid argument to `DSType'.",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   *dstype_ret = dstype;
-  return (0);
+  return 0;
 } /* }}} int cmc_config_add_match_dstype */
 
 static int cmc_config_add_match(web_page_t *page, /* {{{ */
@@ -194,7 +194,7 @@ static int cmc_config_add_match(web_page_t *page, /* {{{ */
   match = calloc(1, sizeof(*match));
   if (match == NULL) {
     ERROR("memcachec plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -242,7 +242,7 @@ static int cmc_config_add_match(web_page_t *page, /* {{{ */
 
   if (status != 0) {
     cmc_web_match_free(match);
-    return (status);
+    return status;
   }
 
   match->match =
@@ -250,7 +250,7 @@ static int cmc_config_add_match(web_page_t *page, /* {{{ */
   if (match->match == NULL) {
     ERROR("memcachec plugin: match_create_simple failed.");
     cmc_web_match_free(match);
-    return (-1);
+    return -1;
   } else {
     web_match_t *prev;
 
@@ -264,7 +264,7 @@ static int cmc_config_add_match(web_page_t *page, /* {{{ */
       prev->next = match;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cmc_config_add_match */
 
 static int cmc_config_add_page(oconfig_item_t *ci) /* {{{ */
@@ -275,13 +275,13 @@ static int cmc_config_add_page(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING(
         "memcachec plugin: `Page' blocks need exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   page = calloc(1, sizeof(*page));
   if (page == NULL) {
     ERROR("memcachec plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   page->server = NULL;
   page->key = NULL;
@@ -290,7 +290,7 @@ static int cmc_config_add_page(oconfig_item_t *ci) /* {{{ */
   if (page->instance == NULL) {
     ERROR("memcachec plugin: strdup failed.");
     sfree(page);
-    return (-1);
+    return -1;
   }
 
   /* Process all children */
@@ -342,7 +342,7 @@ static int cmc_config_add_page(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     cmc_web_page_free(page);
-    return (status);
+    return status;
   }
 
   /* Add the new page to the linked list */
@@ -357,7 +357,7 @@ static int cmc_config_add_page(oconfig_item_t *ci) /* {{{ */
     prev->next = page;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cmc_config_add_page */
 
 static int cmc_config(oconfig_item_t *ci) /* {{{ */
@@ -386,19 +386,19 @@ static int cmc_config(oconfig_item_t *ci) /* {{{ */
 
   if ((success == 0) && (errors > 0)) {
     ERROR("memcachec plugin: All statements failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cmc_config */
 
 static int cmc_init(void) /* {{{ */
 {
   if (pages_g == NULL) {
     INFO("memcachec plugin: No pages have been defined.");
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* }}} int cmc_init */
 
 static void cmc_submit(const web_page_t *wp, const web_match_t *wm, /* {{{ */
@@ -423,14 +423,14 @@ static int cmc_read_page(web_page_t *wp) /* {{{ */
   int status;
 
   if (wp->memc == NULL)
-    return (-1);
+    return -1;
 
   wp->buffer = memcached_get(wp->memc, wp->key, strlen(wp->key), &string_length,
                              &flags, &rc);
   if (rc != MEMCACHED_SUCCESS) {
     ERROR("memcachec plugin: memcached_get failed: %s",
           memcached_strerror(wp->memc, rc));
-    return (-1);
+    return -1;
   }
 
   for (web_match_t *wm = wp->matches; wm != NULL; wm = wm->next) {
@@ -454,7 +454,7 @@ static int cmc_read_page(web_page_t *wp) /* {{{ */
 
   sfree(wp->buffer);
 
-  return (0);
+  return 0;
 } /* }}} int cmc_read_page */
 
 static int cmc_read(void) /* {{{ */
@@ -462,7 +462,7 @@ static int cmc_read(void) /* {{{ */
   for (web_page_t *wp = pages_g; wp != NULL; wp = wp->next)
     cmc_read_page(wp);
 
-  return (0);
+  return 0;
 } /* }}} int cmc_read */
 
 static int cmc_shutdown(void) /* {{{ */
@@ -470,7 +470,7 @@ static int cmc_shutdown(void) /* {{{ */
   cmc_web_page_free(pages_g);
   pages_g = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int cmc_shutdown */
 
 void module_register(void) {
@@ -479,5 +479,3 @@ void module_register(void) {
   plugin_register_read("memcachec", cmc_read);
   plugin_register_shutdown("memcachec", cmc_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 79c38a7..5fc17df 100644 (file)
@@ -78,7 +78,7 @@ static int memcached_connect_unix(memcached_t *st) {
     char errbuf[1024];
     ERROR("memcached plugin: memcached_connect_unix: socket(2) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* connect to the memcached daemon */
@@ -89,7 +89,7 @@ static int memcached_connect_unix(memcached_t *st) {
     fd = -1;
   }
 
-  return (fd);
+  return fd;
 } /* int memcached_connect_unix */
 
 static int memcached_connect_inet(memcached_t *st) {
@@ -109,7 +109,7 @@ static int memcached_connect_inet(memcached_t *st) {
           st->connhost, st->connport,
           (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                  : gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -138,14 +138,14 @@ static int memcached_connect_inet(memcached_t *st) {
   }
 
   freeaddrinfo(ai_list);
-  return (fd);
+  return fd;
 } /* int memcached_connect_inet */
 
 static int memcached_connect(memcached_t *st) {
   if (st->socket != NULL)
-    return (memcached_connect_unix(st));
+    return memcached_connect_unix(st);
   else
-    return (memcached_connect_inet(st));
+    return memcached_connect_inet(st);
 }
 
 static int memcached_query_daemon(char *buffer, size_t buffer_size,
@@ -167,7 +167,7 @@ static int memcached_query_daemon(char *buffer, size_t buffer_size,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     shutdown(fd, SHUT_RDWR);
     close(fd);
-    return (-1);
+    return -1;
   }
 
   /* receive data from the memcached daemon */
@@ -188,7 +188,7 @@ static int memcached_query_daemon(char *buffer, size_t buffer_size,
             sstrerror(errno, errbuf, sizeof(errbuf)));
       shutdown(fd, SHUT_RDWR);
       close(fd);
-      return (-1);
+      return -1;
     }
 
     buffer_fill += (size_t)status;
@@ -212,7 +212,7 @@ static int memcached_query_daemon(char *buffer, size_t buffer_size,
 
   shutdown(fd, SHUT_RDWR);
   close(fd);
-  return (status);
+  return status;
 } /* int memcached_query_daemon */
 
 static void memcached_init_vl(value_list_t *vl, memcached_t const *st) {
@@ -412,8 +412,10 @@ static int memcached_read(user_data_t *user_data) {
     }
 
     /*
-     * Operations on the cache, i. e. cache hits, cache misses and evictions of
-     * items
+     * Operations on the cache:
+     * - get hits/misses
+     * - delete hits/misses
+     * - evictions
      */
     else if (FIELD_IS("get_hits")) {
       submit_derive("memcached_ops", "hits", atoll(fields[2]), st);
@@ -422,6 +424,10 @@ static int memcached_read(user_data_t *user_data) {
       submit_derive("memcached_ops", "misses", atoll(fields[2]), st);
     } else if (FIELD_IS("evictions")) {
       submit_derive("memcached_ops", "evictions", atoll(fields[2]), st);
+    } else if (FIELD_IS("delete_hits")) {
+      submit_derive("memcached_ops", "delete_hits", atoll(fields[2]), st);
+    } else if (FIELD_IS("delete_misses")) {
+      submit_derive("memcached_ops", "delete_misses", atoll(fields[2]), st);
     }
 
     /*
@@ -489,7 +495,7 @@ static int memcached_add_read_callback(memcached_t *st) {
     if (st->host) {
       st->connhost = strdup(st->host);
       if (st->connhost == NULL)
-        return (ENOMEM);
+        return ENOMEM;
 
       if ((strcmp("127.0.0.1", st->host) == 0) ||
           (strcmp("localhost", st->host) == 0))
@@ -497,14 +503,14 @@ static int memcached_add_read_callback(memcached_t *st) {
     } else {
       st->connhost = strdup(MEMCACHED_DEF_HOST);
       if (st->connhost == NULL)
-        return (ENOMEM);
+        return ENOMEM;
     }
   }
 
   if (st->connport == NULL) {
     st->connport = strdup(MEMCACHED_DEF_PORT);
     if (st->connport == NULL)
-      return (ENOMEM);
+      return ENOMEM;
   }
 
   assert(st->connhost != NULL);
@@ -518,7 +524,7 @@ static int memcached_add_read_callback(memcached_t *st) {
                                .data = st, .free_func = memcached_free,
                            });
 
-  return (status);
+  return status;
 } /* int memcached_add_read_callback */
 
 /* Configuration handling functiions
@@ -540,7 +546,7 @@ static int config_add_instance(oconfig_item_t *ci) {
   st = calloc(1, sizeof(*st));
   if (st == NULL) {
     ERROR("memcached plugin: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   st->name = NULL;
@@ -554,7 +560,7 @@ static int config_add_instance(oconfig_item_t *ci) {
 
   if (status != 0) {
     sfree(st);
-    return (status);
+    return status;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -582,10 +588,10 @@ static int config_add_instance(oconfig_item_t *ci) {
 
   if (status != 0) {
     memcached_free(st);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static int memcached_config(oconfig_item_t *ci) {
@@ -601,7 +607,7 @@ static int memcached_config(oconfig_item_t *ci) {
     } else if (!have_instance_block) {
       /* Non-instance option: Assume legacy configuration (without <Instance />
        * blocks) and call config_add_instance() with the <Plugin /> block. */
-      return (config_add_instance(ci));
+      return config_add_instance(ci);
     } else
       WARNING("memcached plugin: The configuration option "
               "\"%s\" is not allowed here. Did you "
@@ -610,7 +616,7 @@ static int memcached_config(oconfig_item_t *ci) {
               child->key);
   } /* for (ci->children) */
 
-  return (status);
+  return status;
 }
 
 static int memcached_init(void) {
@@ -618,12 +624,12 @@ static int memcached_init(void) {
   int status;
 
   if (memcached_have_instances)
-    return (0);
+    return 0;
 
   /* No instances were configured, lets start a default instance. */
   st = calloc(1, sizeof(*st));
   if (st == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   st->name = NULL;
   st->host = NULL;
   st->socket = NULL;
@@ -636,7 +642,7 @@ static int memcached_init(void) {
   else
     memcached_free(st);
 
-  return (status);
+  return status;
 } /* int memcached_init */
 
 void module_register(void) {
index 14b3559..e49fe84 100644 (file)
@@ -111,7 +111,7 @@ static int memory_config(oconfig_item_t *ci) /* {{{ */
             child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int memory_config */
 
 static int memory_init(void) {
@@ -133,11 +133,11 @@ static int memory_init(void) {
   pagesize = getpagesize();
   if (get_kstat(&ksp, "unix", 0, "system_pages") != 0) {
     ksp = NULL;
-    return (-1);
+    return -1;
   }
   if (get_kstat(&ksz, "zfs", 0, "arcstats") != 0) {
     ksz = NULL;
-    return (-1);
+    return -1;
   }
 
 /* #endif HAVE_LIBKSTAT */
@@ -146,7 +146,7 @@ static int memory_init(void) {
   pagesize = getpagesize();
   if (pagesize <= 0) {
     ERROR("memory plugin: Invalid pagesize: %i", pagesize);
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_SYSCTL */
 
@@ -157,7 +157,7 @@ static int memory_init(void) {
 #elif HAVE_PERFSTAT
   pagesize = getpagesize();
 #endif /* HAVE_PERFSTAT */
-  return (0);
+  return 0;
 } /* int memory_init */
 
 #define MEMORY_SUBMIT(...)                                                     \
@@ -180,14 +180,14 @@ static int memory_read_internal(value_list_t *vl) {
   gauge_t free;
 
   if (!port_host || !pagesize)
-    return (-1);
+    return -1;
 
   vm_data_len = sizeof(vm_data) / sizeof(natural_t);
   if ((status = host_statistics(port_host, HOST_VM_INFO, (host_info_t)&vm_data,
                                 &vm_data_len)) != KERN_SUCCESS) {
     ERROR("memory-plugin: host_statistics failed and returned the value %i",
           (int)status);
-    return (-1);
+    return -1;
   }
 
   /*
@@ -282,7 +282,7 @@ static int memory_read_internal(value_list_t *vl) {
   if ((fh = fopen("/proc/meminfo", "r")) == NULL) {
     char errbuf[1024];
     WARNING("memory: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -320,7 +320,7 @@ static int memory_read_internal(value_list_t *vl) {
   }
 
   if (mem_total < (mem_free + mem_buffered + mem_cached + mem_slab_total))
-    return (-1);
+    return -1;
 
   mem_used =
       mem_total - (mem_free + mem_buffered + mem_cached + mem_slab_total);
@@ -353,9 +353,9 @@ static int memory_read_internal(value_list_t *vl) {
   long long availrmem;
 
   if (ksp == NULL)
-    return (-1);
+    return -1;
   if (ksz == NULL)
-    return (-1);
+    return -1;
 
   mem_used = get_kstat_value(ksp, "pagestotal");
   mem_free = get_kstat_value(ksp, "pagesfree");
@@ -370,7 +370,7 @@ static int memory_read_internal(value_list_t *vl) {
 
   if ((mem_used < 0LL) || (mem_free < 0LL) || (mem_lock < 0LL)) {
     WARNING("memory plugin: one of used, free or locked is negative.");
-    return (-1);
+    return -1;
   }
 
   mem_unus = physmem - mem_used;
@@ -424,7 +424,7 @@ static int memory_read_internal(value_list_t *vl) {
     char errbuf[1024];
     WARNING("memory plugin: sysctl failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   assert(pagesize > 0);
@@ -441,7 +441,7 @@ static int memory_read_internal(value_list_t *vl) {
 
   ios = sg_get_mem_stats();
   if (ios == NULL)
-    return (-1);
+    return -1;
 
   MEMORY_SUBMIT("used", (gauge_t)ios->used, "cached", (gauge_t)ios->cache,
                 "free", (gauge_t)ios->free);
@@ -454,7 +454,7 @@ static int memory_read_internal(value_list_t *vl) {
     char errbuf[1024];
     WARNING("memory plugin: perfstat_memory_total failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* Unfortunately, the AIX documentation is not very clear on how these
@@ -473,7 +473,7 @@ static int memory_read_internal(value_list_t *vl) {
                 (gauge_t)(pmemory.real_process * pagesize));
 #endif /* HAVE_PERFSTAT */
 
-  return (0);
+  return 0;
 } /* }}} int memory_read_internal */
 
 static int memory_read(void) /* {{{ */
@@ -487,7 +487,7 @@ static int memory_read(void) /* {{{ */
   sstrncpy(vl.type, "memory", sizeof(vl.type));
   vl.time = cdtime();
 
-  return (memory_read_internal(&vl));
+  return memory_read_internal(&vl);
 } /* }}} int memory_read */
 
 void module_register(void) {
index ab5ffd1..90a6178 100644 (file)
--- a/src/mic.c
+++ b/src/mic.c
@@ -63,7 +63,7 @@ static int mic_init(void) {
   U32 mic_count;
 
   if (mic_handle)
-    return (0);
+    return 0;
 
   mic_count = (U32)STATIC_ARRAY_SIZE(mics);
   ret = MicInitAPI(&mic_handle, eTARGET_SCIF_DRIVER, mics, &mic_count);
@@ -75,10 +75,10 @@ static int mic_init(void) {
 
   if (mic_count < 0 || mic_count >= MAX_MICS) {
     ERROR("mic plugin: No Intel MICs in system");
-    return (1);
+    return 1;
   } else {
     num_mics = mic_count;
-    return (0);
+    return 0;
   }
 }
 
@@ -88,7 +88,7 @@ static int mic_config(const char *key, const char *value) {
   if (power_ignore == NULL)
     power_ignore = ignorelist_create(1);
   if (temp_ignore == NULL || power_ignore == NULL)
-    return (1);
+    return 1;
 
   if (strcasecmp("ShowCPU", key) == 0) {
     show_cpu = IS_TRUE(value);
@@ -115,9 +115,9 @@ static int mic_config(const char *key, const char *value) {
       invert = 0;
     ignorelist_set_invert(power_ignore, invert);
   } else {
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 }
 
 static void mic_submit_memory_use(int micnumber, const char *type_instance,
@@ -148,13 +148,13 @@ static int mic_read_memory(int mic) {
   if (ret != MIC_ACCESS_API_SUCCESS) {
     ERROR("mic plugin: Problem getting Memory Utilization: %s",
           MicGetErrorString(ret));
-    return (1);
+    return 1;
   }
   mic_submit_memory_use(mic, "free", mem_free);
   mic_submit_memory_use(mic, "used", mem_total - mem_free - mem_bufs);
   mic_submit_memory_use(mic, "buffered", mem_bufs);
   DEBUG("mic plugin: Memory Read: %u %u %u", mem_total, mem_free, mem_bufs);
-  return (0);
+  return 0;
 }
 
 static void mic_submit_temp(int micnumber, const char *type, gauge_t value) {
@@ -191,11 +191,11 @@ static int mic_read_temps(int mic) {
       ERROR("mic plugin: Error reading temperature \"%s\": "
             "%s",
             name, MicGetErrorString(status));
-      return (1);
+      return 1;
     }
     mic_submit_temp(mic, name, temp_buffer);
   }
-  return (0);
+  return 0;
 }
 
 static void mic_submit_cpu(int micnumber, const char *type_instance, int core,
@@ -231,7 +231,7 @@ static int mic_read_cpu(int mic) {
   if (status != MIC_ACCESS_API_SUCCESS) {
     ERROR("mic plugin: Problem getting CPU utilization: %s",
           MicGetErrorString(status));
-    return (-1);
+    return -1;
   }
 
   if (show_cpu) {
@@ -249,7 +249,7 @@ static int mic_read_cpu(int mic) {
       mic_submit_cpu(mic, "idle", j, core_jiffs[j].idle);
     }
   }
-  return (0);
+  return 0;
 }
 
 static void mic_submit_power(int micnumber, const char *type,
@@ -277,7 +277,7 @@ static int mic_read_power(int mic) {
   if (ret != MIC_ACCESS_API_SUCCESS) {
     ERROR("mic plugin: Problem getting Power Usage: %s",
           MicGetErrorString(ret));
-    return (1);
+    return 1;
   }
 
 /* power is in uWatts, current in mA, voltage in uVolts..   convert to
@@ -311,7 +311,7 @@ static int mic_read_power(int mic) {
   SUB_VOLTS(vddg);
   SUB_VOLTS(vddq);
 
-  return (0);
+  return 0;
 }
 
 static int mic_read(void) {
@@ -357,7 +357,7 @@ static int mic_shutdown(void) {
     MicCloseAPI(&mic_handle);
   mic_handle = NULL;
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -366,7 +366,3 @@ void module_register(void) {
   plugin_register_read("mic", mic_read);
   plugin_register_config("mic", mic_config, config_keys, config_keys_num);
 } /* void module_register */
-
-/*
- * vim: set shiftwidth=8 softtabstop=8 noet textwidth=78 :
- */
index 5d29791..f45fe21 100644 (file)
@@ -156,13 +156,13 @@ static mb_data_t *data_definitions = NULL;
 static mb_data_t *data_get_by_name(mb_data_t *src, /* {{{ */
                                    const char *name) {
   if (name == NULL)
-    return (NULL);
+    return NULL;
 
   for (mb_data_t *ptr = src; ptr != NULL; ptr = ptr->next)
     if (strcasecmp(ptr->name, name) == 0)
-      return (ptr);
+      return ptr;
 
-  return (NULL);
+  return NULL;
 } /* }}} mb_data_t *data_get_by_name */
 
 static int data_append(mb_data_t **dst, mb_data_t *src) /* {{{ */
@@ -170,13 +170,13 @@ static int data_append(mb_data_t **dst, mb_data_t *src) /* {{{ */
   mb_data_t *ptr;
 
   if ((dst == NULL) || (src == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   ptr = *dst;
 
   if (ptr == NULL) {
     *dst = src;
-    return (0);
+    return 0;
   }
 
   while (ptr->next != NULL)
@@ -184,7 +184,7 @@ static int data_append(mb_data_t **dst, mb_data_t *src) /* {{{ */
 
   ptr->next = src;
 
-  return (0);
+  return 0;
 } /* }}} int data_append */
 
 /* Copy a single mb_data_t and append it to another list. */
@@ -194,11 +194,11 @@ static int data_copy(mb_data_t **dst, const mb_data_t *src) /* {{{ */
   int status;
 
   if ((dst == NULL) || (src == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   tmp = malloc(sizeof(*tmp));
   if (tmp == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   memcpy(tmp, src, sizeof(*tmp));
   tmp->name = NULL;
   tmp->next = NULL;
@@ -206,17 +206,17 @@ static int data_copy(mb_data_t **dst, const mb_data_t *src) /* {{{ */
   tmp->name = strdup(src->name);
   if (tmp->name == NULL) {
     sfree(tmp);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   status = data_append(dst, tmp);
   if (status != 0) {
     sfree(tmp->name);
     sfree(tmp);
-    return (status);
+    return status;
   }
 
-  return (0);
+  return 0;
 } /* }}} int data_copy */
 
 /* Lookup a single mb_data_t instance, copy it and append the copy to another
@@ -226,13 +226,13 @@ static int data_copy_by_name(mb_data_t **dst, mb_data_t *src, /* {{{ */
   mb_data_t *ptr;
 
   if ((dst == NULL) || (src == NULL) || (name == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   ptr = data_get_by_name(src, name);
   if (ptr == NULL)
-    return (ENOENT);
+    return ENOENT;
 
-  return (data_copy(dst, ptr));
+  return data_copy(dst, ptr);
 } /* }}} int data_copy_by_name */
 
 /* Read functions */
@@ -242,7 +242,7 @@ static int mb_submit(mb_host_t *host, mb_slave_t *slave, /* {{{ */
   value_list_t vl = VALUE_LIST_INIT;
 
   if ((host == NULL) || (slave == NULL) || (data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->interval == 0)
     host->interval = plugin_get_interval();
@@ -259,7 +259,7 @@ static int mb_submit(mb_host_t *host, mb_slave_t *slave, /* {{{ */
   sstrncpy(vl.type, data->type, sizeof(vl.type));
   sstrncpy(vl.type_instance, data->instance, sizeof(vl.type_instance));
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 } /* }}} int mb_submit */
 
 static float mb_register_to_float(uint16_t hi, uint16_t lo) /* {{{ */
@@ -283,7 +283,7 @@ static float mb_register_to_float(uint16_t hi, uint16_t lo) /* {{{ */
   conv.b[0] = (hi >> 8) & 0x00ff;
 #endif
 
-  return (conv.f);
+  return conv.f;
 } /* }}} float mb_register_to_float */
 
 #if LEGACY_LIBMODBUS
@@ -293,7 +293,7 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
   int status;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
 #if COLLECT_DEBUG
   modbus_set_debug(&host->connection, 1);
@@ -325,11 +325,11 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
   if (status != 0) {
     ERROR("Modbus plugin: modbus_connect (%s, %i) failed with status %i.",
           host->node, host->port ? host->port : host->baudrate, status);
-    return (status);
+    return status;
   }
 
   host->is_connected = 1;
-  return (0);
+  return 0;
 } /* }}} int mb_init_connection */
 /* #endif LEGACY_LIBMODBUS */
 
@@ -340,10 +340,10 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
   int status;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (host->connection != NULL)
-    return (0);
+    return 0;
 
   if (host->conntype == MBCONN_TCP) {
     if ((host->port < 1) || (host->port > 65535))
@@ -355,7 +355,7 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
     host->connection = modbus_new_tcp(host->node, host->port);
     if (host->connection == NULL) {
       ERROR("Modbus plugin: Creating new Modbus/TCP object failed.");
-      return (-1);
+      return -1;
     }
   } else {
     DEBUG("Modbus plugin: Trying to connect to \"%s\", baudrate %i.",
@@ -364,7 +364,7 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
     host->connection = modbus_new_rtu(host->node, host->baudrate, 'N', 8, 1);
     if (host->connection == NULL) {
       ERROR("Modbus plugin: Creating new Modbus/RTU object failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -381,10 +381,10 @@ static int mb_init_connection(mb_host_t *host) /* {{{ */
           host->node, host->port ? host->port : host->baudrate, status);
     modbus_free(host->connection);
     host->connection = NULL;
-    return (status);
+    return status;
   }
 
-  return (0);
+  return 0;
 } /* }}} int mb_init_connection */
 #endif /* !LEGACY_LIBMODBUS */
 
@@ -408,19 +408,19 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
   int status = 0;
 
   if ((host == NULL) || (slave == NULL) || (data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   ds = plugin_get_ds(data->type);
   if (ds == NULL) {
     ERROR("Modbus plugin: Type \"%s\" is not defined.", data->type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num != 1) {
     ERROR("Modbus plugin: The type \"%s\" has %zu data sources. "
           "I can only handle data sets with only one data source.",
           data->type, ds->ds_num);
-    return (-1);
+    return -1;
   }
 
   if ((ds->ds[0].type != DS_TYPE_GAUGE) &&
@@ -458,7 +458,7 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
             host->node);
       host->is_connected = 0;
       host->connection = NULL;
-      return (-1);
+      return -1;
     }
   } else if (status != 0) {
 #if LEGACY_LIBMODBUS
@@ -480,7 +480,7 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
   if (status != 0) {
     ERROR("Modbus plugin: modbus_set_slave (%i) failed with status %i.",
           slave->id, status);
-    return (-1);
+    return -1;
   }
 #endif
   if (data->modbus_register_type == MREG_INPUT) {
@@ -505,7 +505,7 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
     modbus_free(host->connection);
 #endif
     host->connection = NULL;
-    return (-1);
+    return -1;
   }
 
   DEBUG("Modbus plugin: mb_read_data: Success! "
@@ -575,7 +575,7 @@ static int mb_read_data(mb_host_t *host, mb_slave_t *slave, /* {{{ */
     mb_submit(host, slave, data, vt);
   }
 
-  return (0);
+  return 0;
 } /* }}} int mb_read_data */
 
 static int mb_read_slave(mb_host_t *host, mb_slave_t *slave) /* {{{ */
@@ -584,7 +584,7 @@ static int mb_read_slave(mb_host_t *host, mb_slave_t *slave) /* {{{ */
   int status;
 
   if ((host == NULL) || (slave == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   success = 0;
   for (mb_data_t *data = slave->collect; data != NULL; data = data->next) {
@@ -594,9 +594,9 @@ static int mb_read_slave(mb_host_t *host, mb_slave_t *slave) /* {{{ */
   }
 
   if (success == 0)
-    return (-1);
+    return -1;
   else
-    return (0);
+    return 0;
 } /* }}} int mb_read_slave */
 
 static int mb_read(user_data_t *user_data) /* {{{ */
@@ -606,7 +606,7 @@ static int mb_read(user_data_t *user_data) /* {{{ */
   int status;
 
   if ((user_data == NULL) || (user_data->data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   host = user_data->data;
 
@@ -618,9 +618,9 @@ static int mb_read(user_data_t *user_data) /* {{{ */
   }
 
   if (success == 0)
-    return (-1);
+    return -1;
   else
-    return (0);
+    return 0;
 } /* }}} int mb_read */
 
 /* Free functions */
@@ -681,7 +681,7 @@ static int mb_config_add_data(oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_string(ci, &data.name);
   if (status != 0)
-    return (status);
+    return status;
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
@@ -752,7 +752,7 @@ static int mb_config_add_data(oconfig_item_t *ci) /* {{{ */
 
   sfree(data.name);
 
-  return (status);
+  return status;
 } /* }}} int mb_config_add_data */
 
 static int mb_config_set_host_address(mb_host_t *host, /* {{{ */
@@ -761,7 +761,7 @@ static int mb_config_set_host_address(mb_host_t *host, /* {{{ */
   int status;
 
   if ((host == NULL) || (address == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   struct addrinfo ai_hints = {
       /* XXX: libmodbus can only handle IPv4 addresses. */
@@ -774,7 +774,7 @@ static int mb_config_set_host_address(mb_host_t *host, /* {{{ */
     ERROR("Modbus plugin: getaddrinfo failed: %s",
           (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                  : gai_strerror(status));
-    return (status);
+    return status;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -797,7 +797,7 @@ static int mb_config_set_host_address(mb_host_t *host, /* {{{ */
           host->node);
   }
 
-  return (status);
+  return status;
 } /* }}} int mb_config_set_host_address */
 
 static int mb_config_add_slave(mb_host_t *host, oconfig_item_t *ci) /* {{{ */
@@ -806,11 +806,11 @@ static int mb_config_add_slave(mb_host_t *host, oconfig_item_t *ci) /* {{{ */
   int status;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   slave = realloc(host->slaves, sizeof(*slave) * (host->slaves_num + 1));
   if (slave == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   host->slaves = slave;
   slave = host->slaves + host->slaves_num;
   memset(slave, 0, sizeof(*slave));
@@ -818,7 +818,7 @@ static int mb_config_add_slave(mb_host_t *host, oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_int(ci, &slave->id);
   if (status != 0)
-    return (status);
+    return status;
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
@@ -852,7 +852,7 @@ static int mb_config_add_slave(mb_host_t *host, oconfig_item_t *ci) /* {{{ */
   else /* if (status != 0) */
     data_free_all(slave->collect);
 
-  return (status);
+  return status;
 } /* }}} int mb_config_add_slave */
 
 static int mb_config_add_host(oconfig_item_t *ci) /* {{{ */
@@ -862,17 +862,17 @@ static int mb_config_add_host(oconfig_item_t *ci) /* {{{ */
 
   host = calloc(1, sizeof(*host));
   if (host == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   host->slaves = NULL;
 
   status = cf_util_get_string_buffer(ci, host->host, sizeof(host->host));
   if (status != 0) {
     sfree(host);
-    return (status);
+    return status;
   }
   if (host->host[0] == 0) {
     sfree(host);
-    return (EINVAL);
+    return EINVAL;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -946,13 +946,13 @@ static int mb_config_add_host(oconfig_item_t *ci) /* {{{ */
     host_free(host);
   }
 
-  return (status);
+  return status;
 } /* }}} int mb_config_add_host */
 
 static int mb_config(oconfig_item_t *ci) /* {{{ */
 {
   if (ci == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
@@ -965,7 +965,7 @@ static int mb_config(oconfig_item_t *ci) /* {{{ */
       ERROR("Modbus plugin: Unknown configuration option: %s", child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int mb_config */
 
 /* ========= */
@@ -975,12 +975,10 @@ static int mb_shutdown(void) /* {{{ */
   data_free_all(data_definitions);
   data_definitions = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int mb_shutdown */
 
 void module_register(void) {
   plugin_register_complex_config("modbus", mb_config);
   plugin_register_shutdown("modbus", mb_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 315974b..36e6577 100644 (file)
@@ -160,17 +160,17 @@ static char *strip_prefix(char *topic) {
       num++;
 
   if (num < 2)
-    return (NULL);
+    return NULL;
 
   while (num > 2) {
     char *tmp = strchr(topic, '/');
     if (tmp == NULL)
-      return (NULL);
+      return NULL;
     topic = tmp + 1;
     num--;
   }
 
-  return (topic);
+  return topic;
 }
 
 static void on_message(
@@ -243,7 +243,7 @@ static int mqtt_reconnect(mqtt_client_conf_t *conf) {
   int status;
 
   if (conf->connected)
-    return (0);
+    return 0;
 
   status = mosquitto_reconnect(conf->mosq);
   if (status != MOSQ_ERR_SUCCESS) {
@@ -251,7 +251,7 @@ static int mqtt_reconnect(mqtt_client_conf_t *conf) {
     ERROR("mqtt_connect_broker: mosquitto_connect failed: %s",
           (status == MOSQ_ERR_ERRNO) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                      : mosquitto_strerror(status));
-    return (-1);
+    return -1;
   }
 
   conf->connected = 1;
@@ -260,7 +260,7 @@ static int mqtt_reconnect(mqtt_client_conf_t *conf) {
             "mqtt plugin: successfully reconnected to broker \"%s:%d\"",
             conf->host, conf->port);
 
-  return (0);
+  return 0;
 } /* mqtt_reconnect */
 
 /* must hold conf->lock when calling. */
@@ -284,7 +284,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
 #endif
   if (conf->mosq == NULL) {
     ERROR("mqtt plugin: mosquitto_new failed");
-    return (-1);
+    return -1;
   }
 
 #if LIBMOSQUITTO_MAJOR != 0
@@ -297,7 +297,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
             mosquitto_strerror(status));
       mosquitto_destroy(conf->mosq);
       conf->mosq = NULL;
-      return (-1);
+      return -1;
     }
 
     status = mosquitto_tls_opts_set(conf->mosq, SSL_VERIFY_PEER,
@@ -307,7 +307,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
             mosquitto_strerror(status));
       mosquitto_destroy(conf->mosq);
       conf->mosq = NULL;
-      return (-1);
+      return -1;
     }
 
     status = mosquitto_tls_insecure_set(conf->mosq, false);
@@ -316,7 +316,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
             mosquitto_strerror(status));
       mosquitto_destroy(conf->mosq);
       conf->mosq = NULL;
-      return (-1);
+      return -1;
     }
   }
 #endif
@@ -333,7 +333,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
 
       mosquitto_destroy(conf->mosq);
       conf->mosq = NULL;
-      return (-1);
+      return -1;
     }
   }
 
@@ -353,7 +353,7 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
 
     mosquitto_destroy(conf->mosq);
     conf->mosq = NULL;
-    return (-1);
+    return -1;
   }
 
   if (!conf->publish) {
@@ -369,12 +369,12 @@ static int mqtt_connect(mqtt_client_conf_t *conf) {
       mosquitto_disconnect(conf->mosq);
       mosquitto_destroy(conf->mosq);
       conf->mosq = NULL;
-      return (-1);
+      return -1;
     }
   }
 
   conf->connected = 1;
-  return (0);
+  return 0;
 } /* mqtt_connect */
 
 static void *subscribers_thread(void *arg) {
@@ -427,7 +427,7 @@ static int publish(mqtt_client_conf_t *conf, char const *topic,
   if (status != 0) {
     pthread_mutex_unlock(&conf->lock);
     ERROR("mqtt plugin: unable to reconnect to broker");
-    return (status);
+    return status;
   }
 
   status = mosquitto_publish(conf->mosq, /* message_id */ NULL, topic,
@@ -451,11 +451,11 @@ static int publish(mqtt_client_conf_t *conf, char const *topic,
     mosquitto_disconnect(conf->mosq);
 
     pthread_mutex_unlock(&conf->lock);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_unlock(&conf->lock);
-  return (0);
+  return 0;
 } /* int publish */
 
 static int format_topic(char *buf, size_t buf_len, data_set_t const *ds,
@@ -465,21 +465,21 @@ static int format_topic(char *buf, size_t buf_len, data_set_t const *ds,
   char *c;
 
   if ((conf->topic_prefix == NULL) || (conf->topic_prefix[0] == 0))
-    return (FORMAT_VL(buf, buf_len, vl));
+    return FORMAT_VL(buf, buf_len, vl);
 
   status = FORMAT_VL(name, sizeof(name), vl);
   if (status != 0)
-    return (status);
+    return status;
 
   status = ssnprintf(buf, buf_len, "%s/%s", conf->topic_prefix, name);
   if ((status < 0) || (((size_t)status) >= buf_len))
-    return (ENOMEM);
+    return ENOMEM;
 
   while((c = strchr(buf, '#')) || (c = strchr(buf, '+'))) {
        *c = '_';
   }
 
-  return (0);
+  return 0;
 } /* int format_topic */
 
 static int mqtt_write(const data_set_t *ds, const value_list_t *vl,
@@ -490,28 +490,28 @@ static int mqtt_write(const data_set_t *ds, const value_list_t *vl,
   int status = 0;
 
   if ((user_data == NULL) || (user_data->data == NULL))
-    return (EINVAL);
+    return EINVAL;
   conf = user_data->data;
 
   status = format_topic(topic, sizeof(topic), ds, vl, conf);
   if (status != 0) {
     ERROR("mqtt plugin: format_topic failed with status %d.", status);
-    return (status);
+    return status;
   }
 
   status = format_values(payload, sizeof(payload), ds, vl, conf->store_rates);
   if (status != 0) {
     ERROR("mqtt plugin: format_values failed with status %d.", status);
-    return (status);
+    return status;
   }
 
   status = publish(conf, topic, payload, strlen(payload) + 1);
   if (status != 0) {
     ERROR("mqtt plugin: publish failed: %s", mosquitto_strerror(status));
-    return (status);
+    return status;
   }
 
-  return (status);
+  return status;
 } /* mqtt_write */
 
 /*
@@ -539,7 +539,7 @@ static int mqtt_config_publisher(oconfig_item_t *ci) {
   conf = calloc(1, sizeof(*conf));
   if (conf == NULL) {
     ERROR("mqtt plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   conf->publish = 1;
 
@@ -547,7 +547,7 @@ static int mqtt_config_publisher(oconfig_item_t *ci) {
   status = cf_util_get_string(ci, &conf->name);
   if (status != 0) {
     mqtt_free(conf);
-    return (status);
+    return status;
   }
 
   conf->host = strdup(MQTT_DEFAULT_HOST);
@@ -560,7 +560,7 @@ static int mqtt_config_publisher(oconfig_item_t *ci) {
   status = pthread_mutex_init(&conf->lock, NULL);
   if (status != 0) {
     mqtt_free(conf);
-    return (status);
+    return status;
   }
 
   C_COMPLAIN_INIT(&conf->complaint_cantpublish);
@@ -612,7 +612,7 @@ static int mqtt_config_publisher(oconfig_item_t *ci) {
   plugin_register_write(cb_name, mqtt_write, &(user_data_t){
                                                  .data = conf,
                                              });
-  return (0);
+  return 0;
 } /* mqtt_config_publisher */
 
 /*
@@ -633,7 +633,7 @@ static int mqtt_config_subscriber(oconfig_item_t *ci) {
   conf = calloc(1, sizeof(*conf));
   if (conf == NULL) {
     ERROR("mqtt plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   conf->publish = 0;
 
@@ -641,7 +641,7 @@ static int mqtt_config_subscriber(oconfig_item_t *ci) {
   status = cf_util_get_string(ci, &conf->name);
   if (status != 0) {
     mqtt_free(conf);
-    return (status);
+    return status;
   }
 
   conf->host = strdup(MQTT_DEFAULT_HOST);
@@ -654,7 +654,7 @@ static int mqtt_config_subscriber(oconfig_item_t *ci) {
   status = pthread_mutex_init(&conf->lock, NULL);
   if (status != 0) {
     mqtt_free(conf);
-    return (status);
+    return status;
   }
 
   C_COMPLAIN_INIT(&conf->complaint_cantpublish);
@@ -694,13 +694,13 @@ static int mqtt_config_subscriber(oconfig_item_t *ci) {
   if (tmp == NULL) {
     ERROR("mqtt plugin: realloc failed.");
     mqtt_free(conf);
-    return (-1);
+    return -1;
   }
   subscribers = tmp;
   subscribers[subscribers_num] = conf;
   subscribers_num++;
 
-  return (0);
+  return 0;
 } /* mqtt_config_subscriber */
 
 /*
@@ -725,7 +725,7 @@ static int mqtt_config(oconfig_item_t *ci) {
       ERROR("mqtt plugin: Unknown config option: %s", child->key);
   }
 
-  return (0);
+  return 0;
 } /* int mqtt_config */
 
 static int mqtt_init(void) {
@@ -750,12 +750,10 @@ static int mqtt_init(void) {
     }
   }
 
-  return (0);
+  return 0;
 } /* mqtt_init */
 
 void module_register(void) {
   plugin_register_complex_config("mqtt", mqtt_config);
   plugin_register_init("mqtt", mqtt_init);
 } /* void module_register */
-
-/* vim: set sw=4 sts=4 et fdm=marker : */
index 913e277..72b0fed 100644 (file)
@@ -27,8 +27,7 @@
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_MATH_H
-#include <math.h>
+#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
 #include <termios.h>
 #else
@@ -50,7 +49,7 @@ static int multimeter_read_value(double *value) {
       char errbuf[1024];
       ERROR("multimeter plugin: gettimeofday failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
     time_end.tv_sec++;
 
@@ -65,7 +64,7 @@ static int multimeter_read_value(double *value) {
       status = swrite(fd, "D", 1);
       if (status < 0) {
         ERROR("multimeter plugin: swrite failed.");
-        return (-1);
+        return -1;
       }
 
       FD_ZERO(&rfds);
@@ -76,7 +75,7 @@ static int multimeter_read_value(double *value) {
         ERROR("multimeter plugin: "
               "gettimeofday failed: %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
       if (timeval_cmp(time_end, time_now, &timeout) < 0)
         break;
@@ -121,9 +120,9 @@ static int multimeter_read_value(double *value) {
               break;
             }
           } else
-            return (-1); /* Overflow */
+            return -1; /* Overflow */
 
-          return (0); /* value received */
+          return 0; /* value received */
         } else
           break;
       } else if (!status) /* Timeout */
@@ -142,7 +141,7 @@ static int multimeter_read_value(double *value) {
     }
   } while (--retry);
 
-  return (-2); /* no value received */
+  return -2; /* no value received */
 } /* int multimeter_read_value */
 
 static int multimeter_init(void) {
@@ -174,13 +173,13 @@ static int multimeter_init(void) {
         INFO("multimeter plugin: Device "
              "found at %s",
              device);
-        return (0);
+        return 0;
       }
     }
   }
 
   ERROR("multimeter plugin: No device found");
-  return (-1);
+  return -1;
 }
 #undef LINE_LENGTH
 
@@ -199,13 +198,13 @@ static int multimeter_read(void) {
   double value;
 
   if (fd < 0)
-    return (-1);
+    return -1;
 
   if (multimeter_read_value(&value) != 0)
-    return (-1);
+    return -1;
 
   multimeter_submit(value);
-  return (0);
+  return 0;
 } /* int multimeter_read */
 
 static int multimeter_shutdown(void) {
@@ -214,7 +213,7 @@ static int multimeter_shutdown(void) {
     fd = -1;
   }
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index 8409d1b..b6edce0 100644 (file)
@@ -121,13 +121,13 @@ static int mysql_config_database(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("mysql plugin: The `Database' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   db = calloc(1, sizeof(*db));
   if (db == NULL) {
     ERROR("mysql plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   /* initialize all the pointers */
@@ -153,7 +153,7 @@ static int mysql_config_database(oconfig_item_t *ci) /* {{{ */
   status = cf_util_get_string(ci, &db->instance);
   if (status != 0) {
     sfree(db);
-    return (status);
+    return status;
   }
   assert(db->instance != NULL);
 
@@ -229,16 +229,16 @@ static int mysql_config_database(oconfig_item_t *ci) /* {{{ */
         });
   } else {
     mysql_database_free(db);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int mysql_config_database */
 
 static int mysql_config(oconfig_item_t *ci) /* {{{ */
 {
   if (ci == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* Fill the `mysql_database_t' structure.. */
   for (int i = 0; i < ci->children_num; i++) {
@@ -250,7 +250,7 @@ static int mysql_config(oconfig_item_t *ci) /* {{{ */
       WARNING("mysql plugin: Option \"%s\" not allowed here.", child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int mysql_config */
 
 /* }}} End of configuration handling functions */
@@ -263,7 +263,7 @@ static MYSQL *getconnection(mysql_database_t *db) {
 
     status = mysql_ping(db->con);
     if (status == 0)
-      return (db->con);
+      return db->con;
 
     WARNING("mysql plugin: Lost connection to instance \"%s\": %s",
             db->instance, mysql_error(db->con));
@@ -274,7 +274,7 @@ static MYSQL *getconnection(mysql_database_t *db) {
     db->con = mysql_init(NULL);
     if (db->con == NULL) {
       ERROR("mysql plugin: mysql_init failed: %s", mysql_error(db->con));
-      return (NULL);
+      return NULL;
     }
   }
 
@@ -289,7 +289,7 @@ static MYSQL *getconnection(mysql_database_t *db) {
           "at server %s: %s",
           (db->database != NULL) ? db->database : "<none>",
           (db->host != NULL) ? db->host : "localhost", mysql_error(db->con));
-    return (NULL);
+    return NULL;
   }
 
   cipher = mysql_get_ssl_cipher(db->con);
@@ -302,7 +302,7 @@ static MYSQL *getconnection(mysql_database_t *db) {
        mysql_get_server_info(db->con), mysql_get_proto_info(db->con));
 
   db->is_connected = 1;
-  return (db->con);
+  return db->con;
 } /* static MYSQL *getconnection (mysql_database_t *db) */
 
 static void set_host(mysql_database_t *db, char *buf, size_t buflen) {
@@ -364,17 +364,17 @@ static MYSQL_RES *exec_query(MYSQL *con, const char *query) {
   if (mysql_real_query(con, query, query_len)) {
     ERROR("mysql plugin: Failed to execute query: %s", mysql_error(con));
     INFO("mysql plugin: SQL query was: %s", query);
-    return (NULL);
+    return NULL;
   }
 
   res = mysql_store_result(con);
   if (res == NULL) {
     ERROR("mysql plugin: Failed to store query result: %s", mysql_error(con));
     INFO("mysql plugin: SQL query was: %s", query);
-    return (NULL);
+    return NULL;
   }
 
-  return (res);
+  return res;
 } /* exec_query */
 
 static int mysql_read_master_stats(mysql_database_t *db, MYSQL *con) {
@@ -389,7 +389,7 @@ static int mysql_read_master_stats(mysql_database_t *db, MYSQL *con) {
 
   res = exec_query(con, query);
   if (res == NULL)
-    return (-1);
+    return -1;
 
   row = mysql_fetch_row(res);
   if (row == NULL) {
@@ -397,7 +397,7 @@ static int mysql_read_master_stats(mysql_database_t *db, MYSQL *con) {
           "`%s' did not return any rows.",
           query);
     mysql_free_result(res);
-    return (-1);
+    return -1;
   }
 
   field_num = mysql_num_fields(res);
@@ -406,7 +406,7 @@ static int mysql_read_master_stats(mysql_database_t *db, MYSQL *con) {
           "`%s' returned less than two columns.",
           query);
     mysql_free_result(res);
-    return (-1);
+    return -1;
   }
 
   position = atoll(row[1]);
@@ -420,7 +420,7 @@ static int mysql_read_master_stats(mysql_database_t *db, MYSQL *con) {
 
   mysql_free_result(res);
 
-  return (0);
+  return 0;
 } /* mysql_read_master_stats */
 
 static int mysql_read_slave_stats(mysql_database_t *db, MYSQL *con) {
@@ -442,7 +442,7 @@ static int mysql_read_slave_stats(mysql_database_t *db, MYSQL *con) {
 
   res = exec_query(con, query);
   if (res == NULL)
-    return (-1);
+    return -1;
 
   row = mysql_fetch_row(res);
   if (row == NULL) {
@@ -450,7 +450,7 @@ static int mysql_read_slave_stats(mysql_database_t *db, MYSQL *con) {
           "`%s' did not return any rows.",
           query);
     mysql_free_result(res);
-    return (-1);
+    return -1;
   }
 
   field_num = mysql_num_fields(res);
@@ -459,7 +459,7 @@ static int mysql_read_slave_stats(mysql_database_t *db, MYSQL *con) {
           "`%s' returned less than 33 columns.",
           query);
     mysql_free_result(res);
-    return (-1);
+    return -1;
   }
 
   if (db->slave_stats) {
@@ -532,7 +532,7 @@ static int mysql_read_slave_stats(mysql_database_t *db, MYSQL *con) {
 
   mysql_free_result(res);
 
-  return (0);
+  return 0;
 } /* mysql_read_slave_stats */
 
 static int mysql_read_innodb_stats(mysql_database_t *db, MYSQL *con) {
@@ -591,7 +591,7 @@ static int mysql_read_innodb_stats(mysql_database_t *db, MYSQL *con) {
 
   res = exec_query(con, query);
   if (res == NULL)
-    return (-1);
+    return -1;
 
   while ((row = mysql_fetch_row(res))) {
     int i;
@@ -621,7 +621,7 @@ static int mysql_read_innodb_stats(mysql_database_t *db, MYSQL *con) {
   }
 
   mysql_free_result(res);
-  return (0);
+  return 0;
 }
 
 static int mysql_read_wsrep_stats(mysql_database_t *db, MYSQL *con) {
@@ -670,7 +670,7 @@ static int mysql_read_wsrep_stats(mysql_database_t *db, MYSQL *con) {
 
   res = exec_query(con, query);
   if (res == NULL)
-    return (-1);
+    return -1;
 
   row = mysql_fetch_row(res);
   if (row == NULL) {
@@ -678,7 +678,7 @@ static int mysql_read_wsrep_stats(mysql_database_t *db, MYSQL *con) {
           "`%s' did not return any rows.",
           query);
     mysql_free_result(res);
-    return (-1);
+    return -1;
   }
 
   while ((row = mysql_fetch_row(res))) {
@@ -706,7 +706,7 @@ static int mysql_read_wsrep_stats(mysql_database_t *db, MYSQL *con) {
   }
 
   mysql_free_result(res);
-  return (0);
+  return 0;
 } /* mysql_read_wsrep_stats */
 
 static int mysql_read(user_data_t *ud) {
@@ -733,14 +733,14 @@ static int mysql_read(user_data_t *ud) {
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("mysql plugin: mysql_database_read: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   db = (mysql_database_t *)ud->data;
 
   /* An error message will have been printed in this case */
   if ((con = getconnection(db)) == NULL)
-    return (-1);
+    return -1;
 
   mysql_version = mysql_get_server_version(con);
 
@@ -750,7 +750,7 @@ static int mysql_read(user_data_t *ud) {
 
   res = exec_query(con, query);
   if (res == NULL)
-    return (-1);
+    return -1;
 
   while ((row = mysql_fetch_row(res))) {
     char *key;
@@ -938,7 +938,7 @@ static int mysql_read(user_data_t *ud) {
   if (db->wsrep_stats)
     mysql_read_wsrep_stats(db, con);
 
-  return (0);
+  return 0;
 } /* int mysql_read */
 
 void module_register(void) {
index 45144bf..701ac2f 100644 (file)
@@ -459,7 +459,7 @@ static disk_t *get_disk(cfg_disk_t *cd, const char *name) /* {{{ */
   disk_t *d;
 
   if ((cd == NULL) || (name == NULL))
-    return (NULL);
+    return NULL;
 
   for (d = cd->disks; d != NULL; d = d->next) {
     if (strcmp(d->name, name) == 0)
@@ -468,13 +468,13 @@ static disk_t *get_disk(cfg_disk_t *cd, const char *name) /* {{{ */
 
   d = calloc(1, sizeof(*d));
   if (d == NULL)
-    return (NULL);
+    return NULL;
   d->next = NULL;
 
   d->name = strdup(name);
   if (d->name == NULL) {
     sfree(d);
-    return (NULL);
+    return NULL;
   }
 
   d->next = cd->disks;
@@ -492,12 +492,12 @@ static data_volume_usage_t *get_volume_usage(cfg_volume_usage_t *cvu, /* {{{ */
   int ignore_snapshot = 0;
 
   if ((cvu == NULL) || (name == NULL))
-    return (NULL);
+    return NULL;
 
   last = cvu->volumes;
   while (last != NULL) {
     if (strcmp(last->name, name) == 0)
-      return (last);
+      return last;
 
     if (last->next == NULL)
       break;
@@ -510,18 +510,18 @@ static data_volume_usage_t *get_volume_usage(cfg_volume_usage_t *cvu, /* {{{ */
   ignore_capacity = ignorelist_match(cvu->il_capacity, name);
   ignore_snapshot = ignorelist_match(cvu->il_snapshot, name);
   if ((ignore_capacity != 0) && (ignore_snapshot != 0))
-    return (NULL);
+    return NULL;
 
   /* Not found: allocate. */
   new = calloc(1, sizeof(*new));
   if (new == NULL)
-    return (NULL);
+    return NULL;
   new->next = NULL;
 
   new->name = strdup(name);
   if (new->name == NULL) {
     sfree(new);
-    return (NULL);
+    return NULL;
   }
 
   if (ignore_capacity == 0)
@@ -541,7 +541,7 @@ static data_volume_usage_t *get_volume_usage(cfg_volume_usage_t *cvu, /* {{{ */
   else
     last->next = new;
 
-  return (new);
+  return new;
 } /* }}} data_volume_usage_t *get_volume_usage */
 
 static data_volume_perf_t *get_volume_perf(cfg_volume_perf_t *cvp, /* {{{ */
@@ -554,12 +554,12 @@ static data_volume_perf_t *get_volume_perf(cfg_volume_perf_t *cvp, /* {{{ */
   int ignore_latency = 0;
 
   if ((cvp == NULL) || (name == NULL))
-    return (NULL);
+    return NULL;
 
   last = cvp->volumes;
   while (last != NULL) {
     if (strcmp(last->name, name) == 0)
-      return (last);
+      return last;
 
     if (last->next == NULL)
       break;
@@ -573,18 +573,18 @@ static data_volume_perf_t *get_volume_perf(cfg_volume_perf_t *cvp, /* {{{ */
   ignore_operations = ignorelist_match(cvp->il_operations, name);
   ignore_latency = ignorelist_match(cvp->il_latency, name);
   if ((ignore_octets != 0) || (ignore_operations != 0) || (ignore_latency != 0))
-    return (NULL);
+    return NULL;
 
   /* Not found: allocate. */
   new = calloc(1, sizeof(*new));
   if (new == NULL)
-    return (NULL);
+    return NULL;
   new->next = NULL;
 
   new->name = strdup(name);
   if (new->name == NULL) {
     sfree(new);
-    return (NULL);
+    return NULL;
   }
 
   if (ignore_octets == 0)
@@ -600,7 +600,7 @@ static data_volume_perf_t *get_volume_perf(cfg_volume_perf_t *cvp, /* {{{ */
   else
     last->next = new;
 
-  return (new);
+  return new;
 } /* }}} data_volume_perf_t *get_volume_perf */
 
 /*
@@ -634,7 +634,7 @@ static int submit_values(const char *host, /* {{{ */
   if (type_inst != NULL)
     sstrncpy(vl.type_instance, type_inst, sizeof(vl.type_instance));
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 } /* }}} int submit_uint64 */
 
 static int submit_two_derive(const char *host,
@@ -646,16 +646,17 @@ static int submit_two_derive(const char *host,
       {.derive = val0}, {.derive = val1},
   };
 
-  return (submit_values(host, plugin_inst, type, type_inst, values,
-                        STATIC_ARRAY_SIZE(values), timestamp, interval));
+  return submit_values(host, plugin_inst, type, type_inst, values,
+                       STATIC_ARRAY_SIZE(values), timestamp, interval);
 } /* }}} int submit_two_derive */
 
 static int submit_derive(const char *host, const char *plugin_inst, /* {{{ */
                          const char *type, const char *type_inst,
                          derive_t counter, cdtime_t timestamp,
                          cdtime_t interval) {
-  return (submit_values(host, plugin_inst, type, type_inst,
-                        &(value_t){.derive = counter}, 1, timestamp, interval));
+  return submit_values(host, plugin_inst, type, type_inst, &(value_t){
+      .derive=counter,
+    }, 1, timestamp, interval);
 } /* }}} int submit_derive */
 
 static int submit_two_gauge(const char *host, const char *plugin_inst, /* {{{ */
@@ -666,15 +667,16 @@ static int submit_two_gauge(const char *host, const char *plugin_inst, /* {{{ */
       {.gauge = val0}, {.gauge = val1},
   };
 
-  return (submit_values(host, plugin_inst, type, type_inst, values,
-                        STATIC_ARRAY_SIZE(values), timestamp, interval));
+  return submit_values(host, plugin_inst, type, type_inst, values,
+                       STATIC_ARRAY_SIZE(values), timestamp, interval);
 } /* }}} int submit_two_gauge */
 
 static int submit_double(const char *host, const char *plugin_inst, /* {{{ */
                          const char *type, const char *type_inst, double d,
                          cdtime_t timestamp, cdtime_t interval) {
-  return (submit_values(host, plugin_inst, type, type_inst,
-                        &(value_t){.gauge = d}, 1, timestamp, interval));
+  return submit_values(host, plugin_inst, type, type_inst, &(value_t){
+      .gauge=d,
+    }, 1, timestamp, interval);
 } /* }}} int submit_uint64 */
 
 /* Calculate hit ratio from old and new counters and submit the resulting
@@ -696,8 +698,8 @@ static int submit_cache_ratio(const char *host, /* {{{ */
     v.gauge = 100.0 * ((gauge_t)hits) / ((gauge_t)(hits + misses));
   }
 
-  return (submit_values(host, plugin_inst, "cache_ratio", type_inst, &v, 1,
-                        timestamp, interval));
+  return submit_values(host, plugin_inst, "cache_ratio", type_inst, &v, 1,
+                       timestamp, interval);
 } /* }}} int submit_cache_ratio */
 
 /* Submits all the caches used by WAFL. Uses "submit_cache_ratio". */
@@ -753,7 +755,7 @@ static int submit_wafl_data(const char *hostname,
   /* Copy HAVE_* flags */
   old_data->flags |= (new_data->flags & HAVE_WAFL_ALL);
 
-  return (0);
+  return 0;
 } /* }}} int submit_wafl_data */
 
 /* Submits volume performance data to the daemon, taking care to honor and
@@ -765,7 +767,7 @@ static int submit_volume_perf_data(const char *hostname, /* {{{ */
   char plugin_instance[DATA_MAX_NAME_LEN];
 
   if ((hostname == NULL) || (old_data == NULL) || (new_data == NULL))
-    return (-1);
+    return -1;
 
   ssnprintf(plugin_instance, sizeof(plugin_instance), "volume-%s",
             old_data->name);
@@ -853,7 +855,7 @@ static int submit_volume_perf_data(const char *hostname, /* {{{ */
   /* Copy the HAVE_* flags */
   old_data->flags |= (new_data->flags & HAVE_VOLUME_PERF_ALL);
 
-  return (0);
+  return 0;
 } /* }}} int submit_volume_perf_data */
 
 static cdtime_t cna_child_get_cdtime(na_elem_t *data) /* {{{ */
@@ -862,7 +864,7 @@ static cdtime_t cna_child_get_cdtime(na_elem_t *data) /* {{{ */
 
   t = (time_t)na_child_get_uint64(data, "timestamp", /* default = */ 0);
 
-  return (TIME_T_TO_CDTIME_T(t));
+  return TIME_T_TO_CDTIME_T(t);
 } /* }}} cdtime_t cna_child_get_cdtime */
 
 /*
@@ -889,7 +891,7 @@ static int cna_handle_wafl_data(const char *hostname,
           "na_elem_child (\"instances\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   plugin_inst = na_child_get_string(instances, "name");
@@ -898,7 +900,7 @@ static int cna_handle_wafl_data(const char *hostname,
           "na_child_get_string (\"name\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   /* Iterate over all counters */
@@ -948,8 +950,8 @@ static int cna_handle_wafl_data(const char *hostname,
     }
   }
 
-  return (
-      submit_wafl_data(hostname, plugin_inst, cfg_wafl, &perf_data, interval));
+  return submit_wafl_data(hostname, plugin_inst, cfg_wafl, &perf_data,
+                          interval);
 } /* }}} void cna_handle_wafl_data */
 
 static int cna_setup_wafl(cfg_wafl_t *cw) /* {{{ */
@@ -957,15 +959,15 @@ static int cna_setup_wafl(cfg_wafl_t *cw) /* {{{ */
   na_elem_t *e;
 
   if (cw == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cw->query != NULL)
-    return (0);
+    return 0;
 
   cw->query = na_elem_new("perf-object-get-instances");
   if (cw->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(cw->query, "objectname", "wafl");
 
@@ -974,7 +976,7 @@ static int cna_setup_wafl(cfg_wafl_t *cw) /* {{{ */
     na_elem_free(cw->query);
     cw->query = NULL;
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(e, "counter", "name_cache_hit");
   na_child_add_string(e, "counter", "name_cache_miss");
@@ -987,7 +989,7 @@ static int cna_setup_wafl(cfg_wafl_t *cw) /* {{{ */
 
   na_child_add(cw->query, e);
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_wafl */
 
 static int cna_query_wafl(host_config_t *host) /* {{{ */
@@ -997,20 +999,20 @@ static int cna_query_wafl(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If WAFL was not configured, return without doing anything. */
   if (host->cfg_wafl == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_wafl->interval.interval + host->cfg_wafl->interval.last_read) >
       now)
-    return (0);
+    return 0;
 
   status = cna_setup_wafl(host->cfg_wafl);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_wafl->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_wafl->query);
@@ -1019,7 +1021,7 @@ static int cna_query_wafl(host_config_t *host) /* {{{ */
           "host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_wafl_data(host->name, host->cfg_wafl, data,
@@ -1029,7 +1031,7 @@ static int cna_query_wafl(host_config_t *host) /* {{{ */
     host->cfg_wafl->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_wafl */
 
 /* Data corresponding to <Disks /> */
@@ -1042,7 +1044,7 @@ static int cna_handle_disk_data(const char *hostname, /* {{{ */
   disk_t *worst_disk = NULL;
 
   if ((cfg_disk == NULL) || (data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   timestamp = cna_child_get_cdtime(data);
 
@@ -1052,7 +1054,7 @@ static int cna_handle_disk_data(const char *hostname, /* {{{ */
           "na_elem_child (\"instances\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   /* Iterate over all children */
@@ -1137,7 +1139,7 @@ static int cna_handle_disk_data(const char *hostname, /* {{{ */
     submit_double(hostname, "system", "percent", "disk_busy",
                   worst_disk->disk_busy_percent, timestamp, interval);
 
-  return (0);
+  return 0;
 } /* }}} int cna_handle_disk_data */
 
 static int cna_setup_disk(cfg_disk_t *cd) /* {{{ */
@@ -1145,15 +1147,15 @@ static int cna_setup_disk(cfg_disk_t *cd) /* {{{ */
   na_elem_t *e;
 
   if (cd == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cd->query != NULL)
-    return (0);
+    return 0;
 
   cd->query = na_elem_new("perf-object-get-instances");
   if (cd->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(cd->query, "objectname", "disk");
 
@@ -1162,13 +1164,13 @@ static int cna_setup_disk(cfg_disk_t *cd) /* {{{ */
     na_elem_free(cd->query);
     cd->query = NULL;
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(e, "counter", "disk_busy");
   na_child_add_string(e, "counter", "base_for_disk_busy");
   na_child_add(cd->query, e);
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_disk */
 
 static int cna_query_disk(host_config_t *host) /* {{{ */
@@ -1178,21 +1180,21 @@ static int cna_query_disk(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If the user did not configure disk statistics, return without doing
    * anything. */
   if (host->cfg_disk == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_disk->interval.interval + host->cfg_disk->interval.last_read) >
       now)
-    return (0);
+    return 0;
 
   status = cna_setup_disk(host->cfg_disk);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_disk->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_disk->query);
@@ -1201,7 +1203,7 @@ static int cna_query_disk(host_config_t *host) /* {{{ */
           "host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_disk_data(host->name, host->cfg_disk, data,
@@ -1211,7 +1213,7 @@ static int cna_query_disk(host_config_t *host) /* {{{ */
     host->cfg_disk->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_disk */
 
 /* Data corresponding to <VolumePerf /> */
@@ -1230,7 +1232,7 @@ static int cna_handle_volume_perf_data(const char *hostname, /* {{{ */
           "na_elem_child (\"instances\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   iter_instances = na_child_iterator(elem_instances);
@@ -1299,7 +1301,7 @@ static int cna_handle_volume_perf_data(const char *hostname, /* {{{ */
     submit_volume_perf_data(hostname, v, &perf_data, interval);
   } /* for (volume) */
 
-  return (0);
+  return 0;
 } /* }}} int cna_handle_volume_perf_data */
 
 static int cna_setup_volume_perf(cfg_volume_perf_t *cd) /* {{{ */
@@ -1307,15 +1309,15 @@ static int cna_setup_volume_perf(cfg_volume_perf_t *cd) /* {{{ */
   na_elem_t *e;
 
   if (cd == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cd->query != NULL)
-    return (0);
+    return 0;
 
   cd->query = na_elem_new("perf-object-get-instances");
   if (cd->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(cd->query, "objectname", "volume");
 
@@ -1324,7 +1326,7 @@ static int cna_setup_volume_perf(cfg_volume_perf_t *cd) /* {{{ */
     na_elem_free(cd->query);
     cd->query = NULL;
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(e, "counter", "read_ops");
   na_child_add_string(e, "counter", "write_ops");
@@ -1334,7 +1336,7 @@ static int cna_setup_volume_perf(cfg_volume_perf_t *cd) /* {{{ */
   na_child_add_string(e, "counter", "write_latency");
   na_child_add(cd->query, e);
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_volume_perf */
 
 static int cna_query_volume_perf(host_config_t *host) /* {{{ */
@@ -1344,21 +1346,21 @@ static int cna_query_volume_perf(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If the user did not configure volume performance statistics, return
    * without doing anything. */
   if (host->cfg_volume_perf == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_volume_perf->interval.interval +
        host->cfg_volume_perf->interval.last_read) > now)
-    return (0);
+    return 0;
 
   status = cna_setup_volume_perf(host->cfg_volume_perf);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_volume_perf->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_volume_perf->query);
@@ -1367,7 +1369,7 @@ static int cna_query_volume_perf(host_config_t *host) /* {{{ */
           "for host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status =
@@ -1378,7 +1380,7 @@ static int cna_query_volume_perf(host_config_t *host) /* {{{ */
     host->cfg_volume_perf->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_volume_perf */
 
 /* Data corresponding to <VolumeUsage /> */
@@ -1472,7 +1474,7 @@ static int cna_submit_volume_usage_data(const char *hostname, /* {{{ */
     v->flags &= ~HAVE_VOLUME_USAGE_ALL;
   } /* for (v = cfg_volume->volumes) */
 
-  return (0);
+  return 0;
 } /* }}} int cna_submit_volume_usage_data */
 
 /* Switch the state of a volume between online and offline and send out a
@@ -1498,7 +1500,7 @@ static int cna_change_volume_status(const char *hostname, /* {{{ */
     v->flags |= IS_VOLUME_USAGE_OFFLINE;
   }
 
-  return (plugin_dispatch_notification(&n));
+  return plugin_dispatch_notification(&n);
 } /* }}} int cna_change_volume_status */
 
 static void cna_handle_volume_snap_usage(const host_config_t *host, /* {{{ */
@@ -1661,7 +1663,7 @@ static int cna_handle_volume_usage_data(const host_config_t *host, /* {{{ */
           "na_elem_child (\"volumes\") failed "
           "for host %s.",
           host->name);
-    return (-1);
+    return -1;
   }
 
   iter_volume = na_child_iterator(elem_volumes);
@@ -1721,25 +1723,25 @@ static int cna_handle_volume_usage_data(const host_config_t *host, /* {{{ */
     }
   } /* for (elem_volume) */
 
-  return (cna_submit_volume_usage_data(
-      host->name, cfg_volume, host->cfg_volume_usage->interval.interval));
+  return cna_submit_volume_usage_data(host->name, cfg_volume,
+                                      host->cfg_volume_usage->interval.interval);
 } /* }}} int cna_handle_volume_usage_data */
 
 static int cna_setup_volume_usage(cfg_volume_usage_t *cvu) /* {{{ */
 {
   if (cvu == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cvu->query != NULL)
-    return (0);
+    return 0;
 
   cvu->query = na_elem_new("volume-list-info");
   if (cvu->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_volume_usage */
 
 static int cna_query_volume_usage(host_config_t *host) /* {{{ */
@@ -1749,21 +1751,21 @@ static int cna_query_volume_usage(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If the user did not configure volume_usage statistics, return without
    * doing anything. */
   if (host->cfg_volume_usage == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_volume_usage->interval.interval +
        host->cfg_volume_usage->interval.last_read) > now)
-    return (0);
+    return 0;
 
   status = cna_setup_volume_usage(host->cfg_volume_usage);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_volume_usage->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_volume_usage->query);
@@ -1772,7 +1774,7 @@ static int cna_query_volume_usage(host_config_t *host) /* {{{ */
           "for host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_volume_usage_data(host, host->cfg_volume_usage, data);
@@ -1781,7 +1783,7 @@ static int cna_query_volume_usage(host_config_t *host) /* {{{ */
     host->cfg_volume_usage->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_volume_usage */
 
 /* Data corresponding to <Quota /> */
@@ -1796,7 +1798,7 @@ static int cna_handle_quota_data(const host_config_t *host, /* {{{ */
           "na_elem_child (\"quotas\") failed "
           "for host %s.",
           host->name);
-    return (-1);
+    return -1;
   }
 
   iter_quota = na_child_iterator(elem_quotas);
@@ -1844,24 +1846,24 @@ static int cna_handle_quota_data(const host_config_t *host, /* {{{ */
     }
   } /* for (elem_quota) */
 
-  return (0);
+  return 0;
 } /* }}} int cna_handle_volume_usage_data */
 
 static int cna_setup_quota(cfg_quota_t *cq) /* {{{ */
 {
   if (cq == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cq->query != NULL)
-    return (0);
+    return 0;
 
   cq->query = na_elem_new("quota-report");
   if (cq->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_quota */
 
 static int cna_query_quota(host_config_t *host) /* {{{ */
@@ -1871,21 +1873,21 @@ static int cna_query_quota(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If the user did not configure quota statistics, return without
    * doing anything. */
   if (host->cfg_quota == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_quota->interval.interval +
        host->cfg_quota->interval.last_read) > now)
-    return (0);
+    return 0;
 
   status = cna_setup_quota(host->cfg_quota);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_quota->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_quota->query);
@@ -1894,7 +1896,7 @@ static int cna_query_quota(host_config_t *host) /* {{{ */
           "host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_quota_data(host, host->cfg_quota, data);
@@ -1903,7 +1905,7 @@ static int cna_query_quota(host_config_t *host) /* {{{ */
     host->cfg_quota->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_quota */
 
 /* Data corresponding to <SnapVault /> */
@@ -1913,7 +1915,7 @@ static int cna_handle_snapvault_data(const char *hostname, /* {{{ */
   na_elem_t *status_list = na_elem_child(data, "status-list");
   if (status_list == NULL) {
     ERROR("netapp plugin: SnapVault status record missing status-list");
-    return (0);
+    return 0;
   }
 
   na_elem_iter_t status_iter = na_child_iterator(status_list);
@@ -1957,7 +1959,7 @@ static int cna_handle_snapvault_data(const char *hostname, /* {{{ */
     }
   } /* for (status) */
 
-  return (0);
+  return 0;
 } /* }}} int cna_handle_snapvault_data */
 
 static int cna_handle_snapvault_iter(host_config_t *host, /* {{{ */
@@ -1989,7 +1991,7 @@ static int cna_handle_snapvault_iter(host_config_t *host, /* {{{ */
             "na_server_invoke failed for host %s: %s",
             host->name, na_results_reason(data));
       na_elem_free(elem);
-      return (-1);
+      return -1;
     }
 
     cna_handle_snapvault_data(host->name, host->cfg_snapvault, elem,
@@ -2000,25 +2002,25 @@ static int cna_handle_snapvault_iter(host_config_t *host, /* {{{ */
   na_elem_free(na_server_invoke(
       host->srv, "snapvault-secondary-relationship-status-list-iter-end", "tag",
       tag, NULL));
-  return (0);
+  return 0;
 } /* }}} int cna_handle_snapvault_iter */
 
 static int cna_setup_snapvault(cfg_snapvault_t *sv) /* {{{ */
 {
   if (sv == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (sv->query != NULL)
-    return (0);
+    return 0;
 
   sv->query =
       na_elem_new("snapvault-secondary-relationship-status-list-iter-start");
   if (sv->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_snapvault */
 
 static int cna_query_snapvault(host_config_t *host) /* {{{ */
@@ -2036,11 +2038,11 @@ static int cna_query_snapvault(host_config_t *host) /* {{{ */
   now = cdtime();
   if ((host->cfg_snapvault->interval.interval +
        host->cfg_snapvault->interval.last_read) > now)
-    return (0);
+    return 0;
 
   status = cna_setup_snapvault(host->cfg_snapvault);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_snapvault->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_snapvault->query);
@@ -2049,7 +2051,7 @@ static int cna_query_snapvault(host_config_t *host) /* {{{ */
           "for host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_snapvault_iter(host, data);
@@ -2058,7 +2060,7 @@ static int cna_query_snapvault(host_config_t *host) /* {{{ */
     host->cfg_snapvault->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_snapvault */
 
 /* Data corresponding to <System /> */
@@ -2084,7 +2086,7 @@ static int cna_handle_system_data(const char *hostname, /* {{{ */
           "na_elem_child (\"instances\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   instance = na_child_get_string(instances, "name");
@@ -2093,7 +2095,7 @@ static int cna_handle_system_data(const char *hostname, /* {{{ */
           "na_child_get_string (\"name\") failed "
           "for host %s.",
           hostname);
-    return (-1);
+    return -1;
   }
 
   counter_iter = na_child_iterator(na_elem_child(instances, "counters"));
@@ -2154,25 +2156,25 @@ static int cna_handle_system_data(const char *hostname, /* {{{ */
                   timestamp, interval);
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_handle_system_data */
 
 static int cna_setup_system(cfg_system_t *cs) /* {{{ */
 {
   if (cs == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (cs->query != NULL)
-    return (0);
+    return 0;
 
   cs->query = na_elem_new("perf-object-get-instances");
   if (cs->query == NULL) {
     ERROR("netapp plugin: na_elem_new failed.");
-    return (-1);
+    return -1;
   }
   na_child_add_string(cs->query, "objectname", "system");
 
-  return (0);
+  return 0;
 } /* }}} int cna_setup_system */
 
 static int cna_query_system(host_config_t *host) /* {{{ */
@@ -2182,20 +2184,20 @@ static int cna_query_system(host_config_t *host) /* {{{ */
   cdtime_t now;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   /* If system statistics were not configured, return without doing anything. */
   if (host->cfg_system == NULL)
-    return (0);
+    return 0;
 
   now = cdtime();
   if ((host->cfg_system->interval.interval +
        host->cfg_system->interval.last_read) > now)
-    return (0);
+    return 0;
 
   status = cna_setup_system(host->cfg_system);
   if (status != 0)
-    return (status);
+    return status;
   assert(host->cfg_system->query != NULL);
 
   data = na_server_invoke_elem(host->srv, host->cfg_system->query);
@@ -2204,7 +2206,7 @@ static int cna_query_system(host_config_t *host) /* {{{ */
           "host %s: %s",
           host->name, na_results_reason(data));
     na_elem_free(data);
-    return (-1);
+    return -1;
   }
 
   status = cna_handle_system_data(host->name, host->cfg_system, data,
@@ -2214,7 +2216,7 @@ static int cna_query_system(host_config_t *host) /* {{{ */
     host->cfg_system->interval.last_read = now;
 
   na_elem_free(data);
-  return (status);
+  return status;
 } /* }}} int cna_query_system */
 
 /*
@@ -2225,12 +2227,12 @@ static int cna_query_system(host_config_t *host) /* {{{ */
 static int cna_config_bool_to_flag(const oconfig_item_t *ci, /* {{{ */
                                    uint32_t *flags, uint32_t flag) {
   if ((ci == NULL) || (flags == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) {
     WARNING("netapp plugin: The %s option needs exactly one boolean argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.boolean)
@@ -2238,7 +2240,7 @@ static int cna_config_bool_to_flag(const oconfig_item_t *ci, /* {{{ */
   else
     *flags &= ~flag;
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_bool_to_flag */
 
 /* Handling of the "Interval" option which is allowed in every block. */
@@ -2249,12 +2251,12 @@ static int cna_config_get_interval(const oconfig_item_t *ci, /* {{{ */
 
   status = cf_util_get_cdtime(ci, &tmp);
   if (status != 0)
-    return (status);
+    return status;
 
   out_interval->interval = tmp;
   out_interval->last_read = 0;
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_get_interval */
 
 /* Handling of the "GetIO", "GetOps" and "GetLatency" options within a
@@ -2335,12 +2337,12 @@ static int cna_config_volume_performance(host_config_t *host, /* {{{ */
   cfg_volume_perf_t *cfg_volume_perf;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_volume_perf == NULL) {
     cfg_volume_perf = calloc(1, sizeof(*cfg_volume_perf));
     if (cfg_volume_perf == NULL)
-      return (ENOMEM);
+      return ENOMEM;
 
     /* Set default flags */
     cfg_volume_perf->query = NULL;
@@ -2349,14 +2351,14 @@ static int cna_config_volume_performance(host_config_t *host, /* {{{ */
     cfg_volume_perf->il_octets = ignorelist_create(/* invert = */ 1);
     if (cfg_volume_perf->il_octets == NULL) {
       sfree(cfg_volume_perf);
-      return (ENOMEM);
+      return ENOMEM;
     }
 
     cfg_volume_perf->il_operations = ignorelist_create(/* invert = */ 1);
     if (cfg_volume_perf->il_operations == NULL) {
       ignorelist_free(cfg_volume_perf->il_octets);
       sfree(cfg_volume_perf);
-      return (ENOMEM);
+      return ENOMEM;
     }
 
     cfg_volume_perf->il_latency = ignorelist_create(/* invert = */ 1);
@@ -2364,7 +2366,7 @@ static int cna_config_volume_performance(host_config_t *host, /* {{{ */
       ignorelist_free(cfg_volume_perf->il_octets);
       ignorelist_free(cfg_volume_perf->il_operations);
       sfree(cfg_volume_perf);
-      return (ENOMEM);
+      return ENOMEM;
     }
 
     host->cfg_volume_perf = cfg_volume_perf;
@@ -2395,7 +2397,7 @@ static int cna_config_volume_performance(host_config_t *host, /* {{{ */
               item->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_volume_performance */
 
 /* Handling of the "GetCapacity" and "GetSnapshot" options within a
@@ -2456,12 +2458,12 @@ static int cna_config_quota(host_config_t *host, oconfig_item_t *ci) /* {{{ */
   cfg_quota_t *cfg_quota;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_quota == NULL) {
     cfg_quota = calloc(1, sizeof(*cfg_quota));
     if (cfg_quota == NULL)
-      return (ENOMEM);
+      return ENOMEM;
     cfg_quota->query = NULL;
 
     host->cfg_quota = cfg_quota;
@@ -2479,7 +2481,7 @@ static int cna_config_quota(host_config_t *host, oconfig_item_t *ci) /* {{{ */
               item->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_quota */
 
 /* Corresponds to a <Disks /> block */
@@ -2487,12 +2489,12 @@ static int cna_config_disk(host_config_t *host, oconfig_item_t *ci) { /* {{{ */
   cfg_disk_t *cfg_disk;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_disk == NULL) {
     cfg_disk = calloc(1, sizeof(*cfg_disk));
     if (cfg_disk == NULL)
-      return (ENOMEM);
+      return ENOMEM;
 
     /* Set default flags */
     cfg_disk->flags = CFG_DISK_ALL;
@@ -2520,7 +2522,7 @@ static int cna_config_disk(host_config_t *host, oconfig_item_t *ci) { /* {{{ */
     host->cfg_disk = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_disk */
 
 /* Corresponds to a <WAFL /> block */
@@ -2529,12 +2531,12 @@ static int cna_config_wafl(host_config_t *host, oconfig_item_t *ci) /* {{{ */
   cfg_wafl_t *cfg_wafl;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_wafl == NULL) {
     cfg_wafl = calloc(1, sizeof(*cfg_wafl));
     if (cfg_wafl == NULL)
-      return (ENOMEM);
+      return ENOMEM;
 
     /* Set default flags */
     cfg_wafl->flags = CFG_WAFL_ALL;
@@ -2569,7 +2571,7 @@ static int cna_config_wafl(host_config_t *host, oconfig_item_t *ci) /* {{{ */
     host->cfg_wafl = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_wafl */
 
 /*
@@ -2594,12 +2596,12 @@ static int cna_config_volume_usage(host_config_t *host, /* {{{ */
   cfg_volume_usage_t *cfg_volume_usage;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_volume_usage == NULL) {
     cfg_volume_usage = calloc(1, sizeof(*cfg_volume_usage));
     if (cfg_volume_usage == NULL)
-      return (ENOMEM);
+      return ENOMEM;
 
     /* Set default flags */
     cfg_volume_usage->query = NULL;
@@ -2608,14 +2610,14 @@ static int cna_config_volume_usage(host_config_t *host, /* {{{ */
     cfg_volume_usage->il_capacity = ignorelist_create(/* invert = */ 1);
     if (cfg_volume_usage->il_capacity == NULL) {
       sfree(cfg_volume_usage);
-      return (ENOMEM);
+      return ENOMEM;
     }
 
     cfg_volume_usage->il_snapshot = ignorelist_create(/* invert = */ 1);
     if (cfg_volume_usage->il_snapshot == NULL) {
       ignorelist_free(cfg_volume_usage->il_capacity);
       sfree(cfg_volume_usage);
-      return (ENOMEM);
+      return ENOMEM;
     }
 
     host->cfg_volume_usage = cfg_volume_usage;
@@ -2642,7 +2644,7 @@ static int cna_config_volume_usage(host_config_t *host, /* {{{ */
               item->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_volume_usage */
 
 /* Corresponds to a <SnapVault /> block */
@@ -2684,12 +2686,12 @@ static int cna_config_system(host_config_t *host, /* {{{ */
   cfg_system_t *cfg_system;
 
   if ((host == NULL) || (ci == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   if (host->cfg_system == NULL) {
     cfg_system = calloc(1, sizeof(*cfg_system));
     if (cfg_system == NULL)
-      return (ENOMEM);
+      return ENOMEM;
 
     /* Set default flags */
     cfg_system->flags = CFG_SYSTEM_ALL;
@@ -2726,7 +2728,7 @@ static int cna_config_system(host_config_t *host, /* {{{ */
     host->cfg_system = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_config_system */
 
 /* Corresponds to a <Host /> block. */
@@ -2736,7 +2738,7 @@ static host_config_t *cna_alloc_host(void) /* {{{ */
 
   host = calloc(1, sizeof(*host));
   if (host == NULL)
-    return (NULL);
+    return NULL;
 
   host->name = NULL;
   host->protocol = NA_SERVER_TRANSPORT_HTTPS;
@@ -2753,7 +2755,7 @@ static host_config_t *cna_alloc_host(void) /* {{{ */
   host->cfg_snapvault = NULL;
   host->cfg_system = NULL;
 
-  return (host);
+  return host;
 } /* }}} host_config_t *cna_alloc_host */
 
 static host_config_t *cna_shallow_clone_host(host_config_t *host) /* {{{ */
@@ -2761,11 +2763,11 @@ static host_config_t *cna_shallow_clone_host(host_config_t *host) /* {{{ */
   host_config_t *clone;
 
   if (host == NULL)
-    return (NULL);
+    return NULL;
 
   clone = cna_alloc_host();
   if (clone == NULL)
-    return (NULL);
+    return NULL;
 
   if (host->name != NULL) {
     clone->name = strdup(host->name);
@@ -2804,7 +2806,7 @@ static host_config_t *cna_shallow_clone_host(host_config_t *host) /* {{{ */
 
   clone->interval = host->interval;
 
-  return (clone);
+  return clone;
 } /* }}} host_config_t *cna_shallow_clone_host */
 
 static int cna_read(user_data_t *ud);
@@ -2827,7 +2829,7 @@ static int cna_register_host(host_config_t *host) /* {{{ */
           .data = host, .free_func = (void *)free_host_config,
       });
 
-  return (0);
+  return 0;
 } /* }}} int cna_register_host */
 
 static int cna_config_host(host_config_t *host, /* {{{ */
@@ -2843,12 +2845,12 @@ static int cna_config_host(host_config_t *host, /* {{{ */
     WARNING("netapp plugin: \"%s\" needs exactly one string argument. Ignoring "
             "host block.",
             ci->key);
-    return (1);
+    return 1;
   }
 
   status = cf_util_get_string(ci, &host->name);
   if (status != 0)
-    return (1);
+    return 1;
 
   for (int i = 0; i < ci->children_num; ++i) {
     item = ci->children + i;
@@ -2871,7 +2873,7 @@ static int cna_config_host(host_config_t *host, /* {{{ */
         WARNING("netapp plugin: \"Protocol\" needs to be either \"http\" or "
                 "\"https\". Ignoring host block \"%s\".",
                 ci->values[0].value.string);
-        return (1);
+        return 1;
       }
       if (!strcasecmp(item->values[0].value.string, "http"))
         host->protocol = NA_SERVER_TRANSPORT_HTTP;
@@ -2947,7 +2949,7 @@ static int cna_config_host(host_config_t *host, /* {{{ */
   if (status != 0)
     return status;
 
-  return (0);
+  return 0;
 } /* }}} host_config_t *cna_config_host */
 
 /*
@@ -2961,10 +2963,10 @@ static int cna_init_host(host_config_t *host) /* {{{ */
   int major_version = 1, minor_version = 1;
 
   if (host == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (host->srv != NULL)
-    return (0);
+    return 0;
 
   if (host->vfiler != NULL) /* Request version 1.7 of the ONTAP API */
     minor_version = 7;
@@ -2972,7 +2974,7 @@ static int cna_init_host(host_config_t *host) /* {{{ */
   host->srv = na_server_open(host->host, major_version, minor_version);
   if (host->srv == NULL) {
     ERROR("netapp plugin: na_server_open (%s) failed.", host->host);
-    return (-1);
+    return -1;
   }
 
   na_server_set_transport_type(host->srv, host->protocol,
@@ -2986,14 +2988,14 @@ static int cna_init_host(host_config_t *host) /* {{{ */
     if (!na_server_set_vfiler(host->srv, host->vfiler)) {
       ERROR("netapp plugin: Failed to connect to VFiler '%s' on host '%s'.",
             host->vfiler, host->host);
-      return (-1);
+      return -1;
     } else {
       INFO("netapp plugin: Connected to VFiler '%s' on host '%s'.",
            host->vfiler, host->host);
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int cna_init_host */
 
 static int cna_init(void) /* {{{ */
@@ -3006,7 +3008,7 @@ static int cna_init(void) /* {{{ */
     return 1;
   }
 
-  return (0);
+  return 0;
 } /* }}} cna_init */
 
 static int cna_read_internal(host_config_t *host) { /* {{{ */
@@ -3014,31 +3016,31 @@ static int cna_read_internal(host_config_t *host) { /* {{{ */
 
   status = cna_query_wafl(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_disk(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_volume_perf(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_volume_usage(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_quota(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_snapvault(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_query_system(host);
   if (status != 0)
-    return (status);
+    return status;
 
   return 0;
 } /* }}} int cna_read_internal */
@@ -3048,13 +3050,13 @@ static int cna_read(user_data_t *ud) { /* {{{ */
   int status;
 
   if ((ud == NULL) || (ud->data == NULL))
-    return (-1);
+    return -1;
 
   host = ud->data;
 
   status = cna_init_host(host);
   if (status != 0)
-    return (status);
+    return status;
 
   status = cna_read_internal(host);
   if (status != 0) {
@@ -3101,7 +3103,7 @@ static int cna_shutdown(void) /* {{{ */
   /* Clean up system resources and stuff. */
   na_shutdown();
 
-  return (0);
+  return 0;
 } /* }}} int cna_shutdown */
 
 void module_register(void) {
@@ -3109,5 +3111,3 @@ void module_register(void) {
   plugin_register_init("netapp", cna_init);
   plugin_register_shutdown("netapp", cna_shutdown);
 }
-
-/* vim: set sw=2 ts=2 noet fdm=marker : */
index 8076c1f..3cc1084 100644 (file)
@@ -85,6 +85,11 @@ typedef struct ir_ignorelist_s {
   struct ir_ignorelist_s *next;
 } ir_ignorelist_t;
 
+struct qos_stats {
+  struct gnet_stats_basic *bs;
+  struct gnet_stats_queue *qs;
+};
+
 static int ir_ignorelist_invert = 1;
 static ir_ignorelist_t *ir_ignorelist_head = NULL;
 
@@ -103,13 +108,13 @@ static int add_ignorelist(const char *dev, const char *type, const char *inst) {
 
   entry = calloc(1, sizeof(*entry));
   if (entry == NULL)
-    return (-1);
+    return -1;
 
   if (strcasecmp(dev, "All") != 0) {
     entry->device = strdup(dev);
     if (entry->device == NULL) {
       sfree(entry);
-      return (-1);
+      return -1;
     }
   }
 
@@ -117,7 +122,7 @@ static int add_ignorelist(const char *dev, const char *type, const char *inst) {
   if (entry->type == NULL) {
     sfree(entry->device);
     sfree(entry);
-    return (-1);
+    return -1;
   }
 
   if (inst != NULL) {
@@ -126,14 +131,14 @@ static int add_ignorelist(const char *dev, const char *type, const char *inst) {
       sfree(entry->type);
       sfree(entry->device);
       sfree(entry);
-      return (-1);
+      return -1;
     }
   }
 
   entry->next = ir_ignorelist_head;
   ir_ignorelist_head = entry;
 
-  return (0);
+  return 0;
 } /* int add_ignorelist */
 
 /*
@@ -145,7 +150,7 @@ static int check_ignorelist(const char *dev, const char *type,
   assert((dev != NULL) && (type != NULL));
 
   if (ir_ignorelist_head == NULL)
-    return (ir_ignorelist_invert ? 0 : 1);
+    return ir_ignorelist_invert ? 0 : 1;
 
   for (ir_ignorelist_t *i = ir_ignorelist_head; i != NULL; i = i->next) {
     /* i->device == NULL  =>  match all devices */
@@ -166,10 +171,10 @@ static int check_ignorelist(const char *dev, const char *type,
           i->device == NULL ? "(nil)" : i->device, i->type,
           i->inst == NULL ? "(nil)" : i->inst);
 
-    return (ir_ignorelist_invert ? 0 : 1);
+    return ir_ignorelist_invert ? 0 : 1;
   } /* for i */
 
-  return (ir_ignorelist_invert);
+  return ir_ignorelist_invert;
 } /* int check_ignorelist */
 
 static void submit_one(const char *dev, const char *type,
@@ -216,7 +221,7 @@ static int update_iflist(struct ifinfomsg *msg, const char *dev) {
     temp = realloc(iflist, (msg->ifi_index + 1) * sizeof(char *));
     if (temp == NULL) {
       ERROR("netlink plugin: update_iflist: realloc failed.");
-      return (-1);
+      return -1;
     }
 
     memset(temp + iflist_len, '\0',
@@ -230,7 +235,7 @@ static int update_iflist(struct ifinfomsg *msg, const char *dev) {
     iflist[msg->ifi_index] = strdup(dev);
   }
 
-  return (0);
+  return 0;
 } /* int update_iflist */
 
 static void check_ignorelist_and_submit(const char *dev,
@@ -387,20 +392,30 @@ static int link_filter_cb(const struct nlmsghdr *nlh,
 
 #if HAVE_TCA_STATS2
 static int qos_attr_cb(const struct nlattr *attr, void *data) {
-  struct gnet_stats_basic **bs = (struct gnet_stats_basic **)data;
+  struct qos_stats *q_stats = (struct qos_stats *)data;
 
   /* skip unsupported attribute in user-space */
   if (mnl_attr_type_valid(attr, TCA_STATS_MAX) < 0)
     return MNL_CB_OK;
 
   if (mnl_attr_get_type(attr) == TCA_STATS_BASIC) {
-    if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(**bs)) < 0) {
+    if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*q_stats->bs)) < 0) {
       ERROR("netlink plugin: qos_attr_cb: TCA_STATS_BASIC mnl_attr_validate2 "
             "failed.");
       return MNL_CB_ERROR;
     }
-    *bs = mnl_attr_get_payload(attr);
-    return MNL_CB_STOP;
+    q_stats->bs = mnl_attr_get_payload(attr);
+    return MNL_CB_OK;
+  }
+
+  if (mnl_attr_get_type(attr) == TCA_STATS_QUEUE) {
+    if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*q_stats->qs)) < 0) {
+      ERROR("netlink plugin: qos_attr_cb: TCA_STATS_QUEUE mnl_attr_validate2 "
+            "failed.");
+      return MNL_CB_ERROR;
+    }
+    q_stats->qs = mnl_attr_get_payload(attr);
+    return MNL_CB_OK;
   }
 
   return MNL_CB_OK;
@@ -470,7 +485,7 @@ static int qos_filter_cb(const struct nlmsghdr *nlh, void *args) {
 
   if (kind == NULL) {
     ERROR("netlink plugin: qos_filter_cb: kind == NULL");
-    return (-1);
+    return -1;
   }
 
   { /* The ID */
@@ -492,7 +507,9 @@ static int qos_filter_cb(const struct nlmsghdr *nlh, void *args) {
 
 #if HAVE_TCA_STATS2
   mnl_attr_for_each(attr, nlh, sizeof(*tm)) {
-    struct gnet_stats_basic *bs = NULL;
+    struct qos_stats q_stats;
+
+    memset(&q_stats, 0x0, sizeof(q_stats));
 
     if (mnl_attr_get_type(attr) != TCA_STATS2)
       continue;
@@ -503,9 +520,9 @@ static int qos_filter_cb(const struct nlmsghdr *nlh, void *args) {
       return MNL_CB_ERROR;
     }
 
-    mnl_attr_parse_nested(attr, qos_attr_cb, &bs);
+    mnl_attr_parse_nested(attr, qos_attr_cb, &q_stats);
 
-    if (bs != NULL) {
+    if (q_stats.bs != NULL || q_stats.qs != NULL) {
       char type_instance[DATA_MAX_NAME_LEN];
 
       stats_submitted = 1;
@@ -513,8 +530,13 @@ static int qos_filter_cb(const struct nlmsghdr *nlh, void *args) {
       ssnprintf(type_instance, sizeof(type_instance), "%s-%s", tc_type,
                 tc_inst);
 
-      submit_one(dev, "ipt_bytes", type_instance, bs->bytes);
-      submit_one(dev, "ipt_packets", type_instance, bs->packets);
+      if (q_stats.bs != NULL) {
+        submit_one(dev, "ipt_bytes", type_instance, q_stats.bs->bytes);
+        submit_one(dev, "ipt_packets", type_instance, q_stats.bs->packets);
+      }
+      if (q_stats.qs != NULL) {
+        submit_one(dev, "if_tx_dropped", type_instance, q_stats.qs->drops);
+      }
     }
 
     break;
@@ -566,12 +588,12 @@ static int ir_config(const char *key, const char *value) {
 
   new_val = strdup(value);
   if (new_val == NULL)
-    return (-1);
+    return -1;
 
   fields_num = strsplit(new_val, fields, STATIC_ARRAY_SIZE(fields));
   if ((fields_num < 1) || (fields_num > 8)) {
     sfree(new_val);
-    return (-1);
+    return -1;
   }
 
   if ((strcasecmp(key, "Interface") == 0) ||
@@ -594,7 +616,7 @@ static int ir_config(const char *key, const char *value) {
       ERROR("netlink plugin: Invalid number of fields for option "
             "`%s'. Got %i, expected 1 or 2.",
             key, fields_num);
-      return (-1);
+      return -1;
     } else {
       add_ignorelist(fields[0], key, (fields_num == 2) ? fields[1] : NULL);
       status = 0;
@@ -616,22 +638,22 @@ static int ir_config(const char *key, const char *value) {
 
   sfree(new_val);
 
-  return (status);
+  return status;
 } /* int ir_config */
 
 static int ir_init(void) {
   nl = mnl_socket_open(NETLINK_ROUTE);
   if (nl == NULL) {
     ERROR("netlink plugin: ir_init: mnl_socket_open failed.");
-    return (-1);
+    return -1;
   }
 
   if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
     ERROR("netlink plugin: ir_init: mnl_socket_bind failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int ir_init */
 
 static int ir_read(void) {
@@ -655,7 +677,7 @@ static int ir_read(void) {
 
   if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
     ERROR("netlink plugin: ir_read: rtnl_wilddump_request failed.");
-    return (-1);
+    return -1;
   }
 
   ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
@@ -667,7 +689,7 @@ static int ir_read(void) {
   }
   if (ret < 0) {
     ERROR("netlink plugin: ir_read: mnl_socket_recvfrom failed.");
-    return (-1);
+    return -1;
   }
 
   /* `link_filter_cb' will update `iflist' which is used here to iterate
@@ -718,7 +740,7 @@ static int ir_read(void) {
     } /* for (type_index) */
   }   /* for (if_index) */
 
-  return (0);
+  return 0;
 } /* int ir_read */
 
 static int ir_shutdown(void) {
@@ -727,7 +749,7 @@ static int ir_shutdown(void) {
     nl = NULL;
   }
 
-  return (0);
+  return 0;
 } /* int ir_shutdown */
 
 void module_register(void) {
@@ -736,7 +758,3 @@ void module_register(void) {
   plugin_register_read("netlink", ir_read);
   plugin_register_shutdown("netlink", ir_shutdown);
 } /* void module_register */
-
-/*
- * vim: set shiftwidth=2 softtabstop=2 tabstop=8 :
- */
index f93f49c..00c6c75 100644 (file)
@@ -51,7 +51,7 @@
 #include <net/if.h>
 #endif
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 #if defined __APPLE__
 /* default xcode compiler throws warnings even when deprecated functionality
  * is not used. -Werror breaks the build because of erroneous warnings.
@@ -96,7 +96,7 @@ GCRY_THREAD_OPTION_PTHREAD_IMPL;
  * Private data types
  */
 #define SECURITY_LEVEL_NONE 0
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 #define SECURITY_LEVEL_SIGN 1
 #define SECURITY_LEVEL_ENCRYPT 2
 #endif
@@ -104,7 +104,7 @@ struct sockent_client {
   int fd;
   struct sockaddr_storage *addr;
   socklen_t addrlen;
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   int security_level;
   char *username;
   char *password;
@@ -118,7 +118,7 @@ struct sockent_client {
 struct sockent_server {
   int *fd;
   size_t fd_num;
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   int security_level;
   char *auth_file;
   fbhash_t *userdb;
@@ -324,9 +324,9 @@ static _Bool check_receive_okay(const value_list_t *vl) /* {{{ */
   /* This is a value we already sent. Don't allow it to be received again in
    * order to avoid looping. */
   if ((status == 0) && (time_sent >= ((uint64_t)vl->time)))
-    return (0);
+    return 0;
 
-  return (1);
+  return 1;
 } /* }}} _Bool check_receive_okay */
 
 static _Bool check_send_okay(const value_list_t *vl) /* {{{ */
@@ -335,24 +335,24 @@ static _Bool check_send_okay(const value_list_t *vl) /* {{{ */
   int status;
 
   if (network_config_forward)
-    return (1);
+    return 1;
 
   if (vl->meta == NULL)
-    return (1);
+    return 1;
 
   status = meta_data_get_boolean(vl->meta, "network:received", &received);
   if (status == -ENOENT)
-    return (1);
+    return 1;
   else if (status != 0) {
     ERROR("network plugin: check_send_okay: meta_data_get_boolean failed "
           "with status %i.",
           status);
-    return (1);
+    return 1;
   }
 
   /* By default, only *send* value lists that were not *received* by the
    * network plugin. */
-  return (!received);
+  return !received;
 } /* }}} _Bool check_send_okay */
 
 static _Bool check_notify_received(const notification_t *n) /* {{{ */
@@ -360,9 +360,9 @@ static _Bool check_notify_received(const notification_t *n) /* {{{ */
   for (notification_meta_t *ptr = n->meta; ptr != NULL; ptr = ptr->next)
     if ((strcmp("network:received", ptr->name) == 0) &&
         (ptr->type == NM_TYPE_BOOLEAN))
-      return ((_Bool)ptr->nm_value.nm_boolean);
+      return (_Bool)ptr->nm_value.nm_boolean;
 
-  return (0);
+  return 0;
 } /* }}} _Bool check_notify_received */
 
 static _Bool check_send_notify_okay(const notification_t *n) /* {{{ */
@@ -371,7 +371,7 @@ static _Bool check_send_notify_okay(const notification_t *n) /* {{{ */
   _Bool received = 0;
 
   if (n->meta == NULL)
-    return (1);
+    return 1;
 
   received = check_notify_received(n);
 
@@ -387,7 +387,7 @@ static _Bool check_send_notify_okay(const notification_t *n) /* {{{ */
 
   /* By default, only *send* value lists that were not *received* by the
    * network plugin. */
-  return (!received);
+  return !received;
 } /* }}} _Bool check_send_notify_okay */
 
 static int network_dispatch_values(value_list_t *vl, /* {{{ */
@@ -396,7 +396,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
 
   if ((vl->time == 0) || (strlen(vl->host) == 0) || (strlen(vl->plugin) == 0) ||
       (strlen(vl->type) == 0))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (!check_receive_okay(vl)) {
 #if COLLECT_DEBUG
@@ -408,7 +408,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
           name);
 #endif
     stats_values_not_dispatched++;
-    return (0);
+    return 0;
   }
 
   assert(vl->meta == NULL);
@@ -416,7 +416,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
   vl->meta = meta_data_create();
   if (vl->meta == NULL) {
     ERROR("network plugin: meta_data_create failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   status = meta_data_add_boolean(vl->meta, "network:received", 1);
@@ -424,7 +424,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
     ERROR("network plugin: meta_data_add_boolean failed.");
     meta_data_destroy(vl->meta);
     vl->meta = NULL;
-    return (status);
+    return status;
   }
 
   if (username != NULL) {
@@ -433,7 +433,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
       ERROR("network plugin: meta_data_add_string failed.");
       meta_data_destroy(vl->meta);
       vl->meta = NULL;
-      return (status);
+      return status;
     }
   }
 
@@ -443,7 +443,7 @@ static int network_dispatch_values(value_list_t *vl, /* {{{ */
   meta_data_destroy(vl->meta);
   vl->meta = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int network_dispatch_values */
 
 static int network_dispatch_notification(notification_t *n) /* {{{ */
@@ -457,7 +457,7 @@ static int network_dispatch_notification(notification_t *n) /* {{{ */
     ERROR("network plugin: plugin_notification_meta_add_boolean failed.");
     plugin_notification_meta_free(n->meta);
     n->meta = NULL;
-    return (status);
+    return status;
   }
 
   status = plugin_dispatch_notification(n);
@@ -465,10 +465,10 @@ static int network_dispatch_notification(notification_t *n) /* {{{ */
   plugin_notification_meta_free(n->meta);
   n->meta = NULL;
 
-  return (status);
+  return status;
 } /* }}} int network_dispatch_notification */
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 static int network_init_gcrypt(void) /* {{{ */
 {
   gcry_error_t err;
@@ -477,7 +477,7 @@ static int network_init_gcrypt(void) /* {{{ */
    * Because you can't know in a library whether another library has
    * already initialized the library */
   if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P))
-    return (0);
+    return 0;
 
 /* http://www.gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
  * To ensure thread-safety, it's important to set GCRYCTL_SET_THREAD_CBS
@@ -491,7 +491,7 @@ static int network_init_gcrypt(void) /* {{{ */
   if (err) {
     ERROR("network plugin: gcry_control (GCRYCTL_SET_THREAD_CBS) failed: %s",
           gcry_strerror(err));
-    return (-1);
+    return -1;
   }
 #endif
 
@@ -501,11 +501,11 @@ static int network_init_gcrypt(void) /* {{{ */
   if (err) {
     ERROR("network plugin: gcry_control (GCRYCTL_INIT_SECMEM) failed: %s",
           gcry_strerror(err));
-    return (-1);
+    return -1;
   }
 
   gcry_control(GCRYCTL_INITIALIZATION_FINISHED);
-  return (0);
+  return 0;
 } /* }}} int network_init_gcrypt */
 
 static gcry_cipher_hd_t network_get_aes256_cypher(sockent_t *se, /* {{{ */
@@ -525,11 +525,11 @@ static gcry_cipher_hd_t network_get_aes256_cypher(sockent_t *se, /* {{{ */
     cyper_ptr = &se->data.server.cypher;
 
     if (username == NULL)
-      return (NULL);
+      return NULL;
 
     secret = fbh_get(se->data.server.userdb, username);
     if (secret == NULL)
-      return (NULL);
+      return NULL;
 
     gcry_md_hash_buffer(GCRY_MD_SHA256, password_hash, secret, strlen(secret));
 
@@ -543,7 +543,7 @@ static gcry_cipher_hd_t network_get_aes256_cypher(sockent_t *se, /* {{{ */
       ERROR("network plugin: gcry_cipher_open returned: %s",
             gcry_strerror(err));
       *cyper_ptr = NULL;
-      return (NULL);
+      return NULL;
     }
   } else {
     gcry_cipher_reset(*cyper_ptr);
@@ -556,7 +556,7 @@ static gcry_cipher_hd_t network_get_aes256_cypher(sockent_t *se, /* {{{ */
           gcry_strerror(err));
     gcry_cipher_close(*cyper_ptr);
     *cyper_ptr = NULL;
-    return (NULL);
+    return NULL;
   }
 
   err = gcry_cipher_setiv(*cyper_ptr, iv, iv_size);
@@ -565,12 +565,12 @@ static gcry_cipher_hd_t network_get_aes256_cypher(sockent_t *se, /* {{{ */
           gcry_strerror(err));
     gcry_cipher_close(*cyper_ptr);
     *cyper_ptr = NULL;
-    return (NULL);
+    return NULL;
   }
 
-  return (*cyper_ptr);
+  return *cyper_ptr;
 } /* }}} int network_get_aes256_cypher */
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
 static int write_part_values(char **ret_buffer, size_t *ret_buffer_len,
                              const data_set_t *ds, const value_list_t *vl) {
@@ -590,19 +590,19 @@ static int write_part_values(char **ret_buffer, size_t *ret_buffer_len,
                (num_values * sizeof(uint8_t)) + (num_values * sizeof(value_t));
 
   if (*ret_buffer_len < packet_len)
-    return (-1);
+    return -1;
 
   pkg_values_types = malloc(num_values * sizeof(*pkg_values_types));
   if (pkg_values_types == NULL) {
     ERROR("network plugin: write_part_values: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   pkg_values = malloc(num_values * sizeof(*pkg_values));
   if (pkg_values == NULL) {
     free(pkg_values_types);
     ERROR("network plugin: write_part_values: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   pkg_ph.type = htons(TYPE_VALUES);
@@ -635,7 +635,7 @@ static int write_part_values(char **ret_buffer, size_t *ret_buffer_len,
       ERROR("network plugin: write_part_values: "
             "Unknown data source type: %i",
             ds->ds[i].type);
-      return (-1);
+      return -1;
     } /* switch (ds->ds[i].type) */
   }   /* for (num_values) */
 
@@ -663,7 +663,7 @@ static int write_part_values(char **ret_buffer, size_t *ret_buffer_len,
   free(pkg_values_types);
   free(pkg_values);
 
-  return (0);
+  return 0;
 } /* int write_part_values */
 
 static int write_part_number(char **ret_buffer, size_t *ret_buffer_len,
@@ -679,7 +679,7 @@ static int write_part_number(char **ret_buffer, size_t *ret_buffer_len,
   packet_len = sizeof(pkg_head) + sizeof(pkg_value);
 
   if (*ret_buffer_len < packet_len)
-    return (-1);
+    return -1;
 
   pkg_head.type = htons(type);
   pkg_head.length = htons(packet_len);
@@ -697,7 +697,7 @@ static int write_part_number(char **ret_buffer, size_t *ret_buffer_len,
   *ret_buffer = packet_ptr + packet_len;
   *ret_buffer_len -= packet_len;
 
-  return (0);
+  return 0;
 } /* int write_part_number */
 
 static int write_part_string(char **ret_buffer, size_t *ret_buffer_len,
@@ -712,7 +712,7 @@ static int write_part_string(char **ret_buffer, size_t *ret_buffer_len,
 
   buffer_len = 2 * sizeof(uint16_t) + str_len + 1;
   if (*ret_buffer_len < buffer_len)
-    return (-1);
+    return -1;
 
   pkg_type = htons(type);
   pkg_length = htons(buffer_len);
@@ -733,7 +733,7 @@ static int write_part_string(char **ret_buffer, size_t *ret_buffer_len,
   *ret_buffer = buffer + buffer_len;
   *ret_buffer_len -= buffer_len;
 
-  return (0);
+  return 0;
 } /* int write_part_string */
 
 static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
@@ -755,7 +755,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
     NOTICE("network plugin: packet is too short: "
            "buffer_len = %zu",
            buffer_len);
-    return (-1);
+    return -1;
   }
 
   memcpy((void *)&tmp16, buffer, sizeof(tmp16));
@@ -780,7 +780,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
             "Chunk of size %zu expected, "
             "but buffer has only %zu bytes left.",
             exp_size, buffer_len);
-    return (-1);
+    return -1;
   }
   assert(pkg_numval <= ((buffer_len - 6) / 9));
 
@@ -788,7 +788,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
     WARNING("network plugin: parse_part_values: "
             "Length and number of values "
             "in the packet don't match.");
-    return (-1);
+    return -1;
   }
 
   pkg_types = calloc(pkg_numval, sizeof(*pkg_types));
@@ -797,7 +797,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
     sfree(pkg_types);
     sfree(pkg_values);
     ERROR("network plugin: parse_part_values: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   memcpy(pkg_types, buffer, pkg_numval * sizeof(*pkg_types));
@@ -829,7 +829,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
              pkg_types[i]);
       sfree(pkg_types);
       sfree(pkg_values);
-      return (-1);
+      return -1;
     } /* switch (pkg_types[i]) */
   }
 
@@ -840,7 +840,7 @@ static int parse_part_values(void **ret_buffer, size_t *ret_buffer_len,
 
   sfree(pkg_types);
 
-  return (0);
+  return 0;
 } /* int parse_part_values */
 
 static int parse_part_number(void **ret_buffer, size_t *ret_buffer_len,
@@ -860,7 +860,7 @@ static int parse_part_number(void **ret_buffer, size_t *ret_buffer_len,
             "Chunk of size %zu expected, "
             "but buffer has only %zu bytes left.",
             exp_size, buffer_len);
-    return (-1);
+    return -1;
   }
 
   memcpy((void *)&tmp16, buffer, sizeof(tmp16));
@@ -878,7 +878,7 @@ static int parse_part_number(void **ret_buffer, size_t *ret_buffer_len,
   *ret_buffer = buffer;
   *ret_buffer_len = buffer_len - pkg_length;
 
-  return (0);
+  return 0;
 } /* int parse_part_number */
 
 static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
@@ -893,7 +893,7 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
   size_t payload_size;
 
   if (output_len == 0)
-    return (EINVAL);
+    return EINVAL;
 
   if (buffer_len < header_size) {
     WARNING("network plugin: parse_part_string: "
@@ -901,7 +901,7 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
             "Chunk of at least size %zu expected, "
             "but buffer has only %zu bytes left.",
             header_size, buffer_len);
-    return (-1);
+    return -1;
   }
 
   memcpy((void *)&tmp16, buffer, sizeof(tmp16));
@@ -920,7 +920,7 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
             "Chunk of size %" PRIu16 " received, "
             "but buffer has only %zu bytes left.",
             pkg_length, buffer_len);
-    return (-1);
+    return -1;
   }
 
   /* Check that pkg_length is in the valid range */
@@ -930,7 +930,7 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
             "Header claims this packet is only %hu "
             "bytes long.",
             pkg_length);
-    return (-1);
+    return -1;
   }
 
   /* Check that the package data fits into the output buffer.
@@ -943,7 +943,7 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
             "which is too small to hold the received "
             "%zu byte string.",
             output_len, payload_size);
-    return (-1);
+    return -1;
   }
 
   /* All sanity checks successfull, let's copy the data over */
@@ -956,13 +956,13 @@ static int parse_part_string(void **ret_buffer, size_t *ret_buffer_len,
     WARNING("network plugin: parse_part_string: "
             "Received string does not end "
             "with a NULL-byte.");
-    return (-1);
+    return -1;
   }
 
   *ret_buffer = buffer;
   *ret_buffer_len = buffer_len - pkg_length;
 
-  return (0);
+  return 0;
 } /* int parse_part_string */
 
 /* Forward declaration: parse_part_sign_sha256 and parse_part_encr_aes256 call
@@ -978,7 +978,7 @@ static int parse_packet(sockent_t *se, void *buffer, size_t buffer_size,
     buffer_offset += (s);                                                      \
   } while (0)
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
                                   void **ret_buffer, size_t *ret_buffer_len,
                                   int flags) {
@@ -1005,7 +1005,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
 
   /* Check if the buffer has enough data for this structure. */
   if (buffer_len <= PART_SIGNATURE_SHA256_SIZE)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   /* Read type and length header */
   BUFFER_READ(&pss.head.type, sizeof(pss.head.type));
@@ -1016,7 +1016,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   if ((pss_head_length <= PART_SIGNATURE_SHA256_SIZE) ||
       (pss_head_length > buffer_len)) {
     ERROR("network plugin: HMAC-SHA-256 with invalid length received.");
-    return (-1);
+    return -1;
   }
 
   if (se->data.server.userdb == NULL) {
@@ -1028,7 +1028,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
     *ret_buffer = buffer + pss_head_length;
     *ret_buffer_len -= pss_head_length;
 
-    return (0);
+    return 0;
   }
 
   /* Copy the hash. */
@@ -1038,7 +1038,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   username_len = pss_head_length - PART_SIGNATURE_SHA256_SIZE;
   pss.username = malloc(username_len + 1);
   if (pss.username == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   /* Read the username */
   BUFFER_READ(pss.username, username_len);
@@ -1051,7 +1051,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   if (secret == NULL) {
     ERROR("network plugin: Unknown user: %s", pss.username);
     sfree(pss.username);
-    return (-ENOENT);
+    return -ENOENT;
   }
 
   /* Create a hash device and check the HMAC */
@@ -1062,7 +1062,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
           gcry_strerror(err));
     sfree(secret);
     sfree(pss.username);
-    return (-1);
+    return -1;
   }
 
   err = gcry_md_setkey(hd, secret, strlen(secret));
@@ -1071,7 +1071,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
     gcry_md_close(hd);
     sfree(secret);
     sfree(pss.username);
-    return (-1);
+    return -1;
   }
 
   gcry_md_write(hd, buffer + PART_SIGNATURE_SHA256_SIZE,
@@ -1082,7 +1082,7 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
     gcry_md_close(hd);
     sfree(secret);
     sfree(pss.username);
-    return (-1);
+    return -1;
   }
   memcpy(hash, hash_ptr, sizeof(hash));
 
@@ -1105,11 +1105,11 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   *ret_buffer = buffer + buffer_len;
   *ret_buffer_len = 0;
 
-  return (0);
+  return 0;
 } /* }}} int parse_part_sign_sha256 */
-/* #endif HAVE_LIBGCRYPT */
+/* #endif HAVE_GCRYPT_H */
 
-#else  /* if !HAVE_LIBGCRYPT */
+#else  /* if !HAVE_GCRYPT_H */
 static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
                                   void **ret_buffer, size_t *ret_buffer_size,
                                   int flags) {
@@ -1127,14 +1127,14 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   buffer_offset = 0;
 
   if (buffer_size <= PART_SIGNATURE_SHA256_SIZE)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   BUFFER_READ(&pss.head.type, sizeof(pss.head.type));
   BUFFER_READ(&pss.head.length, sizeof(pss.head.length));
   part_len = ntohs(pss.head.length);
 
   if ((part_len <= PART_SIGNATURE_SHA256_SIZE) || (part_len > buffer_size))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (warning_has_been_printed == 0) {
     WARNING("network plugin: Received signed packet, but the network "
@@ -1149,11 +1149,11 @@ static int parse_part_sign_sha256(sockent_t *se, /* {{{ */
   *ret_buffer = buffer + buffer_size;
   *ret_buffer_size = 0;
 
-  return (0);
+  return 0;
 } /* }}} int parse_part_sign_sha256 */
-#endif /* !HAVE_LIBGCRYPT */
+#endif /* !HAVE_GCRYPT_H */
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
                                   void **ret_buffer, size_t *ret_buffer_len,
                                   int flags) {
@@ -1173,7 +1173,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   if (buffer_len <= PART_ENCRYPTION_AES256_SIZE) {
     NOTICE("network plugin: parse_part_encr_aes256: "
            "Discarding short packet.");
-    return (-1);
+    return -1;
   }
 
   buffer_offset = 0;
@@ -1187,7 +1187,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   if ((part_size <= PART_ENCRYPTION_AES256_SIZE) || (part_size > buffer_len)) {
     NOTICE("network plugin: parse_part_encr_aes256: "
            "Discarding part with invalid size.");
-    return (-1);
+    return -1;
   }
 
   /* Read the username */
@@ -1198,13 +1198,13 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
       (username_len > (part_size - (PART_ENCRYPTION_AES256_SIZE + 1)))) {
     NOTICE("network plugin: parse_part_encr_aes256: "
            "Discarding part with invalid username length.");
-    return (-1);
+    return -1;
   }
 
   assert(username_len > 0);
   pea.username = malloc(username_len + 1);
   if (pea.username == NULL)
-    return (-ENOMEM);
+    return -ENOMEM;
   BUFFER_READ(pea.username, username_len);
   pea.username[username_len] = 0;
 
@@ -1219,7 +1219,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   if (cypher == NULL) {
     ERROR("network plugin: Failed to get cypher. Username: %s", pea.username);
     sfree(pea.username);
-    return (-1);
+    return -1;
   }
 
   payload_len = part_size - (PART_ENCRYPTION_AES256_SIZE + username_len);
@@ -1233,7 +1233,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
     sfree(pea.username);
     ERROR("network plugin: gcry_cipher_decrypt returned: %s. Username: %s",
           gcry_strerror(err), pea.username);
-    return (-1);
+    return -1;
   }
 
   /* Read the hash */
@@ -1248,7 +1248,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   if (memcmp(hash, pea.hash, sizeof(hash)) != 0) {
     ERROR("network plugin: Checksum mismatch. Username: %s", pea.username);
     sfree(pea.username);
-    return (-1);
+    return -1;
   }
 
   parse_packet(se, buffer + buffer_offset, payload_len, flags | PP_ENCRYPTED,
@@ -1262,11 +1262,11 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
 
   sfree(pea.username);
 
-  return (0);
+  return 0;
 } /* }}} int parse_part_encr_aes256 */
-/* #endif HAVE_LIBGCRYPT */
+/* #endif HAVE_GCRYPT_H */
 
-#else  /* if !HAVE_LIBGCRYPT */
+#else  /* if !HAVE_GCRYPT_H */
 static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
                                   void **ret_buffer, size_t *ret_buffer_size,
                                   int flags) {
@@ -1293,7 +1293,7 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   if ((ph_length <= PART_ENCRYPTION_AES256_SIZE) || (ph_length > buffer_size)) {
     ERROR("network plugin: AES-256 encrypted part "
           "with invalid length received.");
-    return (-1);
+    return -1;
   }
 
   if (warning_has_been_printed == 0) {
@@ -1306,9 +1306,9 @@ static int parse_part_encr_aes256(sockent_t *se, /* {{{ */
   *ret_buffer = (void *)(((char *)*ret_buffer) + ph_length);
   *ret_buffer_size -= ph_length;
 
-  return (0);
+  return 0;
 } /* }}} int parse_part_encr_aes256 */
-#endif /* !HAVE_LIBGCRYPT */
+#endif /* !HAVE_GCRYPT_H */
 
 #undef BUFFER_READ
 
@@ -1320,11 +1320,11 @@ static int parse_packet(sockent_t *se, /* {{{ */
   value_list_t vl = VALUE_LIST_INIT;
   notification_t n = {0};
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   int packet_was_signed = (flags & PP_SIGNED);
   int packet_was_encrypted = (flags & PP_ENCRYPTED);
   int printed_ignore_warning = 0;
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
   memset(&vl, '\0', sizeof(vl));
   status = 0;
@@ -1357,7 +1357,7 @@ static int parse_packet(sockent_t *se, /* {{{ */
         break;
       }
     }
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     else if ((se->data.server.security_level == SECURITY_LEVEL_ENCRYPT) &&
              (packet_was_encrypted == 0)) {
       if (printed_ignore_warning == 0) {
@@ -1369,7 +1369,7 @@ static int parse_packet(sockent_t *se, /* {{{ */
       buffer_size -= (size_t)pkg_length;
       continue;
     }
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
     else if (pkg_type == TYPE_SIGN_SHA256) {
       status = parse_part_sign_sha256(se, &buffer, &buffer_size, flags);
       if (status != 0) {
@@ -1380,7 +1380,7 @@ static int parse_packet(sockent_t *se, /* {{{ */
         break;
       }
     }
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     else if ((se->data.server.security_level == SECURITY_LEVEL_SIGN) &&
              (packet_was_encrypted == 0) && (packet_was_signed == 0)) {
       if (printed_ignore_warning == 0) {
@@ -1392,7 +1392,7 @@ static int parse_packet(sockent_t *se, /* {{{ */
       buffer_size -= (size_t)pkg_length;
       continue;
     }
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
     else if (pkg_type == TYPE_VALUES) {
       status =
           parse_part_values(&buffer, &buffer_size, &vl.values, &vl.values_len);
@@ -1493,7 +1493,7 @@ static int parse_packet(sockent_t *se, /* {{{ */
     WARNING("network plugin: parse_packet: Received truncated "
             "packet, try increasing `MaxPacketSize'");
 
-  return (status);
+  return status;
 } /* }}} int parse_packet */
 
 static void free_sockent_client(struct sockent_client *sec) /* {{{ */
@@ -1503,7 +1503,7 @@ static void free_sockent_client(struct sockent_client *sec) /* {{{ */
     sec->fd = -1;
   }
   sfree(sec->addr);
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   sfree(sec->username);
   sfree(sec->password);
   if (sec->cypher != NULL)
@@ -1521,7 +1521,7 @@ static void free_sockent_server(struct sockent_server *ses) /* {{{ */
   }
 
   sfree(ses->fd);
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   sfree(ses->auth_file);
   fbh_destroy(ses->userdb);
   if (ses->cypher != NULL)
@@ -1567,7 +1567,7 @@ static int network_set_ttl(const sockent_t *se, const struct addrinfo *ai) {
   assert(se->type == SOCKENT_TYPE_CLIENT);
 
   if ((network_config_ttl < 1) || (network_config_ttl > 255))
-    return (-1);
+    return -1;
 
   if (ai->ai_family == AF_INET) {
     struct sockaddr_in *addr = (struct sockaddr_in *)ai->ai_addr;
@@ -1583,7 +1583,7 @@ static int network_set_ttl(const sockent_t *se, const struct addrinfo *ai) {
       char errbuf[1024];
       ERROR("network plugin: setsockopt (ipv4-ttl): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   } else if (ai->ai_family == AF_INET6) {
     /* Useful example:
@@ -1601,11 +1601,11 @@ static int network_set_ttl(const sockent_t *se, const struct addrinfo *ai) {
       char errbuf[1024];
       ERROR("network plugin: setsockopt(ipv6-ttl): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   }
 
-  return (0);
+  return 0;
 } /* int network_set_ttl */
 
 static int network_set_interface(const sockent_t *se,
@@ -1639,10 +1639,10 @@ static int network_set_interface(const sockent_t *se,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (ipv4-multicast-if): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
-      return (0);
+      return 0;
     }
   } else if (ai->ai_family == AF_INET6) {
     struct sockaddr_in6 *addr = (struct sockaddr_in6 *)ai->ai_addr;
@@ -1653,10 +1653,10 @@ static int network_set_interface(const sockent_t *se,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (ipv6-multicast-if): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
-      return (0);
+      return 0;
     }
   }
 
@@ -1667,7 +1667,7 @@ static int network_set_interface(const sockent_t *se,
     char interface_name[IFNAMSIZ];
 
     if (if_indextoname(se->interface, interface_name) == NULL)
-      return (-1);
+      return -1;
 
     DEBUG("network plugin: Binding socket to interface %s", interface_name);
 
@@ -1676,7 +1676,7 @@ static int network_set_interface(const sockent_t *se,
       char errbuf[1024];
       ERROR("network plugin: setsockopt (bind-if): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
 /* #endif HAVE_IF_INDEXTONAME && SO_BINDTODEVICE */
 
@@ -1692,7 +1692,7 @@ static int network_set_interface(const sockent_t *se,
 #endif
   }
 
-  return (0);
+  return 0;
 } /* }}} network_set_interface */
 
 static int network_bind_socket(int fd, const struct addrinfo *ai,
@@ -1709,7 +1709,7 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
     char errbuf[1024];
     ERROR("network plugin: setsockopt (reuseaddr): %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   DEBUG("fd = %i; calling `bind'", fd);
@@ -1717,7 +1717,7 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
   if (bind(fd, ai->ai_addr, ai->ai_addrlen) == -1) {
     char errbuf[1024];
     ERROR("bind: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (ai->ai_family == AF_INET) {
@@ -1747,7 +1747,7 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (multicast-loop): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
       if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) ==
@@ -1755,10 +1755,10 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (add-membership): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
-      return (0);
+      return 0;
     }
   } else if (ai->ai_family == AF_INET6) {
     /* Useful example:
@@ -1787,7 +1787,7 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (ipv6-multicast-loop): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
       if (setsockopt(fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq,
@@ -1795,10 +1795,10 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
         char errbuf[1024];
         ERROR("network plugin: setsockopt (ipv6-add-membership): %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
-      return (0);
+      return 0;
     }
   }
 
@@ -1811,7 +1811,7 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
     char interface_name[IFNAMSIZ];
 
     if (if_indextoname(interface_idx, interface_name) == NULL)
-      return (-1);
+      return -1;
 
     DEBUG("fd = %i; Binding socket to interface %s", fd, interface_name);
 
@@ -1820,12 +1820,12 @@ static int network_bind_socket(int fd, const struct addrinfo *ai,
       char errbuf[1024];
       ERROR("network plugin: setsockopt (bind-if): %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   }
 #endif /* HAVE_IF_INDEXTONAME && SO_BINDTODEVICE */
 
-  return (0);
+  return 0;
 } /* int network_bind_socket */
 
 /* Initialize a sockent structure. `type' must be either `SOCKENT_TYPE_CLIENT'
@@ -1835,11 +1835,11 @@ static sockent_t *sockent_create(int type) /* {{{ */
   sockent_t *se;
 
   if ((type != SOCKENT_TYPE_CLIENT) && (type != SOCKENT_TYPE_SERVER))
-    return (NULL);
+    return NULL;
 
   se = calloc(1, sizeof(*se));
   if (se == NULL)
-    return (NULL);
+    return NULL;
 
   se->type = type;
   se->node = NULL;
@@ -1850,7 +1850,7 @@ static sockent_t *sockent_create(int type) /* {{{ */
   if (type == SOCKENT_TYPE_SERVER) {
     se->data.server.fd = NULL;
     se->data.server.fd_num = 0;
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     se->data.server.security_level = SECURITY_LEVEL_NONE;
     se->data.server.auth_file = NULL;
     se->data.server.userdb = NULL;
@@ -1861,7 +1861,7 @@ static sockent_t *sockent_create(int type) /* {{{ */
     se->data.client.addr = NULL;
     se->data.client.resolve_interval = 0;
     se->data.client.next_resolve_reconnect = 0;
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     se->data.client.security_level = SECURITY_LEVEL_NONE;
     se->data.client.username = NULL;
     se->data.client.password = NULL;
@@ -1869,18 +1869,18 @@ static sockent_t *sockent_create(int type) /* {{{ */
 #endif
   }
 
-  return (se);
+  return se;
 } /* }}} sockent_t *sockent_create */
 
 static int sockent_init_crypto(sockent_t *se) /* {{{ */
 {
-#if HAVE_LIBGCRYPT /* {{{ */
+#if HAVE_GCRYPT_H /* {{{ */
   if (se->type == SOCKENT_TYPE_CLIENT) {
     if (se->data.client.security_level > SECURITY_LEVEL_NONE) {
       if (network_init_gcrypt() < 0) {
         ERROR("network plugin: Cannot configure client socket with "
               "security: Failed to initialize crypto library.");
-        return (-1);
+        return -1;
       }
 
       if ((se->data.client.username == NULL) ||
@@ -1888,7 +1888,7 @@ static int sockent_init_crypto(sockent_t *se) /* {{{ */
         ERROR("network plugin: Client socket with "
               "security requested, but no "
               "credentials are configured.");
-        return (-1);
+        return -1;
       }
       gcry_md_hash_buffer(GCRY_MD_SHA256, se->data.client.password_hash,
                           se->data.client.password,
@@ -1900,26 +1900,26 @@ static int sockent_init_crypto(sockent_t *se) /* {{{ */
         (se->data.server.auth_file == NULL)) {
       ERROR("network plugin: Server socket with security requested, "
             "but no \"AuthFile\" is configured.");
-      return (-1);
+      return -1;
     }
     if (se->data.server.auth_file != NULL) {
       if (network_init_gcrypt() < 0) {
         ERROR("network plugin: Cannot configure server socket with security: "
               "Failed to initialize crypto library.");
-        return (-1);
+        return -1;
       }
 
       se->data.server.userdb = fbh_create(se->data.server.auth_file);
       if (se->data.server.userdb == NULL) {
         ERROR("network plugin: Reading password file \"%s\" failed.",
               se->data.server.auth_file);
-        return (-1);
+        return -1;
       }
     }
   }
-#endif /* }}} HAVE_LIBGCRYPT */
+#endif /* }}} HAVE_GCRYPT_H */
 
-  return (0);
+  return 0;
 } /* }}} int sockent_init_crypto */
 
 static int sockent_client_disconnect(sockent_t *se) /* {{{ */
@@ -1927,7 +1927,7 @@ static int sockent_client_disconnect(sockent_t *se) /* {{{ */
   struct sockent_client *client;
 
   if ((se == NULL) || (se->type != SOCKENT_TYPE_CLIENT))
-    return (EINVAL);
+    return EINVAL;
 
   client = &se->data.client;
   if (client->fd >= 0) /* connected */
@@ -1939,7 +1939,7 @@ static int sockent_client_disconnect(sockent_t *se) /* {{{ */
   sfree(client->addr);
   client->addrlen = 0;
 
-  return (0);
+  return 0;
 } /* }}} int sockent_client_disconnect */
 
 static int sockent_client_connect(sockent_t *se) /* {{{ */
@@ -1953,7 +1953,7 @@ static int sockent_client_connect(sockent_t *se) /* {{{ */
   cdtime_t now;
 
   if ((se == NULL) || (se->type != SOCKENT_TYPE_CLIENT))
-    return (EINVAL);
+    return EINVAL;
 
   client = &se->data.client;
 
@@ -1967,7 +1967,7 @@ static int sockent_client_connect(sockent_t *se) /* {{{ */
   }
 
   if (client->fd >= 0 && !reconnect) /* already connected and not stale*/
-    return (0);
+    return 0;
 
   struct addrinfo ai_hints = {.ai_family = AF_UNSPEC,
                               .ai_flags = AI_ADDRCONFIG,
@@ -1982,7 +1982,7 @@ static int sockent_client_connect(sockent_t *se) /* {{{ */
         LOG_ERR, &complaint, "network plugin: getaddrinfo (%s, %s) failed: %s",
         (se->node == NULL) ? "(null)" : se->node,
         (se->service == NULL) ? "(null)" : se->service, gai_strerror(status));
-    return (-1);
+    return -1;
   } else {
     c_release(LOG_NOTICE, &complaint,
               "network plugin: Successfully resolved \"%s\".", se->node);
@@ -2024,11 +2024,11 @@ static int sockent_client_connect(sockent_t *se) /* {{{ */
 
   freeaddrinfo(ai_list);
   if (client->fd < 0)
-    return (-1);
+    return -1;
 
   if (client->resolve_interval > 0)
     client->next_resolve_reconnect = now + client->resolve_interval;
-  return (0);
+  return 0;
 } /* }}} int sockent_client_connect */
 
 /* Open the file descriptors for a initialized sockent structure. */
@@ -2041,7 +2041,7 @@ static int sockent_server_listen(sockent_t *se) /* {{{ */
   const char *service;
 
   if (se == NULL)
-    return (-1);
+    return -1;
 
   assert(se->data.server.fd == NULL);
   assert(se->data.server.fd_num == 0);
@@ -2065,7 +2065,7 @@ static int sockent_server_listen(sockent_t *se) /* {{{ */
     ERROR("network plugin: getaddrinfo (%s, %s) failed: %s",
           (se->node == NULL) ? "(null)" : se->node,
           (se->service == NULL) ? "(null)" : se->service, gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -2103,8 +2103,8 @@ static int sockent_server_listen(sockent_t *se) /* {{{ */
   freeaddrinfo(ai_list);
 
   if (se->data.server.fd_num == 0)
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* }}} int sockent_server_listen */
 
 /* Add a sockent to the global list of sockets */
@@ -2113,7 +2113,7 @@ static int sockent_add(sockent_t *se) /* {{{ */
   sockent_t *last_ptr;
 
   if (se == NULL)
-    return (-1);
+    return -1;
 
   if (se->type == SOCKENT_TYPE_SERVER) {
     struct pollfd *tmp;
@@ -2122,7 +2122,7 @@ static int sockent_add(sockent_t *se) /* {{{ */
                   sizeof(*tmp) * (listen_sockets_num + se->data.server.fd_num));
     if (tmp == NULL) {
       ERROR("network plugin: realloc failed.");
-      return (-1);
+      return -1;
     }
     listen_sockets_pollfd = tmp;
     tmp = listen_sockets_pollfd + listen_sockets_num;
@@ -2138,14 +2138,14 @@ static int sockent_add(sockent_t *se) /* {{{ */
 
     if (listen_sockets == NULL) {
       listen_sockets = se;
-      return (0);
+      return 0;
     }
     last_ptr = listen_sockets;
   } else /* if (se->type == SOCKENT_TYPE_CLIENT) */
   {
     if (sending_sockets == NULL) {
       sending_sockets = se;
-      return (0);
+      return 0;
     }
     last_ptr = sending_sockets;
   }
@@ -2154,7 +2154,7 @@ static int sockent_add(sockent_t *se) /* {{{ */
     last_ptr = last_ptr->next;
   last_ptr->next = se;
 
-  return (0);
+  return 0;
 } /* }}} int sockent_add */
 
 static void *dispatch_thread(void __attribute__((unused)) * arg) /* {{{ */
@@ -2210,7 +2210,7 @@ static void *dispatch_thread(void __attribute__((unused)) * arg) /* {{{ */
     sfree(ent);
   } /* while (42) */
 
-  return (NULL);
+  return NULL;
 } /* }}} void *dispatch_thread */
 
 static int network_receive(void) /* {{{ */
@@ -2335,11 +2335,11 @@ static int network_receive(void) /* {{{ */
     pthread_mutex_unlock(&receive_list_lock);
   }
 
-  return (status);
+  return status;
 } /* }}} int network_receive */
 
 static void *receive_thread(void __attribute__((unused)) * arg) {
-  return (network_receive() ? (void *)1 : (void *)0);
+  return network_receive() ? (void *)1 : (void *)0;
 } /* void *receive_thread */
 
 static void network_init_buffer(void) {
@@ -2379,7 +2379,7 @@ static void network_send_buffer_plain(sockent_t *se, /* {{{ */
   } /* while (42) */
 } /* }}} void network_send_buffer_plain */
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 #define BUFFER_ADD(p, s)                                                       \
   do {                                                                         \
     memcpy(buffer + buffer_offset, (p), (s));                                  \
@@ -2529,20 +2529,20 @@ static void network_send_buffer_encrypted(sockent_t *se, /* {{{ */
   network_send_buffer_plain(se, buffer, buffer_size);
 } /* }}} void network_send_buffer_encrypted */
 #undef BUFFER_ADD
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
 static void network_send_buffer(char *buffer, size_t buffer_len) /* {{{ */
 {
   DEBUG("network plugin: network_send_buffer: buffer_len = %zu", buffer_len);
 
   for (sockent_t *se = sending_sockets; se != NULL; se = se->next) {
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     if (se->data.client.security_level == SECURITY_LEVEL_ENCRYPT)
       network_send_buffer_encrypted(se, buffer, buffer_len);
     else if (se->data.client.security_level == SECURITY_LEVEL_SIGN)
       network_send_buffer_signed(se, buffer, buffer_len);
     else /* if (se->data.client.security_level == SECURITY_LEVEL_NONE) */
-#endif   /* HAVE_LIBGCRYPT */
+#endif   /* HAVE_GCRYPT_H */
       network_send_buffer_plain(se, buffer, buffer_len);
   } /* for (sending_sockets) */
 } /* }}} void network_send_buffer */
@@ -2555,28 +2555,28 @@ static int add_to_buffer(char *buffer, size_t buffer_size, /* {{{ */
   if (strcmp(vl_def->host, vl->host) != 0) {
     if (write_part_string(&buffer, &buffer_size, TYPE_HOST, vl->host,
                           strlen(vl->host)) != 0)
-      return (-1);
+      return -1;
     sstrncpy(vl_def->host, vl->host, sizeof(vl_def->host));
   }
 
   if (vl_def->time != vl->time) {
     if (write_part_number(&buffer, &buffer_size, TYPE_TIME_HR,
                           (uint64_t)vl->time))
-      return (-1);
+      return -1;
     vl_def->time = vl->time;
   }
 
   if (vl_def->interval != vl->interval) {
     if (write_part_number(&buffer, &buffer_size, TYPE_INTERVAL_HR,
                           (uint64_t)vl->interval))
-      return (-1);
+      return -1;
     vl_def->interval = vl->interval;
   }
 
   if (strcmp(vl_def->plugin, vl->plugin) != 0) {
     if (write_part_string(&buffer, &buffer_size, TYPE_PLUGIN, vl->plugin,
                           strlen(vl->plugin)) != 0)
-      return (-1);
+      return -1;
     sstrncpy(vl_def->plugin, vl->plugin, sizeof(vl_def->plugin));
   }
 
@@ -2584,7 +2584,7 @@ static int add_to_buffer(char *buffer, size_t buffer_size, /* {{{ */
     if (write_part_string(&buffer, &buffer_size, TYPE_PLUGIN_INSTANCE,
                           vl->plugin_instance,
                           strlen(vl->plugin_instance)) != 0)
-      return (-1);
+      return -1;
     sstrncpy(vl_def->plugin_instance, vl->plugin_instance,
              sizeof(vl_def->plugin_instance));
   }
@@ -2592,22 +2592,22 @@ static int add_to_buffer(char *buffer, size_t buffer_size, /* {{{ */
   if (strcmp(vl_def->type, vl->type) != 0) {
     if (write_part_string(&buffer, &buffer_size, TYPE_TYPE, vl->type,
                           strlen(vl->type)) != 0)
-      return (-1);
+      return -1;
     sstrncpy(vl_def->type, ds->type, sizeof(vl_def->type));
   }
 
   if (strcmp(vl_def->type_instance, vl->type_instance) != 0) {
     if (write_part_string(&buffer, &buffer_size, TYPE_TYPE_INSTANCE,
                           vl->type_instance, strlen(vl->type_instance)) != 0)
-      return (-1);
+      return -1;
     sstrncpy(vl_def->type_instance, vl->type_instance,
              sizeof(vl_def->type_instance));
   }
 
   if (write_part_values(&buffer, &buffer_size, ds, vl) != 0)
-    return (-1);
+    return -1;
 
-  return (buffer - buffer_orig);
+  return buffer - buffer_orig;
 } /* }}} int add_to_buffer */
 
 static void flush_buffer(void) {
@@ -2645,7 +2645,7 @@ static int network_write(const data_set_t *ds, const value_list_t *vl,
     pthread_mutex_lock(&stats_lock);
     stats_values_not_sent++;
     pthread_mutex_unlock(&stats_lock);
-    return (0);
+    return 0;
   }
 
   uc_meta_data_add_unsigned_int(vl, "network:time_sent", (uint64_t)vl->time);
@@ -2688,7 +2688,7 @@ static int network_write(const data_set_t *ds, const value_list_t *vl,
 
   pthread_mutex_unlock(&send_buffer_lock);
 
-  return ((status < 0) ? -1 : 0);
+  return (status < 0) ? -1 : 0;
 } /* int network_write */
 
 static int network_config_set_ttl(const oconfig_item_t *ci) /* {{{ */
@@ -2696,15 +2696,15 @@ static int network_config_set_ttl(const oconfig_item_t *ci) /* {{{ */
   int tmp = 0;
 
   if (cf_util_get_int(ci, &tmp) != 0)
-    return (-1);
+    return -1;
   else if ((tmp > 0) && (tmp <= 255))
     network_config_ttl = tmp;
   else {
     WARNING("network plugin: The `TimeToLive' must be between 1 and 255.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config_set_ttl */
 
 static int network_config_set_interface(const oconfig_item_t *ci, /* {{{ */
@@ -2712,10 +2712,10 @@ static int network_config_set_interface(const oconfig_item_t *ci, /* {{{ */
   char if_name[256];
 
   if (cf_util_get_string_buffer(ci, if_name, sizeof(if_name)) != 0)
-    return (-1);
+    return -1;
 
   *interface = if_nametoindex(if_name);
-  return (0);
+  return 0;
 } /* }}} int network_config_set_interface */
 
 static int network_config_set_buffer_size(const oconfig_item_t *ci) /* {{{ */
@@ -2723,26 +2723,26 @@ static int network_config_set_buffer_size(const oconfig_item_t *ci) /* {{{ */
   int tmp = 0;
 
   if (cf_util_get_int(ci, &tmp) != 0)
-    return (-1);
+    return -1;
   else if ((tmp >= 1024) && (tmp <= 65535))
     network_config_packet_size = tmp;
   else {
     WARNING(
         "network plugin: The `MaxPacketSize' must be between 1024 and 65535.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config_set_buffer_size */
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
 static int network_config_set_security_level(oconfig_item_t *ci, /* {{{ */
                                              int *retval) {
   char *str;
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("network plugin: The `SecurityLevel' config option needs exactly "
             "one string argument.");
-    return (-1);
+    return -1;
   }
 
   str = ci->values[0].value.string;
@@ -2754,12 +2754,12 @@ static int network_config_set_security_level(oconfig_item_t *ci, /* {{{ */
     *retval = SECURITY_LEVEL_NONE;
   else {
     WARNING("network plugin: Unknown security level: %s.", str);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config_set_security_level */
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
 static int network_config_add_listen(const oconfig_item_t *ci) /* {{{ */
 {
@@ -2772,13 +2772,13 @@ static int network_config_add_listen(const oconfig_item_t *ci) /* {{{ */
     ERROR("network plugin: The `%s' config option needs "
           "one or two string arguments.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   se = sockent_create(SOCKENT_TYPE_SERVER);
   if (se == NULL) {
     ERROR("network plugin: sockent_create failed.");
-    return (-1);
+    return -1;
   }
 
   se->node = strdup(ci->values[0].value.string);
@@ -2788,13 +2788,13 @@ static int network_config_add_listen(const oconfig_item_t *ci) /* {{{ */
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     if (strcasecmp("AuthFile", child->key) == 0)
       cf_util_get_string(child, &se->data.server.auth_file);
     else if (strcasecmp("SecurityLevel", child->key) == 0)
       network_config_set_security_level(child, &se->data.server.security_level);
     else
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
         if (strcasecmp("Interface", child->key) == 0)
       network_config_set_interface(child, &se->interface);
     else {
@@ -2802,23 +2802,23 @@ static int network_config_add_listen(const oconfig_item_t *ci) /* {{{ */
     }
   }
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   if ((se->data.server.security_level > SECURITY_LEVEL_NONE) &&
       (se->data.server.auth_file == NULL)) {
     ERROR("network plugin: A security level higher than `none' was "
           "requested, but no AuthFile option was given. Cowardly refusing to "
           "open this socket!");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
   status = sockent_init_crypto(se);
   if (status != 0) {
     ERROR("network plugin: network_config_add_listen: sockent_init_crypto() "
           "failed.");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
 
   status = sockent_server_listen(se);
@@ -2826,17 +2826,17 @@ static int network_config_add_listen(const oconfig_item_t *ci) /* {{{ */
     ERROR("network plugin: network_config_add_listen: sockent_server_listen "
           "failed.");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
 
   status = sockent_add(se);
   if (status != 0) {
     ERROR("network plugin: network_config_add_listen: sockent_add failed.");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config_add_listen */
 
 static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
@@ -2850,13 +2850,13 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
     ERROR("network plugin: The `%s' config option needs "
           "one or two string arguments.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   se = sockent_create(SOCKENT_TYPE_CLIENT);
   if (se == NULL) {
     ERROR("network plugin: sockent_create failed.");
-    return (-1);
+    return -1;
   }
 
   se->node = strdup(ci->values[0].value.string);
@@ -2866,7 +2866,7 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
     if (strcasecmp("Username", child->key) == 0)
       cf_util_get_string(child, &se->data.client.username);
     else if (strcasecmp("Password", child->key) == 0)
@@ -2874,7 +2874,7 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
     else if (strcasecmp("SecurityLevel", child->key) == 0)
       network_config_set_security_level(child, &se->data.client.security_level);
     else
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
         if (strcasecmp("Interface", child->key) == 0)
       network_config_set_interface(child, &se->interface);
     else if (strcasecmp("ResolveInterval", child->key) == 0)
@@ -2884,7 +2884,7 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
     }
   }
 
-#if HAVE_LIBGCRYPT
+#if HAVE_GCRYPT_H
   if ((se->data.client.security_level > SECURITY_LEVEL_NONE) &&
       ((se->data.client.username == NULL) ||
        (se->data.client.password == NULL))) {
@@ -2892,16 +2892,16 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
           "requested, but no Username or Password option was given. "
           "Cowardly refusing to open this socket!");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
-#endif /* HAVE_LIBGCRYPT */
+#endif /* HAVE_GCRYPT_H */
 
   status = sockent_init_crypto(se);
   if (status != 0) {
     ERROR("network plugin: network_config_add_server: sockent_init_crypto() "
           "failed.");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
 
   /* No call to sockent_client_connect() here -- it is called from
@@ -2911,10 +2911,10 @@ static int network_config_add_server(const oconfig_item_t *ci) /* {{{ */
   if (status != 0) {
     ERROR("network plugin: network_config_add_server: sockent_add failed.");
     sockent_destroy(se);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config_add_server */
 
 static int network_config(oconfig_item_t *ci) /* {{{ */
@@ -2946,7 +2946,7 @@ static int network_config(oconfig_item_t *ci) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int network_config */
 
 static int network_notification(const notification_t *n,
@@ -2958,63 +2958,63 @@ static int network_notification(const notification_t *n,
   int status;
 
   if (!check_send_notify_okay(n))
-    return (0);
+    return 0;
 
   memset(buffer, 0, sizeof(buffer));
 
   status = write_part_number(&buffer_ptr, &buffer_free, TYPE_TIME_HR,
                              (uint64_t)n->time);
   if (status != 0)
-    return (-1);
+    return -1;
 
   status = write_part_number(&buffer_ptr, &buffer_free, TYPE_SEVERITY,
                              (uint64_t)n->severity);
   if (status != 0)
-    return (-1);
+    return -1;
 
   if (strlen(n->host) > 0) {
     status = write_part_string(&buffer_ptr, &buffer_free, TYPE_HOST, n->host,
                                strlen(n->host));
     if (status != 0)
-      return (-1);
+      return -1;
   }
 
   if (strlen(n->plugin) > 0) {
     status = write_part_string(&buffer_ptr, &buffer_free, TYPE_PLUGIN,
                                n->plugin, strlen(n->plugin));
     if (status != 0)
-      return (-1);
+      return -1;
   }
 
   if (strlen(n->plugin_instance) > 0) {
     status = write_part_string(&buffer_ptr, &buffer_free, TYPE_PLUGIN_INSTANCE,
                                n->plugin_instance, strlen(n->plugin_instance));
     if (status != 0)
-      return (-1);
+      return -1;
   }
 
   if (strlen(n->type) > 0) {
     status = write_part_string(&buffer_ptr, &buffer_free, TYPE_TYPE, n->type,
                                strlen(n->type));
     if (status != 0)
-      return (-1);
+      return -1;
   }
 
   if (strlen(n->type_instance) > 0) {
     status = write_part_string(&buffer_ptr, &buffer_free, TYPE_TYPE_INSTANCE,
                                n->type_instance, strlen(n->type_instance));
     if (status != 0)
-      return (-1);
+      return -1;
   }
 
   status = write_part_string(&buffer_ptr, &buffer_free, TYPE_MESSAGE,
                              n->message, strlen(n->message));
   if (status != 0)
-    return (-1);
+    return -1;
 
   network_send_buffer(buffer, sizeof(buffer) - buffer_free);
 
-  return (0);
+  return 0;
 } /* int network_notification */
 
 static int network_shutdown(void) {
@@ -3055,7 +3055,7 @@ static int network_shutdown(void) {
   plugin_unregister_write("network");
   plugin_unregister_shutdown("network");
 
-  return (0);
+  return 0;
 } /* int network_shutdown */
 
 static int network_stats_read(void) /* {{{ */
@@ -3126,7 +3126,7 @@ static int network_stats_read(void) /* {{{ */
   vl.type_instance[0] = 0;
   plugin_dispatch_values(&vl);
 
-  return (0);
+  return 0;
 } /* }}} int network_stats_read */
 
 static int network_init(void) {
@@ -3135,7 +3135,7 @@ static int network_init(void) {
   /* Check if we were already initialized. If so, just return - there's
    * nothing more to do (for now, that is). */
   if (have_init)
-    return (0);
+    return 0;
   have_init = 1;
 
   if (network_config_stats)
@@ -3146,7 +3146,7 @@ static int network_init(void) {
   send_buffer = malloc(network_config_packet_size);
   if (send_buffer == NULL) {
     ERROR("network plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
   network_init_buffer();
 
@@ -3161,7 +3161,7 @@ static int network_init(void) {
   /* If no threads need to be started, return here. */
   if ((listen_sockets_num == 0) ||
       ((dispatch_thread_running != 0) && (receive_thread_running != 0)))
-    return (0);
+    return 0;
 
   if (dispatch_thread_running == 0) {
     int status;
@@ -3191,7 +3191,7 @@ static int network_init(void) {
     }
   }
 
-  return (0);
+  return 0;
 } /* int network_init */
 
 /*
@@ -3211,14 +3211,14 @@ static int network_flush(cdtime_t timeout,
       cdtime_t now = cdtime();
       if ((send_buffer_last_update + timeout) > now) {
         pthread_mutex_unlock(&send_buffer_lock);
-        return (0);
+        return 0;
       }
     }
     flush_buffer();
   }
   pthread_mutex_unlock(&send_buffer_lock);
 
-  return (0);
+  return 0;
 } /* int network_flush */
 
 void module_register(void) {
@@ -3227,5 +3227,3 @@ void module_register(void) {
   plugin_register_flush("network", network_flush,
                         /* user_data = */ NULL);
 } /* void module_register */
-
-/* vim: set fdm=marker : */
index 74c6cbc..6290613 100644 (file)
--- a/src/nfs.c
+++ b/src/nfs.c
@@ -296,7 +296,7 @@ static kstat_t *nfs4_ksp_server;
 #endif
 
 #if KERNEL_LINUX
-static int nfs_init(void) { return (0); }
+static int nfs_init(void) { return 0; }
 /* #endif KERNEL_LINUX */
 
 #elif HAVE_LIBKSTAT
@@ -309,7 +309,7 @@ static int nfs_init(void) {
   nfs4_ksp_server = NULL;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (kstat_t *ksp_chain = kc->kc_chain; ksp_chain != NULL;
        ksp_chain = ksp_chain->ks_next) {
@@ -329,7 +329,7 @@ static int nfs_init(void) {
       nfs4_ksp_client = ksp_chain;
   }
 
-  return (0);
+  return 0;
 } /* int nfs_init */
 #endif
 
@@ -374,12 +374,12 @@ static int nfs_submit_fields_safe(int nfs_version, const char *instance,
     WARNING("nfs plugin: Wrong number of fields for "
             "NFSv%i %s statistics. Expected %zu, got %zu.",
             nfs_version, instance, proc_names_num, fields_num);
-    return (EINVAL);
+    return EINVAL;
   }
 
   nfs_submit_fields(nfs_version, instance, fields, fields_num, proc_names);
 
-  return (0);
+  return 0;
 }
 
 static int nfs_submit_nfs4_server(const char *instance, char **fields,
@@ -398,7 +398,7 @@ static int nfs_submit_nfs4_server(const char *instance, char **fields,
       fields_num = NFS4_SERVER_MAX_PROC;
       suppress_warning = 1;
     } else {
-      return (EINVAL);
+      return EINVAL;
     }
   }
 
@@ -412,7 +412,7 @@ static int nfs_submit_nfs4_server(const char *instance, char **fields,
                       nfs4_server41_procedures_names);
   }
 
-  return (0);
+  return 0;
 }
 
 static int nfs_submit_nfs4_client(const char *instance, char **fields,
@@ -462,7 +462,7 @@ static int nfs_submit_nfs4_client(const char *instance, char **fields,
 
       suppress_warning = 1;
     } else {
-      return (EINVAL);
+      return EINVAL;
     }
   }
 
@@ -477,7 +477,7 @@ static int nfs_submit_nfs4_client(const char *instance, char **fields,
                       nfs4_client41_procedures_names);
   }
 
-  return (0);
+  return 0;
 }
 
 static void nfs_read_linux(FILE *fh, const char *inst) {
@@ -521,7 +521,7 @@ static int nfs_read_kstat(kstat_t *ksp, int nfs_version, const char *inst,
   value_t values[proc_names_num];
 
   if (ksp == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   ssnprintf(plugin_instance, sizeof(plugin_instance), "v%i%s", nfs_version,
             inst);
@@ -537,7 +537,7 @@ static int nfs_read_kstat(kstat_t *ksp, int nfs_version, const char *inst,
   }
 
   nfs_procedures_submit(plugin_instance, proc_names, values, proc_names_num);
-  return (0);
+  return 0;
 }
 #endif
 
@@ -555,7 +555,7 @@ static int nfs_read(void) {
     fclose(fh);
   }
 
-  return (0);
+  return 0;
 }
 /* #endif KERNEL_LINUX */
 
@@ -574,7 +574,7 @@ static int nfs_read(void) {
   nfs_read_kstat(nfs4_ksp_server, /* version = */ 4, "server",
                  nfs4_procedures_names, nfs4_procedures_names_num);
 
-  return (0);
+  return 0;
 }
 #endif /* HAVE_LIBKSTAT */
 
index ffc545c..0f1da0a 100644 (file)
@@ -62,13 +62,13 @@ static size_t nginx_curl_callback(void *buf, size_t size, size_t nmemb,
   }
 
   if (len == 0)
-    return (len);
+    return len;
 
   memcpy(&nginx_buffer[nginx_buffer_len], buf, len);
   nginx_buffer_len += len;
   nginx_buffer[nginx_buffer_len] = 0;
 
-  return (len);
+  return len;
 }
 
 static int config_set(char **var, const char *value) {
@@ -78,28 +78,28 @@ static int config_set(char **var, const char *value) {
   }
 
   if ((*var = strdup(value)) == NULL)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 }
 
 static int config(const char *key, const char *value) {
   if (strcasecmp(key, "url") == 0)
-    return (config_set(&url, value));
+    return config_set(&url, value);
   else if (strcasecmp(key, "user") == 0)
-    return (config_set(&user, value));
+    return config_set(&user, value);
   else if (strcasecmp(key, "password") == 0)
-    return (config_set(&pass, value));
+    return config_set(&pass, value);
   else if (strcasecmp(key, "verifypeer") == 0)
-    return (config_set(&verify_peer, value));
+    return config_set(&verify_peer, value);
   else if (strcasecmp(key, "verifyhost") == 0)
-    return (config_set(&verify_host, value));
+    return config_set(&verify_host, value);
   else if (strcasecmp(key, "cacert") == 0)
-    return (config_set(&cacert, value));
+    return config_set(&cacert, value);
   else if (strcasecmp(key, "timeout") == 0)
-    return (config_set(&timeout, value));
+    return config_set(&timeout, value);
   else
-    return (-1);
+    return -1;
 } /* int config */
 
 static int init(void) {
@@ -108,7 +108,7 @@ static int init(void) {
 
   if ((curl = curl_easy_init()) == NULL) {
     ERROR("nginx plugin: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
@@ -126,7 +126,7 @@ static int init(void) {
                            pass == NULL ? "" : pass);
     if ((status < 0) || ((size_t)status >= sizeof(credentials))) {
       ERROR("nginx plugin: Credentials would have been truncated.");
-      return (-1);
+      return -1;
     }
 
     curl_easy_setopt(curl, CURLOPT_USERPWD, credentials);
@@ -165,7 +165,7 @@ static int init(void) {
   }
 #endif
 
-  return (0);
+  return 0;
 } /* void init */
 
 static void submit(const char *type, const char *inst, long long value) {
@@ -202,14 +202,14 @@ static int nginx_read(void) {
   int fields_num;
 
   if (curl == NULL)
-    return (-1);
+    return -1;
   if (url == NULL)
-    return (-1);
+    return -1;
 
   nginx_buffer_len = 0;
   if (curl_easy_perform(curl) != CURLE_OK) {
     WARNING("nginx plugin: curl_easy_perform failed: %s", nginx_curl_error);
-    return (-1);
+    return -1;
   }
 
   ptr = nginx_buffer;
@@ -259,7 +259,7 @@ static int nginx_read(void) {
 
   nginx_buffer_len = 0;
 
-  return (0);
+  return 0;
 } /* int nginx_read */
 
 void module_register(void) {
@@ -267,7 +267,3 @@ void module_register(void) {
   plugin_register_init("nginx", init);
   plugin_register_read("nginx", nginx_read);
 } /* void module_register */
-
-/*
- * vim: set shiftwidth=2 softtabstop=2 tabstop=8 :
- */
index 4840441..d167fbf 100644 (file)
@@ -166,5 +166,3 @@ void module_register(void) {
   plugin_register_init("notify_desktop", c_notify_init);
   return;
 } /* module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index f42e66c..c1ce2f8 100644 (file)
@@ -115,7 +115,7 @@ static int notify_email_init(void) {
   if (session == NULL) {
     pthread_mutex_unlock(&session_lock);
     ERROR("notify_email plugin: cannot create SMTP session");
-    return (-1);
+    return -1;
   }
 
   smtp_set_monitorcb(session, monitor_cb, NULL, 1);
@@ -131,11 +131,11 @@ static int notify_email_init(void) {
   if (!smtp_auth_set_context(session, authctx)) {
     pthread_mutex_unlock(&session_lock);
     ERROR("notify_email plugin: cannot set SMTP auth context");
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_unlock(&session_lock);
-  return (0);
+  return 0;
 } /* int notify_email_init */
 
 static int notify_email_shutdown(void) {
@@ -152,7 +152,7 @@ static int notify_email_shutdown(void) {
   auth_client_exit();
 
   pthread_mutex_unlock(&session_lock);
-  return (0);
+  return 0;
 } /* int notify_email_shutdown */
 
 static int notify_email_config(const char *key, const char *value) {
@@ -162,14 +162,14 @@ static int notify_email_config(const char *key, const char *value) {
     tmp = realloc(recipients, (recipients_len + 1) * sizeof(char *));
     if (tmp == NULL) {
       ERROR("notify_email: realloc failed.");
-      return (-1);
+      return -1;
     }
 
     recipients = tmp;
     recipients[recipients_len] = strdup(value);
     if (recipients[recipients_len] == NULL) {
       ERROR("notify_email: strdup failed.");
-      return (-1);
+      return -1;
     }
     recipients_len++;
   } else if (0 == strcasecmp(key, "SMTPServer")) {
@@ -179,7 +179,7 @@ static int notify_email_config(const char *key, const char *value) {
     int port_tmp = atoi(value);
     if (port_tmp < 1 || port_tmp > 65535) {
       WARNING("notify_email plugin: Invalid SMTP port: %i", port_tmp);
-      return (1);
+      return 1;
     }
     smtp_port = port_tmp;
   } else if (0 == strcasecmp(key, "SMTPUser")) {
@@ -246,13 +246,13 @@ static int notify_email_notification(const notification_t *n,
   if (session == NULL) {
     /* Initialization failed or we're in the process of shutting down. */
     pthread_mutex_unlock(&session_lock);
-    return (-1);
+    return -1;
   }
 
   if (!(message = smtp_add_message(session))) {
     pthread_mutex_unlock(&session_lock);
     ERROR("notify_email plugin: cannot set SMTP message");
-    return (-1);
+    return -1;
   }
   smtp_set_reverse_path(message, email_from);
   smtp_set_header(message, "To", NULL, NULL);
@@ -266,7 +266,7 @@ static int notify_email_notification(const notification_t *n,
     ERROR("notify_email plugin: SMTP server problem: %s",
           smtp_strerror(smtp_errno(), buf, sizeof buf));
     pthread_mutex_unlock(&session_lock);
-    return (-1);
+    return -1;
   } else {
 #if COLLECT_DEBUG
     const smtp_status_t *status;
@@ -279,7 +279,7 @@ static int notify_email_notification(const notification_t *n,
   }
 
   pthread_mutex_unlock(&session_lock);
-  return (0);
+  return 0;
 } /* int notify_email_notification */
 
 void module_register(void) {
@@ -290,5 +290,3 @@ void module_register(void) {
   plugin_register_notification("notify_email", notify_email_notification,
                                /* user_data = */ NULL);
 } /* void module_register (void) */
-
-/* vim: set sw=2 sts=2 ts=8 et : */
index 1351691..c95f7cb 100644 (file)
@@ -153,5 +153,3 @@ void module_register(void) {
   plugin_register_complex_config("notify_nagios", nagios_config);
   plugin_register_notification("notify_nagios", nagios_notify, NULL);
 } /* void module_register (void) */
-
-/* vim: set sw=2 sts=2 ts=8 et : */
index 1dc1857..68ac3a7 100644 (file)
@@ -32,9 +32,6 @@
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_STDINT_H
-#include <stdint.h>
-#endif
 #if HAVE_NETDB_H
 #include <netdb.h>
 #endif
@@ -266,7 +263,7 @@ static int ntpd_config(const char *key, const char *value) {
     if (ntpd_host != NULL)
       free(ntpd_host);
     if ((ntpd_host = strdup(value)) == NULL)
-      return (1);
+      return 1;
   } else if (strcasecmp(key, "Port") == 0) {
     int port = (int)(atof(value));
     if ((port > 0) && (port <= 65535))
@@ -284,10 +281,10 @@ static int ntpd_config(const char *key, const char *value) {
     else
       include_unit_id = 0;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void ntpd_submit(const char *type, const char *type_inst,
@@ -322,7 +319,7 @@ static int ntpd_connect(void) {
   int status;
 
   if (sock_descr >= 0)
-    return (sock_descr);
+    return sock_descr;
 
   DEBUG("Opening a new socket");
 
@@ -344,7 +341,7 @@ static int ntpd_connect(void) {
     ERROR("ntpd plugin: getaddrinfo (%s, %s): %s", host, port,
           (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                  : gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -370,7 +367,7 @@ static int ntpd_connect(void) {
     ERROR("ntpd plugin: Unable to connect to server.");
   }
 
-  return (sock_descr);
+  return sock_descr;
 }
 
 /* For a description of the arguments see `ntpd_do_query' below. */
@@ -399,7 +396,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
   ssize_t pkt_padding; /* Padding in this packet */
 
   if ((sd = ntpd_connect()) < 0)
-    return (-1);
+    return -1;
 
   items = NULL;
   items_num = 0;
@@ -415,7 +412,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
     char errbuf[1024];
     ERROR("ntpd plugin: gettimeofday failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   time_end.tv_sec++; /* wait for a most one second */
 
@@ -427,7 +424,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
       char errbuf[1024];
       ERROR("ntpd plugin: gettimeofday failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
 
     if (timeval_cmp(time_end, time_now, &time_left) <= 0)
@@ -453,7 +450,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
       char errbuf[1024];
       ERROR("ntpd plugin: poll failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
 
     if (status == 0) /* timeout */
@@ -474,7 +471,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
       DEBUG("Closing socket #%i", sd);
       close(sd);
       sock_descr = sd = -1;
-      return (-1);
+      return -1;
     }
 
     DEBUG("recv'd %i bytes", status);
@@ -516,7 +513,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
     if (INFO_ERR(res.err_nitems) != 0) {
       ERROR("ntpd plugin: Received error code %i",
             (int)INFO_ERR(res.err_nitems));
-      return ((int)INFO_ERR(res.err_nitems));
+      return (int)INFO_ERR(res.err_nitems);
     }
 
     /* extract number of items in this packet and the size of these items */
@@ -635,7 +632,7 @@ static int ntpd_receive_response(int *res_items, int *res_size, char **res_data,
       done = 1;
   } /* while (done == 0) */
 
-  return (0);
+  return 0;
 } /* int ntpd_receive_response */
 
 /* For a description of the arguments see `ntpd_do_query' below. */
@@ -650,7 +647,7 @@ static int ntpd_send_request(int req_code, int req_items, int req_size,
   assert(req_size >= 0);
 
   if ((sd = ntpd_connect()) < 0)
-    return (-1);
+    return -1;
 
   req.rm_vn_mode = RM_VN_MODE(0, 0, 0);
   req.auth_seq = AUTH_SEQ(0, 0);
@@ -676,10 +673,10 @@ static int ntpd_send_request(int req_code, int req_items, int req_size,
     DEBUG("`swrite' failed. Closing socket #%i", sd);
     close(sd);
     sock_descr = sd = -1;
-    return (status);
+    return status;
   }
 
-  return (0);
+  return 0;
 }
 
 /*
@@ -704,10 +701,10 @@ static int ntpd_do_query(int req_code, int req_items, int req_size,
 
   status = ntpd_send_request(req_code, req_items, req_size, req_data);
   if (status != 0)
-    return (status);
+    return status;
 
   status = ntpd_receive_response(res_items, res_size, res_data, res_item_size);
-  return (status);
+  return status;
 }
 
 static double ntpd_read_fp(int32_t val_int) {
@@ -716,7 +713,7 @@ static double ntpd_read_fp(int32_t val_int) {
   val_int = ntohl(val_int);
   val_double = ((double)val_int) / FP_FRAC;
 
-  return (val_double);
+  return val_double;
 }
 
 static uint32_t
@@ -724,7 +721,7 @@ ntpd_get_refclock_id(struct info_peer_summary const *peer_info) {
   uint32_t addr = ntohl(peer_info->srcadr);
   uint32_t refclock_id = (addr >> 8) & 0x00FF;
 
-  return (refclock_id);
+  return refclock_id;
 }
 
 static int ntpd_get_name_from_address(char *buffer, size_t buffer_size,
@@ -770,10 +767,10 @@ static int ntpd_get_name_from_address(char *buffer, size_t buffer_size,
     ERROR("ntpd plugin: getnameinfo failed: %s",
           (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                  : gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* ntpd_get_name_from_address */
 
 static int ntpd_get_name_refclock(char *buffer, size_t buffer_size,
@@ -782,8 +779,7 @@ static int ntpd_get_name_refclock(char *buffer, size_t buffer_size,
   uint32_t unit_id = ntohl(peer_info->srcadr) & 0x00FF;
 
   if (((size_t)refclock_id) >= refclock_names_num)
-    return (ntpd_get_name_from_address(buffer, buffer_size, peer_info,
-                                       /* do_reverse_lookup = */ 0));
+    return ntpd_get_name_from_address(buffer, buffer_size, peer_info, 0);
 
   if (include_unit_id)
     ssnprintf(buffer, buffer_size, "%s-%" PRIu32, refclock_names[refclock_id],
@@ -791,7 +787,7 @@ static int ntpd_get_name_refclock(char *buffer, size_t buffer_size,
   else
     sstrncpy(buffer, refclock_names[refclock_id], buffer_size);
 
-  return (0);
+  return 0;
 } /* int ntpd_get_name_refclock */
 
 static int ntpd_get_name(char *buffer, size_t buffer_size,
@@ -799,10 +795,10 @@ static int ntpd_get_name(char *buffer, size_t buffer_size,
   uint32_t addr = ntohl(peer_info->srcadr);
 
   if (!peer_info->v6_flag && ((addr & REFCLOCK_MASK) == REFCLOCK_ADDR))
-    return (ntpd_get_name_refclock(buffer, buffer_size, peer_info));
+    return ntpd_get_name_refclock(buffer, buffer_size, peer_info);
   else
-    return (ntpd_get_name_from_address(buffer, buffer_size, peer_info,
-                                       do_reverse_lookups));
+    return ntpd_get_name_from_address(buffer, buffer_size, peer_info,
+                                      do_reverse_lookups);
 } /* int ntpd_addr_to_name */
 
 static int ntpd_read(void) {
@@ -836,12 +832,12 @@ static int ntpd_read(void) {
   if (status != 0) {
     ERROR("ntpd plugin: ntpd_do_query (REQ_GET_KERNEL) failed with status %i",
           status);
-    return (status);
+    return status;
   } else if ((ik == NULL) || (ik_num == 0) || (ik_size == 0)) {
     ERROR("ntpd plugin: ntpd_do_query returned unexpected data. "
           "(ik = %p; ik_num = %i; ik_size = %i)",
           (void *)ik, ik_num, ik_size);
-    return (-1);
+    return -1;
   }
 
   if (ntohs(ik->status) & STA_NANO) {
@@ -875,12 +871,12 @@ static int ntpd_read(void) {
     ERROR(
         "ntpd plugin: ntpd_do_query (REQ_PEER_LIST_SUM) failed with status %i",
         status);
-    return (status);
+    return status;
   } else if ((ps == NULL) || (ps_num == 0) || (ps_size == 0)) {
     ERROR("ntpd plugin: ntpd_do_query returned unexpected data. "
           "(ps = %p; ps_num = %i; ps_size = %i)",
           (void *)ps, ps_num, ps_size);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ps_num; i++) {
@@ -929,7 +925,7 @@ static int ntpd_read(void) {
   free(ps);
   ps = NULL;
 
-  return (0);
+  return 0;
 } /* int ntpd_read */
 
 void module_register(void) {
index 049daee..6ef3f09 100644 (file)
@@ -69,7 +69,7 @@ static int numa_read_node(int node) /* {{{ */
     char errbuf[1024];
     ERROR("numa plugin: Reading node %i failed: open(%s): %s", node, path,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   success = 0;
@@ -95,7 +95,7 @@ static int numa_read_node(int node) /* {{{ */
   }
 
   fclose(fh);
-  return (success ? 0 : -1);
+  return success ? 0 : -1;
 } /* }}} int numa_read_node */
 
 static int numa_read(void) /* {{{ */
@@ -106,7 +106,7 @@ static int numa_read(void) /* {{{ */
 
   if (max_node < 0) {
     WARNING("numa plugin: No NUMA nodes were detected.");
-    return (-1);
+    return -1;
   }
 
   success = 0;
@@ -116,7 +116,7 @@ static int numa_read(void) /* {{{ */
       success++;
   }
 
-  return (success ? 0 : -1);
+  return success ? 0 : -1;
 } /* }}} int numa_read */
 
 static int numa_init(void) /* {{{ */
@@ -140,17 +140,15 @@ static int numa_init(void) /* {{{ */
       char errbuf[1024];
       ERROR("numa plugin: stat(%s) failed: %s", path,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   }
 
   DEBUG("numa plugin: Found %i nodes.", max_node + 1);
-  return (0);
+  return 0;
 } /* }}} int numa_init */
 
 void module_register(void) {
   plugin_register_init("numa", numa_init);
   plugin_register_read("numa", numa_read);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et : */
index d40e095..2173af9 100644 (file)
--- a/src/nut.c
+++ b/src/nut.c
@@ -54,8 +54,11 @@ static nut_ups_t *upslist_head = NULL;
 static pthread_mutex_t read_lock = PTHREAD_MUTEX_INITIALIZER;
 static int read_busy = 0;
 
-static const char *config_keys[] = {"UPS"};
+static const char *config_keys[] = {"UPS", "FORCESSL", "VERIFYPEER", "CAPATH"};
 static int config_keys_num = STATIC_ARRAY_SIZE(config_keys);
+static int force_ssl = 0;   // Initialized to default of 0 (false)
+static int verify_peer = 0; // Initialized to default of 0 (false)
+static char *ca_path = NULL;
 
 static void free_nut_ups_t(nut_ups_t *ups) {
   if (ups->conn != NULL) {
@@ -76,14 +79,14 @@ static int nut_add_ups(const char *name) {
   ups = calloc(1, sizeof(*ups));
   if (ups == NULL) {
     ERROR("nut plugin: nut_add_ups: calloc failed.");
-    return (1);
+    return 1;
   }
 
   status = upscli_splitname(name, &ups->upsname, &ups->hostname, &ups->port);
   if (status != 0) {
     ERROR("nut plugin: nut_add_ups: upscli_splitname (%s) failed.", name);
     free_nut_ups_t(ups);
-    return (1);
+    return 1;
   }
 
   if (upslist_head == NULL)
@@ -95,14 +98,56 @@ static int nut_add_ups(const char *name) {
     last->next = ups;
   }
 
-  return (0);
+  return 0;
 } /* int nut_add_ups */
 
+static int nut_force_ssl(const char *value) {
+  if (strcasecmp(value, "true") == 0)
+    force_ssl = 1;
+  else if (strcasecmp(value, "false") == 0)
+    force_ssl = 0; // Should already be set to 0 from initialization
+  else {
+    force_ssl = 0;
+    WARNING("nut plugin: nut_force_ssl: invalid FORCESSL value "
+            "found. Defaulting to false.");
+  }
+  return 0;
+} /* int nut_parse_force_ssl */
+
+static int nut_verify_peer(const char *value) {
+  if (strcasecmp(value, "true") == 0)
+    verify_peer = 1;
+  else if (strcasecmp(value, "false") == 0)
+    verify_peer = 0; // Should already be set to 0 from initialization
+  else {
+    verify_peer = 0;
+    WARNING("nut plugin: nut_verify_peer: invalid VERIFYPEER value "
+            "found. Defaulting to false.");
+  }
+  return 0;
+} /* int nut_verify_peer */
+
+static int nut_ca_path(const char *value) {
+  if (value != NULL && strcmp(value, "") != 0) {
+    ca_path = malloc(strlen(value) + 1);
+    strncpy(ca_path, value, (strlen(value) + 1));
+  } else {
+    ca_path = NULL; // Should alread be set to NULL from initialization
+  }
+  return 0;
+} /* int nut_ca_path */
+
 static int nut_config(const char *key, const char *value) {
   if (strcasecmp(key, "UPS") == 0)
-    return (nut_add_ups(value));
+    return nut_add_ups(value);
+  else if (strcasecmp(key, "FORCESSL") == 0)
+    return nut_force_ssl(value);
+  else if (strcasecmp(key, "VERIFYPEER") == 0)
+    return nut_verify_peer(value);
+  else if (strcasecmp(key, "CAPATH") == 0)
+    return nut_ca_path(value);
   else
-    return (-1);
+    return -1;
 } /* int nut_config */
 
 static void nut_submit(nut_ups_t *ups, const char *type,
@@ -123,6 +168,119 @@ static void nut_submit(nut_ups_t *ups, const char *type,
   plugin_dispatch_values(&vl);
 } /* void nut_submit */
 
+static int nut_connect(nut_ups_t *ups) {
+#if HAVE_UPSCLI_INIT
+  int status;
+  int ssl_status;
+  int ssl_flags;
+
+  if (verify_peer == 1 && force_ssl == 0) {
+    WARNING("nut plugin: nut_connect: VerifyPeer true but ForceSSL "
+            "false. Setting ForceSSL to true.");
+    force_ssl = 1;
+  }
+
+  if (verify_peer == 1 && ca_path == NULL) {
+    ERROR("nut plugin: nut_connect: VerifyPeer true but missing "
+          "CAPath value.");
+    return -1;
+  }
+
+  if (verify_peer == 1) {
+    status = upscli_init(verify_peer, ca_path, NULL, NULL);
+
+    if (status != 1) {
+      ERROR("nut plugin: nut_connect: upscli_init (%i, %s) failed: %s",
+            verify_peer, ca_path, upscli_strerror(ups->conn));
+      upscli_cleanup();
+      return -1;
+    }
+  } /* if (verify_peer == 1) */
+
+  if (verify_peer == 1)
+    ssl_flags = (UPSCLI_CONN_REQSSL | UPSCLI_CONN_CERTVERIF);
+  else if (force_ssl == 1)
+    ssl_flags = UPSCLI_CONN_REQSSL;
+  else
+    ssl_flags = UPSCLI_CONN_TRYSSL;
+
+  status = upscli_connect(ups->conn, ups->hostname, ups->port, ssl_flags);
+
+  if (status != 0) {
+    ERROR("nut plugin: nut_connect: upscli_connect (%s, %i) failed: %s",
+          ups->hostname, ups->port, upscli_strerror(ups->conn));
+    sfree(ups->conn);
+    upscli_cleanup();
+    return -1;
+  } /* if (status != 0) */
+
+  INFO("nut plugin: Connection to (%s, %i) established.", ups->hostname,
+       ups->port);
+
+  // Output INFO or WARNING based on SSL and VERIFICATION
+  ssl_status = upscli_ssl(ups->conn); // 1 for SSL, 0 for not, -1 for error
+  if (ssl_status == 1 && verify_peer == 1) {
+    INFO("nut plugin: Connection is secured with SSL and certificate "
+         "has been verified.");
+  } else if (ssl_status == 1) {
+    INFO("nut plugin: Connection is secured with SSL with no verification "
+         "of server SSL certificate.");
+  } else if (ssl_status == 0) {
+    WARNING("nut plugin: Connection is unsecured (no SSL).");
+  } else {
+    ERROR("nut plugin: nut_connect: upscli_ssl failed: %s",
+          upscli_strerror(ups->conn));
+    sfree(ups->conn);
+    upscli_cleanup();
+    return -1;
+  } /* if (ssl_status == 1 && verify_peer == 1) */
+  return 0;
+
+#else /* #if HAVE_UPSCLI_INIT */
+  int status;
+  int ssl_status;
+  int ssl_flags;
+
+  if (verify_peer == 1 || ca_path != NULL) {
+    WARNING("nut plugin: nut_connect: Dependency libupsclient version "
+            "insufficient (<2.7) for VerifyPeer support. Ignoring VerifyPeer "
+            "and CAPath.");
+  }
+
+  if (force_ssl == 1)
+    ssl_flags = UPSCLI_CONN_REQSSL;
+  else
+    ssl_flags = UPSCLI_CONN_TRYSSL;
+
+  status = upscli_connect(ups->conn, ups->hostname, ups->port, ssl_flags);
+
+  if (status != 0) {
+    ERROR("nut plugin: nut_connect: upscli_connect (%s, %i) failed: %s",
+          ups->hostname, ups->port, upscli_strerror(ups->conn));
+    sfree(ups->conn);
+    return -1;
+  } /* if (status != 0) */
+
+  INFO("nut plugin: Connection to (%s, %i) established.", ups->hostname,
+       ups->port);
+
+  // Output INFO or WARNING based on SSL
+  ssl_status = upscli_ssl(ups->conn); // 1 for SSL, 0 for not, -1 for error
+  if (ssl_status == 1) {
+    INFO("nut plugin: Connection is secured with SSL with no verification "
+         "of server SSL certificate.");
+  } else if (ssl_status == 0) {
+    WARNING("nut plugin: Connection is unsecured (no SSL).");
+  } else {
+    ERROR("nut plugin: nut_connect: upscli_ssl failed: %s",
+          upscli_strerror(ups->conn));
+    sfree(ups->conn);
+    return -1;
+  } /* if (ssl_status == 1 && verify_peer == 1) */
+  return 0;
+#endif
+}
+
 static int nut_read_one(nut_ups_t *ups) {
   const char *query[3] = {"VAR", ups->upsname, NULL};
   unsigned int query_num = 2;
@@ -135,20 +293,13 @@ static int nut_read_one(nut_ups_t *ups) {
     ups->conn = malloc(sizeof(*ups->conn));
     if (ups->conn == NULL) {
       ERROR("nut plugin: malloc failed.");
-      return (-1);
+      return -1;
     }
 
-    status =
-        upscli_connect(ups->conn, ups->hostname, ups->port, UPSCLI_CONN_TRYSSL);
-    if (status != 0) {
-      ERROR("nut plugin: nut_read_one: upscli_connect (%s, %i) failed: %s",
-            ups->hostname, ups->port, upscli_strerror(ups->conn));
-      sfree(ups->conn);
-      return (-1);
-    }
+    status = nut_connect(ups);
+    if (status == -1)
+      return -1;
 
-    INFO("nut plugin: Connection to (%s, %i) established.", ups->hostname,
-         ups->port);
   } /* if (ups->conn == NULL) */
 
   /* nut plugin: nut_read_one: upscli_list_start (adpos) failed: Protocol
@@ -159,7 +310,10 @@ static int nut_read_one(nut_ups_t *ups) {
           ups->upsname, upscli_strerror(ups->conn));
     upscli_disconnect(ups->conn);
     sfree(ups->conn);
-    return (-1);
+#if HAVE_UPSCLI_INIT
+    upscli_cleanup();
+#endif
+    return -1;
   }
 
   while ((status = upscli_list_next(ups->conn, query_num, query, &answer_num,
@@ -211,7 +365,7 @@ static int nut_read_one(nut_ups_t *ups) {
     }
   } /* while (upscli_list_next) */
 
-  return (0);
+  return 0;
 } /* int nut_read_one */
 
 static int nut_read(void) {
@@ -223,7 +377,7 @@ static int nut_read(void) {
   pthread_mutex_unlock(&read_lock);
 
   if (success != 0)
-    return (0);
+    return 0;
 
   for (nut_ups_t *ups = upslist_head; ups != NULL; ups = ups->next)
     if (nut_read_one(ups) == 0)
@@ -233,7 +387,7 @@ static int nut_read(void) {
   read_busy = 0;
   pthread_mutex_unlock(&read_lock);
 
-  return ((success != 0) ? 0 : -1);
+  return (success != 0) ? 0 : -1;
 } /* int nut_read */
 
 static int nut_shutdown(void) {
@@ -246,8 +400,11 @@ static int nut_shutdown(void) {
     free_nut_ups_t(this);
     this = next;
   }
+#if HAVE_UPSCLI_INIT
+  upscli_cleanup();
+#endif
 
-  return (0);
+  return 0;
 } /* int nut_shutdown */
 
 void module_register(void) {
@@ -255,5 +412,3 @@ void module_register(void) {
   plugin_register_read("nut", nut_read);
   plugin_register_shutdown("nut", nut_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 ts=8 sts=2 tw=78 : */
index d1caf46..eccafae 100644 (file)
@@ -54,15 +54,15 @@ static int config_want_topology = OLSRD_WANT_SUMMARY;
 static const char *olsrd_get_node(void) /* {{{ */
 {
   if (config_node != NULL)
-    return (config_node);
-  return (OLSRD_DEFAULT_NODE);
+    return config_node;
+  return OLSRD_DEFAULT_NODE;
 } /* }}} const char *olsrd_get_node */
 
 static const char *olsrd_get_service(void) /* {{{ */
 {
   if (config_service != NULL)
-    return (config_service);
-  return (OLSRD_DEFAULT_SERVICE);
+    return config_service;
+  return OLSRD_DEFAULT_SERVICE;
 } /* }}} const char *olsrd_get_service */
 
 static void olsrd_set_node(const char *node) /* {{{ */
@@ -114,7 +114,7 @@ static size_t strchomp(char *buffer) /* {{{ */
     buffer[buffer_len] = 0;
   }
 
-  return (buffer_len);
+  return buffer_len;
 } /* }}} size_t strchomp */
 
 static size_t strtabsplit(char *string, char **fields, size_t size) /* {{{ */
@@ -134,7 +134,7 @@ static size_t strtabsplit(char *string, char **fields, size_t size) /* {{{ */
       break;
   }
 
-  return (i);
+  return i;
 } /* }}} size_t strtabsplit */
 
 static FILE *olsrd_connect(void) /* {{{ */
@@ -154,7 +154,7 @@ static FILE *olsrd_connect(void) /* {{{ */
   if (ai_return != 0) {
     ERROR("olsrd plugin: getaddrinfo (%s, %s) failed: %s", olsrd_get_node(),
           olsrd_get_service(), gai_strerror(ai_return));
-    return (NULL);
+    return NULL;
   }
 
   fh = NULL;
@@ -191,7 +191,7 @@ static FILE *olsrd_connect(void) /* {{{ */
 
   freeaddrinfo(ai_list);
 
-  return (fh);
+  return fh;
 } /* }}} FILE *olsrd_connect */
 
 __attribute__((nonnull(2))) static void
@@ -214,7 +214,7 @@ olsrd_submit(const char *plugin_instance, /* {{{ */
 
 static int olsrd_cb_ignore(int lineno, /* {{{ */
                            size_t fields_num, char **fields) {
-  return (0);
+  return 0;
 } /* }}} int olsrd_cb_ignore */
 
 static int olsrd_cb_links(int lineno, /* {{{ */
@@ -239,7 +239,7 @@ static int olsrd_cb_links(int lineno, /* {{{ */
   char *endptr;
 
   if (config_want_links == OLSRD_WANT_NOT)
-    return (0);
+    return 0;
 
   /* Special handling of the first line. */
   if (lineno <= 0) {
@@ -249,7 +249,7 @@ static int olsrd_cb_links(int lineno, /* {{{ */
     nlq_sum = 0.0;
     nlq_num = 0;
 
-    return (0);
+    return 0;
   }
 
   /* Special handling of the last line. */
@@ -272,11 +272,11 @@ static int olsrd_cb_links(int lineno, /* {{{ */
     olsrd_submit(/* p.-inst = */ "links", /* type = */ "signal_quality",
                  "average-nlq", nlq);
 
-    return (0);
+    return 0;
   }
 
   if (fields_num != 6)
-    return (-1);
+    return -1;
 
   links_num++;
 
@@ -328,7 +328,7 @@ static int olsrd_cb_links(int lineno, /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_cb_links */
 
 static int olsrd_cb_routes(int lineno, /* {{{ */
@@ -351,7 +351,7 @@ static int olsrd_cb_routes(int lineno, /* {{{ */
   char *endptr;
 
   if (config_want_routes == OLSRD_WANT_NOT)
-    return (0);
+    return 0;
 
   /* Special handling of the first line */
   if (lineno <= 0) {
@@ -361,7 +361,7 @@ static int olsrd_cb_routes(int lineno, /* {{{ */
     etx_sum = 0.0;
     etx_num = 0;
 
-    return (0);
+    return 0;
   }
 
   /* Special handling after the last line */
@@ -386,11 +386,11 @@ static int olsrd_cb_routes(int lineno, /* {{{ */
     olsrd_submit(/* p.-inst = */ "routes", /* type = */ "route_etx", "average",
                  etx);
 
-    return (0);
+    return 0;
   }
 
   if (fields_num != 5)
-    return (-1);
+    return -1;
 
   routes_num++;
 
@@ -429,7 +429,7 @@ static int olsrd_cb_routes(int lineno, /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_cb_routes */
 
 static int olsrd_cb_topology(int lineno, /* {{{ */
@@ -450,7 +450,7 @@ static int olsrd_cb_topology(int lineno, /* {{{ */
   char *endptr;
 
   if (config_want_topology == OLSRD_WANT_NOT)
-    return (0);
+    return 0;
 
   /* Special handling of the first line */
   if (lineno <= 0) {
@@ -458,7 +458,7 @@ static int olsrd_cb_topology(int lineno, /* {{{ */
     lq_num = 0;
     links_num = 0;
 
-    return (0);
+    return 0;
   }
 
   /* Special handling after the last line */
@@ -474,11 +474,11 @@ static int olsrd_cb_topology(int lineno, /* {{{ */
     olsrd_submit(/* p.-inst = */ "topology", /* type = */ "signal_quality",
                  /* t.-inst = */ "average", lq);
 
-    return (0);
+    return 0;
   }
 
   if (fields_num != 5)
-    return (-1);
+    return -1;
 
   links_num++;
 
@@ -523,7 +523,7 @@ static int olsrd_cb_topology(int lineno, /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_cb_topology */
 
 static int olsrd_read_table(FILE *fh, /* {{{ */
@@ -552,7 +552,7 @@ static int olsrd_read_table(FILE *fh, /* {{{ */
     lineno++;
   } /* while (fgets) */
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_read_table */
 
 static int olsrd_config(const char *key, const char *value) /* {{{ */
@@ -569,10 +569,10 @@ static int olsrd_config(const char *key, const char *value) /* {{{ */
     olsrd_set_detail(&config_want_topology, value, key);
   else {
     ERROR("olsrd plugin: Unknown configuration option given: %s", key);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_config */
 
 static int olsrd_read(void) /* {{{ */
@@ -583,7 +583,7 @@ static int olsrd_read(void) /* {{{ */
 
   fh = olsrd_connect();
   if (fh == NULL)
-    return (-1);
+    return -1;
 
   fputs("\r\n", fh);
   fflush(fh);
@@ -615,7 +615,7 @@ static int olsrd_read(void) /* {{{ */
 
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_read */
 
 static int olsrd_shutdown(void) /* {{{ */
@@ -623,7 +623,7 @@ static int olsrd_shutdown(void) /* {{{ */
   sfree(config_node);
   sfree(config_service);
 
-  return (0);
+  return 0;
 } /* }}} int olsrd_shutdown */
 
 void module_register(void) {
@@ -631,5 +631,3 @@ void module_register(void) {
   plugin_register_read("olsrd", olsrd_read);
   plugin_register_shutdown("olsrd", olsrd_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 10fa5ca..2d594ec 100644 (file)
@@ -123,7 +123,7 @@ static int timeval_subtract(struct timeval *result, struct timeval *t2,
   result->tv_sec = diff / 1000000;
   result->tv_usec = diff % 1000000;
 
-  return (diff < 0);
+  return diff < 0;
 }
 #endif /* COLLECT_DEBUG */
 
@@ -169,7 +169,7 @@ static int direct_list_insert(const char *config) {
     if (regcomp(&regex_direct, regexp_to_match, REG_EXTENDED)) {
       ERROR("onewire plugin: Cannot compile regex");
       direct_list_element_free(element);
-      return (1);
+      return 1;
     }
     regex_direct_initialized = 1;
     DEBUG("onewire plugin: Compiled regex!!");
@@ -242,7 +242,7 @@ static int cow_load_config(const char *key, const char *value) {
 
       if (ignorelist_add(sensor_list, value)) {
         ERROR("onewire plugin: Cannot add value to ignorelist.");
-        return (1);
+        return 1;
       }
     } else {
       DEBUG("onewire plugin: %s is a direct access", value);
@@ -257,7 +257,7 @@ static int cow_load_config(const char *key, const char *value) {
     temp = strdup(value);
     if (temp == NULL) {
       ERROR("onewire plugin: strdup failed.");
-      return (1);
+      return 1;
     }
     sfree(device_g);
     device_g = temp;
@@ -269,10 +269,10 @@ static int cow_load_config(const char *key, const char *value) {
     else
       ERROR("onewire plugin: Invalid `Interval' setting: %s", value);
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static int cow_read_values(const char *path, const char *name,
@@ -310,7 +310,7 @@ static int cow_read_values(const char *path, const char *name,
       ERROR("onewire plugin: OW_get (%s/%s) failed. error = %s;", path,
             family_info->features[i].filename,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
     DEBUG("Read onewire device %s as %s", file, buffer);
 
@@ -334,7 +334,7 @@ static int cow_read_values(const char *path, const char *name,
     free(buffer);
   } /* for (i = 0; i < features_num; i++) */
 
-  return ((success > 0) ? 0 : -1);
+  return (success > 0) ? 0 : -1;
 } /* int cow_read_values */
 
 /* Forward declaration so the recursion below works */
@@ -358,7 +358,7 @@ static int cow_read_ds2409(const char *path) {
   if ((status > 0) && (status < (int)sizeof(subpath)))
     cow_read_bus(subpath);
 
-  return (0);
+  return 0;
 } /* int cow_read_ds2409 */
 
 static int cow_read_bus(const char *path) {
@@ -376,7 +376,7 @@ static int cow_read_bus(const char *path) {
   if (status < 0) {
     ERROR("onewire plugin: OW_get (%s) failed. error = %s;", path,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   DEBUG("onewire plugin: OW_get (%s) returned: %s", path, buffer);
 
@@ -415,7 +415,7 @@ static int cow_read_bus(const char *path) {
   } /* while (strtok_r) */
 
   free(buffer);
-  return (0);
+  return 0;
 } /* int cow_read_bus */
 
 /* ===================================================================================
@@ -439,7 +439,7 @@ static int cow_simple_read(void) {
     if (status < 0) {
       ERROR("onewire plugin: OW_get (%s) failed. status = %s;", traverse->path,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
     DEBUG("onewire plugin: Read onewire device %s as %s", traverse->path,
           buffer);
@@ -502,7 +502,7 @@ static int cow_shutdown(void) {
     regfree(&regex_direct);
   }
 
-  return (0);
+  return 0;
 } /* int cow_shutdown */
 
 static int cow_init(void) {
@@ -511,7 +511,7 @@ static int cow_init(void) {
 
   if (device_g == NULL) {
     ERROR("onewire plugin: cow_init: No device configured.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("onewire plugin: about to init device <%s>.", device_g);
@@ -519,14 +519,14 @@ static int cow_init(void) {
   if (status != 0) {
     ERROR("onewire plugin: OW_init(%s) failed: %s.", device_g,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   plugin_register_complex_read(/* group = */ NULL, "onewire", cow_read,
                                ow_interval, /* user data = */ NULL);
   plugin_register_shutdown("onewire", cow_shutdown);
 
-  return (0);
+  return 0;
 } /* int cow_init */
 
 void module_register(void) {
@@ -534,5 +534,3 @@ void module_register(void) {
   plugin_register_config("onewire", cow_load_config, config_keys,
                          config_keys_num);
 }
-
-/* vim: set sw=2 sts=2 ts=8 et fdm=marker cindent : */
index 50757db..8053929 100644 (file)
@@ -85,7 +85,7 @@ static int cldap_init_host(cldap_t *st) /* {{{ */
 
   if (st->state && st->ld) {
     DEBUG("openldap plugin: Already connected to %s", st->url);
-    return (0);
+    return 0;
   }
 
   rc = ldap_initialize(&ld, st->url);
@@ -147,7 +147,7 @@ static int cldap_init_host(cldap_t *st) /* {{{ */
   } else {
     DEBUG("openldap plugin: Successfully connected to %s", st->url);
     st->state = 1;
-    return (0);
+    return 0;
   }
 } /* }}} static cldap_init_host */
 
@@ -200,14 +200,14 @@ static int cldap_read_host(user_data_t *ud) /* {{{ */
 
   if ((ud == NULL) || (ud->data == NULL)) {
     ERROR("openldap plugin: cldap_read_host: Invalid user data.");
-    return (-1);
+    return -1;
   }
 
   st = (cldap_t *)ud->data;
 
   status = cldap_init_host(st);
   if (status != 0)
-    return (-1);
+    return -1;
 
   rc = ldap_search_ext_s(st->ld, "cn=Monitor", LDAP_SCOPE_SUBTREE,
                          "(|(!(cn=* *))(cn=Database*))", attrs, 0, NULL, NULL,
@@ -376,7 +376,7 @@ static int cldap_read_host(user_data_t *ud) /* {{{ */
   }
 
   ldap_msgfree(result);
-  return (0);
+  return 0;
 } /* }}} int cldap_read_host */
 
 /* Configuration handling functions {{{
@@ -397,13 +397,13 @@ static int cldap_config_add(oconfig_item_t *ci) /* {{{ */
   st = calloc(1, sizeof(*st));
   if (st == NULL) {
     ERROR("openldap plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = cf_util_get_string(ci, &st->name);
   if (status != 0) {
     sfree(st);
-    return (status);
+    return status;
   }
 
   st->starttls = 0;
@@ -495,10 +495,10 @@ static int cldap_config_add(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     cldap_free(st);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int cldap_config_add */
 
 static int cldap_config(oconfig_item_t *ci) /* {{{ */
@@ -518,7 +518,7 @@ static int cldap_config(oconfig_item_t *ci) /* {{{ */
               child->key);
   } /* for (ci->children) */
 
-  return (status);
+  return status;
 } /* }}} int cldap_config */
 
 /* }}} End of configuration handling functions */
@@ -529,7 +529,7 @@ static int cldap_init(void) /* {{{ */
    * ldap_initialize(3) */
   int debug_level;
   ldap_get_option(NULL, LDAP_OPT_DEBUG_LEVEL, &debug_level);
-  return (0);
+  return 0;
 } /* }}} int cldap_init */
 
 static int cldap_shutdown(void) /* {{{ */
@@ -540,7 +540,7 @@ static int cldap_shutdown(void) /* {{{ */
   sfree(databases);
   databases_num = 0;
 
-  return (0);
+  return 0;
 } /* }}} int cldap_shutdown */
 
 void module_register(void) /* {{{ */
index 90694b7..143a770 100644 (file)
@@ -88,7 +88,7 @@ static int openvpn_strsplit(char *string, char **fields, size_t size) {
       break;
   }
 
-  return (i);
+  return i;
 } /* int openvpn_strsplit */
 
 /* dispatches number of users */
@@ -225,7 +225,7 @@ static int single_read(const char *name, FILE *fh) {
 
   read = 1;
 
-  return (read);
+  return read;
 } /* int single_read */
 
 /* for reading status version 1 */
@@ -276,12 +276,12 @@ static int multi1_read(const char *name, FILE *fh) {
   }
 
   if (ferror(fh))
-    return (0);
+    return 0;
 
   if (collect_user_count)
     numusers_submit(name, name, sum_users);
 
-  return (1);
+  return 1;
 } /* int multi1_read */
 
 /* for reading status version 2 */
@@ -336,7 +336,7 @@ static int multi2_read(const char *name, FILE *fh) {
     read = 1;
   }
 
-  return (read);
+  return read;
 } /* int multi2_read */
 
 /* for reading status version 3 */
@@ -391,7 +391,7 @@ static int multi3_read(const char *name, FILE *fh) {
     read = 1;
   }
 
-  return (read);
+  return read;
 } /* int multi3_read */
 
 /* for reading status version 4 */
@@ -446,7 +446,7 @@ static int multi4_read(const char *name, FILE *fh) {
     read = 1;
   }
 
-  return (read);
+  return read;
 } /* int multi4_read */
 
 /* read callback */
@@ -457,7 +457,7 @@ static int openvpn_read(void) {
   read = 0;
 
   if (vpn_num == 0)
-    return (0);
+    return 0;
 
   /* call the right read function for every status entry in the list */
   for (int i = 0; i < vpn_num; i++) {
@@ -498,7 +498,7 @@ static int openvpn_read(void) {
     read += vpn_read;
   }
 
-  return (read ? 0 : -1);
+  return read ? 0 : -1;
 } /* int openvpn_read */
 
 static int version_detect(const char *filename) {
@@ -509,14 +509,14 @@ static int version_detect(const char *filename) {
   /* Sanity checking. We're called from the config handling routine, so
    * better play it save. */
   if ((filename == NULL) || (*filename == 0))
-    return (0);
+    return 0;
 
   fh = fopen(filename, "r");
   if (fh == NULL) {
     char errbuf[1024];
     WARNING("openvpn plugin: Unable to read \"%s\": %s", filename,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (0);
+    return 0;
   }
 
   /* now search for the specific multimode data format */
@@ -581,7 +581,7 @@ static int openvpn_config(const char *key, const char *value) {
       WARNING("openvpn plugin: unable to detect status version, "
               "discarding status file \"%s\".",
               value);
-      return (1);
+      return 1;
     }
 
     status_file = sstrdup(value);
@@ -589,7 +589,7 @@ static int openvpn_config(const char *key, const char *value) {
       char errbuf[1024];
       WARNING("openvpn plugin: sstrdup failed: %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      return 1;
     }
 
     /* it determines the file name as string starting at location filename + 1
@@ -611,7 +611,7 @@ static int openvpn_config(const char *key, const char *value) {
                 "different one.",
                 status_name);
         sfree(status_file);
-        return (1);
+        return 1;
       }
     }
 
@@ -622,7 +622,7 @@ static int openvpn_config(const char *key, const char *value) {
       ERROR("openvpn plugin: malloc failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
       sfree(status_file);
-      return (1);
+      return 1;
     }
     temp->file = status_file;
     temp->version = status_version;
@@ -638,7 +638,7 @@ static int openvpn_config(const char *key, const char *value) {
       sfree(vpn_list);
       sfree(temp->file);
       sfree(temp);
-      return (1);
+      return 1;
     }
     vpn_list = tmp_list;
 
@@ -677,10 +677,10 @@ static int openvpn_config(const char *key, const char *value) {
       collect_individual_users = 1;
   } /* if (strcasecmp("CollectIndividualUsers", key) == 0) */
   else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int openvpn_config */
 
 /* shutdown callback */
@@ -692,7 +692,7 @@ static int openvpn_shutdown(void) {
 
   sfree(vpn_list);
 
-  return (0);
+  return 0;
 } /* int openvpn_shutdown */
 
 static int openvpn_init(void) {
@@ -701,13 +701,13 @@ static int openvpn_init(void) {
     WARNING("OpenVPN plugin: Neither `CollectIndividualUsers', "
             "`CollectCompression', nor `CollectUserCount' is true. There's no "
             "data left to collect.");
-    return (-1);
+    return -1;
   }
 
   plugin_register_read("openvpn", openvpn_read);
   plugin_register_shutdown("openvpn", openvpn_shutdown);
 
-  return (0);
+  return 0;
 } /* int openvpn_init */
 
 void module_register(void) {
@@ -715,5 +715,3 @@ void module_register(void) {
                          config_keys_num);
   plugin_register_init("openvpn", openvpn_init);
 } /* void module_register */
-
-/* vim: set sw=2 ts=2 : */
index 4eacc54..2d98f0a 100644 (file)
@@ -179,13 +179,13 @@ static int o_config_add_database(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("oracle plugin: The `Database' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   db = calloc(1, sizeof(*db));
   if (db == NULL) {
     ERROR("oracle plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   db->name = NULL;
   db->host = NULL;
@@ -196,7 +196,7 @@ static int o_config_add_database(oconfig_item_t *ci) /* {{{ */
   status = cf_util_get_string(ci, &db->name);
   if (status != 0) {
     sfree(db);
-    return (status);
+    return status;
   }
 
   /* Fill the `o_database_t' structure.. */
@@ -282,10 +282,10 @@ static int o_config_add_database(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     o_database_free(db);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int o_config_add_database */
 
 static int o_config(oconfig_item_t *ci) /* {{{ */
@@ -310,7 +310,7 @@ static int o_config(oconfig_item_t *ci) /* {{{ */
     }
   } /* for (ci->children) */
 
-  return (0);
+  return 0;
 } /* }}} int o_config */
 
 /* }}} End of configuration handling functions */
@@ -320,7 +320,7 @@ static int o_init(void) /* {{{ */
   int status;
 
   if (oci_env != NULL)
-    return (0);
+    return 0;
 
   status = OCIEnvCreate(&oci_env,
                         /* mode = */ OCI_THREADED,
@@ -332,7 +332,7 @@ static int o_init(void) /* {{{ */
                         /* user_data_ptr  = */ NULL);
   if (status != 0) {
     ERROR("oracle plugin: OCIEnvCreate failed with status %i.", status);
-    return (-1);
+    return -1;
   }
 
   status = OCIHandleAlloc(oci_env, (void *)&oci_error, OCI_HTYPE_ERROR,
@@ -341,10 +341,10 @@ static int o_init(void) /* {{{ */
     ERROR("oracle plugin: OCIHandleAlloc (OCI_HTYPE_ERROR) failed "
           "with status %i.",
           status);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int o_init */
 
 static int o_read_database_query(o_database_t *db, /* {{{ */
@@ -378,7 +378,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
       o_report_error("o_read_database_query", db->name, udb_query_get_name(q),
                      "OCIHandleAlloc", oci_error);
       oci_statement = NULL;
-      return (-1);
+      return -1;
     }
 
     status = OCIStmtPrepare(oci_statement, oci_error, (text *)statement,
@@ -390,7 +390,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
                      "OCIStmtPrepare", oci_error);
       OCIHandleFree(oci_statement, OCI_HTYPE_STMT);
       oci_statement = NULL;
-      return (-1);
+      return -1;
     }
     udb_query_set_user_data(q, oci_statement);
 
@@ -411,7 +411,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
   if (status != OCI_SUCCESS) {
     o_report_error("o_read_database_query", db->name, udb_query_get_name(q),
                    "OCIStmtExecute", oci_error);
-    return (-1);
+    return -1;
   } /* }}} */
 
   /* Acquire the number of columns returned. */
@@ -424,7 +424,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
     if (status != OCI_SUCCESS) {
       o_report_error("o_read_database_query", db->name, udb_query_get_name(q),
                      "OCIAttrGet", oci_error);
-      return (-1);
+      return -1;
     } /* }}} */
 
     column_num = (size_t)param_counter;
@@ -461,7 +461,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
     if ((ptr) == NULL) {                                                       \
       FREE_ALL;                                                                \
       ERROR("oracle plugin: o_read_database_query: calloc failed.");           \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
   } while (0)
 
@@ -471,13 +471,13 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
   oci_defines = NULL;
 
   ALLOC_OR_FAIL(column_names, column_num * sizeof(char *));
-  ALLOC_OR_FAIL(column_names[0], column_num * DATA_MAX_NAME_LEN * sizeof(char));
+  ALLOC_OR_FAIL(column_names[0], column_num * DATA_MAX_NAME_LEN);
   for (size_t i = 1; i < column_num; i++)
     column_names[i] = column_names[i - 1] + DATA_MAX_NAME_LEN;
 
   ALLOC_OR_FAIL(column_values, column_num * sizeof(char *));
   ALLOC_OR_FAIL(column_values[0],
-                column_num * DATA_MAX_NAME_LEN * sizeof(char));
+                column_num * DATA_MAX_NAME_LEN);
   for (size_t i = 1; i < column_num; i++)
     column_values[i] = column_values[i - 1] + DATA_MAX_NAME_LEN;
 
@@ -552,7 +552,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
           "udb_query_prepare_result failed.",
           db->name, udb_query_get_name(q));
     FREE_ALL;
-    return (-1);
+    return -1;
   }
 
   /* Fetch and handle all the rows that matched the query. */
@@ -582,7 +582,7 @@ static int o_read_database_query(o_database_t *db, /* {{{ */
    * %s", q->statement); */
   FREE_ALL;
 
-  return (0);
+  return 0;
 #undef FREE_ALL
 #undef ALLOC_OR_FAIL
 } /* }}} int o_read_database_query */
@@ -602,7 +602,7 @@ static int o_read_database(o_database_t *db) /* {{{ */
     if (status != OCI_SUCCESS) {
       o_report_error("o_read_database", db->name, NULL, "OCIAttrGet",
                      oci_error);
-      return (-1);
+      return -1;
     }
 
     if (server_handle == NULL) {
@@ -616,7 +616,7 @@ static int o_read_database(o_database_t *db) /* {{{ */
       if (status != OCI_SUCCESS) {
         o_report_error("o_read_database", db->name, NULL, "OCIAttrGet",
                        oci_error);
-        return (-1);
+        return -1;
       }
     }
 
@@ -642,7 +642,7 @@ static int o_read_database(o_database_t *db) /* {{{ */
       DEBUG("oracle plugin: OCILogon (%s): db->oci_service_context = %p;",
             db->connect_id, db->oci_service_context);
       db->oci_service_context = NULL;
-      return (-1);
+      return -1;
     } else if (status == OCI_SUCCESS_WITH_INFO) {
       /* TODO: Print NOTIFY message. */
     }
@@ -656,7 +656,7 @@ static int o_read_database(o_database_t *db) /* {{{ */
   for (size_t i = 0; i < db->queries_num; i++)
     o_read_database_query(db, db->queries[i], db->q_prep_areas[i]);
 
-  return (0);
+  return 0;
 } /* }}} int o_read_database */
 
 static int o_read(void) /* {{{ */
@@ -666,7 +666,7 @@ static int o_read(void) /* {{{ */
   for (i = 0; i < databases_num; i++)
     o_read_database(databases[i]);
 
-  return (0);
+  return 0;
 } /* }}} int o_read */
 
 static int o_shutdown(void) /* {{{ */
@@ -696,7 +696,7 @@ static int o_shutdown(void) /* {{{ */
   queries = NULL;
   queries_num = 0;
 
-  return (0);
+  return 0;
 } /* }}} int o_shutdown */
 
 void module_register(void) /* {{{ */
@@ -706,7 +706,3 @@ void module_register(void) /* {{{ */
   plugin_register_read("oracle", o_read);
   plugin_register_shutdown("oracle", o_shutdown);
 } /* }}} void module_register */
-
-/*
- * vim: shiftwidth=2 softtabstop=2 et fdm=marker
- */
diff --git a/src/ovs_events.c b/src/ovs_events.c
new file mode 100644 (file)
index 0000000..6504234
--- /dev/null
@@ -0,0 +1,658 @@
+/**
+ * collectd - src/ovs_events.c
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Volodymyr Mytnyk <volodymyrx.mytnyk@intel.com>
+ **/
+
+#include "collectd.h"
+
+#include "common.h" /* auxiliary functions */
+
+#include "utils_ovs.h" /* OVS helpers */
+
+#define OVS_EVENTS_IFACE_NAME_SIZE 128
+#define OVS_EVENTS_IFACE_UUID_SIZE 64
+#define OVS_EVENTS_EXT_IFACE_ID_SIZE 64
+#define OVS_EVENTS_EXT_VM_UUID_SIZE 64
+#define OVS_EVENTS_PLUGIN "ovs_events"
+#define OVS_EVENTS_CTX_LOCK                                                    \
+  for (int __i = ovs_events_ctx_lock(); __i != 0; __i = ovs_events_ctx_unlock())
+
+/* Link status type */
+enum ovs_events_link_status_e { DOWN, UP };
+typedef enum ovs_events_link_status_e ovs_events_link_status_t;
+
+/* Interface info */
+struct ovs_events_iface_info_s {
+  char name[OVS_EVENTS_IFACE_NAME_SIZE];           /* interface name */
+  char uuid[OVS_EVENTS_IFACE_UUID_SIZE];           /* interface UUID */
+  char ext_iface_id[OVS_EVENTS_EXT_IFACE_ID_SIZE]; /* external interface id */
+  char ext_vm_uuid[OVS_EVENTS_EXT_VM_UUID_SIZE];   /* external VM UUID */
+  ovs_events_link_status_t link_status;            /* interface link status */
+  struct ovs_events_iface_info_s *next;            /* next interface info */
+};
+typedef struct ovs_events_iface_info_s ovs_events_iface_info_t;
+
+/* Interface list */
+struct ovs_events_iface_list_s {
+  char name[OVS_EVENTS_IFACE_NAME_SIZE]; /* interface name */
+  struct ovs_events_iface_list_s *next;  /* next interface info */
+};
+typedef struct ovs_events_iface_list_s ovs_events_iface_list_t;
+
+/* OVS events configuration data */
+struct ovs_events_config_s {
+  _Bool send_notification;                 /* sent notification to collectd? */
+  char ovs_db_node[OVS_DB_ADDR_NODE_SIZE]; /* OVS DB node */
+  char ovs_db_serv[OVS_DB_ADDR_SERVICE_SIZE]; /* OVS DB service */
+  char ovs_db_unix[OVS_DB_ADDR_UNIX_SIZE];    /* OVS DB unix socket path */
+  ovs_events_iface_list_t *ifaces;            /* interface info */
+};
+typedef struct ovs_events_config_s ovs_events_config_t;
+
+/* OVS events context type */
+struct ovs_events_ctx_s {
+  pthread_mutex_t mutex;      /* mutex to lock the context */
+  ovs_db_t *ovs_db;           /* pointer to OVS DB instance */
+  ovs_events_config_t config; /* plugin config */
+  char *ovs_db_select_params; /* OVS DB select parameter request */
+  _Bool is_db_available;      /* specify whether OVS DB is available */
+};
+typedef struct ovs_events_ctx_s ovs_events_ctx_t;
+
+/*
+ * Private variables
+ */
+static ovs_events_ctx_t ovs_events_ctx = {
+    .mutex = PTHREAD_MUTEX_INITIALIZER,
+    .config = {.send_notification = 1,     /* send notification by default */
+               .ovs_db_node = "localhost", /* use default OVS DB node */
+               .ovs_db_serv = "6640"}      /* use default OVS DB service */
+};
+
+/* Forward declaration */
+static int ovs_events_plugin_read(user_data_t *u);
+
+/* This function is used only by "OVS_EVENTS_CTX_LOCK" define (see above).
+ * It always returns 1 when context is locked.
+ */
+static int ovs_events_ctx_lock() {
+  pthread_mutex_lock(&ovs_events_ctx.mutex);
+  return 1;
+}
+
+/* This function is used only by "OVS_EVENTS_CTX_LOCK" define (see above).
+ * It always returns 0 when context is unlocked.
+ */
+static int ovs_events_ctx_unlock() {
+  pthread_mutex_unlock(&ovs_events_ctx.mutex);
+  return 0;
+}
+
+/* Check if given interface name exists in configuration file. It
+ * returns 1 if exists otherwise 0. If no interfaces are configured,
+ * -1 is returned
+ */
+static int ovs_events_config_iface_exists(const char *ifname) {
+  if (ovs_events_ctx.config.ifaces == NULL)
+    return -1;
+
+  /* check if given interface exists */
+  for (ovs_events_iface_list_t *iface = ovs_events_ctx.config.ifaces; iface;
+       iface = iface->next)
+    if (strcmp(ifname, iface->name) == 0)
+      return 1;
+
+  return 0;
+}
+
+/* Get OVS DB select parameter request based on rfc7047,
+ * "Transact" & "Select" section
+ */
+static char *ovs_events_get_select_params() {
+  size_t buff_size = 0;
+  size_t buff_off = 0;
+  char *opt_buff = NULL;
+  static const char params_fmt[] = "[\"Open_vSwitch\"%s]";
+  static const char option_fmt[] =
+      ",{\"op\":\"select\",\"table\":\"Interface\","
+      "\"where\":[[\"name\",\"==\",\"%s\"]],"
+      "\"columns\":[\"link_state\",\"external_ids\","
+      "\"name\",\"_uuid\"]}";
+  static const char default_opt[] =
+      ",{\"op\":\"select\",\"table\":\"Interface\","
+      "\"where\":[],\"columns\":[\"link_state\","
+      "\"external_ids\",\"name\",\"_uuid\"]}";
+  /* setup OVS DB interface condition */
+  for (ovs_events_iface_list_t *iface = ovs_events_ctx.config.ifaces; iface;
+       iface = iface->next) {
+    /* allocate new buffer (format size + ifname len is good enough) */
+    buff_size += sizeof(option_fmt) + strlen(iface->name);
+    char *new_buff = realloc(opt_buff, buff_size);
+    if (new_buff == NULL) {
+      sfree(opt_buff);
+      return NULL;
+    }
+    opt_buff = new_buff;
+    int ret = ssnprintf(opt_buff + buff_off, buff_size - buff_off, option_fmt,
+                        iface->name);
+    if (ret < 0) {
+      sfree(opt_buff);
+      return NULL;
+    }
+    buff_off += ret;
+  }
+  /* if no interfaces are configured, use default params */
+  if (opt_buff == NULL)
+    if ((opt_buff = strdup(default_opt)) == NULL)
+      return NULL;
+
+  /* allocate memory for OVS DB select params */
+  size_t params_size = sizeof(params_fmt) + strlen(opt_buff);
+  char *params_buff = calloc(1, params_size);
+  if (params_buff == NULL) {
+    sfree(opt_buff);
+    return NULL;
+  }
+
+  /* create OVS DB select params */
+  if (ssnprintf(params_buff, params_size, params_fmt, opt_buff) < 0)
+    sfree(params_buff);
+
+  sfree(opt_buff);
+  return params_buff;
+}
+
+/* Release memory allocated for configuration data */
+static void ovs_events_config_free() {
+  ovs_events_iface_list_t *del_iface = NULL;
+  sfree(ovs_events_ctx.ovs_db_select_params);
+  while (ovs_events_ctx.config.ifaces) {
+    del_iface = ovs_events_ctx.config.ifaces;
+    ovs_events_ctx.config.ifaces = ovs_events_ctx.config.ifaces->next;
+    sfree(del_iface);
+  }
+}
+
+/* Parse/process "Interfaces" configuration option. Returns 0 if success
+ * otherwise -1 (error)
+ */
+static int ovs_events_config_get_interfaces(const oconfig_item_t *ci) {
+  for (int j = 0; j < ci->values_num; j++) {
+    /* check interface name type */
+    if (ci->values[j].type != OCONFIG_TYPE_STRING) {
+      ERROR(OVS_EVENTS_PLUGIN
+            ": given interface name is not a string [idx=%d]", j);
+      return -1;
+    }
+    /* allocate memory for configured interface */
+    ovs_events_iface_list_t *new_iface = calloc(1, sizeof(*new_iface));
+    if (new_iface == NULL) {
+      ERROR(OVS_EVENTS_PLUGIN ": calloc () copy interface name fail");
+      return -1;
+    } else {
+      /* store interface name */
+      sstrncpy(new_iface->name, ci->values[j].value.string,
+               sizeof(new_iface->name));
+      new_iface->next = ovs_events_ctx.config.ifaces;
+      ovs_events_ctx.config.ifaces = new_iface;
+      DEBUG(OVS_EVENTS_PLUGIN ": found monitored interface \"%s\"",
+            new_iface->name);
+    }
+  }
+  return 0;
+}
+
+/* Parse plugin configuration file and store the config
+ * in allocated memory. Returns negative value in case of error.
+ */
+static int ovs_events_plugin_config(oconfig_item_t *ci) {
+  _Bool dispatch_values = 0;
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("SendNotification", child->key) == 0) {
+      if (cf_util_get_boolean(child,
+                              &ovs_events_ctx.config.send_notification) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+    } else if (strcasecmp("Address", child->key) == 0) {
+      if (cf_util_get_string_buffer(
+              child, ovs_events_ctx.config.ovs_db_node,
+              sizeof(ovs_events_ctx.config.ovs_db_node)) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+    } else if (strcasecmp("Port", child->key) == 0) {
+      char *service = NULL;
+      if (cf_util_get_service(child, &service) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+      strncpy(ovs_events_ctx.config.ovs_db_serv, service,
+              sizeof(ovs_events_ctx.config.ovs_db_serv));
+      sfree(service);
+    } else if (strcasecmp("Socket", child->key) == 0) {
+      if (cf_util_get_string_buffer(
+              child, ovs_events_ctx.config.ovs_db_unix,
+              sizeof(ovs_events_ctx.config.ovs_db_unix)) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+    } else if (strcasecmp("Interfaces", child->key) == 0) {
+      if (ovs_events_config_get_interfaces(child) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+    } else if (strcasecmp("DispatchValues", child->key) == 0) {
+      if (cf_util_get_boolean(child, &dispatch_values) != 0) {
+        ovs_events_config_free();
+        return -1;
+      }
+    } else {
+      ERROR(OVS_EVENTS_PLUGIN ": option '%s' is not allowed here", child->key);
+      ovs_events_config_free();
+      return -1;
+    }
+  }
+  /* Check and warn about invalid configuration */
+  if (!ovs_events_ctx.config.send_notification && !dispatch_values) {
+      WARNING(OVS_EVENTS_PLUGIN ": send notification and dispatch values "
+              "options are disabled. No information will be dispatched by the "
+              "plugin. Please check your configuration");
+  }
+  /* Dispatch link status values if configured */
+  if (dispatch_values)
+    return plugin_register_complex_read(NULL, OVS_EVENTS_PLUGIN,
+                                        ovs_events_plugin_read, 0, NULL);
+
+  return 0;
+}
+
+/* Dispatch OVS interface link status event to collectd */
+static void ovs_events_dispatch_notification(const ovs_events_iface_info_t *ifinfo) {
+  const char *msg_link_status = NULL;
+  notification_t n = {
+      NOTIF_FAILURE, cdtime(), "", "", OVS_EVENTS_PLUGIN, "", "", "", NULL};
+
+  /* convert link status to message string */
+  switch (ifinfo->link_status) {
+  case UP:
+    msg_link_status = "UP";
+    n.severity = NOTIF_OKAY;
+    break;
+  case DOWN:
+    msg_link_status = "DOWN";
+    n.severity = NOTIF_WARNING;
+    break;
+  default:
+    ERROR(OVS_EVENTS_PLUGIN ": unknown interface link status");
+    return;
+  }
+
+  /* add interface metadata to the notification */
+  if (plugin_notification_meta_add_string(&n, "uuid", ifinfo->uuid) < 0) {
+    ERROR(OVS_EVENTS_PLUGIN ": add interface uuid meta data failed");
+    return;
+  }
+
+  if (strlen(ifinfo->ext_vm_uuid) > 0) {
+    if (plugin_notification_meta_add_string(&n, "vm-uuid",
+                                            ifinfo->ext_vm_uuid) < 0) {
+      ERROR(OVS_EVENTS_PLUGIN ": add interface vm-uuid meta data failed");
+      return;
+    }
+  }
+
+  if (strlen(ifinfo->ext_iface_id) > 0) {
+    if (plugin_notification_meta_add_string(&n, "iface-id",
+                                            ifinfo->ext_iface_id) < 0) {
+      ERROR(OVS_EVENTS_PLUGIN ": add interface iface-id meta data failed");
+      return;
+    }
+  }
+
+  /* fill the notification data */
+  ssnprintf(n.message, sizeof(n.message),
+            "link state of \"%s\" interface has been changed to \"%s\"",
+            ifinfo->name, msg_link_status);
+  sstrncpy(n.host, hostname_g, sizeof(n.host));
+  sstrncpy(n.plugin_instance, ifinfo->name, sizeof(n.plugin_instance));
+  sstrncpy(n.type, "gauge", sizeof(n.type));
+  sstrncpy(n.type_instance, "link_status", sizeof(n.type_instance));
+  plugin_dispatch_notification(&n);
+}
+
+/* Dispatch OVS interface link status value to collectd */
+static void ovs_events_link_status_submit(const ovs_events_iface_info_t *ifinfo) {
+  value_list_t vl = VALUE_LIST_INIT;
+  meta_data_t *meta = NULL;
+
+  /* add interface metadata to the submit value */
+  if ((meta = meta_data_create()) != NULL) {
+    if (meta_data_add_string(meta, "uuid", ifinfo->uuid) < 0)
+      ERROR(OVS_EVENTS_PLUGIN ": add interface uuid meta data failed");
+
+    if (strlen(ifinfo->ext_vm_uuid) > 0)
+      if (meta_data_add_string(meta, "vm-uuid", ifinfo->ext_vm_uuid) < 0)
+        ERROR(OVS_EVENTS_PLUGIN ": add interface vm-uuid meta data failed");
+
+    if (strlen(ifinfo->ext_iface_id) > 0)
+      if (meta_data_add_string(meta, "iface-id", ifinfo->ext_iface_id) < 0)
+        ERROR(OVS_EVENTS_PLUGIN ": add interface iface-id meta data failed");
+    vl.meta = meta;
+  } else
+    ERROR(OVS_EVENTS_PLUGIN ": create metadata failed");
+
+  vl.time = cdtime();
+  vl.values = &(value_t){.gauge = (gauge_t)ifinfo->link_status};
+  vl.values_len = 1;
+  sstrncpy(vl.plugin, OVS_EVENTS_PLUGIN, sizeof(vl.plugin));
+  sstrncpy(vl.plugin_instance, ifinfo->name, sizeof(vl.plugin_instance));
+  sstrncpy(vl.type, "gauge", sizeof(vl.type));
+  sstrncpy(vl.type_instance, "link_status", sizeof(vl.type_instance));
+  plugin_dispatch_values(&vl);
+  meta_data_destroy(meta);
+}
+
+/* Dispatch OVS DB terminate connection event to collectd */
+static void ovs_events_dispatch_terminate_notification(const char *msg) {
+  notification_t n = {
+      NOTIF_FAILURE, cdtime(), "", "", OVS_EVENTS_PLUGIN, "", "", "", NULL};
+  sstrncpy(n.message, msg, sizeof(n.message));
+  sstrncpy(n.host, hostname_g, sizeof(n.host));
+  plugin_dispatch_notification(&n);
+}
+
+/* Get OVS DB interface information and stores it into
+ * ovs_events_iface_info_t structure */
+static int ovs_events_get_iface_info(yajl_val jobject,
+                                     ovs_events_iface_info_t *ifinfo) {
+  yajl_val jexternal_ids = NULL;
+  yajl_val jvalue = NULL;
+  yajl_val juuid = NULL;
+  const char *state = NULL;
+
+  /* check YAJL type */
+  if (!YAJL_IS_OBJECT(jobject))
+    return -1;
+
+  /* zero the interface info structure */
+  memset(ifinfo, 0, sizeof(*ifinfo));
+
+  /* try to find external_ids, name and link_state fields */
+  jexternal_ids = ovs_utils_get_value_by_key(jobject, "external_ids");
+  if (jexternal_ids == NULL || ifinfo == NULL)
+    return -1;
+
+  /* get iface-id from external_ids field */
+  jvalue = ovs_utils_get_map_value(jexternal_ids, "iface-id");
+  if (jvalue != NULL && YAJL_IS_STRING(jvalue))
+    sstrncpy(ifinfo->ext_iface_id, YAJL_GET_STRING(jvalue),
+             sizeof(ifinfo->ext_iface_id));
+
+  /* get vm-uuid from external_ids field */
+  jvalue = ovs_utils_get_map_value(jexternal_ids, "vm-uuid");
+  if (jvalue != NULL && YAJL_IS_STRING(jvalue))
+    sstrncpy(ifinfo->ext_vm_uuid, YAJL_GET_STRING(jvalue),
+             sizeof(ifinfo->ext_vm_uuid));
+
+  /* get interface uuid */
+  jvalue = ovs_utils_get_value_by_key(jobject, "_uuid");
+  if (jvalue == NULL || !YAJL_IS_ARRAY(jvalue) ||
+      YAJL_GET_ARRAY(jvalue)->len != 2)
+    return -1;
+  juuid = YAJL_GET_ARRAY(jvalue)->values[1];
+  if (juuid == NULL || !YAJL_IS_STRING(juuid))
+    return -1;
+  sstrncpy(ifinfo->uuid, YAJL_GET_STRING(juuid), sizeof(ifinfo->uuid));
+
+  /* get interface name */
+  jvalue = ovs_utils_get_value_by_key(jobject, "name");
+  if (jvalue == NULL || !YAJL_IS_STRING(jvalue))
+    return -1;
+  sstrncpy(ifinfo->name, YAJL_GET_STRING(jvalue), sizeof(ifinfo->name));
+
+  /* get OVS DB interface link status */
+  jvalue = ovs_utils_get_value_by_key(jobject, "link_state");
+  if (jvalue != NULL && ((state = YAJL_GET_STRING(jvalue)) != NULL)) {
+    /* convert OVS table link state to link status */
+    if (strcmp(state, "up") == 0)
+      ifinfo->link_status = UP;
+    else if (strcmp(state, "down") == 0)
+      ifinfo->link_status = DOWN;
+  }
+  return 0;
+}
+
+/* Process OVS DB update table event. It handles link status update event(s)
+ * and dispatches the value(s) to collectd if interface name matches one of
+ * interfaces specified in configuration file.
+ */
+static void ovs_events_table_update_cb(yajl_val jupdates) {
+  yajl_val jnew_val = NULL;
+  yajl_val jupdate = NULL;
+  yajl_val jrow_update = NULL;
+  ovs_events_iface_info_t ifinfo;
+
+  /* JSON "Interface" table update example:
+   * ---------------------------------
+   * {"Interface":
+   *  {
+   *   "9adf1db2-29ca-4140-ab22-ae347a4484de":
+   *    {
+   *     "new":
+   *      {
+   *       "name":"br0",
+   *       "link_state":"up"
+   *      },
+   *     "old":
+   *      {
+   *       "link_state":"down"
+   *      }
+   *    }
+   *  }
+   * }
+   */
+  if (!YAJL_IS_OBJECT(jupdates) || !(YAJL_GET_OBJECT(jupdates)->len > 0)) {
+    ERROR(OVS_EVENTS_PLUGIN ": unexpected OVS DB update event received");
+    return;
+  }
+  /* verify if this is a table event */
+  jupdate = YAJL_GET_OBJECT(jupdates)->values[0];
+  if (!YAJL_IS_OBJECT(jupdate)) {
+    ERROR(OVS_EVENTS_PLUGIN ": unexpected table update event received");
+    return;
+  }
+  /* go through all row updates  */
+  for (size_t row_index = 0; row_index < YAJL_GET_OBJECT(jupdate)->len;
+       ++row_index) {
+    jrow_update = YAJL_GET_OBJECT(jupdate)->values[row_index];
+
+    /* check row update */
+    jnew_val = ovs_utils_get_value_by_key(jrow_update, "new");
+    if (jnew_val == NULL) {
+      ERROR(OVS_EVENTS_PLUGIN ": unexpected row update received");
+      return;
+    }
+    /* get OVS DB interface information */
+    if (ovs_events_get_iface_info(jnew_val, &ifinfo) < 0) {
+      ERROR(OVS_EVENTS_PLUGIN
+            " :unexpected interface information data received");
+      return;
+    }
+    if (ovs_events_config_iface_exists(ifinfo.name) != 0) {
+      DEBUG("name=%s, uuid=%s, ext_iface_id=%s, ext_vm_uuid=%s", ifinfo.name,
+            ifinfo.uuid, ifinfo.ext_iface_id, ifinfo.ext_vm_uuid);
+      /* dispatch notification */
+      ovs_events_dispatch_notification(&ifinfo);
+    }
+  }
+}
+
+/* OVS DB reply callback. It parses reply, receives
+ * interface information and dispatches the info to
+ * collectd
+ */
+static void ovs_events_poll_result_cb(yajl_val jresult, yajl_val jerror) {
+  yajl_val *jvalues = NULL;
+  yajl_val jvalue = NULL;
+  ovs_events_iface_info_t ifinfo;
+
+  if (!YAJL_IS_NULL(jerror)) {
+    ERROR(OVS_EVENTS_PLUGIN "error received by OVS DB server");
+    return;
+  }
+
+  /* result should be an array */
+  if (!YAJL_IS_ARRAY(jresult)) {
+    ERROR(OVS_EVENTS_PLUGIN "invalid data (array is expected)");
+    return;
+  }
+
+  /* go through all rows and get interface info */
+  jvalues = YAJL_GET_ARRAY(jresult)->values;
+  for (size_t i = 0; i < YAJL_GET_ARRAY(jresult)->len; i++) {
+    jvalue = ovs_utils_get_value_by_key(jvalues[i], "rows");
+    if (jvalue == NULL || !YAJL_IS_ARRAY(jvalue)) {
+      ERROR(OVS_EVENTS_PLUGIN "invalid data (array of rows is expected)");
+      return;
+    }
+    /* get interfaces info */
+    for (size_t j = 0; j < YAJL_GET_ARRAY(jvalue)->len; j++) {
+      if (ovs_events_get_iface_info(YAJL_GET_ARRAY(jvalue)->values[j],
+                                    &ifinfo) < 0) {
+        ERROR(OVS_EVENTS_PLUGIN
+              "unexpected interface information data received");
+        return;
+      }
+      DEBUG("name=%s, uuid=%s, ext_iface_id=%s, ext_vm_uuid=%s", ifinfo.name,
+            ifinfo.uuid, ifinfo.ext_iface_id, ifinfo.ext_vm_uuid);
+      ovs_events_link_status_submit(&ifinfo);
+    }
+  }
+}
+
+/* Setup OVS DB table callback. It subscribes to OVS DB 'Interface' table
+ * to receive link status event(s).
+ */
+static void ovs_events_conn_initialize(ovs_db_t *pdb) {
+  const char tb_name[] = "Interface";
+  const char *columns[] = {"_uuid", "external_ids", "name", "link_state", NULL};
+
+  /* register update link status event if needed */
+  if (ovs_events_ctx.config.send_notification) {
+    int ret = ovs_db_table_cb_register(pdb, tb_name, columns,
+                                       ovs_events_table_update_cb, NULL,
+                                       OVS_DB_TABLE_CB_FLAG_MODIFY);
+    if (ret < 0) {
+      ERROR(OVS_EVENTS_PLUGIN ": register OVS DB update callback failed");
+      return;
+    }
+  }
+  OVS_EVENTS_CTX_LOCK { ovs_events_ctx.is_db_available = 1; }
+  DEBUG(OVS_EVENTS_PLUGIN ": OVS DB connection has been initialized");
+}
+
+/* OVS DB terminate connection notification callback */
+static void ovs_events_conn_terminate() {
+  const char msg[] = "OVS DB connection has been lost";
+  if (ovs_events_ctx.config.send_notification)
+    ovs_events_dispatch_terminate_notification(msg);
+  WARNING(OVS_EVENTS_PLUGIN ": %s", msg);
+  OVS_EVENTS_CTX_LOCK { ovs_events_ctx.is_db_available = 0; }
+}
+
+/* Read OVS DB interface link status callback */
+static int ovs_events_plugin_read(__attribute__((unused)) user_data_t *u) {
+  _Bool is_connected = 0;
+  OVS_EVENTS_CTX_LOCK { is_connected = ovs_events_ctx.is_db_available; }
+  if (is_connected)
+    if (ovs_db_send_request(ovs_events_ctx.ovs_db, "transact",
+                            ovs_events_ctx.ovs_db_select_params,
+                            ovs_events_poll_result_cb) < 0) {
+      ERROR(OVS_EVENTS_PLUGIN ": get interface info failed");
+      return -1;
+    }
+  return 0;
+}
+
+/* Initialize OVS plugin */
+static int ovs_events_plugin_init(void) {
+  ovs_db_t *ovs_db = NULL;
+  ovs_db_callback_t cb = {.post_conn_init = ovs_events_conn_initialize,
+                          .post_conn_terminate = ovs_events_conn_terminate};
+
+  DEBUG(OVS_EVENTS_PLUGIN ": OVS DB address=%s, service=%s, unix=%s",
+        ovs_events_ctx.config.ovs_db_node, ovs_events_ctx.config.ovs_db_serv,
+        ovs_events_ctx.config.ovs_db_unix);
+
+  /* generate OVS DB select condition based on list on configured interfaces */
+  ovs_events_ctx.ovs_db_select_params = ovs_events_get_select_params();
+  if (ovs_events_ctx.ovs_db_select_params == NULL) {
+    ERROR(OVS_EVENTS_PLUGIN ": fail to get OVS DB select condition");
+    goto ovs_events_failure;
+  }
+
+  /* initialize OVS DB */
+  ovs_db = ovs_db_init(ovs_events_ctx.config.ovs_db_node,
+                       ovs_events_ctx.config.ovs_db_serv,
+                       ovs_events_ctx.config.ovs_db_unix, &cb);
+  if (ovs_db == NULL) {
+    ERROR(OVS_EVENTS_PLUGIN ": fail to connect to OVS DB server");
+    goto ovs_events_failure;
+  }
+
+  /* store OVS DB handler */
+  OVS_EVENTS_CTX_LOCK { ovs_events_ctx.ovs_db = ovs_db; }
+
+  DEBUG(OVS_EVENTS_PLUGIN ": plugin has been initialized");
+  return 0;
+
+ovs_events_failure:
+  ERROR(OVS_EVENTS_PLUGIN ": plugin initialize failed");
+  /* release allocated memory */
+  ovs_events_config_free();
+  return -1;
+}
+
+/* Shutdown OVS plugin */
+static int ovs_events_plugin_shutdown(void) {
+  /* destroy OVS DB */
+  if (ovs_db_destroy(ovs_events_ctx.ovs_db))
+    ERROR(OVS_EVENTS_PLUGIN ": OVSDB object destroy failed");
+
+  /* release memory allocated for config */
+  ovs_events_config_free();
+
+  DEBUG(OVS_EVENTS_PLUGIN ": plugin has been destroyed");
+  return 0;
+}
+
+/* Register OVS plugin callbacks */
+void module_register(void) {
+  plugin_register_complex_config(OVS_EVENTS_PLUGIN, ovs_events_plugin_config);
+  plugin_register_init(OVS_EVENTS_PLUGIN, ovs_events_plugin_init);
+  plugin_register_shutdown(OVS_EVENTS_PLUGIN, ovs_events_plugin_shutdown);
+}
diff --git a/src/ovs_stats.c b/src/ovs_stats.c
new file mode 100644 (file)
index 0000000..31af77c
--- /dev/null
@@ -0,0 +1,990 @@
+/*
+ * collectd - src/ovs_stats.c
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Taras Chornyi <tarasx.chornyi@intel.com>
+ */
+
+#include "common.h"
+
+#include "utils_ovs.h" /* OvS helpers */
+
+/* Plugin name */
+static const char plugin_name[] = "ovs_stats";
+
+typedef enum iface_counter {
+  not_supported = -1,
+  collisions,
+  rx_bytes,
+  rx_crc_err,
+  rx_dropped,
+  rx_errors,
+  rx_frame_err,
+  rx_over_err,
+  rx_packets,
+  tx_bytes,
+  tx_dropped,
+  tx_errors,
+  tx_packets,
+  rx_1_to_64_packets,
+  rx_65_to_127_packets,
+  rx_128_to_255_packets,
+  rx_256_to_511_packets,
+  rx_512_to_1023_packets,
+  rx_1024_to_1522_packets,
+  rx_1523_to_max_packets,
+  tx_1_to_64_packets,
+  tx_65_to_127_packets,
+  tx_128_to_255_packets,
+  tx_256_to_511_packets,
+  tx_512_to_1023_packets,
+  tx_1024_to_1522_packets,
+  tx_1523_to_max_packets,
+  tx_multicast_packets,
+  rx_broadcast_packets,
+  tx_broadcast_packets,
+  rx_undersized_errors,
+  rx_oversize_errors,
+  rx_fragmented_errors,
+  rx_jabber_errors,
+  __iface_counter_max
+} iface_counter;
+
+#define IFACE_COUNTER_MAX (__iface_counter_max - 1)
+#define IFACE_COUNTER_COUNT (__iface_counter_max)
+#define PORT_NAME_SIZE_MAX 255
+#define UUID_SIZE 64
+
+typedef struct port_s {
+  char name[PORT_NAME_SIZE_MAX];      /* Port name */
+  char port_uuid[UUID_SIZE];          /* Port table _uuid */
+  char iface_uuid[UUID_SIZE];         /* Interface table uuid */
+  char ex_iface_id[UUID_SIZE];        /* External iface id */
+  char ex_vm_id[UUID_SIZE];           /* External vm id */
+  int64_t stats[IFACE_COUNTER_COUNT]; /* Port statistics */
+  struct bridge_list_s *br;           /* Pointer to bridge */
+  struct port_s *next;                /* Next port */
+} port_list_t;
+
+typedef struct bridge_list_s {
+  char *name;                 /* Bridge name */
+  struct bridge_list_s *next; /* Next bridge*/
+} bridge_list_t;
+
+static const char *const iface_counter_table[IFACE_COUNTER_COUNT] = {
+        [collisions] = "collisions",
+        [rx_bytes] = "rx_bytes",
+        [rx_crc_err] = "rx_crc_err",
+        [rx_dropped] = "rx_dropped",
+        [rx_errors] = "rx_errors",
+        [rx_frame_err] = "rx_frame_err",
+        [rx_over_err] = "rx_over_err",
+        [rx_packets] = "rx_packets",
+        [tx_bytes] = "tx_bytes",
+        [tx_dropped] = "tx_dropped",
+        [tx_errors] = "tx_errors",
+        [tx_packets] = "tx_packets",
+        [rx_1_to_64_packets] = "rx_1_to_64_packets",
+        [rx_65_to_127_packets] = "rx_65_to_127_packets",
+        [rx_128_to_255_packets] = "rx_128_to_255_packets",
+        [rx_256_to_511_packets] = "rx_256_to_511_packets",
+        [rx_512_to_1023_packets] = "rx_512_to_1023_packets",
+        [rx_1024_to_1522_packets] = "rx_1024_to_1518_packets",
+        [rx_1523_to_max_packets] = "rx_1523_to_max_packets",
+        [tx_1_to_64_packets] = "tx_1_to_64_packets",
+        [tx_65_to_127_packets] = "tx_65_to_127_packets",
+        [tx_128_to_255_packets] = "tx_128_to_255_packets",
+        [tx_256_to_511_packets] = "tx_256_to_511_packets",
+        [tx_512_to_1023_packets] = "tx_512_to_1023_packets",
+        [tx_1024_to_1522_packets] = "tx_1024_to_1518_packets",
+        [tx_1523_to_max_packets] = "tx_1523_to_max_packets",
+        [tx_multicast_packets] = "tx_multicast_packets",
+        [rx_broadcast_packets] = "rx_broadcast_packets",
+        [tx_broadcast_packets] = "tx_broadcast_packets",
+        [rx_undersized_errors] = "rx_undersized_errors",
+        [rx_oversize_errors] = "rx_oversize_errors",
+        [rx_fragmented_errors] = "rx_fragmented_errors",
+        [rx_jabber_errors] = "rx_jabber_errors",
+};
+
+/* Entry into the list of network bridges */
+static bridge_list_t *g_bridge_list_head;
+
+/* Entry into the list of monitored network bridges */
+static bridge_list_t *g_monitored_bridge_list_head;
+
+/* entry into the list of network bridges */
+static port_list_t *g_port_list_head;
+
+/* lock for statistics cache */
+static pthread_mutex_t g_stats_lock;
+
+/* OvS DB socket */
+static ovs_db_t *g_ovs_db;
+
+/* OVS stats configuration data */
+struct ovs_stats_config_s {
+  char ovs_db_node[OVS_DB_ADDR_NODE_SIZE];    /* OVS DB node */
+  char ovs_db_serv[OVS_DB_ADDR_SERVICE_SIZE]; /* OVS DB service */
+  char ovs_db_unix[OVS_DB_ADDR_UNIX_SIZE];    /* OVS DB unix socket path */
+};
+typedef struct ovs_stats_config_s ovs_stats_config_t;
+
+static ovs_stats_config_t ovs_stats_cfg = {
+    .ovs_db_node = "localhost", /* use default OVS DB node */
+    .ovs_db_serv = "6640",      /* use default OVS DB service */
+};
+
+static iface_counter ovs_stats_counter_name_to_type(const char *counter) {
+  iface_counter index = not_supported;
+
+  if (counter == NULL)
+    return not_supported;
+
+  for (int i = 0; i < IFACE_COUNTER_COUNT; i++) {
+    if (strncmp(iface_counter_table[i], counter,
+                strlen(iface_counter_table[i])) == 0) {
+      index = i;
+      break;
+    }
+  }
+  return index;
+}
+
+static void ovs_stats_submit_one(const char *dev, const char *type,
+                                 const char *type_instance, derive_t value,
+                                 meta_data_t *meta) {
+  /* if counter is less than 0 - skip it*/
+  if (value < 0)
+    return;
+  value_list_t vl = VALUE_LIST_INIT;
+
+  vl.values = &(value_t){.derive = value};
+  vl.values_len = 1;
+  vl.meta = meta;
+
+  sstrncpy(vl.plugin, plugin_name, sizeof(vl.plugin));
+  sstrncpy(vl.plugin_instance, dev, sizeof(vl.plugin_instance));
+  sstrncpy(vl.type, type, sizeof(vl.type));
+
+  if (type_instance != NULL)
+    sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
+
+  plugin_dispatch_values(&vl);
+}
+
+static void ovs_stats_submit_two(const char *dev, const char *type,
+                                 const char *type_instance, derive_t rx,
+                                 derive_t tx, meta_data_t *meta) {
+  /* if counter is less than 0 - skip it*/
+  if (rx < 0 || tx < 0)
+    return;
+  value_list_t vl = VALUE_LIST_INIT;
+  value_t values[] = {{.derive = rx}, {.derive = tx}};
+
+  vl.values = values;
+  vl.values_len = STATIC_ARRAY_SIZE(values);
+  vl.meta = meta;
+
+  sstrncpy(vl.plugin, plugin_name, sizeof(vl.plugin));
+  sstrncpy(vl.plugin_instance, dev, sizeof(vl.plugin_instance));
+  sstrncpy(vl.type, type, sizeof(vl.type));
+
+  if (type_instance != NULL)
+    sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
+
+  plugin_dispatch_values(&vl);
+}
+
+static port_list_t *ovs_stats_get_port(const char *uuid) {
+  if (uuid == NULL)
+    return NULL;
+
+  for (port_list_t *port = g_port_list_head; port != NULL; port = port->next) {
+    if (strncmp(port->port_uuid, uuid, strlen(port->port_uuid)) == 0)
+      return port;
+  }
+  return NULL;
+}
+
+static port_list_t *ovs_stats_get_port_by_name(const char *name) {
+  if (name == NULL)
+    return NULL;
+
+  for (port_list_t *port = g_port_list_head; port != NULL; port = port->next)
+    if ((strncmp(port->name, name, strlen(port->name)) == 0) &&
+        strlen(name) == strlen(port->name))
+      return port;
+  return NULL;
+}
+
+/* Create or get port by port uuid */
+static port_list_t *ovs_stats_new_port(bridge_list_t *bridge,
+                                       const char *uuid) {
+  port_list_t *port = ovs_stats_get_port(uuid);
+
+  if (port == NULL) {
+    port = (port_list_t *)calloc(1, sizeof(port_list_t));
+    if (!port) {
+      ERROR("%s: Error allocating port", plugin_name);
+      return NULL;
+    }
+    memset(port->stats, -1, sizeof(int64_t[IFACE_COUNTER_COUNT]));
+    sstrncpy(port->port_uuid, uuid, sizeof(port->port_uuid));
+    pthread_mutex_lock(&g_stats_lock);
+    port->next = g_port_list_head;
+    g_port_list_head = port;
+    pthread_mutex_unlock(&g_stats_lock);
+  }
+  if (bridge != NULL) {
+    pthread_mutex_lock(&g_stats_lock);
+    port->br = bridge;
+    pthread_mutex_unlock(&g_stats_lock);
+  }
+  return port;
+}
+
+/* Get bridge by name*/
+static bridge_list_t *ovs_stats_get_bridge(bridge_list_t *head,
+                                           const char *name) {
+  if (name == NULL)
+    return NULL;
+
+  for (bridge_list_t *bridge = head; bridge != NULL; bridge = bridge->next) {
+    if ((strncmp(bridge->name, name, strlen(bridge->name)) == 0) &&
+        strlen(name) == strlen(bridge->name))
+      return bridge;
+  }
+  return NULL;
+}
+
+/* Delete bridge */
+static int ovs_stats_del_bridge(yajl_val bridge) {
+  const char *old[] = {"old", NULL};
+  const char *name[] = {"name", NULL};
+
+  yajl_val row;
+
+  if (bridge && YAJL_IS_OBJECT(bridge)) {
+    row = yajl_tree_get(bridge, old, yajl_t_object);
+    if (row && YAJL_IS_OBJECT(row)) {
+      yajl_val br_name = yajl_tree_get(row, name, yajl_t_string);
+      if (br_name && YAJL_IS_STRING(br_name)) {
+        bridge_list_t *prev_br = g_bridge_list_head;
+        for (bridge_list_t *br = g_bridge_list_head; br != NULL;
+             prev_br = br, br = br->next) {
+          if ((strncmp(br->name, br_name->u.string, strlen(br->name)) == 0) &&
+              strlen(br->name) == strlen(br_name->u.string)) {
+            if (br == g_bridge_list_head)
+              g_bridge_list_head = br->next;
+            else
+              prev_br->next = br->next;
+            sfree(br->name);
+            sfree(br);
+            break;
+          }
+        }
+      }
+    }
+  } else
+    WARNING("%s: Incorrect data for deleting bridge", plugin_name);
+  return 0;
+}
+
+/* Update Bridge. Create bridge ports*/
+static int ovs_stats_update_bridge(yajl_val bridge) {
+  const char *new[] = {"new", NULL};
+  const char *name[] = {"name", NULL};
+  const char *ports[] = {"ports", NULL};
+  bridge_list_t *br = NULL;
+
+  if (bridge && YAJL_IS_OBJECT(bridge)) {
+    yajl_val row = yajl_tree_get(bridge, new, yajl_t_object);
+    if (row && YAJL_IS_OBJECT(row)) {
+      yajl_val br_name = yajl_tree_get(row, name, yajl_t_string);
+      yajl_val br_ports = yajl_tree_get(row, ports, yajl_t_array);
+      if (br_name && YAJL_IS_STRING(br_name)) {
+        br = ovs_stats_get_bridge(g_bridge_list_head, YAJL_GET_STRING(br_name));
+        pthread_mutex_lock(&g_stats_lock);
+        if (br == NULL) {
+          br = (bridge_list_t *)calloc(1, sizeof(bridge_list_t));
+          if (!br) {
+            ERROR("%s: Error allocating memory for bridge", plugin_name);
+            return -1;
+          }
+          char *tmp = YAJL_GET_STRING(br_name);
+
+          if (tmp != NULL)
+            br->name = strdup(tmp);
+          if (br->name == NULL) {
+            sfree(br);
+            pthread_mutex_unlock(&g_stats_lock);
+            return -1;
+          }
+          br->next = g_bridge_list_head;
+          g_bridge_list_head = br;
+        }
+        pthread_mutex_unlock(&g_stats_lock);
+      }
+      if (br_ports && YAJL_IS_ARRAY(br_ports)) {
+        char *tmp = YAJL_GET_STRING(br_ports->u.array.values[0]);
+        if (tmp != NULL && strcmp("set", tmp) == 0) {
+          yajl_val *array = YAJL_GET_ARRAY(br_ports)->values;
+          size_t array_len = YAJL_GET_ARRAY(br_ports)->len;
+          if (array != NULL && array_len > 0 && YAJL_IS_ARRAY(array[1])) {
+            yajl_val *ports_arr = YAJL_GET_ARRAY(array[1])->values;
+            size_t ports_num = YAJL_GET_ARRAY(array[1])->len;
+            for (size_t i = 0; i < ports_num && ports_arr != NULL; i++)
+              ovs_stats_new_port(
+                  br, YAJL_GET_STRING(ports_arr[i]->u.array.values[1]));
+          }
+        } else
+          ovs_stats_new_port(br, YAJL_GET_STRING(br_ports->u.array.values[1]));
+      }
+    }
+  } else {
+    ERROR("Incorrect JSON Bridge data");
+    return -1;
+  }
+  return 0;
+}
+
+/* Handle JSON with Bridge Table change event */
+static void ovs_stats_bridge_table_change_cb(yajl_val jupdates) {
+  /* Bridge Table update example JSON data
+    {
+      "Bridge": {
+        "bb1f8965-5775-46d9-b820-236ca8edbedc": {
+          "new": {
+            "name": "br0",
+            "ports": [
+              "set",
+              [
+                [
+                  "uuid",
+                  "117f1a07-7ef0-458a-865c-ec7fbb85bc01"
+                ],
+                [
+                  "uuid",
+                  "12fd8bdc-e950-4281-aaa9-46e185658f79"
+                ]
+              ]
+            ]
+          }
+        }
+      }
+    }
+   */
+  const char *path[] = {"Bridge", NULL};
+
+  yajl_val bridges = yajl_tree_get(jupdates, path, yajl_t_object);
+
+  if (bridges && YAJL_IS_OBJECT(bridges)) {
+    for (size_t i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) {
+      yajl_val bridge = YAJL_GET_OBJECT(bridges)->values[i];
+      ovs_stats_update_bridge(bridge);
+    }
+  }
+}
+
+/* Handle Bridge Table delete event */
+static void ovs_stats_bridge_table_delete_cb(yajl_val jupdates) {
+  const char *path[] = {"Bridge", NULL};
+  yajl_val bridges = yajl_tree_get(jupdates, path, yajl_t_object);
+  yajl_val bridge;
+  if (bridges && YAJL_IS_OBJECT(bridges)) {
+    pthread_mutex_lock(&g_stats_lock);
+    for (size_t i = 0; i < YAJL_GET_OBJECT(bridges)->len; i++) {
+      bridge = YAJL_GET_OBJECT(bridges)->values[i];
+      ovs_stats_del_bridge(bridge);
+    }
+    pthread_mutex_unlock(&g_stats_lock);
+  }
+  return;
+}
+
+/* Handle JSON with Bridge table initial values */
+static void ovs_stats_bridge_table_result_cb(yajl_val jresult,
+                                             yajl_val jerror) {
+  if (YAJL_IS_NULL(jerror))
+    ovs_stats_bridge_table_change_cb(jresult);
+  else
+    ERROR("%s: Error received from OvSDB. Table: Bridge", plugin_name);
+  return;
+}
+
+/* Update port name */
+static int ovs_stats_update_port(const char *uuid, yajl_val port) {
+  const char *new[] = {"new", NULL};
+  const char *name[] = {"name", NULL};
+  yajl_val row;
+  port_list_t *portentry = NULL;
+  if (port && YAJL_IS_OBJECT(port)) {
+    row = yajl_tree_get(port, new, yajl_t_object);
+    if (row && YAJL_IS_OBJECT(row)) {
+      yajl_val port_name = yajl_tree_get(row, name, yajl_t_string);
+      if (port_name && YAJL_IS_STRING(port_name)) {
+        portentry = ovs_stats_get_port(uuid);
+        if (portentry == NULL)
+          portentry = ovs_stats_new_port(NULL, uuid);
+        if (portentry) {
+          pthread_mutex_lock(&g_stats_lock);
+          sstrncpy(portentry->name, YAJL_GET_STRING(port_name),
+                   sizeof(portentry->name));
+          pthread_mutex_unlock(&g_stats_lock);
+        }
+      }
+    }
+  } else {
+    ERROR("Incorrect JSON Port data");
+    return -1;
+  }
+  return 0;
+}
+
+/* Delete port from global port list */
+static int ovs_stats_del_port(const char *uuid) {
+  port_list_t *prev_port = g_port_list_head;
+  for (port_list_t *port = g_port_list_head; port != NULL;
+       prev_port = port, port = port->next) {
+    if (strncmp(port->port_uuid, uuid, strlen(port->port_uuid)) == 0) {
+      if (port == g_port_list_head)
+        g_port_list_head = port->next;
+      else
+        prev_port->next = port->next;
+      sfree(port);
+      break;
+    }
+  }
+  return 0;
+}
+
+/* Handle JSON with Port Table change event */
+static void ovs_stats_port_table_change_cb(yajl_val jupdates) {
+  /* Port Table update example JSON data
+    {
+      "Port": {
+        "ab107d6f-28a1-4257-b1cc-5b742821db8a": {
+          "new": {
+            "name": "br1",
+            "interfaces": [
+              "uuid",
+              "33a289a0-1d34-4e46-a3c2-3e4066fbecc6"
+            ]
+          }
+        }
+      }
+    }
+   */
+  const char *path[] = {"Port", NULL};
+  yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object);
+  yajl_val port;
+  if (ports && YAJL_IS_OBJECT(ports)) {
+    for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) {
+      port = YAJL_GET_OBJECT(ports)->values[i];
+      ovs_stats_update_port(YAJL_GET_OBJECT(ports)->keys[i], port);
+    }
+  }
+  return;
+}
+
+/* Handle JSON with Port table initial values */
+static void ovs_stats_port_table_result_cb(yajl_val jresult, yajl_val jerror) {
+  if (YAJL_IS_NULL(jerror))
+    ovs_stats_port_table_change_cb(jresult);
+  else
+    ERROR("%s: Error received from OvSDB. Table: Port", plugin_name);
+  return;
+}
+
+/* Handle Port Table delete event */
+static void ovs_stats_port_table_delete_cb(yajl_val jupdates) {
+  const char *path[] = {"Port", NULL};
+  yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object);
+  pthread_mutex_lock(&g_stats_lock);
+  if (ports && YAJL_IS_OBJECT(ports))
+    for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++) {
+      ovs_stats_del_port(YAJL_GET_OBJECT(ports)->keys[i]);
+    }
+  pthread_mutex_unlock(&g_stats_lock);
+  return;
+}
+
+/* Update interface statistics */
+static int ovs_stats_update_iface_stats(port_list_t *port, yajl_val stats) {
+  yajl_val stat;
+  iface_counter counter_index = 0;
+  char *counter_name = NULL;
+  int64_t counter_value = 0;
+  if (stats && YAJL_IS_ARRAY(stats))
+    for (size_t i = 0; i < YAJL_GET_ARRAY(stats)->len; i++) {
+      stat = YAJL_GET_ARRAY(stats)->values[i];
+      if (!YAJL_IS_ARRAY(stat))
+        return -1;
+      counter_name = YAJL_GET_STRING(YAJL_GET_ARRAY(stat)->values[0]);
+      counter_index = ovs_stats_counter_name_to_type(counter_name);
+      counter_value = YAJL_GET_INTEGER(YAJL_GET_ARRAY(stat)->values[1]);
+      if (counter_index == not_supported)
+        continue;
+      port->stats[counter_index] = counter_value;
+    }
+
+  return 0;
+}
+
+/* Update interface external_ids */
+static int ovs_stats_update_iface_ext_ids(port_list_t *port, yajl_val ext_ids) {
+  yajl_val ext_id;
+  char *key;
+  char *value;
+
+  if (ext_ids && YAJL_IS_ARRAY(ext_ids))
+    for (size_t i = 0; i < YAJL_GET_ARRAY(ext_ids)->len; i++) {
+      ext_id = YAJL_GET_ARRAY(ext_ids)->values[i];
+      if (!YAJL_IS_ARRAY(ext_id))
+        return -1;
+      key = YAJL_GET_STRING(YAJL_GET_ARRAY(ext_id)->values[0]);
+      value = YAJL_GET_STRING(YAJL_GET_ARRAY(ext_id)->values[1]);
+      if (key && value) {
+        if (strncmp(key, "iface-id", strlen(key)) == 0)
+          sstrncpy(port->ex_iface_id, value, sizeof(port->ex_iface_id));
+        else if (strncmp(key, "vm-uuid", strlen(key)) == 0)
+          sstrncpy(port->ex_vm_id, value, sizeof(port->ex_vm_id));
+      }
+    }
+
+  return 0;
+}
+
+/* Get interface statistic and external_ids */
+static int ovs_stats_update_iface(yajl_val iface) {
+  yajl_val row;
+  port_list_t *port = NULL;
+  if (iface && YAJL_IS_OBJECT(iface)) {
+    row = ovs_utils_get_value_by_key(iface, "new");
+    if (row && YAJL_IS_OBJECT(row)) {
+      yajl_val iface_name = ovs_utils_get_value_by_key(row, "name");
+      yajl_val iface_stats = ovs_utils_get_value_by_key(row, "statistics");
+      yajl_val iface_ext_ids = ovs_utils_get_value_by_key(row, "external_ids");
+      yajl_val iface_uuid = ovs_utils_get_value_by_key(row, "_uuid");
+      if (iface_name && YAJL_IS_STRING(iface_name)) {
+        port = ovs_stats_get_port_by_name(YAJL_GET_STRING(iface_name));
+        if (port == NULL)
+          return 0;
+      }
+      /*
+       * {
+            "statistics": [
+              "map",
+              [
+                [
+                  "collisions",
+                  0
+                ],
+                . . .
+                [
+                  "tx_packets",
+                  0
+                ]
+              ]
+            ]
+          }
+       Check that statistics is an array with 2 elements
+       */
+      if (iface_stats && YAJL_IS_ARRAY(iface_stats) &&
+          YAJL_GET_ARRAY(iface_stats)->len == 2)
+        ovs_stats_update_iface_stats(port,
+                                     YAJL_GET_ARRAY(iface_stats)->values[1]);
+      if (iface_ext_ids && YAJL_IS_ARRAY(iface_ext_ids))
+        ovs_stats_update_iface_ext_ids(
+            port, YAJL_GET_ARRAY(iface_ext_ids)->values[1]);
+      if (iface_uuid && YAJL_IS_ARRAY(iface_uuid) &&
+          YAJL_GET_ARRAY(iface_uuid)->len == 2)
+        sstrncpy(port->iface_uuid,
+                 YAJL_GET_STRING(YAJL_GET_ARRAY(iface_uuid)->values[1]),
+                 sizeof(port->iface_uuid));
+    }
+  } else {
+    ERROR("Incorrect JSON Port data");
+    return -1;
+  }
+  return 0;
+}
+
+/* Handle JSON with Interface Table change event */
+static void ovs_stats_interface_table_change_cb(yajl_val jupdates) {
+  /* Interface Table update example JSON data
+    {
+      "Interface": {
+        "33a289a0-1d34-4e46-a3c2-3e4066fbecc6": {
+          "new": {
+            "name": "br1",
+            "statistics": [
+              "map",
+              [
+                [
+                  "collisions",
+                  0
+                ],
+                [
+                  "rx_bytes",
+                  0
+                ],
+               . . .
+                [
+                  "tx_packets",
+                  12617
+                ]
+              ]
+            ],
+            "_uuid": [
+              "uuid",
+              "33a289a0-1d34-4e46-a3c2-3e4066fbecc6"
+            ]
+            "external_ids": [
+                "map",
+                [
+                  [
+                    "attached-mac",
+                    "fa:16:3e:7c:1c:4b"
+                  ],
+                  [
+                    "iface-id",
+                    "a61b7e2b-6951-488a-b4c6-6e91343960b2"
+                  ],
+                  [
+                    "iface-status",
+                    "active"
+                  ]
+                ]
+              ]
+          }
+        }
+      }
+    }
+   */
+  const char *path[] = {"Interface", NULL};
+  yajl_val ports = yajl_tree_get(jupdates, path, yajl_t_object);
+  pthread_mutex_lock(&g_stats_lock);
+  if (ports && YAJL_IS_OBJECT(ports))
+    for (size_t i = 0; i < YAJL_GET_OBJECT(ports)->len; i++)
+      ovs_stats_update_iface(YAJL_GET_OBJECT(ports)->values[i]);
+  pthread_mutex_unlock(&g_stats_lock);
+  return;
+}
+
+/* Handle JSON with Interface table initial values */
+static void ovs_stats_interface_table_result_cb(yajl_val jresult,
+                                                yajl_val jerror) {
+  if (YAJL_IS_NULL(jerror))
+    ovs_stats_interface_table_change_cb(jresult);
+  else
+    ERROR("%s: Error received from OvSDB. Table: Interface", plugin_name);
+  return;
+}
+
+/* Setup OVS DB table callbacks  */
+static void ovs_stats_initialize(ovs_db_t *pdb) {
+  const char *bridge_columns[] = {"name", "ports", NULL};
+  const char *port_columns[] = {"name", "interfaces", NULL};
+  const char *interface_columns[] = {"name", "statistics", "_uuid",
+                                     "external_ids", NULL};
+
+  /* subscribe to a tables */
+  ovs_db_table_cb_register(pdb, "Bridge", bridge_columns,
+                           ovs_stats_bridge_table_change_cb,
+      ovs_stats_bridge_table_result_cb,
+                           OVS_DB_TABLE_CB_FLAG_INITIAL |
+                           OVS_DB_TABLE_CB_FLAG_INSERT |
+          OVS_DB_TABLE_CB_FLAG_MODIFY);
+
+  ovs_db_table_cb_register(pdb, "Bridge", bridge_columns,
+                           ovs_stats_bridge_table_delete_cb, NULL,
+                           OVS_DB_TABLE_CB_FLAG_DELETE);
+
+  ovs_db_table_cb_register(pdb, "Port", port_columns,
+                           ovs_stats_port_table_change_cb,
+      ovs_stats_port_table_result_cb,
+                           OVS_DB_TABLE_CB_FLAG_INITIAL |
+                           OVS_DB_TABLE_CB_FLAG_INSERT |
+          OVS_DB_TABLE_CB_FLAG_MODIFY);
+
+  ovs_db_table_cb_register(pdb, "Port", port_columns,
+                           ovs_stats_port_table_delete_cb, NULL,
+                           OVS_DB_TABLE_CB_FLAG_DELETE);
+
+  ovs_db_table_cb_register(pdb, "Interface", interface_columns,
+                           ovs_stats_interface_table_change_cb,
+      ovs_stats_interface_table_result_cb,
+                           OVS_DB_TABLE_CB_FLAG_INITIAL |
+                           OVS_DB_TABLE_CB_FLAG_INSERT |
+          OVS_DB_TABLE_CB_FLAG_MODIFY);
+}
+
+/* Check if bridge is configured to be monitored in config file */
+static int ovs_stats_is_monitored_bridge(const char *br_name) {
+  /* if no bridges are configured, return true */
+  if (g_monitored_bridge_list_head == NULL)
+    return 1;
+
+  /* check if given bridge exists */
+  if (ovs_stats_get_bridge(g_monitored_bridge_list_head, br_name) != NULL)
+    return 1;
+
+  return 0;
+}
+
+/* Delete all ports from port list */
+static void ovs_stats_free_port_list(port_list_t *head) {
+  for (port_list_t *i = head; i != NULL;) {
+    port_list_t *del = i;
+    i = i->next;
+    sfree(del);
+  }
+}
+
+/* Delete all bridges from bridge list */
+static void ovs_stats_free_bridge_list(bridge_list_t *head) {
+  for (bridge_list_t *i = head; i != NULL;) {
+    bridge_list_t *del = i;
+    i = i->next;
+    sfree(del->name);
+    sfree(del);
+  }
+}
+
+/* Handle OVSDB lost connection callback */
+static void ovs_stats_conn_terminate() {
+  WARNING("Lost connection to OVSDB server");
+  pthread_mutex_lock(&g_stats_lock);
+  ovs_stats_free_bridge_list(g_bridge_list_head);
+  g_bridge_list_head = NULL;
+  ovs_stats_free_port_list(g_port_list_head);
+  g_port_list_head = NULL;
+  pthread_mutex_unlock(&g_stats_lock);
+}
+
+/* Parse plugin configuration file and store the config
+ * in allocated memory. Returns negative value in case of error.
+ */
+static int ovs_stats_plugin_config(oconfig_item_t *ci) {
+  bridge_list_t *bridge;
+  char *br_name;
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("Address", child->key) == 0) {
+      if (cf_util_get_string_buffer(child, ovs_stats_cfg.ovs_db_node,
+                                    OVS_DB_ADDR_NODE_SIZE) != 0) {
+        ERROR("%s: parse '%s' option failed", plugin_name, child->key);
+        return -1;
+      }
+    } else if (strcasecmp("Port", child->key) == 0) {
+      if (cf_util_get_string_buffer(child, ovs_stats_cfg.ovs_db_serv,
+                                    OVS_DB_ADDR_SERVICE_SIZE) != 0) {
+        ERROR("%s: parse '%s' option failed", plugin_name, child->key);
+        return -1;
+      }
+    } else if (strcasecmp("Socket", child->key) == 0) {
+      if (cf_util_get_string_buffer(child, ovs_stats_cfg.ovs_db_unix,
+                                    OVS_DB_ADDR_UNIX_SIZE) != 0) {
+        ERROR("%s: parse '%s' option failed", plugin_name, child->key);
+        return -1;
+      }
+    } else if (strcasecmp("Bridges", child->key) == 0) {
+      for (int j = 0; j < child->values_num; j++) {
+        /* check value type */
+        if (child->values[j].type != OCONFIG_TYPE_STRING) {
+          ERROR("%s: Wrong bridge name [idx=%d]. "
+                "Bridge name should be string",
+                plugin_name, j);
+          goto cleanup_fail;
+        }
+        /* get value */
+        if ((br_name = strdup(child->values[j].value.string)) == NULL) {
+          ERROR("%s: strdup() copy bridge name fail", plugin_name);
+          goto cleanup_fail;
+        }
+        if ((bridge = ovs_stats_get_bridge(g_monitored_bridge_list_head,
+                                           br_name)) == NULL) {
+          if ((bridge = calloc(1, sizeof(bridge_list_t))) == NULL) {
+            ERROR("%s: Error allocating memory for bridge", plugin_name);
+            goto cleanup_fail;
+          } else {
+            pthread_mutex_lock(&g_stats_lock);
+            /* store bridge name */
+            bridge->name = br_name;
+            bridge->next = g_monitored_bridge_list_head;
+            g_monitored_bridge_list_head = bridge;
+            pthread_mutex_unlock(&g_stats_lock);
+            DEBUG("%s: found monitored interface \"%s\"", plugin_name, br_name);
+          }
+        }
+      }
+    } else {
+      WARNING("%s: option '%s' not allowed here", plugin_name, child->key);
+      goto cleanup_fail;
+    }
+  }
+  return 0;
+
+cleanup_fail:
+  ovs_stats_free_bridge_list(g_monitored_bridge_list_head);
+  return -1;
+}
+
+/* Initialize OvS Stats plugin*/
+static int ovs_stats_plugin_init(void) {
+  ovs_db_callback_t cb = {.post_conn_init = ovs_stats_initialize,
+                          .post_conn_terminate = ovs_stats_conn_terminate};
+
+  INFO("%s: Connecting to OVS DB using address=%s, service=%s, unix=%s",
+       plugin_name, ovs_stats_cfg.ovs_db_node, ovs_stats_cfg.ovs_db_serv,
+       ovs_stats_cfg.ovs_db_unix);
+  /* connect to OvS DB */
+  if ((g_ovs_db = ovs_db_init (ovs_stats_cfg.ovs_db_node,
+                             ovs_stats_cfg.ovs_db_serv,
+                       ovs_stats_cfg.ovs_db_unix, &cb)) == NULL) {
+    ERROR("%s: plugin: failed to connect to OvS DB server", plugin_name);
+    return -1;
+  }
+  int err = pthread_mutex_init(&g_stats_lock, NULL);
+  if (err < 0) {
+    ERROR("%s: plugin: failed to initialize cache lock", plugin_name);
+    ovs_db_destroy(g_ovs_db);
+    return -1;
+  }
+  return 0;
+}
+
+/* OvS stats read callback. Read bridge/port information and submit it*/
+static int ovs_stats_plugin_read(__attribute__((unused)) user_data_t *ud) {
+  bridge_list_t *bridge;
+  port_list_t *port;
+  char devname[PORT_NAME_SIZE_MAX * 2];
+
+  pthread_mutex_lock(&g_stats_lock);
+  for (bridge = g_bridge_list_head; bridge != NULL; bridge = bridge->next) {
+    if (ovs_stats_is_monitored_bridge(bridge->name)) {
+      for (port = g_port_list_head; port != NULL; port = port->next)
+        if (port->br == bridge) {
+          if (strlen(port->name) == 0)
+            /* Skip port w/o name. This is possible when read callback
+             * is called after Interface Table update callback but before
+             * Port table Update callback. Will add this port on next read */
+            continue;
+          meta_data_t *meta = meta_data_create();
+          if (meta != NULL) {
+            meta_data_add_string(meta, "uuid", port->iface_uuid);
+            if (strlen(port->ex_vm_id))
+              meta_data_add_string(meta, "vm-uuid", port->ex_vm_id);
+            if (strlen(port->ex_iface_id))
+              meta_data_add_string(meta, "iface-id", port->ex_iface_id);
+          }
+          snprintf(devname, sizeof(devname), "%s.%s", bridge->name, port->name);
+          ovs_stats_submit_one(devname, "if_collisions", NULL,
+                               port->stats[collisions], meta);
+          ovs_stats_submit_two(devname, "if_dropped", NULL,
+                               port->stats[rx_dropped], port->stats[tx_dropped],
+                               meta);
+          ovs_stats_submit_two(devname, "if_errors", NULL,
+                               port->stats[rx_errors], port->stats[tx_errors],
+                               meta);
+          ovs_stats_submit_two(devname, "if_packets", NULL,
+                               port->stats[rx_packets], port->stats[tx_packets],
+                               meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "crc",
+                               port->stats[rx_crc_err], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "frame",
+                               port->stats[rx_frame_err], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "over",
+                               port->stats[rx_over_err], meta);
+          ovs_stats_submit_one(devname, "if_rx_octets", NULL,
+                               port->stats[rx_bytes], meta);
+          ovs_stats_submit_one(devname, "if_tx_octets", NULL,
+                               port->stats[tx_bytes], meta);
+          ovs_stats_submit_two(devname, "if_packets", "1_to_64_packets",
+                               port->stats[rx_1_to_64_packets],
+                               port->stats[tx_1_to_64_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "65_to_127_packets",
+                               port->stats[rx_65_to_127_packets],
+                               port->stats[tx_65_to_127_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "128_to_255_packets",
+                               port->stats[rx_128_to_255_packets],
+                               port->stats[tx_128_to_255_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "256_to_511_packets",
+                               port->stats[rx_256_to_511_packets],
+                               port->stats[tx_256_to_511_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "512_to_1023_packets",
+                               port->stats[rx_512_to_1023_packets],
+                               port->stats[tx_512_to_1023_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "1024_to_1518_packets",
+                               port->stats[rx_1024_to_1522_packets],
+                               port->stats[tx_1024_to_1522_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "1523_to_max_packets",
+                               port->stats[rx_1523_to_max_packets],
+                               port->stats[tx_1523_to_max_packets], meta);
+          ovs_stats_submit_two(devname, "if_packets", "broadcast_packets",
+                               port->stats[rx_broadcast_packets],
+                               port->stats[tx_broadcast_packets], meta);
+          ovs_stats_submit_one(devname, "if_multicast", "tx_multicast_packets",
+                               port->stats[tx_multicast_packets], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "rx_undersized_errors",
+                               port->stats[rx_undersized_errors], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "rx_oversize_errors",
+                               port->stats[rx_oversize_errors], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "rx_fragmented_errors",
+                               port->stats[rx_fragmented_errors], meta);
+          ovs_stats_submit_one(devname, "if_rx_errors", "rx_jabber_errors",
+                               port->stats[rx_jabber_errors], meta);
+
+          meta_data_destroy(meta);
+        }
+    } else
+      continue;
+  }
+  pthread_mutex_unlock(&g_stats_lock);
+  return 0;
+}
+
+/* Shutdown OvS Stats plugin */
+static int ovs_stats_plugin_shutdown(void) {
+  pthread_mutex_lock(&g_stats_lock);
+  DEBUG("OvS Statistics plugin shutting down");
+  ovs_db_destroy(g_ovs_db);
+  ovs_stats_free_bridge_list(g_bridge_list_head);
+  ovs_stats_free_bridge_list(g_monitored_bridge_list_head);
+  ovs_stats_free_port_list(g_port_list_head);
+  pthread_mutex_unlock(&g_stats_lock);
+  pthread_mutex_destroy(&g_stats_lock);
+  return 0;
+}
+
+/* Register OvS Stats plugin callbacks */
+void module_register(void) {
+  plugin_register_complex_config(plugin_name, ovs_stats_plugin_config);
+  plugin_register_init(plugin_name, ovs_stats_plugin_init);
+  plugin_register_complex_read(NULL, plugin_name, ovs_stats_plugin_read, 0,
+                               NULL);
+  plugin_register_shutdown(plugin_name, ovs_stats_plugin_shutdown);
+}
index ea53fbf..e922bad 100644 (file)
@@ -38,9 +38,7 @@
 
 #undef DONT_POISON_SPRINTF_YET
 
-#if HAVE_STDBOOL_H
 #include <stdbool.h>
-#endif
 
 #include <EXTERN.h>
 #include <perl.h>
@@ -887,8 +885,8 @@ static char *get_module_name(char *buf, size_t buf_len, const char *module) {
   else
     status = ssnprintf(buf, buf_len, "%s::%s", base_name, module);
   if ((status < 0) || ((unsigned int)status >= buf_len))
-    return (NULL);
-  return (buf);
+    return NULL;
+  return buf;
 } /* char *get_module_name */
 
 /*
@@ -2499,7 +2497,7 @@ static int perl_config_loadplugin(pTHX_ oconfig_item_t *ci) {
 
   if (NULL == get_module_name(module_name, sizeof(module_name), value)) {
     log_err("Invalid module name %s", value);
-    return (1);
+    return 1;
   }
 
   if (0 != init_pi(perl_argc, perl_argv))
@@ -2719,5 +2717,3 @@ void module_register(void) {
   plugin_register_complex_config("perl", perl_config);
   return;
 } /* void module_register (void) */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 533dffe..82adc53 100644 (file)
--- a/src/pf.c
+++ b/src/pf.c
@@ -86,7 +86,7 @@ static int pf_read(void) {
     char errbuf[1024];
     ERROR("pf plugin: Unable to open %s: %s", pf_device,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   status = ioctl(fd, DIOCGETSTATUS, &state);
@@ -95,14 +95,14 @@ static int pf_read(void) {
     ERROR("pf plugin: ioctl(DIOCGETSTATUS) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(fd);
-    return (-1);
+    return -1;
   }
 
   close(fd);
 
   if (!state.running) {
     WARNING("pf plugin: PF is not running.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < PFRES_MAX; i++)
@@ -121,7 +121,7 @@ static int pf_read(void) {
   pf_submit("pf_states", "current", (uint32_t)state.states,
             /* is gauge = */ 1);
 
-  return (0);
+  return 0;
 } /* int pf_read */
 
 void module_register(void) { plugin_register_read("pf", pf_read); }
index 7fd23a0..57ccc7a 100644 (file)
@@ -141,7 +141,7 @@ static derive_t float_counter_get(const float_counter_t *fc, /* {{{ */
   ret = (derive_t)(fc->i * factor);
   ret += (derive_t)(fc->n / (1000000000 / factor));
 
-  return (ret);
+  return ret;
 } /* }}} derive_t float_counter_get */
 
 static void strset(char **str, const char *new) /* {{{ */
@@ -218,7 +218,7 @@ static unsigned int service_statnode_collect(pinba_statnode_t *res, /* {{{ */
   /* reset node */
   node->mem_peak = NAN;
 
-  return (index + 1);
+  return index + 1;
 } /* }}} unsigned int service_statnode_collect */
 
 static void service_statnode_process(pinba_statnode_t *node, /* {{{ */
@@ -263,7 +263,7 @@ static void service_process_request(Pinba__Request *request) /* {{{ */
 static int pb_del_socket(pinba_socket_t *s, /* {{{ */
                          nfds_t index) {
   if (index >= s->fd_num)
-    return (EINVAL);
+    return EINVAL;
 
   close(s->fd[index].fd);
   s->fd[index].fd = -1;
@@ -275,7 +275,7 @@ static int pb_del_socket(pinba_socket_t *s, /* {{{ */
   }
 
   s->fd_num--;
-  return (0);
+  return 0;
 } /* }}} int pb_del_socket */
 
 static int pb_add_socket(pinba_socket_t *s, /* {{{ */
@@ -289,7 +289,7 @@ static int pb_add_socket(pinba_socket_t *s, /* {{{ */
             "%i sockets. Please complain to the collectd developers so we can "
             "raise the limit.",
             PINBA_MAX_SOCKETS);
-    return (-1);
+    return -1;
   }
 
   fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
@@ -297,7 +297,7 @@ static int pb_add_socket(pinba_socket_t *s, /* {{{ */
     char errbuf[1024];
     ERROR("pinba plugin: socket(2) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (0);
+    return 0;
   }
 
   tmp = 1;
@@ -314,7 +314,7 @@ static int pb_add_socket(pinba_socket_t *s, /* {{{ */
     ERROR("pinba plugin: bind(2) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(fd);
-    return (0);
+    return 0;
   }
 
   s->fd[s->fd_num].fd = fd;
@@ -322,7 +322,7 @@ static int pb_add_socket(pinba_socket_t *s, /* {{{ */
   s->fd[s->fd_num].revents = 0;
   s->fd_num++;
 
-  return (0);
+  return 0;
 } /* }}} int pb_add_socket */
 
 static pinba_socket_t *pinba_socket_open(const char *node, /* {{{ */
@@ -344,7 +344,7 @@ static pinba_socket_t *pinba_socket_open(const char *node, /* {{{ */
   status = getaddrinfo(node, service, &ai_hints, &ai_list);
   if (status != 0) {
     ERROR("pinba plugin: getaddrinfo(3) failed: %s", gai_strerror(status));
-    return (NULL);
+    return NULL;
   }
   assert(ai_list != NULL);
 
@@ -352,7 +352,7 @@ static pinba_socket_t *pinba_socket_open(const char *node, /* {{{ */
   if (s == NULL) {
     freeaddrinfo(ai_list);
     ERROR("pinba plugin: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -370,7 +370,7 @@ static pinba_socket_t *pinba_socket_open(const char *node, /* {{{ */
     s = NULL;
   }
 
-  return (s);
+  return s;
 } /* }}} pinba_socket_open */
 
 static void pinba_socket_free(pinba_socket_t *socket) /* {{{ */
@@ -395,12 +395,12 @@ static int pinba_process_stats_packet(const uint8_t *buffer, /* {{{ */
   request = pinba__request__unpack(NULL, buffer_size, buffer);
 
   if (!request)
-    return (-1);
+    return -1;
 
   service_process_request(request);
   pinba__request__free_unpacked(request, NULL);
 
-  return (0);
+  return 0;
 } /* }}} int pinba_process_stats_packet */
 
 static int pinba_udp_read_callback_fn(int sock) /* {{{ */
@@ -426,10 +426,10 @@ static int pinba_udp_read_callback_fn(int sock) /* {{{ */
 
       WARNING("pinba plugin: recvfrom(2) failed: %s",
               sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     } else if (status == 0) {
       DEBUG("pinba plugin: recvfrom(2) returned unexpected status zero.");
-      return (-1);
+      return -1;
     } else /* if (status > 0) */
     {
       assert(((size_t)status) < buffer_size);
@@ -439,13 +439,13 @@ static int pinba_udp_read_callback_fn(int sock) /* {{{ */
       status = pinba_process_stats_packet(buffer, buffer_size);
       if (status != 0)
         DEBUG("pinba plugin: Parsing packet failed.");
-      return (status);
+      return status;
     }
   } /* while (42) */
 
   /* not reached */
   assert(23 == 42);
-  return (-1);
+  return -1;
 } /* }}} void pinba_udp_read_callback_fn */
 
 static int receive_loop(void) /* {{{ */
@@ -455,7 +455,7 @@ static int receive_loop(void) /* {{{ */
   s = pinba_socket_open(conf_node, conf_service);
   if (s == NULL) {
     ERROR("pinba plugin: Collector thread is exiting prematurely.");
-    return (-1);
+    return -1;
   }
 
   while (!collector_thread_do_shutdown) {
@@ -477,7 +477,7 @@ static int receive_loop(void) /* {{{ */
       ERROR("pinba plugin: poll(2) failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
       pinba_socket_free(s);
-      return (-1);
+      return -1;
     }
 
     for (nfds_t i = 0; i < s->fd_num; i++) {
@@ -493,7 +493,7 @@ static int receive_loop(void) /* {{{ */
   pinba_socket_free(s);
   s = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int receive_loop */
 
 static void *collector_thread(void *arg) /* {{{ */
@@ -503,7 +503,7 @@ static void *collector_thread(void *arg) /* {{{ */
   memset(&collector_thread_id, 0, sizeof(collector_thread_id));
   collector_thread_running = 0;
   pthread_exit(NULL);
-  return (NULL);
+  return NULL;
 } /* }}} void *collector_thread */
 
 /*
@@ -519,7 +519,7 @@ static int pinba_config_view(const oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_string(ci, &name);
   if (status != 0)
-    return (status);
+    return status;
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
@@ -547,7 +547,7 @@ static int pinba_config_view(const oconfig_item_t *ci) /* {{{ */
   sfree(server);
   sfree(script);
 
-  return (status);
+  return status;
 } /* }}} int pinba_config_view */
 
 static int plugin_config(oconfig_item_t *ci) /* {{{ */
@@ -571,7 +571,7 @@ static int plugin_config(oconfig_item_t *ci) /* {{{ */
 
   pthread_mutex_unlock(&stat_nodes_lock);
 
-  return (0);
+  return 0;
 } /* }}} int pinba_config */
 
 static int plugin_init(void) /* {{{ */
@@ -587,7 +587,7 @@ static int plugin_init(void) /* {{{ */
   }
 
   if (collector_thread_running)
-    return (0);
+    return 0;
 
   status = plugin_thread_create(&collector_thread_id,
                                 /* attrs = */ NULL, collector_thread,
@@ -596,11 +596,11 @@ static int plugin_init(void) /* {{{ */
     char errbuf[1024];
     ERROR("pinba plugin: pthread_create(3) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
   collector_thread_running = 1;
 
-  return (0);
+  return 0;
 } /* }}} */
 
 static int plugin_shutdown(void) /* {{{ */
@@ -622,7 +622,7 @@ static int plugin_shutdown(void) /* {{{ */
     collector_thread_do_shutdown = 0;
   } /* if (collector_thread_running) */
 
-  return (0);
+  return 0;
 } /* }}} int plugin_shutdown */
 
 static int plugin_submit(const pinba_statnode_t *res) /* {{{ */
@@ -663,7 +663,7 @@ static int plugin_submit(const pinba_statnode_t *res) /* {{{ */
   sstrncpy(vl.type_instance, "peak", sizeof(vl.type_instance));
   plugin_dispatch_values(&vl);
 
-  return (0);
+  return 0;
 } /* }}} int plugin_submit */
 
 static int plugin_read(void) /* {{{ */
@@ -685,5 +685,3 @@ void module_register(void) /* {{{ */
   plugin_register_read("pinba", plugin_read);
   plugin_register_shutdown("pinba", plugin_shutdown);
 } /* }}} void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 82de59f..6e056e4 100644 (file)
@@ -219,7 +219,7 @@ static int ping_dispatch_all(pingobj_t *pingobj) /* {{{ */
     } /* }}} ping_max_missed */
   }   /* }}} for (iter) */
 
-  return (0);
+  return 0;
 } /* }}} int ping_dispatch_all */
 
 static void *ping_thread(void *arg) /* {{{ */
@@ -242,7 +242,7 @@ static void *ping_thread(void *arg) /* {{{ */
     ERROR("ping plugin: ping_construct failed.");
     ping_thread_error = 1;
     pthread_mutex_unlock(&ping_lock);
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   if (ping_source != NULL)
@@ -278,7 +278,7 @@ static void *ping_thread(void *arg) /* {{{ */
     ERROR("ping plugin: No host could be added to ping object. Giving up.");
     ping_thread_error = 1;
     pthread_mutex_unlock(&ping_lock);
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   /* Set up `ts_int' */
@@ -342,7 +342,7 @@ static void *ping_thread(void *arg) /* {{{ */
   pthread_mutex_unlock(&ping_lock);
   ping_destroy(pingobj);
 
-  return ((void *)0);
+  return (void *)0;
 } /* }}} void *ping_thread */
 
 static int start_thread(void) /* {{{ */
@@ -353,7 +353,7 @@ static int start_thread(void) /* {{{ */
 
   if (ping_thread_loop != 0) {
     pthread_mutex_unlock(&ping_lock);
-    return (0);
+    return 0;
   }
 
   ping_thread_loop = 1;
@@ -364,11 +364,11 @@ static int start_thread(void) /* {{{ */
     ping_thread_loop = 0;
     ERROR("ping plugin: Starting thread failed.");
     pthread_mutex_unlock(&ping_lock);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_unlock(&ping_lock);
-  return (0);
+  return 0;
 } /* }}} int start_thread */
 
 static int stop_thread(void) /* {{{ */
@@ -379,7 +379,7 @@ static int stop_thread(void) /* {{{ */
 
   if (ping_thread_loop == 0) {
     pthread_mutex_unlock(&ping_lock);
-    return (-1);
+    return -1;
   }
 
   ping_thread_loop = 0;
@@ -397,14 +397,14 @@ static int stop_thread(void) /* {{{ */
   ping_thread_error = 0;
   pthread_mutex_unlock(&ping_lock);
 
-  return (status);
+  return status;
 } /* }}} int stop_thread */
 
 static int ping_init(void) /* {{{ */
 {
   if (hostlist_head == NULL) {
     NOTICE("ping plugin: No hosts have been configured.");
-    return (-1);
+    return -1;
   }
 
   if (ping_timeout > ping_interval) {
@@ -427,7 +427,7 @@ static int ping_init(void) /* {{{ */
   }
 #endif
 
-  return (start_thread());
+  return start_thread();
 } /* }}} int ping_init */
 
 static int config_set_string(const char *name, /* {{{ */
@@ -439,13 +439,13 @@ static int config_set_string(const char *name, /* {{{ */
     char errbuf[1024];
     ERROR("ping plugin: Setting `%s' to `%s' failed: strdup failed: %s", name,
           value, sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+    return 1;
   }
 
   if (*var != NULL)
     free(*var);
   *var = tmp;
-  return (0);
+  return 0;
 } /* }}} int config_set_string */
 
 static int ping_config(const char *key, const char *value) /* {{{ */
@@ -459,7 +459,7 @@ static int ping_config(const char *key, const char *value) /* {{{ */
       char errbuf[1024];
       ERROR("ping plugin: malloc failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      return 1;
     }
 
     host = strdup(value);
@@ -468,7 +468,7 @@ static int ping_config(const char *key, const char *value) /* {{{ */
       sfree(hl);
       ERROR("ping plugin: strdup failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      return 1;
     }
 
     hl->host = host;
@@ -482,13 +482,13 @@ static int ping_config(const char *key, const char *value) /* {{{ */
   } else if (strcasecmp(key, "SourceAddress") == 0) {
     int status = config_set_string(key, &ping_source, value);
     if (status != 0)
-      return (status);
+      return status;
   }
 #ifdef HAVE_OPING_1_3
   else if (strcasecmp(key, "Device") == 0) {
     int status = config_set_string(key, &ping_device, value);
     if (status != 0)
-      return (status);
+      return status;
   }
 #endif
   else if (strcasecmp(key, "TTL") == 0) {
@@ -514,7 +514,7 @@ static int ping_config(const char *key, const char *value) /* {{{ */
       ping_data = malloc(size + 1);
       if (ping_data == NULL) {
         ERROR("ping plugin: malloc failed.");
-        return (1);
+        return 1;
       }
 
       /* Note: By default oping is using constant string
@@ -546,10 +546,10 @@ static int ping_config(const char *key, const char *value) /* {{{ */
     if (ping_max_missed < 0)
       INFO("ping plugin: MaxMissed < 0, disabled re-resolving of hosts");
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ping_config */
 
 static void submit(const char *host, const char *type, /* {{{ */
@@ -581,7 +581,7 @@ static int ping_read(void) /* {{{ */
 
     start_thread();
 
-    return (-1);
+    return -1;
   } /* if (ping_thread_error != 0) */
 
   for (hostlist_t *hl = hostlist_head; hl != NULL; hl = hl->next) /* {{{ */
@@ -642,7 +642,7 @@ static int ping_read(void) /* {{{ */
     submit(hl->host, "ping_droprate", droprate);
   } /* }}} for (hl = hostlist_head; hl != NULL; hl = hl->next) */
 
-  return (0);
+  return 0;
 } /* }}} int ping_read */
 
 static int ping_shutdown(void) /* {{{ */
@@ -651,7 +651,7 @@ static int ping_shutdown(void) /* {{{ */
 
   INFO("ping plugin: Shutting down thread.");
   if (stop_thread() < 0)
-    return (-1);
+    return -1;
 
   hl = hostlist_head;
   while (hl != NULL) {
@@ -670,7 +670,7 @@ static int ping_shutdown(void) /* {{{ */
     ping_data = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ping_shutdown */
 
 void module_register(void) {
@@ -679,5 +679,3 @@ void module_register(void) {
   plugin_register_read("ping", ping_read);
   plugin_register_shutdown("ping", ping_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 2af8988..d0c0ae1 100644 (file)
@@ -407,7 +407,7 @@ static PGresult *c_psql_exec_query_params(c_psql_database_t *db, udb_query_t *q,
   char interval[64];
 
   if ((data == NULL) || (data->params_num == 0))
-    return (c_psql_exec_query_noparams(db, q));
+    return c_psql_exec_query_noparams(db, q);
 
   assert(db->max_params_num >= data->params_num);
 
@@ -438,8 +438,7 @@ static PGresult *c_psql_exec_query_params(c_psql_database_t *db, udb_query_t *q,
   }
 
   return PQexecParams(db->conn, udb_query_get_statement(q), data->params_num,
-                      NULL, (const char *const *)params, NULL, NULL,
-                      /* return text data */ 0);
+                      NULL, (const char *const*)params, NULL, NULL, 0);
 } /* c_psql_exec_query_params */
 
 /* db->db_lock must be locked when calling this function */
@@ -1009,7 +1008,7 @@ static int config_query_param_add(udb_query_t *q, oconfig_item_t *ci) {
   }
 
   data->params_num++;
-  return (0);
+  return 0;
 } /* config_query_param_add */
 
 static int config_query_callback(udb_query_t *q, oconfig_item_t *ci) {
@@ -1018,7 +1017,7 @@ static int config_query_callback(udb_query_t *q, oconfig_item_t *ci) {
 
   log_err("Option not allowed within a Query block: `%s'", ci->key);
 
-  return (-1);
+  return -1;
 } /* config_query_callback */
 
 static int config_add_writer(oconfig_item_t *ci, c_psql_writer_t *src_writers,
@@ -1265,5 +1264,3 @@ void module_register(void) {
   plugin_register_complex_config("postgresql", c_psql_config);
   plugin_register_shutdown("postgresql", c_psql_shutdown);
 } /* module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index f2149ef..0b08b29 100644 (file)
@@ -395,7 +395,7 @@ static int powerdns_get_data_dgram(list_item_t *item, /* {{{ */
   sd = socket(PF_UNIX, item->socktype, 0);
   if (sd < 0) {
     FUNC_ERROR("socket");
-    return (-1);
+    return -1;
   }
 
   sa_unix.sun_family = AF_UNIX;
@@ -407,7 +407,7 @@ static int powerdns_get_data_dgram(list_item_t *item, /* {{{ */
   if ((status != 0) && (errno != ENOENT)) {
     SOCK_ERROR("unlink", sa_unix.sun_path);
     close(sd);
-    return (-1);
+    return -1;
   }
 
   do /* while (0) */
@@ -465,13 +465,13 @@ static int powerdns_get_data_dgram(list_item_t *item, /* {{{ */
   unlink(sa_unix.sun_path);
 
   if (status != 0)
-    return (-1);
+    return -1;
 
   assert(buffer_size > 0);
   buffer = malloc(buffer_size);
   if (buffer == NULL) {
     FUNC_ERROR("malloc");
-    return (-1);
+    return -1;
   }
 
   memcpy(buffer, temp, buffer_size - 1);
@@ -480,7 +480,7 @@ static int powerdns_get_data_dgram(list_item_t *item, /* {{{ */
   *ret_buffer = buffer;
   *ret_buffer_size = buffer_size;
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_get_data_dgram */
 
 static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
@@ -496,7 +496,7 @@ static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
   sd = socket(PF_UNIX, item->socktype, 0);
   if (sd < 0) {
     FUNC_ERROR("socket");
-    return (-1);
+    return -1;
   }
 
   struct timeval timeout;
@@ -506,7 +506,7 @@ static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
   if (status != 0) {
     FUNC_ERROR("setsockopt");
     close(sd);
-    return (-1);
+    return -1;
   }
 
   status =
@@ -514,7 +514,7 @@ static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
   if (status != 0) {
     SOCK_ERROR("connect", item->sockaddr.sun_path);
     close(sd);
-    return (-1);
+    return -1;
   }
 
   /* strlen + 1, because we need to send the terminating NULL byte, too. */
@@ -523,7 +523,7 @@ static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
   if (status < 0) {
     SOCK_ERROR("send", item->sockaddr.sun_path);
     close(sd);
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -558,18 +558,18 @@ static int powerdns_get_data_stream(list_item_t *item, /* {{{ */
     *ret_buffer_size = buffer_size;
   }
 
-  return (status);
+  return status;
 } /* }}} int powerdns_get_data_stream */
 
 static int powerdns_get_data(list_item_t *item, char **ret_buffer,
                              size_t *ret_buffer_size) {
   if (item->socktype == SOCK_DGRAM)
-    return (powerdns_get_data_dgram(item, ret_buffer, ret_buffer_size));
+    return powerdns_get_data_dgram(item, ret_buffer, ret_buffer_size);
   else if (item->socktype == SOCK_STREAM)
-    return (powerdns_get_data_stream(item, ret_buffer, ret_buffer_size));
+    return powerdns_get_data_stream(item, ret_buffer, ret_buffer_size);
   else {
     ERROR("powerdns plugin: Unknown socket type: %i", (int)item->socktype);
-    return (-1);
+    return -1;
   }
 } /* int powerdns_get_data */
 
@@ -592,12 +592,12 @@ static int powerdns_read_server(list_item_t *item) /* {{{ */
     item->command = strdup(SERVER_COMMAND);
   if (item->command == NULL) {
     ERROR("powerdns plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   status = powerdns_get_data(item, &buffer, &buffer_size);
   if (status != 0)
-    return (-1);
+    return -1;
 
   if (item->fields_num != 0) {
     fields = (const char *const *)item->fields;
@@ -640,7 +640,7 @@ static int powerdns_read_server(list_item_t *item) /* {{{ */
 
   sfree(buffer);
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_read_server */
 
 /*
@@ -656,7 +656,7 @@ static int powerdns_update_recursor_command(list_item_t *li) /* {{{ */
   int status;
 
   if (li == NULL)
-    return (0);
+    return 0;
 
   if (li->fields_num < 1) {
     sstrncpy(buffer, RECURSOR_COMMAND, sizeof(buffer));
@@ -667,7 +667,7 @@ static int powerdns_update_recursor_command(list_item_t *li) /* {{{ */
                      /* seperator = */ " ");
     if (status < 0) {
       ERROR("powerdns plugin: strjoin failed.");
-      return (-1);
+      return -1;
     }
     buffer[sizeof(buffer) - 1] = 0;
     size_t len = strlen(buffer);
@@ -682,10 +682,10 @@ static int powerdns_update_recursor_command(list_item_t *li) /* {{{ */
   li->command = strdup(buffer);
   if (li->command == NULL) {
     ERROR("powerdns plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_update_recursor_command */
 
 static int powerdns_read_recursor(list_item_t *item) /* {{{ */
@@ -706,7 +706,7 @@ static int powerdns_read_recursor(list_item_t *item) /* {{{ */
     status = powerdns_update_recursor_command(item);
     if (status != 0) {
       ERROR("powerdns plugin: powerdns_update_recursor_command failed.");
-      return (-1);
+      return -1;
     }
 
     DEBUG("powerdns plugin: powerdns_read_recursor: item->command = %s;",
@@ -717,14 +717,14 @@ static int powerdns_read_recursor(list_item_t *item) /* {{{ */
   status = powerdns_get_data(item, &buffer, &buffer_size);
   if (status != 0) {
     ERROR("powerdns plugin: powerdns_get_data failed.");
-    return (-1);
+    return -1;
   }
 
   keys_list = strdup(item->command);
   if (keys_list == NULL) {
     FUNC_ERROR("strdup");
     sfree(buffer);
-    return (-1);
+    return -1;
   }
 
   key_saveptr = NULL;
@@ -747,7 +747,7 @@ static int powerdns_read_recursor(list_item_t *item) /* {{{ */
   sfree(buffer);
   sfree(keys_list);
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_read_recursor */
 
 static int powerdns_config_add_collect(list_item_t *li, /* {{{ */
@@ -757,21 +757,21 @@ static int powerdns_config_add_collect(list_item_t *li, /* {{{ */
   if (ci->values_num < 1) {
     WARNING("powerdns plugin: The `Collect' option needs "
             "at least one argument.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; i++)
     if (ci->values[i].type != OCONFIG_TYPE_STRING) {
       WARNING("powerdns plugin: Only string arguments are allowed to "
               "the `Collect' option.");
-      return (-1);
+      return -1;
     }
 
   temp =
       realloc(li->fields, sizeof(char *) * (li->fields_num + ci->values_num));
   if (temp == NULL) {
     WARNING("powerdns plugin: realloc failed.");
-    return (-1);
+    return -1;
   }
   li->fields = temp;
 
@@ -787,7 +787,7 @@ static int powerdns_config_add_collect(list_item_t *li, /* {{{ */
   /* Invalidate a previously computed command */
   sfree(li->command);
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_config_add_collect */
 
 static int powerdns_config_add_server(oconfig_item_t *ci) /* {{{ */
@@ -800,20 +800,20 @@ static int powerdns_config_add_server(oconfig_item_t *ci) /* {{{ */
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("powerdns plugin: `%s' needs exactly one string argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   item = calloc(1, sizeof(*item));
   if (item == NULL) {
     ERROR("powerdns plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   item->instance = strdup(ci->values[0].value.string);
   if (item->instance == NULL) {
     ERROR("powerdns plugin: strdup failed.");
     sfree(item);
-    return (-1);
+    return -1;
   }
 
   /*
@@ -832,7 +832,7 @@ static int powerdns_config_add_server(oconfig_item_t *ci) /* {{{ */
   } else {
     /* We must never get here.. */
     assert(0);
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -879,13 +879,13 @@ static int powerdns_config_add_server(oconfig_item_t *ci) /* {{{ */
   if (status != 0) {
     sfree(socket_temp);
     sfree(item);
-    return (-1);
+    return -1;
   }
 
   DEBUG("powerdns plugin: Add server: instance = %s;", item->instance);
 
   sfree(socket_temp);
-  return (0);
+  return 0;
 } /* }}} int powerdns_config_add_server */
 
 static int powerdns_config(oconfig_item_t *ci) /* {{{ */
@@ -897,7 +897,7 @@ static int powerdns_config(oconfig_item_t *ci) /* {{{ */
 
     if (list == NULL) {
       ERROR("powerdns plugin: `llist_create' failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -915,7 +915,7 @@ static int powerdns_config(oconfig_item_t *ci) /* {{{ */
       } else {
         char *temp = strdup(option->values[0].value.string);
         if (temp == NULL)
-          return (1);
+          return 1;
         sfree(local_sockpath);
         local_sockpath = temp;
       }
@@ -924,7 +924,7 @@ static int powerdns_config(oconfig_item_t *ci) /* {{{ */
     }
   } /* for (i = 0; i < ci->children_num; i++) */
 
-  return (0);
+  return 0;
 } /* }}} int powerdns_config */
 
 static int powerdns_read(void) {
@@ -933,12 +933,12 @@ static int powerdns_read(void) {
     item->func(item);
   }
 
-  return (0);
+  return 0;
 } /* static int powerdns_read */
 
 static int powerdns_shutdown(void) {
   if (list == NULL)
-    return (0);
+    return 0;
 
   for (llentry_t *e = llist_head(list); e != NULL; e = e->next) {
     list_item_t *item = (list_item_t *)e->value;
@@ -952,7 +952,7 @@ static int powerdns_shutdown(void) {
   llist_destroy(list);
   list = NULL;
 
-  return (0);
+  return 0;
 } /* static int powerdns_shutdown */
 
 void module_register(void) {
@@ -960,5 +960,3 @@ void module_register(void) {
   plugin_register_read("powerdns", powerdns_read);
   plugin_register_shutdown("powerdns", powerdns_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 fdm=marker : */
index 87c96c8..82a4859 100644 (file)
@@ -32,6 +32,7 @@
  *   Manuel Sanmartin
  *   Clément Stenac <clement.stenac at diwi.org>
  *   Cosmin Ioiart <cioiart at gmail.com>
+ *   Pavel Rochnyack <pavel2000 at ngs.ru>
  **/
 
 #include "collectd.h"
 #endif
 #endif
 
-typedef struct procstat_entry_s {
+#define PROCSTAT_NAME_LEN 256
+typedef struct process_entry_s {
   unsigned long id;
-  unsigned long age;
+  char name[PROCSTAT_NAME_LEN];
 
   unsigned long num_proc;
   unsigned long num_lwp;
+  unsigned long num_fd;
   unsigned long vmem_size;
   unsigned long vmem_rss;
   unsigned long vmem_data;
@@ -188,10 +191,31 @@ typedef struct procstat_entry_s {
   derive_t cswitch_invol;
   _Bool has_cswitch;
 
+  _Bool has_fd;
+} process_entry_t;
+
+typedef struct procstat_entry_s {
+  unsigned long id;
+  unsigned long age;
+
+  derive_t vmem_minflt_counter;
+  derive_t vmem_majflt_counter;
+
+  derive_t cpu_user_counter;
+  derive_t cpu_system_counter;
+
+  /* io data */
+  derive_t io_rchar;
+  derive_t io_wchar;
+  derive_t io_syscr;
+  derive_t io_syscw;
+
+  derive_t cswitch_vol;
+  derive_t cswitch_invol;
+
   struct procstat_entry_s *next;
 } procstat_entry_t;
 
-#define PROCSTAT_NAME_LEN 256
 typedef struct procstat {
   char name[PROCSTAT_NAME_LEN];
 #if HAVE_REGEX_H
@@ -200,6 +224,7 @@ typedef struct procstat {
 
   unsigned long num_proc;
   unsigned long num_lwp;
+  unsigned long num_fd;
   unsigned long vmem_size;
   unsigned long vmem_rss;
   unsigned long vmem_data;
@@ -221,6 +246,9 @@ typedef struct procstat {
   derive_t cswitch_vol;
   derive_t cswitch_invol;
 
+  _Bool report_fd_num;
+  _Bool report_ctx_switch;
+
   struct procstat *next;
   struct procstat_entry_s *instances;
 } procstat_t;
@@ -229,6 +257,7 @@ static procstat_t *list_head_g = NULL;
 
 static _Bool want_init = 1;
 static _Bool report_ctx_switch = 0;
+static _Bool report_fd_num = 0;
 
 #if HAVE_THREAD_INFO
 static mach_port_t port_host_self;
@@ -240,7 +269,7 @@ static mach_msg_type_number_t pset_list_len;
 
 #elif KERNEL_LINUX
 static long pagesize_g;
-static void ps_fill_details(const procstat_t *ps, procstat_entry_t *entry);
+static void ps_fill_details(const procstat_t *ps, process_entry_t *entry);
 /* #endif KERNEL_LINUX */
 
 #elif HAVE_LIBKVM_GETPROCS &&                                                  \
@@ -265,7 +294,7 @@ int getargs(void *processBuffer, int bufferLen, char *argsBuffer, int argsLen);
 /* put name of process from config to list_head_g tree
  * list_head_g is a list of 'procstat_t' structs with
  * processes names we want to watch */
-static void ps_list_register(const char *name, const char *regexp) {
+static procstat_t *ps_list_register(const char *name, const char *regexp) {
   procstat_t *new;
   procstat_t *ptr;
   int status;
@@ -273,10 +302,20 @@ static void ps_list_register(const char *name, const char *regexp) {
   new = calloc(1, sizeof(*new));
   if (new == NULL) {
     ERROR("processes plugin: ps_list_register: calloc failed.");
-    return;
+    return NULL;
   }
   sstrncpy(new->name, name, sizeof(new->name));
 
+  new->io_rchar = -1;
+  new->io_wchar = -1;
+  new->io_syscr = -1;
+  new->io_syscw = -1;
+  new->cswitch_vol = -1;
+  new->cswitch_invol = -1;
+
+  new->report_fd_num = report_fd_num;
+  new->report_ctx_switch = report_ctx_switch;
+
 #if HAVE_REGEX_H
   if (regexp != NULL) {
     DEBUG("ProcessMatch: adding \"%s\" as criteria to process %s.", regexp,
@@ -285,7 +324,7 @@ static void ps_list_register(const char *name, const char *regexp) {
     if (new->re == NULL) {
       ERROR("processes plugin: ps_list_register: malloc failed.");
       sfree(new);
-      return;
+      return NULL;
     }
 
     status = regcomp(new->re, regexp, REG_EXTENDED | REG_NOSUB);
@@ -294,7 +333,7 @@ static void ps_list_register(const char *name, const char *regexp) {
             regexp);
       sfree(new->re);
       sfree(new);
-      return;
+      return NULL;
     }
   }
 #else
@@ -305,7 +344,7 @@ static void ps_list_register(const char *name, const char *regexp) {
           "has been disabled at compile time.",
           regexp);
     sfree(new);
-    return;
+    return NULL;
   }
 #endif
 
@@ -320,7 +359,7 @@ static void ps_list_register(const char *name, const char *regexp) {
       sfree(new->re);
 #endif
       sfree(new);
-      return;
+      return NULL;
     }
 
     if (ptr->next == NULL)
@@ -331,6 +370,8 @@ static void ps_list_register(const char *name, const char *regexp) {
     list_head_g = new;
   else
     ptr->next = new;
+
+  return new;
 } /* void ps_list_register */
 
 /* try to match name against entry, returns 1 if success */
@@ -352,13 +393,13 @@ static int ps_list_match(const char *name, const char *cmdline,
                      /* pmatch = */ NULL,
                      /* eflags = */ 0);
     if (status == 0)
-      return (1);
+      return 1;
   } else
 #endif
       if (strcmp(ps->name, name) == 0)
-    return (1);
+    return 1;
 
-  return (0);
+  return 0;
 } /* int ps_list_match */
 
 static void ps_update_counter(derive_t *group_counter, derive_t *curr_counter,
@@ -375,13 +416,16 @@ static void ps_update_counter(derive_t *group_counter, derive_t *curr_counter,
   else
     curr_value = new_counter - *curr_counter;
 
+  if (*group_counter == -1)
+    *group_counter = 0;
+
   *curr_counter = new_counter;
   *group_counter += curr_value;
 }
 
 /* add process entry to 'instances' of process 'name' (or refresh it) */
 static void ps_list_add(const char *name, const char *cmdline,
-                        procstat_entry_t *entry) {
+                        process_entry_t *entry) {
   procstat_entry_t *pse;
 
   if (entry->id == 0)
@@ -416,35 +460,32 @@ static void ps_list_add(const char *name, const char *cmdline,
     }
 
     pse->age = 0;
-    pse->num_proc = entry->num_proc;
-    pse->num_lwp = entry->num_lwp;
-    pse->vmem_size = entry->vmem_size;
-    pse->vmem_rss = entry->vmem_rss;
-    pse->vmem_data = entry->vmem_data;
-    pse->vmem_code = entry->vmem_code;
-    pse->stack_size = entry->stack_size;
-    pse->io_rchar = entry->io_rchar;
-    pse->io_wchar = entry->io_wchar;
-    pse->io_syscr = entry->io_syscr;
-    pse->io_syscw = entry->io_syscw;
-    pse->cswitch_vol = entry->cswitch_vol;
-    pse->cswitch_invol = entry->cswitch_invol;
-
-    ps->num_proc += pse->num_proc;
-    ps->num_lwp += pse->num_lwp;
-    ps->vmem_size += pse->vmem_size;
-    ps->vmem_rss += pse->vmem_rss;
-    ps->vmem_data += pse->vmem_data;
-    ps->vmem_code += pse->vmem_code;
-    ps->stack_size += pse->stack_size;
-
-    ps->io_rchar += ((pse->io_rchar == -1) ? 0 : pse->io_rchar);
-    ps->io_wchar += ((pse->io_wchar == -1) ? 0 : pse->io_wchar);
-    ps->io_syscr += ((pse->io_syscr == -1) ? 0 : pse->io_syscr);
-    ps->io_syscw += ((pse->io_syscw == -1) ? 0 : pse->io_syscw);
-
-    ps->cswitch_vol += ((pse->cswitch_vol == -1) ? 0 : pse->cswitch_vol);
-    ps->cswitch_invol += ((pse->cswitch_invol == -1) ? 0 : pse->cswitch_invol);
+
+    ps->num_proc += entry->num_proc;
+    ps->num_lwp += entry->num_lwp;
+    ps->num_fd += entry->num_fd;
+    ps->vmem_size += entry->vmem_size;
+    ps->vmem_rss += entry->vmem_rss;
+    ps->vmem_data += entry->vmem_data;
+    ps->vmem_code += entry->vmem_code;
+    ps->stack_size += entry->stack_size;
+
+    if ((entry->io_rchar != -1) && (entry->io_wchar != -1)) {
+      ps_update_counter(&ps->io_rchar, &pse->io_rchar, entry->io_rchar);
+      ps_update_counter(&ps->io_wchar, &pse->io_wchar, entry->io_wchar);
+    }
+
+    if ((entry->io_syscr != -1) && (entry->io_syscw != -1)) {
+      ps_update_counter(&ps->io_syscr, &pse->io_syscr, entry->io_syscr);
+      ps_update_counter(&ps->io_syscw, &pse->io_syscw, entry->io_syscw);
+    }
+
+    if ((entry->cswitch_vol != -1) && (entry->cswitch_vol != -1)) {
+      ps_update_counter(&ps->cswitch_vol, &pse->cswitch_vol,
+                        entry->cswitch_vol);
+      ps_update_counter(&ps->cswitch_invol, &pse->cswitch_invol,
+                        entry->cswitch_invol);
+    }
 
     ps_update_counter(&ps->vmem_minflt_counter, &pse->vmem_minflt_counter,
                       entry->vmem_minflt_counter);
@@ -466,17 +507,12 @@ static void ps_list_reset(void) {
   for (procstat_t *ps = list_head_g; ps != NULL; ps = ps->next) {
     ps->num_proc = 0;
     ps->num_lwp = 0;
+    ps->num_fd = 0;
     ps->vmem_size = 0;
     ps->vmem_rss = 0;
     ps->vmem_data = 0;
     ps->vmem_code = 0;
     ps->stack_size = 0;
-    ps->io_rchar = -1;
-    ps->io_wchar = -1;
-    ps->io_syscr = -1;
-    ps->io_syscw = -1;
-    ps->cswitch_vol = -1;
-    ps->cswitch_invol = -1;
 
     pse_prev = NULL;
     pse = ps->instances;
@@ -504,6 +540,20 @@ static void ps_list_reset(void) {
   }   /* for (ps = list_head_g; ps != NULL; ps = ps->next) */
 }
 
+static void ps_tune_instance(oconfig_item_t *ci, procstat_t *ps) {
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *c = ci->children + i;
+
+    if (strcasecmp(c->key, "CollectContextSwitch") == 0)
+      cf_util_get_boolean(c, &ps->report_ctx_switch);
+    else if (strcasecmp(c->key, "CollectFileDescriptor") == 0)
+      cf_util_get_boolean(c, &ps->report_fd_num);
+    else {
+      ERROR("processes plugin: Option `%s' not allowed here.", c->key);
+    }
+  } /* for (ci->children) */
+} /* void ps_tune_instance */
+
 /* put all pre-defined 'Process' names from config to list_head_g tree */
 static int ps_config(oconfig_item_t *ci) {
 #if KERNEL_LINUX
@@ -512,6 +562,8 @@ static int ps_config(oconfig_item_t *ci) {
   const size_t max_procname_len = MAXCOMLEN - 1;
 #endif
 
+  procstat_t *ps;
+
   for (int i = 0; i < ci->children_num; ++i) {
     oconfig_item_t *c = ci->children + i;
 
@@ -523,13 +575,6 @@ static int ps_config(oconfig_item_t *ci) {
         continue;
       }
 
-      if (c->children_num != 0) {
-        WARNING("processes plugin: the `Process' config option "
-                "does not expect any child elements -- ignoring "
-                "content (%i elements) of the <Process '%s'> block.",
-                c->children_num, c->values[0].value.string);
-      }
-
 #if KERNEL_LINUX || KERNEL_SOLARIS || KERNEL_FREEBSD
       if (strlen(c->values[0].value.string) > max_procname_len) {
         WARNING("processes plugin: this platform has a %zu character limit "
@@ -539,7 +584,10 @@ static int ps_config(oconfig_item_t *ci) {
       }
 #endif
 
-      ps_list_register(c->values[0].value.string, NULL);
+      ps = ps_list_register(c->values[0].value.string, NULL);
+
+      if (c->children_num != 0 && ps != NULL)
+        ps_tune_instance(c, ps);
     } else if (strcasecmp(c->key, "ProcessMatch") == 0) {
       if ((c->values_num != 2) || (OCONFIG_TYPE_STRING != c->values[0].type) ||
           (OCONFIG_TYPE_STRING != c->values[1].type)) {
@@ -549,18 +597,15 @@ static int ps_config(oconfig_item_t *ci) {
         continue;
       }
 
-      if (c->children_num != 0) {
-        WARNING("processes plugin: the `ProcessMatch' config option "
-                "does not expect any child elements -- ignoring "
-                "content (%i elements) of the <ProcessMatch '%s' '%s'> "
-                "block.",
-                c->children_num, c->values[0].value.string,
-                c->values[1].value.string);
-      }
+      ps = ps_list_register(c->values[0].value.string,
+                            c->values[1].value.string);
 
-      ps_list_register(c->values[0].value.string, c->values[1].value.string);
+      if (c->children_num != 0 && ps != NULL)
+        ps_tune_instance(c, ps);
     } else if (strcasecmp(c->key, "CollectContextSwitch") == 0) {
       cf_util_get_boolean(c, &report_ctx_switch);
+    } else if (strcasecmp(c->key, "CollectFileDescriptor") == 0) {
+      cf_util_get_boolean(c, &report_fd_num);
     } else {
       ERROR("processes plugin: The `%s' configuration option is not "
             "understood and will be ignored.",
@@ -569,7 +614,7 @@ static int ps_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 static int ps_init(void) {
@@ -591,7 +636,7 @@ static int ps_init(void) {
     ERROR("host_processor_sets failed: %s\n", mach_error_string(status));
     pset_list = NULL;
     pset_list_len = 0;
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_THREAD_INFO */
 
@@ -610,7 +655,7 @@ static int ps_init(void) {
   pagesize = getpagesize();
 #endif /* HAVE_PROCINFO_H */
 
-  return (0);
+  return 0;
 } /* int ps_init */
 
 /* submit global state (e.g.: qty of zombies, running, etc..) */
@@ -695,7 +740,14 @@ static void ps_submit_proc_list(procstat_t *ps) {
     plugin_dispatch_values(&vl);
   }
 
-  if (report_ctx_switch) {
+  if (ps->num_fd > 0) {
+    sstrncpy(vl.type, "file_handles", sizeof(vl.type));
+    vl.values[0].gauge = ps->num_fd;
+    vl.values_len = 1;
+    plugin_dispatch_values(&vl);
+  }
+
+  if ((ps->cswitch_vol != -1) && (ps->cswitch_invol != -1)) {
     sstrncpy(vl.type, "contextswitch", sizeof(vl.type));
     sstrncpy(vl.type_instance, "voluntary", sizeof(vl.type_instance));
     vl.values[0].derive = ps->cswitch_vol;
@@ -709,7 +761,7 @@ static void ps_submit_proc_list(procstat_t *ps) {
     plugin_dispatch_values(&vl);
   }
 
-  DEBUG("name = %s; num_proc = %lu; num_lwp = %lu; "
+  DEBUG("name = %s; num_proc = %lu; num_lwp = %lu; num_fd = %lu; "
         "vmem_size = %lu; vmem_rss = %lu; vmem_data = %lu; "
         "vmem_code = %lu; "
         "vmem_minflt_counter = %" PRIi64 "; vmem_majflt_counter = %" PRIi64 "; "
@@ -717,8 +769,8 @@ static void ps_submit_proc_list(procstat_t *ps) {
         "io_rchar = %" PRIi64 "; io_wchar = %" PRIi64 "; "
         "io_syscr = %" PRIi64 "; io_syscw = %" PRIi64 "; "
         "cswitch_vol = %" PRIi64 "; cswitch_invol = %" PRIi64 ";",
-        ps->name, ps->num_proc, ps->num_lwp, ps->vmem_size, ps->vmem_rss,
-        ps->vmem_data, ps->vmem_code, ps->vmem_minflt_counter,
+        ps->name, ps->num_proc, ps->num_lwp, ps->num_fd, ps->vmem_size,
+        ps->vmem_rss, ps->vmem_data, ps->vmem_code, ps->vmem_minflt_counter,
         ps->vmem_majflt_counter, ps->cpu_user_counter, ps->cpu_system_counter,
         ps->io_rchar, ps->io_wchar, ps->io_syscr, ps->io_syscw, ps->cswitch_vol,
         ps->cswitch_invol);
@@ -741,7 +793,7 @@ static void ps_submit_fork_rate(derive_t value) {
 
 /* ------- additional functions for KERNEL_LINUX/HAVE_THREAD_INFO ------- */
 #if KERNEL_LINUX
-static int ps_read_tasks_status(procstat_entry_t *ps) {
+static int ps_read_tasks_status(process_entry_t *ps) {
   char dirname[64];
   DIR *dh;
   char filename[64];
@@ -757,7 +809,7 @@ static int ps_read_tasks_status(procstat_entry_t *ps) {
 
   if ((dh = opendir(dirname)) == NULL) {
     DEBUG("Failed to open directory `%s'", dirname);
-    return (-1);
+    return -1;
   }
 
   while ((ent = readdir(dh)) != NULL) {
@@ -811,11 +863,11 @@ static int ps_read_tasks_status(procstat_entry_t *ps) {
   ps->cswitch_vol = cswitch_vol;
   ps->cswitch_invol = cswitch_invol;
 
-  return (0);
+  return 0;
 } /* int *ps_read_tasks_status */
 
 /* Read data from /proc/pid/status */
-static procstat_t *ps_read_status(long pid, procstat_t *ps) {
+static int ps_read_status(long pid, process_entry_t *ps) {
   FILE *fh;
   char buffer[1024];
   char filename[64];
@@ -828,7 +880,7 @@ static procstat_t *ps_read_status(long pid, procstat_t *ps) {
 
   ssnprintf(filename, sizeof(filename), "/proc/%li/status", pid);
   if ((fh = fopen(filename, "r")) == NULL)
-    return (NULL);
+    return -1;
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
     unsigned long tmp;
@@ -868,10 +920,10 @@ static procstat_t *ps_read_status(long pid, procstat_t *ps) {
   if (threads != 0)
     ps->num_lwp = threads;
 
-  return (ps);
-} /* procstat_t *ps_read_vmem */
+  return 0;
+} /* int *ps_read_status */
 
-static int ps_read_io(procstat_entry_t *ps) {
+static int ps_read_io(process_entry_t *ps) {
   FILE *fh;
   char buffer[1024];
   char filename[64];
@@ -880,8 +932,10 @@ static int ps_read_io(procstat_entry_t *ps) {
   int numfields;
 
   ssnprintf(filename, sizeof(filename), "/proc/%li/io", ps->id);
-  if ((fh = fopen(filename, "r")) == NULL)
-    return (-1);
+  if ((fh = fopen(filename, "r")) == NULL) {
+    DEBUG("ps_read_io: Failed to open file `%s'", filename);
+    return -1;
+  }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
     derive_t *val = NULL;
@@ -917,35 +971,55 @@ static int ps_read_io(procstat_entry_t *ps) {
     char errbuf[1024];
     WARNING("processes: fclose: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
   }
-  return (0);
+  return 0;
 } /* int ps_read_io (...) */
 
-static void ps_fill_details(const procstat_t *ps, procstat_entry_t *entry) {
-  if (entry->has_io == 0 && ps_read_io(entry) != 0) {
-    /* no io data */
-    entry->io_rchar = -1;
-    entry->io_wchar = -1;
-    entry->io_syscr = -1;
-    entry->io_syscw = -1;
+static int ps_count_fd(int pid) {
+  char dirname[64];
+  DIR *dh;
+  struct dirent *ent;
+  int count = 0;
+
+  ssnprintf(dirname, sizeof(dirname), "/proc/%i/fd", pid);
 
-    DEBUG("ps_read_process: not get io data for pid %li", entry->id);
+  if ((dh = opendir(dirname)) == NULL) {
+    DEBUG("Failed to open directory `%s'", dirname);
+    return -1;
   }
-  entry->has_io = 1;
+  while ((ent = readdir(dh)) != NULL) {
+    if (!isdigit((int)ent->d_name[0]))
+      continue;
+    else
+      count++;
+  }
+  closedir(dh);
+
+  return (count >= 1) ? count : 1;
+} /* int ps_count_fd (pid) */
 
-  if (report_ctx_switch) {
-    if (entry->has_cswitch == 0 && ps_read_tasks_status(entry) != 0) {
-      entry->cswitch_vol = -1;
-      entry->cswitch_invol = -1;
+static void ps_fill_details(const procstat_t *ps, process_entry_t *entry) {
+  if (entry->has_io == 0) {
+    ps_read_io(entry);
+    entry->has_io = 1;
+  }
 
-      DEBUG("ps_read_tasks_status: not get context "
-            "switch data for pid %li",
-            entry->id);
+  if (ps->report_ctx_switch) {
+    if (entry->has_cswitch == 0) {
+      ps_read_tasks_status(entry);
+      entry->has_cswitch = 1;
     }
-    entry->has_cswitch = 1;
+  }
+
+  if (ps->report_fd_num) {
+    int num_fd;
+    if (entry->has_fd == 0 && (num_fd = ps_count_fd(entry->id)) > 0) {
+      entry->num_fd = num_fd;
+    }
+    entry->has_fd = 1;
   }
 } /* void ps_fill_details (...) */
 
-static int ps_read_process(long pid, procstat_t *ps, char *state) {
+static int ps_read_process(long pid, process_entry_t *ps, char *state) {
   char filename[64];
   char buffer[1024];
 
@@ -967,13 +1041,11 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
 
   ssize_t status;
 
-  memset(ps, 0, sizeof(procstat_t));
-
   ssnprintf(filename, sizeof(filename), "/proc/%li/stat", pid);
 
   status = read_file_contents(filename, buffer, sizeof(buffer) - 1);
   if (status <= 0)
-    return (-1);
+    return -1;
   buffer_len = (size_t)status;
   buffer[buffer_len] = 0;
 
@@ -995,7 +1067,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
   if (name_start_pos >= name_end_pos) {
     ERROR("processes plugin: name_start_pos = %zu >= name_end_pos = %zu",
           name_start_pos, name_end_pos);
-    return (-1);
+    return -1;
   }
 
   name_len = (name_end_pos - name_start_pos) - 1;
@@ -1005,7 +1077,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
   sstrncpy(ps->name, &buffer[name_start_pos + 1], name_len + 1);
 
   if ((buffer_len - name_end_pos) < 2)
-    return (-1);
+    return -1;
   buffer_ptr = &buffer[name_end_pos + 2];
 
   fields_len = strsplit(buffer_ptr, fields, STATIC_ARRAY_SIZE(fields));
@@ -1013,7 +1085,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
     DEBUG("processes plugin: ps_read_process (pid = %li):"
           " `%s' has only %i fields..",
           pid, filename, fields_len);
-    return (-1);
+    return -1;
   }
 
   *state = fields[0][0];
@@ -1023,7 +1095,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
     ps->num_proc = 0;
   } else {
     ps->num_lwp = strtoul(fields[17], /* endptr = */ NULL, /* base = */ 10);
-    if ((ps_read_status(pid, ps)) == NULL) {
+    if ((ps_read_status(pid, ps)) != 0) {
       /* No VMem data */
       ps->vmem_data = -1;
       ps->vmem_code = -1;
@@ -1039,7 +1111,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
     DEBUG("processes plugin: This is only a zombie: pid = %li; "
           "name = %s;",
           pid, ps->name);
-    return (0);
+    return 0;
   }
 
   cpu_user_counter = atoll(fields[11]);
@@ -1068,8 +1140,17 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
   ps->vmem_rss = (unsigned long)vmem_rss;
   ps->stack_size = (unsigned long)stack_size;
 
+  /* no data by default. May be filled by ps_fill_details () */
+  ps->io_rchar = -1;
+  ps->io_wchar = -1;
+  ps->io_syscr = -1;
+  ps->io_syscw = -1;
+
+  ps->cswitch_vol = -1;
+  ps->cswitch_invol = -1;
+
   /* success */
-  return (0);
+  return 0;
 } /* int ps_read_process (...) */
 
 static char *ps_get_cmdline(long pid, char *name, char *buf, size_t buf_len) {
@@ -1176,7 +1257,7 @@ static int read_fork_rate(void) {
     char errbuf[1024];
     ERROR("processes plugin: fopen (/proc/stat) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), proc_stat) != NULL) {
@@ -1200,10 +1281,10 @@ static int read_fork_rate(void) {
   fclose(proc_stat);
 
   if (!value_valid)
-    return (-1);
+    return -1;
 
   ps_submit_fork_rate(value.derive);
-  return (0);
+  return 0;
 }
 #endif /*KERNEL_LINUX */
 
@@ -1223,13 +1304,13 @@ static char *ps_get_cmdline(long pid,
           "while reading \"%s\": "
           "Returned %zd but expected %zu.",
           path, status, buffer_size);
-    return (NULL);
+    return NULL;
   }
 
   info.pr_psargs[sizeof(info.pr_psargs) - 1] = 0;
   sstrncpy(buffer, info.pr_psargs, buffer_size);
 
-  return (buffer);
+  return buffer;
 } /* }}} int ps_get_cmdline */
 
 /*
@@ -1239,7 +1320,7 @@ static char *ps_get_cmdline(long pid,
  * The values for input and ouput chars are calculated "by hand"
  * Added a few "solaris" specific process states as well
  */
-static int ps_read_process(long pid, procstat_t *ps, char *state) {
+static int ps_read_process(long pid, process_entry_t *ps, char *state) {
   char filename[64];
   char f_psinfo[64], f_usage[64];
   char *buffer;
@@ -1274,7 +1355,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
     sfree(myStatus);
     sfree(myInfo);
     sfree(myUsage);
-    return (0);
+    return 0;
   } else {
     ps->num_proc = 1;
     ps->num_lwp = myInfo->pr_nlwp;
@@ -1304,6 +1385,11 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
   ps->stack_size = myStatus->pr_stksize;
 
   /*
+   * TODO: File descriptor count for Solaris
+   */
+  ps->num_fd = 0;
+
+  /*
    * Calculating input/ouput chars
    * Formula used is total chars / total blocks => chars/block
    * then convert input/output blocks to chars
@@ -1346,7 +1432,7 @@ static int ps_read_process(long pid, procstat_t *ps, char *state) {
   sfree(myInfo);
   sfree(myUsage);
 
-  return (0);
+  return 0;
 }
 
 /*
@@ -1359,7 +1445,7 @@ static int read_fork_rate(void) {
   derive_t result = 0;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (kstat_t *ksp_chain = kc->kc_chain; ksp_chain != NULL;
        ksp_chain = ksp_chain->ks_next) {
@@ -1377,7 +1463,7 @@ static int read_fork_rate(void) {
   }
 
   ps_submit_fork_rate(result);
-  return (0);
+  return 0;
 }
 #endif /* KERNEL_SOLARIS */
 
@@ -1394,12 +1480,12 @@ static int mach_get_task_name(task_t t, int *pid, char *name,
   mib[2] = KERN_PROC_PID;
 
   if (pid_for_task(t, pid) != KERN_SUCCESS)
-    return (-1);
+    return -1;
   mib[3] = *pid;
 
   kp_size = sizeof(kp);
   if (sysctl(mib, 4, &kp, &kp_size, NULL, 0) != 0)
-    return (-1);
+    return -1;
 
   if (name_max_len > (MAXCOMLEN + 1))
     name_max_len = MAXCOMLEN + 1;
@@ -1413,7 +1499,7 @@ static int mach_get_task_name(task_t t, int *pid, char *name,
    * `top' does it, because it is a lot of work and only used when
    * debugging. -octo */
 
-  return (0);
+  return 0;
 }
 #endif /* HAVE_THREAD_INFO */
 /* ------- end of additional functions for KERNEL_LINUX/HAVE_THREAD_INFO -------
@@ -1444,7 +1530,7 @@ static int ps_read(void) {
   int blocked = 0;
 
   procstat_t *ps;
-  procstat_entry_t pse;
+  process_entry_t pse;
 
   ps_list_reset();
 
@@ -1526,6 +1612,14 @@ static int ps_read(void) {
         pse.vmem_data = 0;
         pse.vmem_code = 0;
 
+        pse.io_rchar = -1;
+        pse.io_wchar = -1;
+        pse.io_syscr = -1;
+        pse.io_syscw = -1;
+
+        /* File descriptor count not implemented */
+        pse.num_fd = 0;
+
         pse.vmem_minflt_counter = task_events_info.cow_faults;
         pse.vmem_majflt_counter = task_events_info.faults;
 
@@ -1657,8 +1751,7 @@ static int ps_read(void) {
   char cmdline[CMDLINE_BUFFER_SIZE];
 
   int status;
-  procstat_t ps;
-  procstat_entry_t pse;
+  process_entry_t pse;
   char state;
 
   running = sleeping = zombies = stopped = paging = blocked = 0;
@@ -1667,7 +1760,7 @@ static int ps_read(void) {
   if ((proc = opendir("/proc")) == NULL) {
     char errbuf[1024];
     ERROR("Cannot open `/proc': %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while ((ent = readdir(proc)) != NULL) {
@@ -1677,38 +1770,15 @@ static int ps_read(void) {
     if ((pid = atol(ent->d_name)) < 1)
       continue;
 
-    status = ps_read_process(pid, &ps, &state);
+    memset(&pse, 0, sizeof(pse));
+    pse.id = pid;
+
+    status = ps_read_process(pid, &pse, &state);
     if (status != 0) {
       DEBUG("ps_read_process failed: %i", status);
       continue;
     }
 
-    memset(&pse, 0, sizeof(pse));
-    pse.id = pid;
-    pse.age = 0;
-
-    pse.num_proc = ps.num_proc;
-    pse.num_lwp = ps.num_lwp;
-    pse.vmem_size = ps.vmem_size;
-    pse.vmem_rss = ps.vmem_rss;
-    pse.vmem_data = ps.vmem_data;
-    pse.vmem_code = ps.vmem_code;
-    pse.stack_size = ps.stack_size;
-
-    pse.vmem_minflt_counter = ps.vmem_minflt_counter;
-    pse.vmem_majflt_counter = ps.vmem_majflt_counter;
-
-    pse.cpu_user_counter = ps.cpu_user_counter;
-    pse.cpu_system_counter = ps.cpu_system_counter;
-
-    pse.io_rchar = ps.io_rchar;
-    pse.io_wchar = ps.io_wchar;
-    pse.io_syscr = ps.io_syscr;
-    pse.io_syscw = ps.io_syscw;
-
-    pse.cswitch_vol = ps.cswitch_vol;
-    pse.cswitch_invol = ps.cswitch_invol;
-
     switch (state) {
     case 'R':
       running++;
@@ -1730,8 +1800,8 @@ static int ps_read(void) {
       break;
     }
 
-    ps_list_add(ps.name, ps_get_cmdline(pid, ps.name, cmdline, sizeof(cmdline)),
-                &pse);
+    ps_list_add(pse.name,
+                ps_get_cmdline(pid, pse.name, cmdline, sizeof(cmdline)), &pse);
   }
 
   closedir(proc);
@@ -1764,7 +1834,7 @@ static int ps_read(void) {
   struct kinfo_proc *proc_ptr = NULL;
   int count; /* returns number of processes */
 
-  procstat_entry_t pse;
+  process_entry_t pse;
 
   ps_list_reset();
 
@@ -1772,7 +1842,7 @@ static int ps_read(void) {
   kd = kvm_openfiles(NULL, "/dev/null", NULL, 0, errbuf);
   if (kd == NULL) {
     ERROR("processes plugin: Cannot open kvm interface: %s", errbuf);
-    return (0);
+    return 0;
   }
 
   /* Get the list of processes. */
@@ -1781,7 +1851,7 @@ static int ps_read(void) {
     ERROR("processes plugin: Cannot get kvm processes list: %s",
           kvm_geterr(kd));
     kvm_close(kd);
-    return (0);
+    return 0;
   }
 
   /* Iterate through the processes in kinfo_proc */
@@ -1814,8 +1884,8 @@ static int ps_read(void) {
         }
       } /* if (process has argument list) */
 
+      memset(&pse, 0, sizeof(pse));
       pse.id = procs[i].ki_pid;
-      pse.age = 0;
 
       pse.num_proc = 1;
       pse.num_lwp = procs[i].ki_numthreads;
@@ -1850,6 +1920,9 @@ static int ps_read(void) {
       pse.io_syscr = -1;
       pse.io_syscw = -1;
 
+      /* file descriptor count not implemented */
+      pse.num_fd = 0;
+
       /* context switch counters not implemented */
       pse.cswitch_vol = -1;
       pse.cswitch_invol = -1;
@@ -1911,15 +1984,15 @@ static int ps_read(void) {
   struct kinfo_proc *proc_ptr = NULL;
   int count; /* returns number of processes */
 
-  procstat_entry_t pse;
+  process_entry_t pse;
 
   ps_list_reset();
 
   /* Open the kvm interface, get a descriptor */
-  kd = kvm_open(NULL, NULL, NULL, 0, errbuf);
+  kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf);
   if (kd == NULL) {
     ERROR("processes plugin: Cannot open kvm interface: %s", errbuf);
-    return (0);
+    return 0;
   }
 
   /* Get the list of processes. */
@@ -1928,7 +2001,7 @@ static int ps_read(void) {
     ERROR("processes plugin: Cannot get kvm processes list: %s",
           kvm_geterr(kd));
     kvm_close(kd);
-    return (0);
+    return 0;
   }
 
   /* Iterate through the processes in kinfo_proc */
@@ -1963,7 +2036,6 @@ static int ps_read(void) {
 
       memset(&pse, 0, sizeof(pse));
       pse.id = procs[i].p_pid;
-      pse.age = 0;
 
       pse.num_proc = 1;
       pse.num_lwp = 1; /* XXX: accumulate p_tid values for a single p_pid ? */
@@ -1987,6 +2059,9 @@ static int ps_read(void) {
       pse.io_syscr = -1;
       pse.io_syscw = -1;
 
+      /* file descriptor count not implemented */
+      pse.num_fd = 0;
+
       /* context switch counters not implemented */
       pse.cswitch_vol = -1;
       pse.cswitch_invol = -1;
@@ -2045,7 +2120,7 @@ static int ps_read(void) {
   pid_t pindex = 0;
   int nprocs;
 
-  procstat_entry_t pse;
+  process_entry_t pse;
 
   ps_list_reset();
   while ((nprocs = getprocs64(procentry, sizeof(struct procentry64),
@@ -2085,8 +2160,9 @@ static int ps_read(void) {
         }
       }
 
+      memset(&pse, 0, sizeof(pse));
+
       pse.id = procentry[i].pi_pid;
-      pse.age = 0;
       pse.num_lwp = procentry[i].pi_thcount;
       pse.num_proc = 1;
 
@@ -2136,7 +2212,7 @@ static int ps_read(void) {
 
       pse.vmem_size = procentry[i].pi_tsize + procentry[i].pi_dvm * pagesize;
       pse.vmem_rss = (procentry[i].pi_drss + procentry[i].pi_trss) * pagesize;
-      /* Not supported */
+      /* Not supported/implemented */
       pse.vmem_data = 0;
       pse.vmem_code = 0;
       pse.stack_size = 0;
@@ -2146,6 +2222,8 @@ static int ps_read(void) {
       pse.io_syscr = -1;
       pse.io_syscw = -1;
 
+      pse.num_fd = 0;
+
       pse.cswitch_vol = -1;
       pse.cswitch_invol = -1;
 
@@ -2194,12 +2272,11 @@ static int ps_read(void) {
 
   proc = opendir("/proc");
   if (proc == NULL)
-    return (-1);
+    return -1;
 
   while ((ent = readdir(proc)) != NULL) {
     long pid;
-    struct procstat ps;
-    procstat_entry_t pse;
+    process_entry_t pse;
     char *endptr;
 
     if (!isdigit((int)ent->d_name[0]))
@@ -2209,38 +2286,15 @@ static int ps_read(void) {
     if (*endptr != 0) /* value didn't completely parse as a number */
       continue;
 
-    status = ps_read_process(pid, &ps, &state);
+    memset(&pse, 0, sizeof(pse));
+    pse.id = pid;
+
+    status = ps_read_process(pid, &pse, &state);
     if (status != 0) {
       DEBUG("ps_read_process failed: %i", status);
       continue;
     }
 
-    memset(&pse, 0, sizeof(pse));
-    pse.id = pid;
-    pse.age = 0;
-
-    pse.num_proc = ps.num_proc;
-    pse.num_lwp = ps.num_lwp;
-    pse.vmem_size = ps.vmem_size;
-    pse.vmem_rss = ps.vmem_rss;
-    pse.vmem_data = ps.vmem_data;
-    pse.vmem_code = ps.vmem_code;
-    pse.stack_size = ps.stack_size;
-
-    pse.vmem_minflt_counter = ps.vmem_minflt_counter;
-    pse.vmem_majflt_counter = ps.vmem_majflt_counter;
-
-    pse.cpu_user_counter = ps.cpu_user_counter;
-    pse.cpu_system_counter = ps.cpu_system_counter;
-
-    pse.io_rchar = ps.io_rchar;
-    pse.io_wchar = ps.io_wchar;
-    pse.io_syscr = ps.io_syscr;
-    pse.io_syscw = ps.io_syscw;
-
-    pse.cswitch_vol = -1;
-    pse.cswitch_invol = -1;
-
     switch (state) {
     case 'R':
       running++;
@@ -2268,8 +2322,8 @@ static int ps_read(void) {
       break;
     }
 
-    ps_list_add(ps.name, ps_get_cmdline(pid, ps.name, cmdline, sizeof(cmdline)),
-                &pse);
+    ps_list_add(pse.name,
+                ps_get_cmdline(pid, pse.name, cmdline, sizeof(cmdline)), &pse);
   } /* while(readdir) */
   closedir(proc);
 
@@ -2290,7 +2344,7 @@ static int ps_read(void) {
 
   want_init = 0;
 
-  return (0);
+  return 0;
 } /* int ps_read */
 
 void module_register(void) {
index 64735e6..32e9824 100644 (file)
@@ -89,7 +89,7 @@ static int read_file(const char *path) {
   if (fh == NULL) {
     ERROR("protocols plugin: fopen (%s) failed: %s.", path,
           sstrerror(errno, key_buffer, sizeof(key_buffer)));
-    return (-1);
+    return -1;
   }
 
   status = -1;
@@ -169,7 +169,7 @@ static int read_file(const char *path) {
 
   fclose(fh);
 
-  return (status);
+  return status;
 } /* int read_file */
 
 static int protocols_read(void) {
@@ -185,9 +185,9 @@ static int protocols_read(void) {
     success++;
 
   if (success == 0)
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* int protocols_read */
 
 static int protocols_config(const char *key, const char *value) {
@@ -202,10 +202,10 @@ static int protocols_config(const char *key, const char *value) {
       invert = 0;
     ignorelist_set_invert(values_list, invert);
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int protocols_config */
 
 void module_register(void) {
@@ -213,5 +213,3 @@ void module_register(void) {
                          config_keys_num);
   plugin_register_read("protocols", protocols_read);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 et : */
index c6ee554..b106e45 100644 (file)
@@ -784,8 +784,8 @@ static PyObject *cpy_register_write(PyObject *self, PyObject *args,
 static PyObject *cpy_register_notification(PyObject *self, PyObject *args,
                                            PyObject *kwds) {
   return cpy_register_generic_userdata((void *)plugin_register_notification,
-                                       (void *)cpy_notification_callback, args,
-                                       kwds);
+                                       (void *)cpy_notification_callback,
+                                       args, kwds);
 }
 
 static PyObject *cpy_register_flush(PyObject *self, PyObject *args,
@@ -944,7 +944,8 @@ static PyObject *cpy_unregister_read(PyObject *self, PyObject *arg) {
 }
 
 static PyObject *cpy_unregister_write(PyObject *self, PyObject *arg) {
-  return cpy_unregister_generic_userdata(plugin_unregister_write, arg, "write");
+  return cpy_unregister_generic_userdata(plugin_unregister_write, arg,
+                                         "write");
 }
 
 static PyObject *cpy_unregister_notification(PyObject *self, PyObject *arg) {
@@ -953,7 +954,8 @@ static PyObject *cpy_unregister_notification(PyObject *self, PyObject *arg) {
 }
 
 static PyObject *cpy_unregister_flush(PyObject *self, PyObject *arg) {
-  return cpy_unregister_generic_userdata(plugin_unregister_flush, arg, "flush");
+  return cpy_unregister_generic_userdata(plugin_unregister_flush, arg,
+                                         "flush");
 }
 
 static PyObject *cpy_unregister_shutdown(PyObject *self, PyObject *arg) {
@@ -1397,7 +1399,7 @@ static int cpy_config(oconfig_item_t *ci) {
       status = 1;
     }
   }
-  return (status);
+  return status;
 }
 
 void module_register(void) {
index 7875c7e..05225b5 100644 (file)
@@ -36,6 +36,7 @@
 #define REDIS_DEF_PASSWD ""
 #define REDIS_DEF_PORT 6379
 #define REDIS_DEF_TIMEOUT 2000
+#define REDIS_DEF_DB_COUNT 16
 #define MAX_REDIS_NODE_NAME 64
 #define MAX_REDIS_PASSWD_LENGTH 512
 #define MAX_REDIS_VAL_SIZE 256
@@ -89,13 +90,13 @@ static int redis_node_add(const redis_node_t *rn) /* {{{ */
 
   if (rn_ptr != NULL) {
     ERROR("redis plugin: A node with the name `%s' already exists.", rn->name);
-    return (-1);
+    return -1;
   }
 
   rn_copy = malloc(sizeof(*rn_copy));
   if (rn_copy == NULL) {
     ERROR("redis plugin: malloc failed adding redis_node to the tree.");
-    return (-1);
+    return -1;
   }
 
   memcpy(rn_copy, rn, sizeof(*rn_copy));
@@ -112,7 +113,7 @@ static int redis_node_add(const redis_node_t *rn) /* {{{ */
     rn_ptr->next = rn_copy;
   }
 
-  return (0);
+  return 0;
 } /* }}} */
 
 static redis_query_t *redis_config_query(oconfig_item_t *ci) /* {{{ */
@@ -170,7 +171,7 @@ static int redis_config_node(oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_string_buffer(ci, rn.name, sizeof(rn.name));
   if (status != 0)
-    return (status);
+    return status;
 
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *option = ci->children + i;
@@ -207,9 +208,9 @@ static int redis_config_node(oconfig_item_t *ci) /* {{{ */
   }
 
   if (status != 0)
-    return (status);
+    return status;
 
-  return (redis_node_add(&rn));
+  return redis_node_add(&rn);
 } /* }}} int redis_config_node */
 
 static int redis_config(oconfig_item_t *ci) /* {{{ */
@@ -227,10 +228,10 @@ static int redis_config(oconfig_item_t *ci) /* {{{ */
 
   if (nodes_head == NULL) {
     ERROR("redis plugin: No valid node configuration could be found.");
-    return (ENOENT);
+    return ENOENT;
   }
 
-  return (0);
+  return 0;
 } /* }}} */
 
 __attribute__((nonnull(2))) static void
@@ -263,7 +264,7 @@ static int redis_init(void) /* {{{ */
   if (nodes_head == NULL)
     redis_node_add(&rn);
 
-  return (0);
+  return 0;
 } /* }}} int redis_init */
 
 static int redis_handle_info(char *node, char const *info_line,
@@ -284,13 +285,13 @@ static int redis_handle_info(char *node, char const *info_line,
 
     if (parse_value(buf, &val, ds_type) == -1) {
       WARNING("redis plugin: Unable to parse field `%s'.", field_name);
-      return (-1);
+      return -1;
     }
 
     redis_submit(node, type, type_instance, val);
-    return (0);
+    return 0;
   }
-  return (-1);
+  return -1;
 
 } /* }}} int redis_handle_info */
 
@@ -304,17 +305,17 @@ static int redis_handle_query(redisContext *rh, redis_node_t *rn,
   ds = plugin_get_ds(rq->type);
   if (!ds) {
     ERROR("redis plugin: DataSet `%s' not defined.", rq->type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num != 1) {
     ERROR("redis plugin: DS `%s' has too many types.", rq->type);
-    return (-1);
+    return -1;
   }
 
   if ((rr = redisCommand(rh, rq->query)) == NULL) {
     WARNING("redis plugin: unable to carry out query `%s'.", rq->query);
-    return (-1);
+    return -1;
   }
 
   switch (rr->type) {
@@ -338,13 +339,13 @@ static int redis_handle_query(redisContext *rh, redis_node_t *rn,
     if (parse_value(rr->str, &val, ds->ds[0].type) == -1) {
       WARNING("redis plugin: Unable to parse field `%s'.", rq->type);
       freeReplyObject(rr);
-      return (-1);
+      return -1;
     }
     break;
   default:
     WARNING("redis plugin: Cannot coerce redis type.");
     freeReplyObject(rr);
-    return (-1);
+    return -1;
   }
 
   redis_submit(rn->name, rq->type,
@@ -353,6 +354,45 @@ static int redis_handle_query(redisContext *rh, redis_node_t *rn,
   return 0;
 } /* }}} int redis_handle_query */
 
+static int redis_db_stats(char *node, char const *info_line) /* {{{ */
+{
+  /* redis_db_stats parses and dispatches Redis database statistics,
+   * currently the number of keys for each database.
+   * info_line needs to have the following format:
+   *   db0:keys=4,expires=0,avg_ttl=0
+   */
+
+  for (int db = 0; db < REDIS_DEF_DB_COUNT; db++) {
+    static char buf[MAX_REDIS_VAL_SIZE];
+    static char field_name[11];
+    static char db_id[3];
+    value_t val;
+    char *str;
+    int i;
+
+    ssnprintf(field_name, sizeof(field_name), "db%d:keys=", db);
+
+    str = strstr(info_line, field_name);
+    if (!str)
+      continue;
+
+    str += strlen(field_name);
+    for (i = 0; (*str && isdigit((int)*str)); i++, str++)
+      buf[i] = *str;
+    buf[i] = '\0';
+
+    if (parse_value(buf, &val, DS_TYPE_GAUGE) != 0) {
+      WARNING("redis plugin: Unable to parse field `%s'.", field_name);
+      return -1;
+    }
+
+    ssnprintf(db_id, sizeof(db_id), "%d", db);
+    redis_submit(node, "records", db_id, val);
+  }
+  return 0;
+
+} /* }}} int redis_db_stats */
+
 static int redis_read(void) /* {{{ */
 {
   for (redis_node_t *rn = nodes_head; rn != NULL; rn = rn->next) {
@@ -429,6 +469,8 @@ static int redis_read(void) /* {{{ */
     redis_handle_info(rn->name, rr->str, "total_bytes", "output",
                       "total_net_output_bytes", DS_TYPE_DERIVE);
 
+    redis_db_stats(rn->name, rr->str);
+
     for (redis_query_t *rq = rn->queries; rq != NULL; rq = rq->next)
       redis_handle_query(rh, rn, rq);
 
@@ -451,5 +493,3 @@ void module_register(void) /* {{{ */
    * X elements */
 }
 /* }}} */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 07493c7..ba92b0b 100644 (file)
@@ -92,10 +92,10 @@ static int handle_interface(__attribute__((unused))
                             const ros_interface_t *i,
                             void *user_data) {
   if ((i == NULL) || (user_data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   submit_interface(user_data, i);
-  return (0);
+  return 0;
 } /* }}} int handle_interface */
 
 static void cr_submit_gauge(cr_data_t *rd, const char *type, /* {{{ */
@@ -174,10 +174,10 @@ static int handle_regtable(__attribute__((unused))
                            const ros_registration_table_t *r,
                            void *user_data) {
   if ((r == NULL) || (user_data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   submit_regtable(user_data, r);
-  return (0);
+  return 0;
 } /* }}} int handle_regtable */
 
 #if ROS_VERSION >= ROS_VERSION_ENCODE(1, 1, 0)
@@ -188,7 +188,7 @@ static int handle_system_resource(__attribute__((unused))
   cr_data_t *rd;
 
   if ((r == NULL) || (user_data == NULL))
-    return (EINVAL);
+    return EINVAL;
   rd = user_data;
 
   if (rd->collect_cpu_load)
@@ -212,7 +212,7 @@ static int handle_system_resource(__attribute__((unused))
     cr_submit_gauge(rd, "gauge", "bad_blocks", (gauge_t)r->bad_blocks);
   }
 
-  return (0);
+  return 0;
 } /* }}} int handle_system_resource */
 #endif
 
@@ -222,11 +222,11 @@ static int cr_read(user_data_t *user_data) /* {{{ */
   cr_data_t *rd;
 
   if (user_data == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   rd = user_data->data;
   if (rd == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (rd->connection == NULL) {
     rd->connection =
@@ -235,7 +235,7 @@ static int cr_read(user_data_t *user_data) /* {{{ */
       char errbuf[128];
       ERROR("routeros plugin: ros_connect failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   }
   assert(rd->connection != NULL);
@@ -249,7 +249,7 @@ static int cr_read(user_data_t *user_data) /* {{{ */
             sstrerror(status, errbuf, sizeof(errbuf)));
       ros_disconnect(rd->connection);
       rd->connection = NULL;
-      return (-1);
+      return -1;
     }
   }
 
@@ -262,7 +262,7 @@ static int cr_read(user_data_t *user_data) /* {{{ */
             sstrerror(status, errbuf, sizeof(errbuf)));
       ros_disconnect(rd->connection);
       rd->connection = NULL;
-      return (-1);
+      return -1;
     }
   }
 
@@ -277,12 +277,12 @@ static int cr_read(user_data_t *user_data) /* {{{ */
             sstrerror(status, errbuf, sizeof(errbuf)));
       ros_disconnect(rd->connection);
       rd->connection = NULL;
-      return (-1);
+      return -1;
     }
   }
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int cr_read */
 
 static void cr_free_data(cr_data_t *ptr) /* {{{ */
@@ -309,7 +309,7 @@ static int cr_config_router(oconfig_item_t *ci) /* {{{ */
 
   router_data = calloc(1, sizeof(*router_data));
   if (router_data == NULL)
-    return (-1);
+    return -1;
   router_data->connection = NULL;
   router_data->node = NULL;
   router_data->service = NULL;
@@ -389,7 +389,7 @@ static int cr_config_router(oconfig_item_t *ci) /* {{{ */
   if (status != 0)
     cr_free_data(router_data);
 
-  return (status);
+  return status;
 } /* }}} int cr_config_router */
 
 static int cr_config(oconfig_item_t *ci) {
@@ -403,11 +403,9 @@ static int cr_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int cr_config */
 
 void module_register(void) {
   plugin_register_complex_config("routeros", cr_config);
 } /* void module_register */
-
-/* vim: set sw=2 noet fdm=marker : */
index 6eb67d4..4efb1f0 100644 (file)
@@ -77,7 +77,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
   t = CDTIME_T_TO_TIME_T(vl->time);
   status = ssnprintf(buffer, buffer_len, "%lu", (unsigned long)t);
   if ((status < 1) || (status >= buffer_len))
-    return (-1);
+    return -1;
   offset = status;
 
   for (size_t i = 0; i < ds->ds_num; i++) {
@@ -85,7 +85,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
         (ds->ds[i].type != DS_TYPE_GAUGE) &&
         (ds->ds[i].type != DS_TYPE_DERIVE) &&
         (ds->ds[i].type != DS_TYPE_ABSOLUTE))
-      return (-1);
+      return -1;
 
     if (ds->ds[i].type == DS_TYPE_COUNTER) {
       status = ssnprintf(buffer + offset, buffer_len - offset, ":%llu",
@@ -102,12 +102,12 @@ static int value_list_to_string(char *buffer, int buffer_len,
     }
 
     if ((status < 1) || (status >= (buffer_len - offset)))
-      return (-1);
+      return -1;
 
     offset += status;
   } /* for ds->ds_num */
 
-  return (0);
+  return 0;
 } /* int value_list_to_string */
 
 static int value_list_to_filename(char *buffer, size_t buffer_size,
@@ -120,7 +120,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
     size_t datadir_len = strlen(datadir) + 1;
 
     if (datadir_len >= buffer_size)
-      return (ENOMEM);
+      return ENOMEM;
 
     sstrncpy(buffer, datadir, buffer_size);
     buffer[datadir_len - 1] = '/';
@@ -132,7 +132,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
 
   status = FORMAT_VL(buffer, buffer_size, vl);
   if (status != 0)
-    return (status);
+    return status;
 
   len = strlen(buffer);
   assert(len < buffer_size);
@@ -140,10 +140,10 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
   buffer_size -= len;
 
   if (buffer_size <= sizeof(suffix))
-    return (ENOMEM);
+    return ENOMEM;
 
   memcpy(buffer, suffix, sizeof(suffix));
-  return (0);
+  return 0;
 } /* int value_list_to_filename */
 
 static int rc_config_get_int_positive(oconfig_item_t const *ci, int *ret) {
@@ -152,12 +152,12 @@ static int rc_config_get_int_positive(oconfig_item_t const *ci, int *ret) {
 
   status = cf_util_get_int(ci, &tmp);
   if (status != 0)
-    return (status);
+    return status;
   if (tmp < 0)
-    return (EINVAL);
+    return EINVAL;
 
   *ret = tmp;
-  return (0);
+  return 0;
 } /* int rc_config_get_int_positive */
 
 static int rc_config_get_xff(oconfig_item_t const *ci, double *ret) {
@@ -167,38 +167,38 @@ static int rc_config_get_xff(oconfig_item_t const *ci, double *ret) {
     ERROR("rrdcached plugin: The \"%s\" needs exactly one numeric argument "
           "in the range [0.0, 1.0)",
           ci->key);
-    return (EINVAL);
+    return EINVAL;
   }
 
   value = ci->values[0].value.number;
   if ((value >= 0.0) && (value < 1.0)) {
     *ret = value;
-    return (0);
+    return 0;
   }
 
   ERROR("rrdcached plugin: The \"%s\" needs exactly one numeric argument "
         "in the range [0.0, 1.0)",
         ci->key);
-  return (EINVAL);
+  return EINVAL;
 } /* int rc_config_get_xff */
 
 static int rc_config_add_timespan(int timespan) {
   int *tmp;
 
   if (timespan <= 0)
-    return (EINVAL);
+    return EINVAL;
 
   tmp = realloc(rrdcreate_config.timespans,
                 sizeof(*rrdcreate_config.timespans) *
                     (rrdcreate_config.timespans_num + 1));
   if (tmp == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   rrdcreate_config.timespans = tmp;
 
   rrdcreate_config.timespans[rrdcreate_config.timespans_num] = timespan;
   rrdcreate_config.timespans_num++;
 
-  return (0);
+  return 0;
 } /* int rc_config_add_timespan */
 
 static int rc_config(oconfig_item_t *ci) {
@@ -258,7 +258,7 @@ static int rc_config(oconfig_item_t *ci) {
     plugin_register_write("rrdcached", rc_write, /* user_data = */ NULL);
     plugin_register_flush("rrdcached", rc_flush, /* user_data = */ NULL);
   }
-  return (0);
+  return 0;
 } /* int rc_config */
 
 static int try_reconnect(void) {
@@ -272,13 +272,13 @@ static int try_reconnect(void) {
     ERROR("rrdcached plugin: Failed to reconnect to RRDCacheD "
           "at %s: %s (status=%d)",
           daemon_address, rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
   INFO("rrdcached plugin: Successfully reconnected to RRDCacheD "
        "at %s",
        daemon_address);
-  return (0);
+  return 0;
 } /* int try_reconnect */
 
 static int rc_read(void) {
@@ -291,10 +291,10 @@ static int rc_read(void) {
   vl.values_len = 1;
 
   if (daemon_address == NULL)
-    return (-1);
+    return -1;
 
   if (!config_collect_stats)
-    return (-1);
+    return -1;
 
   if ((strncmp("unix:", daemon_address, strlen("unix:")) != 0) &&
       (daemon_address[0] != '/'))
@@ -307,7 +307,7 @@ static int rc_read(void) {
     ERROR("rrdcached plugin: Failed to connect to RRDCacheD "
           "at %s: %s (status=%d)",
           daemon_address, rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -328,7 +328,7 @@ static int rc_read(void) {
 
     ERROR("rrdcached plugin: rrdc_stats_get failed: %s (status=%i).",
           rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
   for (rrdc_stats_t *ptr = head; ptr != NULL; ptr = ptr->next) {
@@ -376,14 +376,14 @@ static int rc_read(void) {
 
   rrdc_stats_free(head);
 
-  return (0);
+  return 0;
 } /* int rc_read */
 
 static int rc_init(void) {
   if (config_collect_stats)
     plugin_register_read("rrdcached", rc_read);
 
-  return (0);
+  return 0;
 } /* int rc_init */
 
 static int rc_write(const data_set_t *ds, const value_list_t *vl,
@@ -397,22 +397,22 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl,
   if (daemon_address == NULL) {
     ERROR("rrdcached plugin: daemon_address == NULL.");
     plugin_unregister_write("rrdcached");
-    return (-1);
+    return -1;
   }
 
   if (strcmp(ds->type, vl->type) != 0) {
     ERROR("rrdcached plugin: DS type does not match value list type");
-    return (-1);
+    return -1;
   }
 
   if (value_list_to_filename(filename, sizeof(filename), vl) != 0) {
     ERROR("rrdcached plugin: value_list_to_filename failed.");
-    return (-1);
+    return -1;
   }
 
   if (value_list_to_string(values, sizeof(values), ds, vl) != 0) {
     ERROR("rrdcached plugin: value_list_to_string failed.");
-    return (-1);
+    return -1;
   }
 
   values_array[0] = values;
@@ -427,15 +427,15 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl,
         char errbuf[1024];
         ERROR("rrdcached plugin: stat (%s) failed: %s", filename,
               sstrerror(errno, errbuf, sizeof(errbuf)));
-        return (-1);
+        return -1;
       }
 
       status = cu_rrd_create_file(filename, ds, vl, &rrdcreate_config);
       if (status != 0) {
         ERROR("rrdcached plugin: cu_rrd_create_file (%s) failed.", filename);
-        return (-1);
+        return -1;
       } else if (rrdcreate_config.async)
-        return (0);
+        return 0;
     }
   }
 
@@ -445,7 +445,7 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl,
     ERROR("rrdcached plugin: Failed to connect to RRDCacheD "
           "at %s: %s (status=%d)",
           daemon_address, rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -465,10 +465,10 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl,
 
     ERROR("rrdcached plugin: rrdc_update (%s, [%s], 1) failed: %s (status=%i)",
           filename, values_array[0], rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int rc_write */
 
 static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */
@@ -479,7 +479,7 @@ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */
   _Bool retried = 0;
 
   if (identifier == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   if (datadir != NULL)
     ssnprintf(filename, sizeof(filename), "%s/%s.rrd", datadir, identifier);
@@ -492,7 +492,7 @@ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */
     ERROR("rrdcached plugin: Failed to connect to RRDCacheD "
           "at %s: %s (status=%d)",
           daemon_address, rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -512,16 +512,16 @@ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */
 
     ERROR("rrdcached plugin: rrdc_flush (%s) failed: %s (status=%i).", filename,
           rrd_get_error(), status);
-    return (-1);
+    return -1;
   }
   DEBUG("rrdcached plugin: rrdc_flush (%s): Success.", filename);
 
-  return (0);
+  return 0;
 } /* }}} int rc_flush */
 
 static int rc_shutdown(void) {
   rrdc_disconnect();
-  return (0);
+  return 0;
 } /* int rc_shutdown */
 
 void module_register(void) {
@@ -529,7 +529,3 @@ void module_register(void) {
   plugin_register_init("rrdcached", rc_init);
   plugin_register_shutdown("rrdcached", rc_shutdown);
 } /* void module_register */
-
-/*
- * vim: set sw=2 sts=2 et :
- */
index e29d637..5a71ebe 100644 (file)
@@ -122,7 +122,7 @@ static int srrd_update(char *filename, char *template, int argc,
             rrd_get_error());
   }
 
-  return (status);
+  return status;
 } /* int srrd_update */
 /* #endif HAVE_THREADSAFE_LIBRRD */
 
@@ -140,7 +140,7 @@ static int srrd_update(char *filename, char *template, int argc,
   new_argv = malloc((new_argc + 1) * sizeof(*new_argv));
   if (new_argv == NULL) {
     ERROR("rrdtool plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   new_argv[0] = "update";
@@ -163,7 +163,7 @@ static int srrd_update(char *filename, char *template, int argc,
 
   sfree(new_argv);
 
-  return (status);
+  return status;
 } /* int srrd_update */
 #endif /* !HAVE_THREADSAFE_LIBRRD */
 
@@ -179,7 +179,7 @@ static int value_list_to_string_multiple(char *buffer, int buffer_len,
   tt = CDTIME_T_TO_TIME_T(vl->time);
   status = ssnprintf(buffer, buffer_len, "%u", (unsigned int)tt);
   if ((status < 1) || (status >= buffer_len))
-    return (-1);
+    return -1;
   offset = status;
 
   for (size_t i = 0; i < ds->ds_num; i++) {
@@ -187,7 +187,7 @@ static int value_list_to_string_multiple(char *buffer, int buffer_len,
         (ds->ds[i].type != DS_TYPE_GAUGE) &&
         (ds->ds[i].type != DS_TYPE_DERIVE) &&
         (ds->ds[i].type != DS_TYPE_ABSOLUTE))
-      return (-1);
+      return -1;
 
     if (ds->ds[i].type == DS_TYPE_COUNTER)
       status = ssnprintf(buffer + offset, buffer_len - offset, ":%llu",
@@ -203,12 +203,12 @@ static int value_list_to_string_multiple(char *buffer, int buffer_len,
                          vl->values[i].absolute);
 
     if ((status < 1) || (status >= (buffer_len - offset)))
-      return (-1);
+      return -1;
 
     offset += status;
   } /* for ds->ds_num */
 
-  return (0);
+  return 0;
 } /* int value_list_to_string_multiple */
 
 static int value_list_to_string(char *buffer, int buffer_len,
@@ -217,7 +217,7 @@ static int value_list_to_string(char *buffer, int buffer_len,
   time_t tt;
 
   if (ds->ds_num != 1)
-    return (value_list_to_string_multiple(buffer, buffer_len, ds, vl));
+    return value_list_to_string_multiple(buffer, buffer_len, ds, vl);
 
   tt = CDTIME_T_TO_TIME_T(vl->time);
   switch (ds->ds[0].type) {
@@ -238,13 +238,13 @@ static int value_list_to_string(char *buffer, int buffer_len,
                        vl->values[0].absolute);
     break;
   default:
-    return (EINVAL);
+    return EINVAL;
   }
 
   if ((status < 1) || (status >= buffer_len))
-    return (ENOMEM);
+    return ENOMEM;
 
-  return (0);
+  return 0;
 } /* int value_list_to_string */
 
 static int value_list_to_filename(char *buffer, size_t buffer_size,
@@ -257,7 +257,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
     size_t datadir_len = strlen(datadir) + 1;
 
     if (datadir_len >= buffer_size)
-      return (ENOMEM);
+      return ENOMEM;
 
     sstrncpy(buffer, datadir, buffer_size);
     buffer[datadir_len - 1] = '/';
@@ -269,7 +269,7 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
 
   status = FORMAT_VL(buffer, buffer_size, vl);
   if (status != 0)
-    return (status);
+    return status;
 
   len = strlen(buffer);
   assert(len < buffer_size);
@@ -277,10 +277,10 @@ static int value_list_to_filename(char *buffer, size_t buffer_size,
   buffer_size -= len;
 
   if (buffer_size <= sizeof(suffix))
-    return (ENOMEM);
+    return ENOMEM;
 
   memcpy(buffer, suffix, sizeof(suffix));
-  return (0);
+  return 0;
 } /* int value_list_to_filename */
 
 static void *rrd_queue_thread(void __attribute__((unused)) * data) {
@@ -418,7 +418,7 @@ static void *rrd_queue_thread(void __attribute__((unused)) * data) {
   } /* while (42) */
 
   pthread_exit((void *)0);
-  return ((void *)0);
+  return (void *)0;
 } /* void *rrd_queue_thread */
 
 static int rrd_queue_enqueue(const char *filename, rrd_queue_t **head,
@@ -427,12 +427,12 @@ static int rrd_queue_enqueue(const char *filename, rrd_queue_t **head,
 
   queue_entry = malloc(sizeof(*queue_entry));
   if (queue_entry == NULL)
-    return (-1);
+    return -1;
 
   queue_entry->filename = strdup(filename);
   if (queue_entry->filename == NULL) {
     free(queue_entry);
-    return (-1);
+    return -1;
   }
 
   queue_entry->next = NULL;
@@ -448,7 +448,7 @@ static int rrd_queue_enqueue(const char *filename, rrd_queue_t **head,
   pthread_cond_signal(&queue_cond);
   pthread_mutex_unlock(&queue_lock);
 
-  return (0);
+  return 0;
 } /* int rrd_queue_enqueue */
 
 static int rrd_queue_dequeue(const char *filename, rrd_queue_t **head,
@@ -471,7 +471,7 @@ static int rrd_queue_dequeue(const char *filename, rrd_queue_t **head,
 
   if (this == NULL) {
     pthread_mutex_unlock(&queue_lock);
-    return (-1);
+    return -1;
   }
 
   if (prev == NULL)
@@ -487,7 +487,7 @@ static int rrd_queue_dequeue(const char *filename, rrd_queue_t **head,
   sfree(this->filename);
   sfree(this);
 
-  return (0);
+  return 0;
 } /* int rrd_queue_dequeue */
 
 /* XXX: You must hold "cache_lock" when calling this function! */
@@ -568,7 +568,7 @@ static int rrd_cache_flush_identifier(cdtime_t timeout,
 
   if (identifier == NULL) {
     rrd_cache_flush(timeout);
-    return (0);
+    return 0;
   }
 
   now = cdtime();
@@ -584,7 +584,7 @@ static int rrd_cache_flush_identifier(cdtime_t timeout,
     INFO("rrdtool plugin: rrd_cache_flush_identifier: "
          "c_avl_get (%s) failed. Does that file really exist?",
          key);
-    return (status);
+    return status;
   }
 
   if (rc->flags == FLAG_FLUSHQ) {
@@ -602,7 +602,7 @@ static int rrd_cache_flush_identifier(cdtime_t timeout,
       rc->flags = FLAG_FLUSHQ;
   }
 
-  return (status);
+  return status;
 } /* int rrd_cache_flush_identifier */
 
 static int64_t rrd_get_random_variation(void) {
@@ -610,7 +610,7 @@ static int64_t rrd_get_random_variation(void) {
   long max;
 
   if (random_timeout == 0)
-    return (0);
+    return 0;
 
   /* Assure that "cache_timeout + random_variation" is never negative. */
   if (random_timeout > cache_timeout) {
@@ -622,7 +622,7 @@ static int64_t rrd_get_random_variation(void) {
   max = (long)(random_timeout / 2);
   min = max - ((long)random_timeout);
 
-  return ((int64_t)cdrand_range(min, max));
+  return (int64_t)cdrand_range(min, max);
 } /* int64_t rrd_get_random_variation */
 
 static int rrd_cache_insert(const char *filename, const char *value,
@@ -638,7 +638,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
   if (cache == NULL) {
     pthread_mutex_unlock(&cache_lock);
     WARNING("rrdtool plugin: cache == NULL.");
-    return (-1);
+    return -1;
   }
 
   c_avl_get(cache, filename, (void *)&rc);
@@ -647,7 +647,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
     rc = malloc(sizeof(*rc));
     if (rc == NULL) {
       pthread_mutex_unlock(&cache_lock);
-      return (-1);
+      return -1;
     }
     rc->values_num = 0;
     rc->values = NULL;
@@ -664,7 +664,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
     DEBUG("rrdtool plugin: (rc->last_value = %" PRIu64 ") "
           ">= (value_time = %" PRIu64 ")",
           rc->last_value, value_time);
-    return (-1);
+    return -1;
   }
 
   values_new =
@@ -683,7 +683,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
     sfree(cache_key);
     sfree(rc->values);
     sfree(rc);
-    return (-1);
+    return -1;
   }
   rc->values = values_new;
 
@@ -710,7 +710,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
       sfree(rc->values[0]);
       sfree(rc->values);
       sfree(rc);
-      return (-1);
+      return -1;
     }
 
     c_avl_insert(cache, cache_key, rc);
@@ -744,7 +744,7 @@ static int rrd_cache_insert(const char *filename, const char *value,
 
   pthread_mutex_unlock(&cache_lock);
 
-  return (0);
+  return 0;
 } /* int rrd_cache_insert */
 
 static int rrd_cache_destroy(void) /* {{{ */
@@ -758,7 +758,7 @@ static int rrd_cache_destroy(void) /* {{{ */
 
   if (cache == NULL) {
     pthread_mutex_unlock(&cache_lock);
-    return (0);
+    return 0;
   }
 
   while (c_avl_pick(cache, &key, &value) == 0) {
@@ -791,7 +791,7 @@ static int rrd_cache_destroy(void) /* {{{ */
   }
 
   pthread_mutex_unlock(&cache_lock);
-  return (0);
+  return 0;
 } /* }}} int rrd_cache_destroy */
 
 static int rrd_compare_numeric(const void *a_ptr, const void *b_ptr) {
@@ -799,11 +799,11 @@ static int rrd_compare_numeric(const void *a_ptr, const void *b_ptr) {
   int b = *((int *)b_ptr);
 
   if (a < b)
-    return (-1);
+    return -1;
   else if (a > b)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* int rrd_compare_numeric */
 
 static int rrd_write(const data_set_t *ds, const value_list_t *vl,
@@ -814,7 +814,7 @@ static int rrd_write(const data_set_t *ds, const value_list_t *vl,
   int status;
 
   if (do_shutdown)
-    return (0);
+    return 0;
 
   if (0 != strcmp(ds->type, vl->type)) {
     ERROR("rrdtool plugin: DS type does not match value list type");
@@ -822,32 +822,32 @@ static int rrd_write(const data_set_t *ds, const value_list_t *vl,
   }
 
   if (value_list_to_filename(filename, sizeof(filename), vl) != 0)
-    return (-1);
+    return -1;
 
   if (value_list_to_string(values, sizeof(values), ds, vl) != 0)
-    return (-1);
+    return -1;
 
   if (stat(filename, &statbuf) == -1) {
     if (errno == ENOENT) {
       status = cu_rrd_create_file(filename, ds, vl, &rrdcreate_config);
       if (status != 0)
-        return (-1);
+        return -1;
       else if (rrdcreate_config.async)
-        return (0);
+        return 0;
     } else {
       char errbuf[1024];
       ERROR("stat(%s) failed: %s", filename,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   } else if (!S_ISREG(statbuf.st_mode)) {
     ERROR("stat(%s): Not a regular file!", filename);
-    return (-1);
+    return -1;
   }
 
   status = rrd_cache_insert(filename, values, vl->time);
 
-  return (status);
+  return status;
 } /* int rrd_write */
 
 static int rrd_flush(cdtime_t timeout, const char *identifier,
@@ -856,13 +856,13 @@ static int rrd_flush(cdtime_t timeout, const char *identifier,
 
   if (cache == NULL) {
     pthread_mutex_unlock(&cache_lock);
-    return (0);
+    return 0;
   }
 
   rrd_cache_flush_identifier(timeout, identifier);
 
   pthread_mutex_unlock(&cache_lock);
-  return (0);
+  return 0;
 } /* int rrd_flush */
 
 static int rrd_config(const char *key, const char *value) {
@@ -873,7 +873,7 @@ static int rrd_config(const char *key, const char *value) {
                       "be greater than 0.\n");
       ERROR("rrdtool: `CacheTimeout' must "
             "be greater than 0.\n");
-      return (1);
+      return 1;
     }
     cache_timeout = DOUBLE_TO_CDTIME_T(tmp);
   } else if (strcasecmp("CacheFlush", key) == 0) {
@@ -883,7 +883,7 @@ static int rrd_config(const char *key, const char *value) {
                       "be greater than 0.\n");
       ERROR("rrdtool: `CacheFlush' must "
             "be greater than 0.\n");
-      return (1);
+      return 1;
     }
     cache_flush_timeout = tmp;
   } else if (strcasecmp("DataDir", key) == 0) {
@@ -893,7 +893,7 @@ static int rrd_config(const char *key, const char *value) {
     tmp = strdup(value);
     if (tmp == NULL) {
       ERROR("rrdtool plugin: strdup failed.");
-      return (1);
+      return 1;
     }
 
     len = strlen(tmp);
@@ -905,7 +905,7 @@ static int rrd_config(const char *key, const char *value) {
     if (len == 0) {
       ERROR("rrdtool plugin: Invalid \"DataDir\" option.");
       sfree(tmp);
-      return (1);
+      return 1;
     }
 
     if (datadir != NULL) {
@@ -933,7 +933,7 @@ static int rrd_config(const char *key, const char *value) {
                       "be greater than 0.\n");
       ERROR("rrdtool: `RRARows' must "
             "be greater than 0.\n");
-      return (1);
+      return 1;
     }
     rrdcreate_config.rrarows = tmp;
   } else if (strcasecmp("RRATimespan", key) == 0) {
@@ -945,7 +945,7 @@ static int rrd_config(const char *key, const char *value) {
 
     value_copy = strdup(value);
     if (value_copy == NULL)
-      return (1);
+      return 1;
 
     dummy = value_copy;
     while ((ptr = strtok_r(dummy, ", \t", &saveptr)) != NULL) {
@@ -957,7 +957,7 @@ static int rrd_config(const char *key, const char *value) {
         fprintf(stderr, "rrdtool: realloc failed.\n");
         ERROR("rrdtool: realloc failed.\n");
         free(value_copy);
-        return (1);
+        return 1;
       }
       rrdcreate_config.timespans = tmp_alloc;
       rrdcreate_config.timespans[rrdcreate_config.timespans_num] = atoi(ptr);
@@ -978,7 +978,7 @@ static int rrd_config(const char *key, const char *value) {
                       "be in the range 0 to 1 (exclusive).");
       ERROR("rrdtool: `XFF' must "
             "be in the range 0 to 1 (exclusive).");
-      return (1);
+      return 1;
     }
     rrdcreate_config.xff = tmp;
   } else if (strcasecmp("WritesPerSecond", key) == 0) {
@@ -987,7 +987,7 @@ static int rrd_config(const char *key, const char *value) {
     if (wps < 0.0) {
       fprintf(stderr, "rrdtool: `WritesPerSecond' must be "
                       "greater than or equal to zero.");
-      return (1);
+      return 1;
     } else if (wps == 0.0) {
       write_rate = 0.0;
     } else {
@@ -1006,9 +1006,9 @@ static int rrd_config(const char *key, const char *value) {
       random_timeout = DOUBLE_TO_CDTIME_T(tmp);
     }
   } else {
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* int rrd_config */
 
 static int rrd_shutdown(void) {
@@ -1039,7 +1039,7 @@ static int rrd_shutdown(void) {
 
   rrd_cache_destroy();
 
-  return (0);
+  return 0;
 } /* int rrd_shutdown */
 
 static int rrd_init(void) {
@@ -1047,7 +1047,7 @@ static int rrd_init(void) {
   int status;
 
   if (init_once != 0)
-    return (0);
+    return 0;
   init_once = 1;
 
   if (rrdcreate_config.heartbeat <= 0)
@@ -1060,7 +1060,7 @@ static int rrd_init(void) {
   if (cache == NULL) {
     pthread_mutex_unlock(&cache_lock);
     ERROR("rrdtool plugin: c_avl_create failed.");
-    return (-1);
+    return -1;
   }
 
   cache_flush_last = cdtime();
@@ -1076,7 +1076,7 @@ static int rrd_init(void) {
                            /* args = */ NULL, "rrdtool queue");
   if (status != 0) {
     ERROR("rrdtool plugin: Cannot create queue-thread.");
-    return (-1);
+    return -1;
   }
   queue_thread_running = 1;
 
@@ -1086,7 +1086,7 @@ static int rrd_init(void) {
         rrdcreate_config.heartbeat, rrdcreate_config.rrarows,
         rrdcreate_config.xff);
 
-  return (0);
+  return 0;
 } /* int rrd_init */
 
 void module_register(void) {
index 8f1824d..ed87c30 100644 (file)
@@ -185,7 +185,7 @@ static int sensors_snprintf_chip_name(char *buf, size_t buf_size,
                       chip->addr);
   }
 
-  return (status);
+  return status;
 } /* int sensors_snprintf_chip_name */
 
 static int sensors_feature_name_to_type(const char *name) {
@@ -193,9 +193,9 @@ static int sensors_feature_name_to_type(const char *name) {
    * it's a one time cost.. */
   for (int i = 0; i < known_features_num; i++)
     if (strcasecmp(known_features[i].label, name) == 0)
-      return (known_features[i].type);
+      return known_features[i].type;
 
-  return (SENSOR_TYPE_UNKNOWN);
+  return SENSOR_TYPE_UNKNOWN;
 } /* int sensors_feature_name_to_type */
 #endif
 
@@ -216,7 +216,7 @@ static int sensors_config(const char *key, const char *value) {
     if (ignorelist_add(sensor_list, value)) {
       ERROR("sensors plugin: "
             "Cannot add value to ignorelist.");
-      return (1);
+      return 1;
     }
   } else if (strcasecmp(key, "IgnoreSelected") == 0) {
     ignorelist_set_invert(sensor_list, 1);
@@ -229,10 +229,10 @@ static int sensors_config(const char *key, const char *value) {
   }
 #endif
   else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void sensors_free_features(void) {
@@ -272,7 +272,7 @@ static int sensors_load_conf(void) {
       char errbuf[1024];
       ERROR("sensors plugin: fopen(%s) failed: %s", conffile,
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
   }
 
@@ -283,7 +283,7 @@ static int sensors_load_conf(void) {
   if (status != 0) {
     ERROR("sensors plugin: Cannot initialize sensors. "
           "Data will not be collected.");
-    return (-1);
+    return -1;
   }
 
 #if SENSORS_API_VERSION < 0x400
@@ -367,6 +367,9 @@ static int sensors_load_conf(void) {
       if ((feature->type != SENSORS_FEATURE_IN) &&
           (feature->type != SENSORS_FEATURE_FAN) &&
           (feature->type != SENSORS_FEATURE_TEMP) &&
+#if SENSORS_API_VERSION >= 0x402
+          (feature->type != SENSORS_FEATURE_CURR) &&
+#endif
           (feature->type != SENSORS_FEATURE_POWER)) {
         DEBUG("sensors plugin: sensors_load_conf: "
               "Ignoring feature `%s', "
@@ -383,6 +386,9 @@ static int sensors_load_conf(void) {
         if ((subfeature->type != SENSORS_SUBFEATURE_IN_INPUT) &&
             (subfeature->type != SENSORS_SUBFEATURE_FAN_INPUT) &&
             (subfeature->type != SENSORS_SUBFEATURE_TEMP_INPUT) &&
+#if SENSORS_API_VERSION >= 0x402
+            (subfeature->type != SENSORS_SUBFEATURE_CURR_INPUT) &&
+#endif
             (subfeature->type != SENSORS_SUBFEATURE_POWER_INPUT))
           continue;
 
@@ -410,17 +416,17 @@ static int sensors_load_conf(void) {
     sensors_cleanup();
     INFO("sensors plugin: lm_sensors reports no "
          "features. Data will not be collected.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int sensors_load_conf */
 
 static int sensors_shutdown(void) {
   sensors_free_features();
   ignorelist_free(sensor_list);
 
-  return (0);
+  return 0;
 } /* int sensors_shutdown */
 
 static void sensors_submit(const char *plugin_instance, const char *type,
@@ -454,7 +460,7 @@ static void sensors_submit(const char *plugin_instance, const char *type,
 
 static int sensors_read(void) {
   if (sensors_load_conf() != 0)
-    return (-1);
+    return -1;
 
 #if SENSORS_API_VERSION < 0x400
   for (featurelist_t *fl = first_feature; fl != NULL; fl = fl->next) {
@@ -513,6 +519,10 @@ static int sensors_read(void) {
       type = "temperature";
     else if (fl->feature->type == SENSORS_FEATURE_POWER)
       type = "power";
+#if SENSORS_API_VERSION >= 0x402
+    else if (fl->feature->type == SENSORS_FEATURE_CURR)
+      type = "current";
+#endif
     else
       continue;
 
@@ -520,7 +530,7 @@ static int sensors_read(void) {
   } /* for fl = first_feature .. NULL */
 #endif /* (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
 
-  return (0);
+  return 0;
 } /* int sensors_read */
 
 void module_register(void) {
index 5057fd3..fda8787 100644 (file)
@@ -54,7 +54,7 @@ static int serial_read(void) {
       (fh = fopen("/proc/tty/driver/ttyS", "r")) == NULL) {
     char errbuf[1024];
     WARNING("serial: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -100,7 +100,7 @@ static int serial_read(void) {
   }
 
   fclose(fh);
-  return (0);
+  return 0;
 } /* int serial_read */
 
 void module_register(void) {
index 3188d1c..0e4e192 100644 (file)
@@ -50,7 +50,7 @@ static int smart_config(const char *key, const char *value) {
   if (ignorelist == NULL)
     ignorelist = ignorelist_create(/* invert = */ 1);
   if (ignorelist == NULL)
-    return (1);
+    return 1;
 
   if (strcasecmp("Disk", key) == 0) {
     ignorelist_add(ignorelist, value);
@@ -66,10 +66,10 @@ static int smart_config(const char *key, const char *value) {
     if (IS_TRUE(value))
       use_serial = 1;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int smart_config */
 
 static void smart_submit(const char *dev, const char *type,
@@ -217,7 +217,7 @@ static int smart_read(void) {
   handle_udev = udev_new();
   if (!handle_udev) {
     ERROR("smart plugin: unable to initialize udev.");
-    return (-1);
+    return -1;
   }
   enumerate = udev_enumerate_new(handle_udev);
   udev_enumerate_add_match_subsystem(enumerate, "block");
@@ -239,7 +239,7 @@ static int smart_read(void) {
   udev_enumerate_unref(enumerate);
   udev_unref(handle_udev);
 
-  return (0);
+  return 0;
 } /* int smart_read */
 
 static int smart_init(void) {
@@ -256,7 +256,7 @@ static int smart_init(void) {
               "running \"setcap cap_sys_rawio=ep\" on the collectd binary.");
   }
 #endif
-  return (0);
+  return 0;
 } /* int smart_init */
 
 void module_register(void) {
index 3bfec47..77349f6 100644 (file)
@@ -130,23 +130,23 @@ static void csnmp_oid_init(oid_t *dst, oid const *src, size_t n) {
 }
 
 static int csnmp_oid_compare(oid_t const *left, oid_t const *right) {
-  return (
-      snmp_oid_compare(left->oid, left->oid_len, right->oid, right->oid_len));
+  return snmp_oid_compare(left->oid, left->oid_len, right->oid,
+                          right->oid_len);
 }
 
 static int csnmp_oid_suffix(oid_t *dst, oid_t const *src, oid_t const *root) {
   /* Make sure "src" is in "root"s subtree. */
   if (src->oid_len <= root->oid_len)
-    return (EINVAL);
+    return EINVAL;
   if (snmp_oid_ncompare(root->oid, root->oid_len, src->oid, src->oid_len,
                         /* n = */ root->oid_len) != 0)
-    return (EINVAL);
+    return EINVAL;
 
   memset(dst, 0, sizeof(*dst));
   dst->oid_len = src->oid_len - root->oid_len;
   memcpy(dst->oid, &src->oid[root->oid_len],
          dst->oid_len * sizeof(dst->oid[0]));
-  return (0);
+  return 0;
 }
 
 static int csnmp_oid_to_string(char *buffer, size_t buffer_size,
@@ -159,8 +159,7 @@ static int csnmp_oid_to_string(char *buffer, size_t buffer_size,
     oid_str_ptr[i] = oid_str[i];
   }
 
-  return (strjoin(buffer, buffer_size, oid_str_ptr, o->oid_len,
-                  /* separator = */ "."));
+  return strjoin(buffer, buffer_size, oid_str_ptr, o->oid_len, ".");
 }
 
 static void csnmp_host_close_session(host_definition_t *host) /* {{{ */
@@ -241,14 +240,14 @@ static int csnmp_config_add_data_instance(data_definition_t *dd,
 
     if (!read_objid(buffer, dd->instance.oid.oid, &dd->instance.oid.oid_len)) {
       ERROR("snmp plugin: read_objid (%s) failed.", buffer);
-      return (-1);
+      return -1;
     }
   } else {
     /* Instance is a simple string */
     sstrncpy(dd->instance.string, buffer, sizeof(dd->instance.string));
   }
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_data_instance */
 
 static int csnmp_config_add_data_instance_prefix(data_definition_t *dd,
@@ -259,7 +258,7 @@ static int csnmp_config_add_data_instance_prefix(data_definition_t *dd,
     WARNING("snmp plugin: data %s: InstancePrefix is ignored when `Table' "
             "is set to `false'.",
             dd->name);
-    return (-1);
+    return -1;
   }
 
   status = cf_util_get_string(ci, &dd->instance_prefix);
@@ -270,20 +269,20 @@ static int csnmp_config_add_data_values(data_definition_t *dd,
                                         oconfig_item_t *ci) {
   if (ci->values_num < 1) {
     WARNING("snmp plugin: `Values' needs at least one argument.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; i++)
     if (ci->values[i].type != OCONFIG_TYPE_STRING) {
       WARNING("snmp plugin: `Values' needs only string argument.");
-      return (-1);
+      return -1;
     }
 
   sfree(dd->values);
   dd->values_len = 0;
   dd->values = malloc(sizeof(*dd->values) * ci->values_num);
   if (dd->values == NULL)
-    return (-1);
+    return -1;
   dd->values_len = (size_t)ci->values_num;
 
   for (int i = 0; i < ci->values_num; i++) {
@@ -296,22 +295,22 @@ static int csnmp_config_add_data_values(data_definition_t *dd,
       free(dd->values);
       dd->values = NULL;
       dd->values_len = 0;
-      return (-1);
+      return -1;
     }
   }
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_data_instance */
 
 static int csnmp_config_add_data_blacklist(data_definition_t *dd,
                                            oconfig_item_t *ci) {
   if (ci->values_num < 1)
-    return (0);
+    return 0;
 
   for (int i = 0; i < ci->values_num; i++) {
     if (ci->values[i].type != OCONFIG_TYPE_STRING) {
       WARNING("snmp plugin: `Ignore' needs only string argument.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -323,7 +322,7 @@ static int csnmp_config_add_data_blacklist(data_definition_t *dd,
                      ci->values[i].value.string) != 0) {
       ERROR("snmp plugin: Can't allocate memory");
       strarray_free(dd->ignores, dd->ignores_len);
-      return (ENOMEM);
+      return ENOMEM;
     }
   }
   return 0;
@@ -333,12 +332,12 @@ static int csnmp_config_add_data_blacklist_match_inverted(data_definition_t *dd,
                                                           oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) {
     WARNING("snmp plugin: `InvertMatch' needs exactly one boolean argument.");
-    return (-1);
+    return -1;
   }
 
   dd->invert_match = ci->values[0].value.boolean ? 1 : 0;
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_data_blacklist_match_inverted */
 
 static int csnmp_config_add_data(oconfig_item_t *ci) {
@@ -347,12 +346,12 @@ static int csnmp_config_add_data(oconfig_item_t *ci) {
 
   dd = calloc(1, sizeof(*dd));
   if (dd == NULL)
-    return (-1);
+    return -1;
 
   status = cf_util_get_string(ci, &dd->name);
   if (status != 0) {
     free(dd);
-    return (-1);
+    return -1;
   }
 
   dd->scale = 1.0;
@@ -409,7 +408,7 @@ static int csnmp_config_add_data(oconfig_item_t *ci) {
     sfree(dd->values);
     sfree(dd->ignores);
     sfree(dd);
-    return (-1);
+    return -1;
   }
 
   DEBUG("snmp plugin: dd = { name = %s, type = %s, is_table = %s, values_len = "
@@ -427,7 +426,7 @@ static int csnmp_config_add_data(oconfig_item_t *ci) {
     last->next = dd;
   }
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_data */
 
 static int csnmp_config_add_host_version(host_definition_t *hd,
@@ -437,18 +436,18 @@ static int csnmp_config_add_host_version(host_definition_t *hd,
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) {
     WARNING("snmp plugin: The `Version' config option needs exactly one number "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   version = (int)ci->values[0].value.number;
   if ((version < 1) || (version > 3)) {
     WARNING("snmp plugin: `Version' must either be `1', `2', or `3'.");
-    return (-1);
+    return -1;
   }
 
   hd->version = version;
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host_address */
 
 static int csnmp_config_add_host_collect(host_definition_t *host,
@@ -459,20 +458,20 @@ static int csnmp_config_add_host_collect(host_definition_t *host,
 
   if (ci->values_num < 1) {
     WARNING("snmp plugin: `Collect' needs at least one argument.");
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; i++)
     if (ci->values[i].type != OCONFIG_TYPE_STRING) {
       WARNING("snmp plugin: All arguments to `Collect' must be strings.");
-      return (-1);
+      return -1;
     }
 
   data_list_len = host->data_list_len + ci->values_num;
   data_list =
       realloc(host->data_list, sizeof(data_definition_t *) * data_list_len);
   if (data_list == NULL)
-    return (-1);
+    return -1;
   host->data_list = data_list;
 
   for (int i = 0; i < ci->values_num; i++) {
@@ -493,7 +492,7 @@ static int csnmp_config_add_host_collect(host_definition_t *host,
     host->data_list_len++;
   } /* for (values_num) */
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host_collect */
 
 static int csnmp_config_add_host_auth_protocol(host_definition_t *hd,
@@ -514,13 +513,13 @@ static int csnmp_config_add_host_auth_protocol(host_definition_t *hd,
   } else {
     WARNING("snmp plugin: The `AuthProtocol' config option must be `MD5' or "
             "`SHA'.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("snmp plugin: host = %s; host->auth_protocol = %s;", hd->name,
         hd->auth_protocol == usmHMACMD5AuthProtocol ? "MD5" : "SHA");
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host_auth_protocol */
 
 static int csnmp_config_add_host_priv_protocol(host_definition_t *hd,
@@ -541,13 +540,13 @@ static int csnmp_config_add_host_priv_protocol(host_definition_t *hd,
   } else {
     WARNING("snmp plugin: The `PrivProtocol' config option must be `AES' or "
             "`DES'.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("snmp plugin: host = %s; host->priv_protocol = %s;", hd->name,
         hd->priv_protocol == usmAESPrivProtocol ? "AES" : "DES");
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host_priv_protocol */
 
 static int csnmp_config_add_host_security_level(host_definition_t *hd,
@@ -568,13 +567,13 @@ static int csnmp_config_add_host_security_level(host_definition_t *hd,
   else {
     WARNING("snmp plugin: The `SecurityLevel' config option must be "
             "`noAuthNoPriv', `authNoPriv', or `authPriv'.");
-    return (-1);
+    return -1;
   }
 
   DEBUG("snmp plugin: host = %s; host->security_level = %d;", hd->name,
         hd->security_level);
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host_security_level */
 
 static int csnmp_config_add_host(oconfig_item_t *ci) {
@@ -586,7 +585,7 @@ static int csnmp_config_add_host(oconfig_item_t *ci) {
 
   hd = calloc(1, sizeof(*hd));
   if (hd == NULL)
-    return (-1);
+    return -1;
   hd->version = 2;
   C_COMPLAIN_INIT(&hd->complaint);
 
@@ -697,7 +696,7 @@ static int csnmp_config_add_host(oconfig_item_t *ci) {
 
   if (status != 0) {
     csnmp_host_definition_destroy(hd);
-    return (-1);
+    return -1;
   }
 
   DEBUG("snmp plugin: hd = { name = %s, address = %s, community = %s, version "
@@ -714,10 +713,10 @@ static int csnmp_config_add_host(oconfig_item_t *ci) {
   if (status != 0) {
     ERROR("snmp plugin: Registering complex read function failed.");
     csnmp_host_definition_destroy(hd);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int csnmp_config_add_host */
 
 static int csnmp_config(oconfig_item_t *ci) {
@@ -734,7 +733,7 @@ static int csnmp_config(oconfig_item_t *ci) {
     }
   } /* for (ci->children) */
 
-  return (0);
+  return 0;
 } /* int csnmp_config */
 
 /* }}} End of the config stuff. Now the interesting part begins */
@@ -944,7 +943,7 @@ static value_t csnmp_value_list_to_value(struct variable_list *vl, int type,
     ret.gauge = NAN;
   }
 
-  return (ret);
+  return ret;
 } /* value_t csnmp_value_list_to_value */
 
 /* csnmp_strvbcopy_hexstring converts the bit string contained in "vb" to a hex
@@ -1004,7 +1003,7 @@ static int csnmp_strvbcopy(char *dst, /* {{{ */
                      (uint8_t)vb->val.string[2], (uint8_t)vb->val.string[3]);
   } else {
     dst[0] = 0;
-    return (EINVAL);
+    return EINVAL;
   }
 
   num_chars = dst_size - 1;
@@ -1014,7 +1013,7 @@ static int csnmp_strvbcopy(char *dst, /* {{{ */
   for (size_t i = 0; i < num_chars; i++) {
     /* Check for control characters. */
     if ((unsigned char)src[i] < 32)
-      return (csnmp_strvbcopy_hexstring(dst, vb, dst_size));
+      return csnmp_strvbcopy_hexstring(dst, vb, dst_size);
     dst[i] = src[i];
   }
   dst[num_chars] = 0;
@@ -1042,21 +1041,21 @@ static int csnmp_instance_list_add(csnmp_list_instances_t **head,
        vb = vb->next_variable)
     /* do nothing */;
   if (vb == NULL)
-    return (-1);
+    return -1;
 
   csnmp_oid_init(&vb_name, vb->name, vb->name_length);
 
   il = calloc(1, sizeof(*il));
   if (il == NULL) {
     ERROR("snmp plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   il->next = NULL;
 
   status = csnmp_oid_suffix(&il->suffix, &vb_name, &dd->instance.oid);
   if (status != 0) {
     sfree(il);
-    return (status);
+    return status;
   }
 
   /* Get instance name */
@@ -1104,7 +1103,7 @@ static int csnmp_instance_list_add(csnmp_list_instances_t **head,
     (*tail)->next = il;
   *tail = il;
 
-  return (0);
+  return 0;
 } /* int csnmp_instance_list_add */
 
 static int csnmp_dispatch_table(host_definition_t *host,
@@ -1115,7 +1114,7 @@ static int csnmp_dispatch_table(host_definition_t *host,
   value_list_t vl = VALUE_LIST_INIT;
 
   csnmp_list_instances_t *instance_list_ptr;
-  csnmp_table_values_t **value_table_ptr;
+  csnmp_table_values_t *value_table_ptr[data->values_len];
 
   size_t i;
   _Bool have_more;
@@ -1124,27 +1123,16 @@ static int csnmp_dispatch_table(host_definition_t *host,
   ds = plugin_get_ds(data->type);
   if (!ds) {
     ERROR("snmp plugin: DataSet `%s' not defined.", data->type);
-    return (-1);
+    return -1;
   }
   assert(ds->ds_num == data->values_len);
   assert(data->values_len > 0);
 
   instance_list_ptr = instance_list;
 
-  value_table_ptr = calloc(data->values_len, sizeof(*value_table_ptr));
-  if (value_table_ptr == NULL)
-    return (-1);
   for (i = 0; i < data->values_len; i++)
     value_table_ptr[i] = value_table[i];
 
-  vl.values_len = data->values_len;
-  vl.values = malloc(sizeof(*vl.values) * vl.values_len);
-  if (vl.values == NULL) {
-    ERROR("snmp plugin: malloc failed.");
-    sfree(value_table_ptr);
-    return (-1);
-  }
-
   sstrncpy(vl.host, host->name, sizeof(vl.host));
   sstrncpy(vl.plugin, "snmp", sizeof(vl.plugin));
 
@@ -1163,8 +1151,8 @@ static int csnmp_dispatch_table(host_definition_t *host,
 
       memcpy(&current_suffix, &instance_list_ptr->suffix,
              sizeof(current_suffix));
-    } else /* no instance configured */
-    {
+    } else {
+      /* no instance configured */
       csnmp_table_values_t *ptr = value_table_ptr[0];
       if (ptr == NULL) {
         have_more = 0;
@@ -1238,6 +1226,10 @@ static int csnmp_dispatch_table(host_definition_t *host,
                   data->instance_prefix, temp);
     }
 
+    vl.values_len = data->values_len;
+    value_t values[vl.values_len];
+    vl.values = values;
+
     for (i = 0; i < data->values_len; i++)
       vl.values[i] = value_table_ptr[i]->value;
 
@@ -1248,15 +1240,16 @@ static int csnmp_dispatch_table(host_definition_t *host,
     if (vl.type_instance[0] != '\0')
       plugin_dispatch_values(&vl);
 
+    /* prevent leakage of pointer to local variable. */
+    vl.values_len = 0;
+    vl.values = NULL;
+
     if (instance_list != NULL)
       instance_list_ptr = instance_list_ptr->next;
     else
       value_table_ptr[0] = value_table_ptr[0]->next;
   } /* while (have_more) */
 
-  sfree(vl.values);
-  sfree(value_table_ptr);
-
   return (0);
 } /* int csnmp_dispatch_table */
 
@@ -1292,20 +1285,20 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
 
   if (host->sess_handle == NULL) {
     DEBUG("snmp plugin: csnmp_read_table: host->sess_handle == NULL");
-    return (-1);
+    return -1;
   }
 
   ds = plugin_get_ds(data->type);
   if (!ds) {
     ERROR("snmp plugin: DataSet `%s' not defined.", data->type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num != data->values_len) {
     ERROR("snmp plugin: DataSet `%s' requires %zu values, but config talks "
           "about %zu",
           data->type, ds->ds_num, data->values_len);
-    return (-1);
+    return -1;
   }
   assert(data->values_len > 0);
 
@@ -1328,7 +1321,7 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
     ERROR("snmp plugin: csnmp_read_table: calloc failed.");
     sfree(value_list_head);
     sfree(value_list_tail);
-    return (-1);
+    return -1;
   }
 
   instance_list_head = NULL;
@@ -1517,7 +1510,7 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
   sfree(value_list_head);
   sfree(value_list_tail);
 
-  return (0);
+  return 0;
 } /* int csnmp_read_table */
 
 static int csnmp_read_value(host_definition_t *host, data_definition_t *data) {
@@ -1536,26 +1529,26 @@ static int csnmp_read_value(host_definition_t *host, data_definition_t *data) {
 
   if (host->sess_handle == NULL) {
     DEBUG("snmp plugin: csnmp_read_value: host->sess_handle == NULL");
-    return (-1);
+    return -1;
   }
 
   ds = plugin_get_ds(data->type);
   if (!ds) {
     ERROR("snmp plugin: DataSet `%s' not defined.", data->type);
-    return (-1);
+    return -1;
   }
 
   if (ds->ds_num != data->values_len) {
     ERROR("snmp plugin: DataSet `%s' requires %zu values, but config talks "
           "about %zu",
           data->type, ds->ds_num, data->values_len);
-    return (-1);
+    return -1;
   }
 
   vl.values_len = ds->ds_num;
   vl.values = malloc(sizeof(*vl.values) * vl.values_len);
   if (vl.values == NULL)
-    return (-1);
+    return -1;
   for (i = 0; i < vl.values_len; i++) {
     if (ds->ds[i].type == DS_TYPE_COUNTER)
       vl.values[i].counter = 0;
@@ -1574,7 +1567,7 @@ static int csnmp_read_value(host_definition_t *host, data_definition_t *data) {
   if (req == NULL) {
     ERROR("snmp plugin: snmp_pdu_create failed.");
     sfree(vl.values);
-    return (-1);
+    return -1;
   }
 
   for (i = 0; i < data->values_len; i++)
@@ -1596,7 +1589,7 @@ static int csnmp_read_value(host_definition_t *host, data_definition_t *data) {
     sfree(vl.values);
     csnmp_host_close_session(host);
 
-    return (-1);
+    return -1;
   }
 
   for (vb = res->variables; vb != NULL; vb = vb->next_variable) {
@@ -1620,7 +1613,7 @@ static int csnmp_read_value(host_definition_t *host, data_definition_t *data) {
   plugin_dispatch_values(&vl);
   sfree(vl.values);
 
-  return (0);
+  return 0;
 } /* int csnmp_read_value */
 
 static int csnmp_read_host(user_data_t *ud) {
@@ -1638,7 +1631,7 @@ static int csnmp_read_host(user_data_t *ud) {
     csnmp_host_open_session(host);
 
   if (host->sess_handle == NULL)
-    return (-1);
+    return -1;
 
   success = 0;
   for (i = 0; i < host->data_list_len; i++) {
@@ -1654,15 +1647,15 @@ static int csnmp_read_host(user_data_t *ud) {
   }
 
   if (success == 0)
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* int csnmp_read_host */
 
 static int csnmp_init(void) {
   call_snmp_init_once();
 
-  return (0);
+  return 0;
 } /* int csnmp_init */
 
 static int csnmp_shutdown(void) {
@@ -1687,7 +1680,7 @@ static int csnmp_shutdown(void) {
     data_this = data_next;
   }
 
-  return (0);
+  return 0;
 } /* int csnmp_shutdown */
 
 void module_register(void) {
@@ -1695,7 +1688,3 @@ void module_register(void) {
   plugin_register_init("snmp", csnmp_init);
   plugin_register_shutdown("snmp", csnmp_shutdown);
 } /* void module_register */
-
-/*
- * vim: shiftwidth=2 softtabstop=2 tabstop=8 fdm=marker
- */
diff --git a/src/snmp_agent.c b/src/snmp_agent.c
new file mode 100644 (file)
index 0000000..d7aea2d
--- /dev/null
@@ -0,0 +1,1576 @@
+/**
+ * collectd - src/snmp_agent.c
+ *
+ * Copyright(c) 2017 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Roman Korynkevych <romanx.korynkevych@intel.com>
+ *   Serhiy Pshyk <serhiyx.pshyk@intel.com>
+ **/
+
+#include "collectd.h"
+
+#include "common.h"
+#include "utils_avltree.h"
+#include "utils_cache.h"
+#include "utils_llist.h"
+
+#include <net-snmp/net-snmp-config.h>
+
+#include <net-snmp/net-snmp-includes.h>
+
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+
+#define PLUGIN_NAME "snmp_agent"
+#define ERR_BUF_SIZE 1024
+#define TYPE_STRING -1
+
+#ifndef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#endif
+
+struct oid_s {
+  oid oid[MAX_OID_LEN];
+  size_t oid_len;
+  u_char type;
+};
+typedef struct oid_s oid_t;
+
+struct table_definition_s {
+  char *name;
+  oid_t index_oid;
+  oid_t size_oid;
+  llist_t *columns;
+  c_avl_tree_t *instance_index;
+  c_avl_tree_t *index_instance;
+};
+typedef struct table_definition_s table_definition_t;
+
+struct data_definition_s {
+  char *name;
+  char *plugin;
+  char *plugin_instance;
+  char *type;
+  char *type_instance;
+  const table_definition_t *table;
+  _Bool is_instance;
+  oid_t *oids;
+  size_t oids_len;
+  double scale;
+  double shift;
+};
+typedef struct data_definition_s data_definition_t;
+
+struct snmp_agent_ctx_s {
+  pthread_t thread;
+  pthread_mutex_t lock;
+  pthread_mutex_t agentx_lock;
+  struct tree *tp;
+
+  llist_t *tables;
+  llist_t *scalars;
+};
+typedef struct snmp_agent_ctx_s snmp_agent_ctx_t;
+
+static snmp_agent_ctx_t *g_agent = NULL;
+
+#define CHECK_DD_TYPE(_dd, _p, _pi, _t, _ti)                                   \
+  (_dd->plugin ? !strcmp(_dd->plugin, _p) : 0) &&                              \
+      (_dd->plugin_instance ? !strcmp(_dd->plugin_instance, _pi) : 1) &&       \
+      (_dd->type ? !strcmp(_dd->type, _t) : 0) &&                              \
+      (_dd->type_instance ? !strcmp(_dd->type_instance, _ti) : 1)
+
+static void *snmp_agent_thread_run(void *arg);
+static int snmp_agent_register_oid(oid_t *oid, Netsnmp_Node_Handler *handler);
+static int snmp_agent_set_vardata(void *dst_buf, size_t *dst_buf_len,
+                                  u_char asn_type, double scale, double shift,
+                                  const void *value, size_t len, int type);
+static int snmp_agent_unregister_oid_index(oid_t *oid, int index);
+
+static u_char snmp_agent_get_asn_type(oid *oid, size_t oid_len) {
+  struct tree *node = get_tree(oid, oid_len, g_agent->tp);
+
+  return (node != NULL) ? mib_to_asn_type(node->type) : 0;
+}
+
+static char *snmp_agent_get_oid_name(oid *oid, size_t oid_len) {
+  struct tree *node = get_tree(oid, oid_len, g_agent->tp);
+
+  return (node != NULL) ? node->label : NULL;
+}
+
+static int snmp_agent_oid_to_string(char *buf, size_t buf_size,
+                                    oid_t const *o) {
+  char oid_str[MAX_OID_LEN][16];
+  char *oid_str_ptr[MAX_OID_LEN];
+
+  for (size_t i = 0; i < o->oid_len; i++) {
+    ssnprintf(oid_str[i], sizeof(oid_str[i]), "%lu", (unsigned long)o->oid[i]);
+    oid_str_ptr[i] = oid_str[i];
+  }
+
+  return strjoin(buf, buf_size, oid_str_ptr, o->oid_len, ".");
+}
+
+static void snmp_agent_dump_data(void) {
+#if COLLECT_DEBUG
+  char oid_str[DATA_MAX_NAME_LEN];
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    DEBUG(PLUGIN_NAME ": Table:");
+    DEBUG(PLUGIN_NAME ":   Name: %s", td->name);
+    if (td->index_oid.oid_len != 0) {
+      snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &td->index_oid);
+      DEBUG(PLUGIN_NAME ":   IndexOID: %s", oid_str);
+    }
+    if (td->size_oid.oid_len != 0) {
+      snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &td->size_oid);
+      DEBUG(PLUGIN_NAME ":   SizeOID: %s", oid_str);
+    }
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      DEBUG(PLUGIN_NAME ":   Column:");
+      DEBUG(PLUGIN_NAME ":     Name: %s", dd->name);
+      if (dd->plugin)
+        DEBUG(PLUGIN_NAME ":     Plugin: %s", dd->plugin);
+      if (dd->plugin_instance)
+        DEBUG(PLUGIN_NAME ":     PluginInstance: %s", dd->plugin_instance);
+      if (dd->is_instance)
+        DEBUG(PLUGIN_NAME ":     Instance: true");
+      if (dd->type)
+        DEBUG(PLUGIN_NAME ":     Type: %s", dd->type);
+      if (dd->type_instance)
+        DEBUG(PLUGIN_NAME ":     TypeInstance: %s", dd->type_instance);
+      for (size_t i = 0; i < dd->oids_len; i++) {
+        snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
+        DEBUG(PLUGIN_NAME ":     OID[%d]: %s", i, oid_str);
+      }
+      DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
+      DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
+    }
+  }
+
+  for (llentry_t *e = llist_head(g_agent->scalars); e != NULL; e = e->next) {
+    data_definition_t *dd = e->value;
+
+    DEBUG(PLUGIN_NAME ": Scalar:");
+    DEBUG(PLUGIN_NAME ":   Name: %s", dd->name);
+    if (dd->plugin)
+      DEBUG(PLUGIN_NAME ":   Plugin: %s", dd->plugin);
+    if (dd->plugin_instance)
+      DEBUG(PLUGIN_NAME ":   PluginInstance: %s", dd->plugin_instance);
+    if (dd->is_instance)
+      DEBUG(PLUGIN_NAME ":   Instance: true");
+    if (dd->type)
+      DEBUG(PLUGIN_NAME ":   Type: %s", dd->type);
+    if (dd->type_instance)
+      DEBUG(PLUGIN_NAME ":   TypeInstance: %s", dd->type_instance);
+    for (size_t i = 0; i < dd->oids_len; i++) {
+      snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
+      DEBUG(PLUGIN_NAME ":   OID[%d]: %s", i, oid_str);
+    }
+    DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
+    DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
+  }
+#endif /* COLLECT_DEBUG */
+}
+
+static int snmp_agent_validate_data(void) {
+
+  snmp_agent_dump_data();
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      if (!dd->plugin) {
+        ERROR(PLUGIN_NAME ": Plugin not defined for '%s'.'%s'", td->name,
+              dd->name);
+        return -EINVAL;
+      }
+
+      if (dd->plugin_instance) {
+        ERROR(PLUGIN_NAME ": PluginInstance should not be defined for table "
+                          "data type '%s'.'%s'",
+              td->name, dd->name);
+        return -EINVAL;
+      }
+
+      if (dd->oids_len == 0) {
+        ERROR(PLUGIN_NAME ": No OIDs defined for '%s'.'%s'", td->name,
+              dd->name);
+        return -EINVAL;
+      }
+
+      if (dd->is_instance) {
+
+        if (dd->type || dd->type_instance) {
+          ERROR(PLUGIN_NAME ": Type and TypeInstance are not valid for "
+                            "instance data '%s'.'%s'",
+                td->name, dd->name);
+          return -EINVAL;
+        }
+
+        if (dd->oids_len > 1) {
+          ERROR(
+              PLUGIN_NAME
+              ": Only one OID should be specified for instance data '%s'.'%s'",
+              td->name, dd->name);
+          return -EINVAL;
+        }
+      } else {
+
+        if (!dd->type) {
+          ERROR(PLUGIN_NAME ": Type not defined for data '%s'.'%s'", td->name,
+                dd->name);
+          return -EINVAL;
+        }
+      }
+    }
+  }
+
+  for (llentry_t *e = llist_head(g_agent->scalars); e != NULL; e = e->next) {
+    data_definition_t *dd = e->value;
+
+    if (!dd->plugin) {
+      ERROR(PLUGIN_NAME ": Plugin not defined for '%s'", dd->name);
+      return -EINVAL;
+    }
+
+    if (dd->oids_len == 0) {
+      ERROR(PLUGIN_NAME ": No OIDs defined for '%s'", dd->name);
+      return -EINVAL;
+    }
+
+    if (dd->is_instance) {
+      ERROR(PLUGIN_NAME
+            ": Instance flag can't be specified for scalar data '%s'",
+            dd->name);
+      return -EINVAL;
+    }
+
+    if (!dd->type) {
+      ERROR(PLUGIN_NAME ": Type not defined for data '%s'", dd->name);
+      return -EINVAL;
+    }
+  }
+
+  return 0;
+}
+
+static void snmp_agent_generate_oid2string(oid_t *oid, size_t offset, char *key) {
+  int key_len = oid->oid[offset];
+  int i;
+
+  for (i = 0; i < key_len && offset < oid->oid_len; i++)
+    key[i] = oid->oid[++offset];
+
+  key[i] = '\0';
+}
+
+static int snmp_agent_generate_string2oid(oid_t *oid, const char *key) {
+  int key_len = strlen(key);
+
+  oid->oid[oid->oid_len++] = key_len;
+  for (int i = 0; i < key_len; i++) {
+    oid->oid[oid->oid_len++] = key[i];
+    if (oid->oid_len >= MAX_OID_LEN) {
+      ERROR(PLUGIN_NAME ": Conversion key string %s to OID failed", key);
+      return -EINVAL;
+    }
+  }
+
+  return 0;
+}
+
+static int snmp_agent_register_oid_string(oid_t *oid, const char *key,
+                                          Netsnmp_Node_Handler *handler) {
+  oid_t new_oid;
+
+  memcpy(&new_oid, oid, sizeof(*oid));
+  int ret = snmp_agent_generate_string2oid(&new_oid, key);
+  if (ret != 0)
+    return ret;
+
+  return snmp_agent_register_oid(&new_oid, handler);
+}
+
+static int snmp_agent_unregister_oid_string(oid_t *oid, const char *key) {
+  oid_t new_oid;
+
+  memcpy(&new_oid, oid, sizeof(*oid));
+  int ret = snmp_agent_generate_string2oid(&new_oid, key);
+  if (ret != 0)
+    return ret;
+
+  return unregister_mib(new_oid.oid, new_oid.oid_len);
+}
+
+static int snmp_agent_table_row_remove(table_definition_t *td,
+                                       const char *instance) {
+  int *index = NULL;
+  char *ins = NULL;
+
+  if (td->index_oid.oid_len) {
+    if ((c_avl_get(td->instance_index, instance, (void **)&index) != 0) ||
+        (c_avl_get(td->index_instance, index, (void **)&ins) != 0))
+      return 0;
+  } else {
+    if (c_avl_get(td->instance_index, instance, (void **)&ins) != 0)
+      return 0;
+  }
+
+  pthread_mutex_lock(&g_agent->agentx_lock);
+
+  if (td->index_oid.oid_len)
+    snmp_agent_unregister_oid_index(&td->index_oid, *index);
+
+  for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+    data_definition_t *dd = de->value;
+
+    for (size_t i = 0; i < dd->oids_len; i++)
+      if (td->index_oid.oid_len)
+        snmp_agent_unregister_oid_index(&dd->oids[i], *index);
+      else
+        snmp_agent_unregister_oid_string(&dd->oids[i], ins);
+  }
+
+  pthread_mutex_unlock(&g_agent->agentx_lock);
+
+  DEBUG(PLUGIN_NAME ": Removed row for '%s' table [%d, %s]", td->name,
+        (index != NULL) ? *index : -1, ins);
+
+  notification_t n = {
+      .severity = NOTIF_WARNING, .time = cdtime(), .plugin = PLUGIN_NAME};
+  sstrncpy(n.host, hostname_g, sizeof(n.host));
+  sstrncpy(n.plugin_instance, ins, sizeof(n.plugin_instance));
+  ssnprintf(n.message, sizeof(n.message),
+            "Removed data row from table %s instance %s index %d", td->name,
+            ins, (index != NULL) ? *index : -1);
+  plugin_dispatch_notification(&n);
+
+  if (td->index_oid.oid_len) {
+    c_avl_remove(td->index_instance, index, NULL, (void **)&ins);
+    c_avl_remove(td->instance_index, instance, NULL, (void **)&index);
+    sfree(index);
+    sfree(ins);
+  } else {
+    c_avl_remove(td->instance_index, instance, NULL, (void **)&ins);
+    sfree(ins);
+  }
+
+  return 0;
+}
+
+static int snmp_agent_clear_missing(const value_list_t *vl,
+                                    __attribute__((unused)) user_data_t *ud) {
+  if (vl == NULL)
+    return -EINVAL;
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      if (!dd->is_instance) {
+        if (CHECK_DD_TYPE(dd, vl->plugin, vl->plugin_instance, vl->type,
+                          vl->type_instance)) {
+          snmp_agent_table_row_remove(td, vl->plugin_instance);
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 0;
+}
+
+static void snmp_agent_free_data(data_definition_t **dd) {
+
+  if (dd == NULL || *dd == NULL)
+    return;
+
+  /* unregister scalar type OID */
+  if ((*dd)->table == NULL) {
+    for (size_t i = 0; i < (*dd)->oids_len; i++)
+      unregister_mib((*dd)->oids[i].oid, (*dd)->oids[i].oid_len);
+  }
+  if (!(*dd)->table->index_oid.oid_len) {
+    char *instance;
+
+    c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->instance_index);
+    while (c_avl_iterator_next(iter, (void *)&instance, (void *)&instance) ==
+           0) {
+      for (size_t i = 0; i < (*dd)->oids_len; i++)
+        snmp_agent_unregister_oid_string(&(*dd)->oids[i], instance);
+    }
+    c_avl_iterator_destroy(iter);
+  } else {
+    /* unregister all table OIDs */
+    int *index;
+    char *value;
+
+    c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->index_instance);
+    while (c_avl_iterator_next(iter, (void *)&index, (void *)&value) == 0) {
+      for (size_t i = 0; i < (*dd)->oids_len; i++)
+        snmp_agent_unregister_oid_index(&(*dd)->oids[i], *index);
+    }
+    c_avl_iterator_destroy(iter);
+  }
+
+  sfree((*dd)->name);
+  sfree((*dd)->plugin);
+  sfree((*dd)->plugin_instance);
+  sfree((*dd)->type);
+  sfree((*dd)->type_instance);
+  sfree((*dd)->oids);
+
+  sfree(*dd);
+
+  return;
+}
+
+static void snmp_agent_free_table(table_definition_t **td) {
+
+  if (td == NULL || *td == NULL)
+    return;
+
+  if ((*td)->size_oid.oid_len)
+    unregister_mib((*td)->size_oid.oid, (*td)->size_oid.oid_len);
+
+  if ((*td)->index_oid.oid_len) {
+    int *index;
+    char *value;
+
+    c_avl_iterator_t *iter = c_avl_get_iterator((*td)->index_instance);
+    while (c_avl_iterator_next(iter, (void *)&index, (void *)&value) == 0)
+      snmp_agent_unregister_oid_index(&(*td)->index_oid, *index);
+
+    c_avl_iterator_destroy(iter);
+  }
+
+  for (llentry_t *de = llist_head((*td)->columns); de != NULL; de = de->next) {
+    data_definition_t *dd = de->value;
+    snmp_agent_free_data(&dd);
+  }
+
+  llist_destroy((*td)->columns);
+
+  void *key = NULL;
+  void *value = NULL;
+
+  /* index_instance and instance_index contain the same pointers */
+  c_avl_destroy((*td)->index_instance);
+  (*td)->index_instance = NULL;
+
+  if ((*td)->instance_index != NULL) {
+    while (c_avl_pick((*td)->instance_index, &key, &value) == 0) {
+      if (key != value)
+        sfree(key);
+      sfree(value);
+    }
+    c_avl_destroy((*td)->instance_index);
+    (*td)->instance_index = NULL;
+  }
+
+  sfree((*td)->name);
+  sfree(*td);
+
+  return;
+}
+
+static int snmp_agent_form_reply(struct netsnmp_request_info_s *requests,
+                                 data_definition_t *dd, char *instance,
+                                 int oid_index) {
+  char name[DATA_MAX_NAME_LEN];
+  format_name(name, sizeof(name), hostname_g, dd->plugin,
+              instance ? instance : dd->plugin_instance, dd->type,
+              dd->type_instance);
+  DEBUG(PLUGIN_NAME ": Identifier '%s'", name);
+
+  value_t *values;
+  size_t values_num;
+  const data_set_t *ds = plugin_get_ds(dd->type);
+  if (ds == NULL) {
+    ERROR(PLUGIN_NAME ": Data set not found for '%s' type", dd->type);
+    return SNMP_NOSUCHINSTANCE;
+  }
+
+  int ret = uc_get_value_by_name(name, &values, &values_num);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to get value for '%s'", name);
+    return SNMP_NOSUCHINSTANCE;
+  }
+
+  assert(ds->ds_num == values_num);
+  assert(oid_index < (int)values_num);
+
+  char data[DATA_MAX_NAME_LEN];
+  size_t data_len = sizeof(data);
+  ret = snmp_agent_set_vardata(
+      data, &data_len, dd->oids[oid_index].type, dd->scale, dd->shift,
+      &values[oid_index], sizeof(values[oid_index]), ds->ds[oid_index].type);
+
+  sfree(values);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to convert '%s' value to snmp data", name);
+    return SNMP_NOSUCHINSTANCE;
+  }
+
+  requests->requestvb->type = dd->oids[oid_index].type;
+  snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
+                           (const u_char *)data, data_len);
+
+  return SNMP_ERR_NOERROR;
+}
+
+static int
+snmp_agent_table_oid_handler(struct netsnmp_mib_handler_s *handler,
+                             struct netsnmp_handler_registration_s *reginfo,
+                             struct netsnmp_agent_request_info_s *reqinfo,
+                             struct netsnmp_request_info_s *requests) {
+
+  if (reqinfo->mode != MODE_GET && reqinfo->mode != MODE_GETNEXT) {
+    DEBUG(PLUGIN_NAME ": Not supported request mode (%d)", reqinfo->mode);
+    return SNMP_ERR_NOERROR;
+  }
+
+  pthread_mutex_lock(&g_agent->lock);
+
+  oid_t oid;
+  memcpy(oid.oid, requests->requestvb->name,
+         sizeof(oid.oid[0]) * requests->requestvb->name_length);
+  oid.oid_len = requests->requestvb->name_length;
+
+#if COLLECT_DEBUG
+  char oid_str[DATA_MAX_NAME_LEN];
+  snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &oid);
+  DEBUG(PLUGIN_NAME ": Get request received for table OID '%s'", oid_str);
+#endif
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      for (size_t i = 0; i < dd->oids_len; i++) {
+        int ret = snmp_oid_ncompare(oid.oid, oid.oid_len, dd->oids[i].oid,
+                                    dd->oids[i].oid_len,
+                                    MIN(oid.oid_len, dd->oids[i].oid_len));
+        if (ret != 0)
+          continue;
+
+        char *instance;
+
+        if (!td->index_oid.oid_len) {
+          char key[MAX_OID_LEN];
+
+          memset(key, 0, sizeof(key));
+          snmp_agent_generate_oid2string(
+              &oid, MIN(oid.oid_len, dd->oids[i].oid_len), key);
+
+          ret = c_avl_get(td->instance_index, key, (void **)&instance);
+          if (ret != 0) {
+            DEBUG(PLUGIN_NAME ": Nonexisting index string '%s' requested", key);
+            pthread_mutex_unlock(&g_agent->lock);
+            return SNMP_NOSUCHINSTANCE;
+          }
+        } else {
+          int index = oid.oid[oid.oid_len - 1];
+
+          ret = c_avl_get(td->index_instance, &index, (void **)&instance);
+          if (ret != 0) {
+            DEBUG(PLUGIN_NAME ": Nonexisting index '%d' requested", index);
+            pthread_mutex_unlock(&g_agent->lock);
+            return SNMP_NOSUCHINSTANCE;
+          }
+        }
+
+        if (dd->is_instance) {
+          requests->requestvb->type = ASN_OCTET_STR;
+          snmp_set_var_typed_value(requests->requestvb,
+                                   requests->requestvb->type, (const u_char *)instance,
+                                   strlen((instance)));
+
+          pthread_mutex_unlock(&g_agent->lock);
+
+          return SNMP_ERR_NOERROR;
+        }
+
+        ret = snmp_agent_form_reply(requests, dd, instance, i);
+
+        pthread_mutex_unlock(&g_agent->lock);
+
+        return ret;
+      }
+    }
+  }
+
+  pthread_mutex_unlock(&g_agent->lock);
+
+  return SNMP_NOSUCHINSTANCE;
+}
+
+static int snmp_agent_table_index_oid_handler(
+    struct netsnmp_mib_handler_s *handler,
+    struct netsnmp_handler_registration_s *reginfo,
+    struct netsnmp_agent_request_info_s *reqinfo,
+    struct netsnmp_request_info_s *requests) {
+
+  if (reqinfo->mode != MODE_GET && reqinfo->mode != MODE_GETNEXT) {
+    DEBUG(PLUGIN_NAME ": Not supported request mode (%d)", reqinfo->mode);
+    return SNMP_ERR_NOERROR;
+  }
+
+  pthread_mutex_lock(&g_agent->lock);
+
+  oid_t oid;
+  memcpy(oid.oid, requests->requestvb->name,
+         sizeof(oid.oid[0]) * requests->requestvb->name_length);
+  oid.oid_len = requests->requestvb->name_length;
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    if (td->index_oid.oid_len &&
+        (snmp_oid_ncompare(oid.oid, oid.oid_len, td->index_oid.oid,
+                           td->index_oid.oid_len,
+                           MIN(oid.oid_len, td->index_oid.oid_len)) == 0)) {
+
+      DEBUG(PLUGIN_NAME ": Handle '%s' table index OID", td->name);
+
+      int index = oid.oid[oid.oid_len - 1];
+
+      int ret = c_avl_get(td->index_instance, &index, &(void *){NULL});
+      if (ret != 0) {
+        /* nonexisting index requested */
+        pthread_mutex_unlock(&g_agent->lock);
+        return SNMP_NOSUCHINSTANCE;
+      }
+
+      requests->requestvb->type = ASN_INTEGER;
+      snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
+                               (const u_char *)&index, sizeof(index));
+
+      pthread_mutex_unlock(&g_agent->lock);
+
+      return SNMP_ERR_NOERROR;
+    }
+  }
+
+  pthread_mutex_unlock(&g_agent->lock);
+
+  return SNMP_NOSUCHINSTANCE;
+}
+
+static int snmp_agent_table_size_oid_handler(
+    struct netsnmp_mib_handler_s *handler,
+    struct netsnmp_handler_registration_s *reginfo,
+    struct netsnmp_agent_request_info_s *reqinfo,
+    struct netsnmp_request_info_s *requests) {
+
+  if (reqinfo->mode != MODE_GET && reqinfo->mode != MODE_GETNEXT) {
+    DEBUG(PLUGIN_NAME ": Not supported request mode (%d)", reqinfo->mode);
+    return SNMP_ERR_NOERROR;
+  }
+
+  pthread_mutex_lock(&g_agent->lock);
+
+  oid_t oid;
+  memcpy(oid.oid, requests->requestvb->name,
+         sizeof(oid.oid[0]) * requests->requestvb->name_length);
+  oid.oid_len = requests->requestvb->name_length;
+
+  DEBUG(PLUGIN_NAME ": Get request received for table size OID");
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    if (td->size_oid.oid_len &&
+        (snmp_oid_ncompare(oid.oid, oid.oid_len, td->size_oid.oid,
+                           td->size_oid.oid_len,
+                           MIN(oid.oid_len, td->size_oid.oid_len)) == 0)) {
+      DEBUG(PLUGIN_NAME ": Handle '%s' table size OID", td->name);
+
+      long size = c_avl_size(td->index_instance);
+
+      requests->requestvb->type = td->size_oid.type;
+      snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
+                               (const u_char *)&size, sizeof(size));
+
+      pthread_mutex_unlock(&g_agent->lock);
+
+      return SNMP_ERR_NOERROR;
+    }
+  }
+
+  pthread_mutex_unlock(&g_agent->lock);
+
+  return SNMP_NOSUCHINSTANCE;
+}
+
+static int
+snmp_agent_scalar_oid_handler(struct netsnmp_mib_handler_s *handler,
+                              struct netsnmp_handler_registration_s *reginfo,
+                              struct netsnmp_agent_request_info_s *reqinfo,
+                              struct netsnmp_request_info_s *requests) {
+
+  if (reqinfo->mode != MODE_GET && reqinfo->mode != MODE_GETNEXT) {
+    DEBUG(PLUGIN_NAME ": Not supported request mode (%d)", reqinfo->mode);
+    return SNMP_ERR_NOERROR;
+  }
+
+  pthread_mutex_lock(&g_agent->lock);
+
+  oid_t oid;
+  memcpy(oid.oid, requests->requestvb->name,
+         sizeof(oid.oid[0]) * requests->requestvb->name_length);
+  oid.oid_len = requests->requestvb->name_length;
+
+#if COLLECT_DEBUG
+  char oid_str[DATA_MAX_NAME_LEN];
+  snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &oid);
+  DEBUG(PLUGIN_NAME ": Get request received for scalar OID '%s'", oid_str);
+#endif
+
+  for (llentry_t *de = llist_head(g_agent->scalars); de != NULL;
+       de = de->next) {
+    data_definition_t *dd = de->value;
+
+    for (size_t i = 0; i < dd->oids_len; i++) {
+
+      int ret = snmp_oid_compare(oid.oid, oid.oid_len, dd->oids[i].oid,
+                                 dd->oids[i].oid_len);
+      if (ret != 0)
+        continue;
+
+      ret = snmp_agent_form_reply(requests, dd, NULL, i);
+
+      pthread_mutex_unlock(&g_agent->lock);
+
+      return ret;
+    }
+  }
+
+  pthread_mutex_unlock(&g_agent->lock);
+
+  return SNMP_NOSUCHINSTANCE;
+}
+
+static int snmp_agent_register_table_oids(void) {
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    if (td->size_oid.oid_len != 0) {
+      td->size_oid.type =
+          snmp_agent_get_asn_type(td->size_oid.oid, td->size_oid.oid_len);
+      td->size_oid.oid_len++;
+      int ret = snmp_agent_register_oid(&td->size_oid,
+                                        snmp_agent_table_size_oid_handler);
+      if (ret != 0)
+        return ret;
+    }
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      for (size_t i = 0; i < dd->oids_len; i++) {
+        dd->oids[i].type =
+            snmp_agent_get_asn_type(dd->oids[i].oid, dd->oids[i].oid_len);
+      }
+    }
+  }
+
+  return 0;
+}
+
+static int snmp_agent_register_scalar_oids(void) {
+
+  for (llentry_t *e = llist_head(g_agent->scalars); e != NULL; e = e->next) {
+    data_definition_t *dd = e->value;
+
+    for (size_t i = 0; i < dd->oids_len; i++) {
+
+      dd->oids[i].type =
+          snmp_agent_get_asn_type(dd->oids[i].oid, dd->oids[i].oid_len);
+
+      int ret =
+          snmp_agent_register_oid(&dd->oids[i], snmp_agent_scalar_oid_handler);
+      if (ret != 0)
+        return ret;
+    }
+  }
+
+  return 0;
+}
+
+static int snmp_agent_config_data_oids(data_definition_t *dd,
+                                       oconfig_item_t *ci) {
+  if (ci->values_num < 1) {
+    WARNING(PLUGIN_NAME ": `OIDs' needs at least one argument");
+    return -EINVAL;
+  }
+
+  for (int i = 0; i < ci->values_num; i++)
+    if (ci->values[i].type != OCONFIG_TYPE_STRING) {
+      WARNING(PLUGIN_NAME ": `OIDs' needs only string argument");
+      return -EINVAL;
+    }
+
+  if (dd->oids != NULL)
+    sfree(dd->oids);
+  dd->oids_len = 0;
+  dd->oids = calloc(ci->values_num, sizeof(*dd->oids));
+  if (dd->oids == NULL)
+    return -ENOMEM;
+  dd->oids_len = (size_t)ci->values_num;
+
+  for (int i = 0; i < ci->values_num; i++) {
+    dd->oids[i].oid_len = MAX_OID_LEN;
+
+    if (NULL == snmp_parse_oid(ci->values[i].value.string, dd->oids[i].oid,
+                               &dd->oids[i].oid_len)) {
+      ERROR(PLUGIN_NAME ": snmp_parse_oid (%s) failed",
+            ci->values[i].value.string);
+      sfree(dd->oids);
+      dd->oids_len = 0;
+      return -1;
+    }
+  }
+
+  return 0;
+}
+
+static int snmp_agent_config_table_size_oid(table_definition_t *td,
+                                            oconfig_item_t *ci) {
+  if (ci->values_num < 1) {
+    WARNING(PLUGIN_NAME ": `TableSizeOID' is empty");
+    return -EINVAL;
+  }
+
+  if (ci->values[0].type != OCONFIG_TYPE_STRING) {
+    WARNING(PLUGIN_NAME ": `TableSizeOID' needs only string argument");
+    return -EINVAL;
+  }
+
+  td->size_oid.oid_len = MAX_OID_LEN;
+
+  if (NULL == snmp_parse_oid(ci->values[0].value.string, td->size_oid.oid,
+                             &td->size_oid.oid_len)) {
+    ERROR(PLUGIN_NAME ": Failed to parse table size OID (%s)",
+          ci->values[0].value.string);
+    td->size_oid.oid_len = 0;
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+static int snmp_agent_config_table_index_oid(table_definition_t *td,
+                                             oconfig_item_t *ci) {
+
+  if (ci->values_num < 1) {
+    WARNING(PLUGIN_NAME ": `IndexOID' is empty");
+    return -EINVAL;
+  }
+
+  if (ci->values[0].type != OCONFIG_TYPE_STRING) {
+    WARNING(PLUGIN_NAME ": `IndexOID' needs only string argument");
+    return -EINVAL;
+  }
+
+  td->index_oid.oid_len = MAX_OID_LEN;
+
+  if (NULL == snmp_parse_oid(ci->values[0].value.string, td->index_oid.oid,
+                             &td->index_oid.oid_len)) {
+    ERROR(PLUGIN_NAME ": Failed to parse table index OID (%s)",
+          ci->values[0].value.string);
+    td->index_oid.oid_len = 0;
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+static int snmp_agent_config_table_data(table_definition_t *td,
+                                        oconfig_item_t *ci) {
+  data_definition_t *dd;
+  int ret = 0;
+
+  assert(ci != NULL);
+
+  dd = calloc(1, sizeof(*dd));
+  if (dd == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to allocate memory for table data definition");
+    return -ENOMEM;
+  }
+
+  ret = cf_util_get_string(ci, &dd->name);
+  if (ret != 0) {
+    sfree(dd);
+    return -1;
+  }
+
+  dd->scale = 1.0;
+  dd->shift = 0.0;
+
+  dd->table = td;
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *option = ci->children + i;
+
+    if (strcasecmp("Instance", option->key) == 0)
+      ret = cf_util_get_boolean(option, &dd->is_instance);
+    else if (strcasecmp("Plugin", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->plugin);
+    else if (strcasecmp("PluginInstance", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->plugin_instance);
+    else if (strcasecmp("Type", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->type);
+    else if (strcasecmp("TypeInstance", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->type_instance);
+    else if (strcasecmp("Shift", option->key) == 0)
+      ret = cf_util_get_double(option, &dd->shift);
+    else if (strcasecmp("Scale", option->key) == 0)
+      ret = cf_util_get_double(option, &dd->scale);
+    else if (strcasecmp("OIDs", option->key) == 0)
+      ret = snmp_agent_config_data_oids(dd, option);
+    else {
+      WARNING(PLUGIN_NAME ": Option `%s' not allowed here", option->key);
+      ret = -1;
+    }
+
+    if (ret != 0) {
+      snmp_agent_free_data(&dd);
+      return -1;
+    }
+  }
+
+  llentry_t *entry = llentry_create(dd->name, dd);
+  if (entry == NULL) {
+    snmp_agent_free_data(&dd);
+    return -ENOMEM;
+  }
+
+  llist_append(td->columns, entry);
+
+  return 0;
+}
+
+static int snmp_agent_config_data(oconfig_item_t *ci) {
+  data_definition_t *dd;
+  int ret = 0;
+
+  assert(ci != NULL);
+
+  dd = calloc(1, sizeof(*dd));
+  if (dd == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to allocate memory for data definition");
+    return -ENOMEM;
+  }
+
+  ret = cf_util_get_string(ci, &dd->name);
+  if (ret != 0) {
+    free(dd);
+    return -1;
+  }
+
+  dd->scale = 1.0;
+  dd->shift = 0.0;
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *option = ci->children + i;
+
+    if (strcasecmp("Instance", option->key) == 0)
+      ret = cf_util_get_boolean(option, &dd->is_instance);
+    else if (strcasecmp("Plugin", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->plugin);
+    else if (strcasecmp("PluginInstance", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->plugin_instance);
+    else if (strcasecmp("Type", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->type);
+    else if (strcasecmp("TypeInstance", option->key) == 0)
+      ret = cf_util_get_string(option, &dd->type_instance);
+    else if (strcasecmp("Shift", option->key) == 0)
+      ret = cf_util_get_double(option, &dd->shift);
+    else if (strcasecmp("Scale", option->key) == 0)
+      ret = cf_util_get_double(option, &dd->scale);
+    else if (strcasecmp("OIDs", option->key) == 0)
+      ret = snmp_agent_config_data_oids(dd, option);
+    else {
+      WARNING(PLUGIN_NAME ": Option `%s' not allowed here", option->key);
+      ret = -1;
+    }
+
+    if (ret != 0) {
+      snmp_agent_free_data(&dd);
+      return -1;
+    }
+  }
+
+  llentry_t *entry = llentry_create(dd->name, dd);
+  if (entry == NULL) {
+    snmp_agent_free_data(&dd);
+    return -ENOMEM;
+  }
+
+  llist_append(g_agent->scalars, entry);
+
+  return 0;
+}
+
+static int num_compare(const int *a, const int *b) {
+  assert((a != NULL) && (b != NULL));
+  if (*a < *b)
+    return -1;
+  else if (*a > *b)
+    return 1;
+  else
+    return 0;
+}
+
+static int snmp_agent_config_table(oconfig_item_t *ci) {
+  table_definition_t *td;
+  int ret = 0;
+
+  assert(ci != NULL);
+
+  td = calloc(1, sizeof(*td));
+  if (td == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to allocate memory for table definition");
+    return -ENOMEM;
+  }
+
+  ret = cf_util_get_string(ci, &td->name);
+  if (ret != 0) {
+    sfree(td);
+    return -1;
+  }
+
+  td->columns = llist_create();
+  if (td->columns == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to allocate memory for columns list");
+    snmp_agent_free_table(&td);
+    return -ENOMEM;
+  }
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *option = ci->children + i;
+
+    if (strcasecmp("IndexOID", option->key) == 0)
+      ret = snmp_agent_config_table_index_oid(td, option);
+    else if (strcasecmp("SizeOID", option->key) == 0)
+      ret = snmp_agent_config_table_size_oid(td, option);
+    else if (strcasecmp("Data", option->key) == 0)
+      ret = snmp_agent_config_table_data(td, option);
+    else {
+      WARNING(PLUGIN_NAME ": Option `%s' not allowed here", option->key);
+      ret = -1;
+    }
+
+    if (ret != 0) {
+      snmp_agent_free_table(&td);
+      return -ENOMEM;
+    }
+  }
+
+  llentry_t *entry = llentry_create(td->name, td);
+  if (entry == NULL) {
+    snmp_agent_free_table(&td);
+    return -ENOMEM;
+  }
+
+  td->instance_index =
+      c_avl_create((int (*)(const void *, const void *))strcmp);
+  if (td->instance_index == NULL) {
+    snmp_agent_free_table(&td);
+    return -ENOMEM;
+  }
+
+  td->index_instance =
+      c_avl_create((int (*)(const void *, const void *))num_compare);
+  if (td->index_instance == NULL) {
+    snmp_agent_free_table(&td);
+    return -ENOMEM;
+  }
+
+  llist_append(g_agent->tables, entry);
+
+  return 0;
+}
+
+static int snmp_agent_get_value_from_ds_type(const value_t *val, int type,
+                                             double scale, double shift,
+                                             long *value) {
+  switch (type) {
+  case DS_TYPE_COUNTER:
+    *value = (long)((val->counter * scale) + shift);
+    break;
+  case DS_TYPE_ABSOLUTE:
+    *value = (long)((val->absolute * scale) + shift);
+    break;
+  case DS_TYPE_DERIVE:
+    *value = (long)((val->derive * scale) + shift);
+    break;
+  case DS_TYPE_GAUGE:
+    *value = (long)((val->gauge * scale) + shift);
+    break;
+  case TYPE_STRING:
+    break;
+  default:
+    ERROR(PLUGIN_NAME ": Unknown data source type: %i", type);
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+static int snmp_agent_set_vardata(void *data, size_t *data_len, u_char asn_type,
+                                  double scale, double shift, const void *value,
+                                  size_t len, int type) {
+
+  int ret;
+  netsnmp_vardata var;
+  const value_t *val;
+  long new_value = 0;
+
+  val = value;
+  var.string = (u_char *)data;
+
+  ret = snmp_agent_get_value_from_ds_type(val, type, scale, shift, &new_value);
+  if (ret != 0)
+    return ret;
+
+  switch (asn_type) {
+  case ASN_INTEGER:
+  case ASN_UINTEGER:
+  case ASN_COUNTER:
+  case ASN_TIMETICKS:
+  case ASN_GAUGE:
+    if (*data_len < sizeof(*var.integer))
+      return -EINVAL;
+    *var.integer = new_value;
+    *data_len = sizeof(*var.integer);
+    break;
+  case ASN_COUNTER64:
+    if (*data_len < sizeof(*var.counter64))
+      return -EINVAL;
+    var.counter64->high = (u_long)((int64_t)new_value >> 32);
+    var.counter64->low = (u_long)((int64_t)new_value & 0xFFFFFFFF);
+    *data_len = sizeof(*var.counter64);
+    break;
+  case ASN_OCTET_STR:
+    if (type == DS_TYPE_GAUGE) {
+      char buf[DATA_MAX_NAME_LEN];
+      snprintf(buf, sizeof(buf), "%.2f", val->gauge);
+      if (*data_len < strlen(buf))
+        return -EINVAL;
+      *data_len = strlen(buf);
+      memcpy(var.string, buf, *data_len);
+    } else {
+      ERROR(PLUGIN_NAME ": Failed to convert %d ds type to %d asn type", type,
+            asn_type);
+      return -EINVAL;
+    }
+    break;
+  default:
+    ERROR(PLUGIN_NAME ": Failed to convert %d ds type to %d asn type", type,
+          asn_type);
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+static int snmp_agent_register_oid_index(oid_t *oid, int index,
+                                         Netsnmp_Node_Handler *handler) {
+  oid_t new_oid;
+  memcpy(&new_oid, oid, sizeof(*oid));
+  new_oid.oid[new_oid.oid_len++] = index;
+  return snmp_agent_register_oid(&new_oid, handler);
+}
+
+static int snmp_agent_unregister_oid_index(oid_t *oid, int index) {
+  oid_t new_oid;
+  memcpy(&new_oid, oid, sizeof(*oid));
+  new_oid.oid[new_oid.oid_len++] = index;
+  return unregister_mib(new_oid.oid, new_oid.oid_len);
+}
+
+static int snmp_agent_update_index(table_definition_t *td,
+                                   const char *instance) {
+
+  if (c_avl_get(td->instance_index, instance, NULL) == 0)
+    return 0;
+
+  int ret;
+  int *index = NULL;
+  char *ins;
+
+  ins = strdup(instance);
+  if (ins == NULL)
+    return -ENOMEM;
+
+  /* need to generate index for the table */
+  if (td->index_oid.oid_len) {
+    index = calloc(1, sizeof(*index));
+    if (index == NULL) {
+      sfree(ins);
+      return -ENOMEM;
+    }
+
+    *index = c_avl_size(td->instance_index) + 1;
+
+    ret = c_avl_insert(td->instance_index, ins, index);
+    if (ret != 0) {
+      sfree(ins);
+      sfree(index);
+      return ret;
+    }
+
+    ret = c_avl_insert(td->index_instance, index, ins);
+    if (ret < 0) {
+      DEBUG(PLUGIN_NAME ": Failed to update index_instance for '%s' table",
+            td->name);
+      c_avl_remove(td->instance_index, ins, NULL, (void **)&index);
+      sfree(ins);
+      sfree(index);
+      return ret;
+    }
+
+    ret = snmp_agent_register_oid_index(&td->index_oid, *index,
+                                        snmp_agent_table_index_oid_handler);
+    if (ret != 0)
+      return ret;
+  } else {
+    /* instance as a key is required for any table */
+    ret = c_avl_insert(td->instance_index, ins, ins);
+    if (ret != 0) {
+      sfree(ins);
+      return ret;
+    }
+  }
+
+  /* register new oids for all columns */
+  for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+    data_definition_t *dd = de->value;
+
+    for (size_t i = 0; i < dd->oids_len; i++) {
+      if (td->index_oid.oid_len) {
+        ret = snmp_agent_register_oid_index(&dd->oids[i], *index,
+                                            snmp_agent_table_oid_handler);
+      } else {
+        ret = snmp_agent_register_oid_string(&dd->oids[i], ins,
+                                             snmp_agent_table_oid_handler);
+      }
+
+      if (ret != 0)
+        return ret;
+    }
+  }
+
+  DEBUG(PLUGIN_NAME ": Updated index for '%s' table [%d, %s]", td->name,
+        (index != NULL) ? *index : -1, ins);
+
+  notification_t n = {
+      .severity = NOTIF_OKAY, .time = cdtime(), .plugin = PLUGIN_NAME};
+  sstrncpy(n.host, hostname_g, sizeof(n.host));
+  sstrncpy(n.plugin_instance, ins, sizeof(n.plugin_instance));
+  ssnprintf(n.message, sizeof(n.message),
+            "Data row added to table %s instance %s index %d", td->name, ins,
+            (index != NULL) ? *index : -1);
+  plugin_dispatch_notification(&n);
+
+  return 0;
+}
+
+static int snmp_agent_write(value_list_t const *vl) {
+
+  if (vl == NULL)
+    return -EINVAL;
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next) {
+    table_definition_t *td = te->value;
+
+    for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
+      data_definition_t *dd = de->value;
+
+      if (!dd->is_instance) {
+        if (CHECK_DD_TYPE(dd, vl->plugin, vl->plugin_instance, vl->type,
+                          vl->type_instance)) {
+          snmp_agent_update_index(td, vl->plugin_instance);
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 0;
+}
+
+static int snmp_agent_collect(const data_set_t *ds, const value_list_t *vl,
+                              user_data_t __attribute__((unused)) * user_data) {
+
+  pthread_mutex_lock(&g_agent->lock);
+
+  snmp_agent_write(vl);
+
+  pthread_mutex_unlock(&g_agent->lock);
+
+  return 0;
+}
+
+static int snmp_agent_preinit(void) {
+  if (g_agent != NULL) {
+    /* already initialized if config callback was called before init callback */
+    return 0;
+  }
+
+  g_agent = calloc(1, sizeof(*g_agent));
+  if (g_agent == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to allocate memory for snmp agent context");
+    return -ENOMEM;
+  }
+
+  g_agent->tables = llist_create();
+  g_agent->scalars = llist_create();
+
+  int err;
+  /* make us a agentx client. */
+  err = netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE,
+                               1);
+  if (err != 0) {
+    ERROR(PLUGIN_NAME ": Failed to set agent role (%d)", err);
+    return -1;
+  }
+
+  /*
+   *  For SNMP debug purposes uses snmp_set_do_debugging(1);
+   */
+
+  /* initialize the agent library */
+  err = init_agent(PLUGIN_NAME);
+  if (err != 0) {
+    ERROR(PLUGIN_NAME ": Failed to initialize the agent library (%d)", err);
+    return -1;
+  }
+
+  init_snmp(PLUGIN_NAME);
+
+  g_agent->tp = read_all_mibs();
+
+  return 0;
+}
+
+static int snmp_agent_init(void) {
+  int ret;
+
+  ret = snmp_agent_preinit();
+  if (ret != 0)
+    return ret;
+
+  ret = snmp_agent_register_scalar_oids();
+  if (ret != 0)
+    return ret;
+
+  ret = snmp_agent_register_table_oids();
+  if (ret != 0)
+    return ret;
+
+  /* create a second thread to listen for requests from AgentX*/
+  ret = pthread_create(&g_agent->thread, NULL, &snmp_agent_thread_run, NULL);
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to create a separate thread, err %u", ret);
+    return ret;
+  }
+
+  ret = pthread_mutex_init(&g_agent->lock, NULL);
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to initialize mutex, err %u", ret);
+    return ret;
+  }
+
+  ret = pthread_mutex_init(&g_agent->agentx_lock, NULL);
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to initialize AgentX mutex, err %u", ret);
+    return ret;
+  }
+
+  return 0;
+}
+
+static void *snmp_agent_thread_run(void __attribute__((unused)) * arg) {
+  INFO(PLUGIN_NAME ": Thread is up and running");
+
+  for (;;) {
+    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+
+    pthread_mutex_lock(&g_agent->agentx_lock);
+    agent_check_and_process(0); /* 0 == don't block */
+    pthread_mutex_unlock(&g_agent->agentx_lock);
+
+    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+    usleep(10);
+  }
+
+  pthread_exit(0);
+}
+
+static int snmp_agent_register_oid(oid_t *oid, Netsnmp_Node_Handler *handler) {
+  netsnmp_handler_registration *reg;
+  char *oid_name = snmp_agent_get_oid_name(oid->oid, oid->oid_len - 1);
+  char oid_str[DATA_MAX_NAME_LEN];
+
+  snmp_agent_oid_to_string(oid_str, sizeof(oid_str), oid);
+
+  if (oid_name == NULL) {
+    WARNING(PLUGIN_NAME
+            ": Skipped registration: OID (%s) is not found in main tree",
+            oid_str);
+    return 0;
+  }
+
+  reg = netsnmp_create_handler_registration(oid_name, handler, oid->oid,
+                                            oid->oid_len, HANDLER_CAN_RONLY);
+  if (reg == NULL) {
+    ERROR(PLUGIN_NAME ": Failed to create handler registration for OID (%s)",
+          oid_str);
+    return -1;
+  }
+
+  pthread_mutex_lock(&g_agent->agentx_lock);
+
+  if (netsnmp_register_instance(reg) != MIB_REGISTERED_OK) {
+    ERROR(PLUGIN_NAME ": Failed to register handler for OID (%s)", oid_str);
+    pthread_mutex_unlock(&g_agent->agentx_lock);
+    return -1;
+  }
+
+  pthread_mutex_unlock(&g_agent->agentx_lock);
+
+  DEBUG(PLUGIN_NAME ": Registered handler for OID (%s)", oid_str);
+
+  return 0;
+}
+
+static int snmp_agent_free_config(void) {
+
+  if (g_agent == NULL)
+    return -EINVAL;
+
+  for (llentry_t *te = llist_head(g_agent->tables); te != NULL; te = te->next)
+    snmp_agent_free_table((table_definition_t **)&te->value);
+  llist_destroy(g_agent->tables);
+
+  for (llentry_t *de = llist_head(g_agent->scalars); de != NULL; de = de->next)
+    snmp_agent_free_data((data_definition_t **)&de->value);
+  llist_destroy(g_agent->scalars);
+
+  return 0;
+}
+
+static int snmp_agent_shutdown(void) {
+  int ret = 0;
+
+  DEBUG(PLUGIN_NAME ": snmp_agent_shutdown");
+
+  if (g_agent == NULL) {
+    ERROR(PLUGIN_NAME ": snmp_agent_shutdown: plugin not initialized");
+    return -EINVAL;
+  }
+
+  if (pthread_cancel(g_agent->thread) != 0)
+    ERROR(PLUGIN_NAME ": snmp_agent_shutdown: failed to cancel the thread");
+
+  if (pthread_join(g_agent->thread, NULL) != 0)
+    ERROR(PLUGIN_NAME ": snmp_agent_shutdown: failed to join the thread");
+
+  snmp_agent_free_config();
+
+  snmp_shutdown(PLUGIN_NAME);
+
+  pthread_mutex_destroy(&g_agent->lock);
+  pthread_mutex_destroy(&g_agent->agentx_lock);
+
+  sfree(g_agent);
+
+  return ret;
+}
+
+static int snmp_agent_config(oconfig_item_t *ci) {
+
+  int ret = snmp_agent_preinit();
+
+  if (ret != 0) {
+    sfree(g_agent);
+    return -EINVAL;
+  }
+
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("Data", child->key) == 0) {
+      ret = snmp_agent_config_data(child);
+    } else if (strcasecmp("Table", child->key) == 0) {
+      ret = snmp_agent_config_table(child);
+    } else {
+      ERROR(PLUGIN_NAME ": Unknown configuration option `%s'", child->key);
+      ret = (-EINVAL);
+    }
+
+    if (ret != 0) {
+      ERROR(PLUGIN_NAME ": Failed to parse configuration");
+      snmp_agent_free_config();
+      snmp_shutdown(PLUGIN_NAME);
+      sfree(g_agent);
+      return -EINVAL;
+    }
+  }
+
+  ret = snmp_agent_validate_data();
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Invalid configuration provided");
+    snmp_agent_free_config();
+    snmp_shutdown(PLUGIN_NAME);
+    sfree(g_agent);
+    return -EINVAL;
+  }
+
+  return 0;
+}
+
+void module_register(void) {
+  plugin_register_init(PLUGIN_NAME, snmp_agent_init);
+  plugin_register_complex_config(PLUGIN_NAME, snmp_agent_config);
+  plugin_register_write(PLUGIN_NAME, snmp_agent_collect, NULL);
+  plugin_register_missing(PLUGIN_NAME, snmp_agent_clear_missing, NULL);
+  plugin_register_shutdown(PLUGIN_NAME, snmp_agent_shutdown);
+}
index 47e01d8..e1b52cb 100644 (file)
@@ -107,7 +107,7 @@ static statsd_metric_t *statsd_metric_lookup_unsafe(char const *name, /* {{{ */
     key[0] = 's';
     break;
   default:
-    return (NULL);
+    return NULL;
   }
 
   key[1] = ':';
@@ -115,19 +115,19 @@ static statsd_metric_t *statsd_metric_lookup_unsafe(char const *name, /* {{{ */
 
   status = c_avl_get(metrics_tree, key, (void *)&metric);
   if (status == 0)
-    return (metric);
+    return metric;
 
   key_copy = strdup(key);
   if (key_copy == NULL) {
     ERROR("statsd plugin: strdup failed.");
-    return (NULL);
+    return NULL;
   }
 
   metric = calloc(1, sizeof(*metric));
   if (metric == NULL) {
     ERROR("statsd plugin: calloc failed.");
     sfree(key_copy);
-    return (NULL);
+    return NULL;
   }
 
   metric->type = type;
@@ -139,10 +139,10 @@ static statsd_metric_t *statsd_metric_lookup_unsafe(char const *name, /* {{{ */
     ERROR("statsd plugin: c_avl_insert failed.");
     sfree(key_copy);
     sfree(metric);
-    return (NULL);
+    return NULL;
   }
 
-  return (metric);
+  return metric;
 } /* }}} statsd_metric_lookup_unsafe */
 
 static int statsd_metric_set(char const *name, double value, /* {{{ */
@@ -154,7 +154,7 @@ static int statsd_metric_set(char const *name, double value, /* {{{ */
   metric = statsd_metric_lookup_unsafe(name, type);
   if (metric == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (-1);
+    return -1;
   }
 
   metric->value = value;
@@ -162,7 +162,7 @@ static int statsd_metric_set(char const *name, double value, /* {{{ */
 
   pthread_mutex_unlock(&metrics_lock);
 
-  return (0);
+  return 0;
 } /* }}} int statsd_metric_set */
 
 static int statsd_metric_add(char const *name, double delta, /* {{{ */
@@ -174,7 +174,7 @@ static int statsd_metric_add(char const *name, double delta, /* {{{ */
   metric = statsd_metric_lookup_unsafe(name, type);
   if (metric == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (-1);
+    return -1;
   }
 
   metric->value += delta;
@@ -182,7 +182,7 @@ static int statsd_metric_add(char const *name, double delta, /* {{{ */
 
   pthread_mutex_unlock(&metrics_lock);
 
-  return (0);
+  return 0;
 } /* }}} int statsd_metric_add */
 
 static void statsd_metric_free(statsd_metric_t *metric) /* {{{ */
@@ -217,9 +217,9 @@ static int statsd_parse_value(char const *str, value_t *ret_value) /* {{{ */
 
   ret_value->gauge = (gauge_t)strtod(str, &endptr);
   if ((str == endptr) || ((endptr != NULL) && (*endptr != 0)))
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* }}} int statsd_parse_value */
 
 static int statsd_handle_counter(char const *name, /* {{{ */
@@ -229,27 +229,27 @@ static int statsd_handle_counter(char const *name, /* {{{ */
   int status;
 
   if ((extra != NULL) && (extra[0] != '@'))
-    return (-1);
+    return -1;
 
   scale.gauge = 1.0;
   if (extra != NULL) {
     status = statsd_parse_value(extra + 1, &scale);
     if (status != 0)
-      return (status);
+      return status;
 
     if (!isfinite(scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
-      return (-1);
+      return -1;
   }
 
   value.gauge = 1.0;
   status = statsd_parse_value(value_str, &value);
   if (status != 0)
-    return (status);
+    return status;
 
   /* Changes to the counter are added to (statsd_metric_t*)->value. ->counter is
    * only updated in statsd_metric_submit_unsafe(). */
-  return (statsd_metric_add(name, (double)(value.gauge / scale.gauge),
-                            STATSD_COUNTER));
+  return statsd_metric_add(name, (double)(value.gauge / scale.gauge),
+                           STATSD_COUNTER);
 } /* }}} int statsd_handle_counter */
 
 static int statsd_handle_gauge(char const *name, /* {{{ */
@@ -260,12 +260,12 @@ static int statsd_handle_gauge(char const *name, /* {{{ */
   value.gauge = 0;
   status = statsd_parse_value(value_str, &value);
   if (status != 0)
-    return (status);
+    return status;
 
   if ((value_str[0] == '+') || (value_str[0] == '-'))
-    return (statsd_metric_add(name, (double)value.gauge, STATSD_GAUGE));
+    return statsd_metric_add(name, (double)value.gauge, STATSD_GAUGE);
   else
-    return (statsd_metric_set(name, (double)value.gauge, STATSD_GAUGE));
+    return statsd_metric_set(name, (double)value.gauge, STATSD_GAUGE);
 } /* }}} int statsd_handle_gauge */
 
 static int statsd_handle_timer(char const *name, /* {{{ */
@@ -277,22 +277,22 @@ static int statsd_handle_timer(char const *name, /* {{{ */
   int status;
 
   if ((extra != NULL) && (extra[0] != '@'))
-    return (-1);
+    return -1;
 
   scale.gauge = 1.0;
   if (extra != NULL) {
     status = statsd_parse_value(extra + 1, &scale);
     if (status != 0)
-      return (status);
+      return status;
 
     if (!isfinite(scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
-      return (-1);
+      return -1;
   }
 
   value_ms.derive = 0;
   status = statsd_parse_value(value_str, &value_ms);
   if (status != 0)
-    return (status);
+    return status;
 
   value = MS_TO_CDTIME_T(value_ms.gauge / scale.gauge);
 
@@ -301,21 +301,21 @@ static int statsd_handle_timer(char const *name, /* {{{ */
   metric = statsd_metric_lookup_unsafe(name, STATSD_TIMER);
   if (metric == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (-1);
+    return -1;
   }
 
   if (metric->latency == NULL)
     metric->latency = latency_counter_create();
   if (metric->latency == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (-1);
+    return -1;
   }
 
   latency_counter_add(metric->latency, value);
   metric->updates_num++;
 
   pthread_mutex_unlock(&metrics_lock);
-  return (0);
+  return 0;
 } /* }}} int statsd_handle_timer */
 
 static int statsd_handle_set(char const *name, /* {{{ */
@@ -329,7 +329,7 @@ static int statsd_handle_set(char const *name, /* {{{ */
   metric = statsd_metric_lookup_unsafe(name, STATSD_SET);
   if (metric == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (-1);
+    return -1;
   }
 
   /* Make sure metric->set exists. */
@@ -339,14 +339,14 @@ static int statsd_handle_set(char const *name, /* {{{ */
   if (metric->set == NULL) {
     pthread_mutex_unlock(&metrics_lock);
     ERROR("statsd plugin: c_avl_create failed.");
-    return (-1);
+    return -1;
   }
 
   set_key = strdup(set_key_orig);
   if (set_key == NULL) {
     pthread_mutex_unlock(&metrics_lock);
     ERROR("statsd plugin: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   status = c_avl_insert(metric->set, set_key, /* value = */ NULL);
@@ -356,7 +356,7 @@ static int statsd_handle_set(char const *name, /* {{{ */
       ERROR("statsd plugin: c_avl_insert (\"%s\") failed with status %i.",
             set_key, status);
     sfree(set_key);
-    return (-1);
+    return -1;
   } else if (status > 0) /* key already exists */
   {
     sfree(set_key);
@@ -365,7 +365,7 @@ static int statsd_handle_set(char const *name, /* {{{ */
   metric->updates_num++;
 
   pthread_mutex_unlock(&metrics_lock);
-  return (0);
+  return 0;
 } /* }}} int statsd_handle_set */
 
 static int statsd_parse_line(char *buffer) /* {{{ */
@@ -377,13 +377,13 @@ static int statsd_parse_line(char *buffer) /* {{{ */
 
   type = strchr(name, '|');
   if (type == NULL)
-    return (-1);
+    return -1;
   *type = 0;
   type++;
 
   value = strrchr(name, ':');
   if (value == NULL)
-    return (-1);
+    return -1;
   *value = 0;
   value++;
 
@@ -394,20 +394,20 @@ static int statsd_parse_line(char *buffer) /* {{{ */
   }
 
   if (strcmp("c", type) == 0)
-    return (statsd_handle_counter(name, value, extra));
+    return statsd_handle_counter(name, value, extra);
   else if (strcmp("ms", type) == 0)
-    return (statsd_handle_timer(name, value, extra));
+    return statsd_handle_timer(name, value, extra);
 
   /* extra is only valid for counters and timers */
   if (extra != NULL)
-    return (-1);
+    return -1;
 
   if (strcmp("g", type) == 0)
-    return (statsd_handle_gauge(name, value));
+    return statsd_handle_gauge(name, value);
   else if (strcmp("s", type) == 0)
-    return (statsd_handle_set(name, value));
+    return statsd_handle_set(name, value);
   else
-    return (-1);
+    return -1;
 } /* }}} void statsd_parse_line */
 
 static void statsd_parse_buffer(char *buffer) /* {{{ */
@@ -484,7 +484,7 @@ static int statsd_network_init(struct pollfd **ret_fds, /* {{{ */
   if (status != 0) {
     ERROR("statsd plugin: getaddrinfo (\"%s\", \"%s\") failed: %s", node,
           service, gai_strerror(status));
-    return (status);
+    return status;
   }
 
   for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
@@ -538,12 +538,12 @@ static int statsd_network_init(struct pollfd **ret_fds, /* {{{ */
   if (fds_num == 0) {
     ERROR("statsd plugin: Unable to create listening socket for [%s]:%s.",
           (node != NULL) ? node : "::", service);
-    return (ENOENT);
+    return ENOENT;
   }
 
   *ret_fds = fds;
   *ret_fds_num = fds_num;
-  return (0);
+  return 0;
 } /* }}} int statsd_network_init */
 
 static void *statsd_network_thread(void *args) /* {{{ */
@@ -585,7 +585,7 @@ static void *statsd_network_thread(void *args) /* {{{ */
     close(fds[i].fd);
   sfree(fds);
 
-  return ((void *)0);
+  return (void *)0;
 } /* }}} void *statsd_network_thread */
 
 static int statsd_config_timer_percentile(oconfig_item_t *ci) /* {{{ */
@@ -596,26 +596,26 @@ static int statsd_config_timer_percentile(oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_double(ci, &percent);
   if (status != 0)
-    return (status);
+    return status;
 
   if ((percent <= 0.0) || (percent >= 100)) {
     ERROR("statsd plugin: The value for \"%s\" must be between 0 and 100, "
           "exclusively.",
           ci->key);
-    return (ERANGE);
+    return ERANGE;
   }
 
   tmp = realloc(conf_timer_percentile, sizeof(*conf_timer_percentile) *
                                            (conf_timer_percentile_num + 1));
   if (tmp == NULL) {
     ERROR("statsd plugin: realloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
   conf_timer_percentile = tmp;
   conf_timer_percentile[conf_timer_percentile_num] = percent;
   conf_timer_percentile_num++;
 
-  return (0);
+  return 0;
 } /* }}} int statsd_config_timer_percentile */
 
 static int statsd_config(oconfig_item_t *ci) /* {{{ */
@@ -652,7 +652,7 @@ static int statsd_config(oconfig_item_t *ci) /* {{{ */
             child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int statsd_config */
 
 static int statsd_init(void) /* {{{ */
@@ -672,14 +672,14 @@ static int statsd_init(void) /* {{{ */
       pthread_mutex_unlock(&metrics_lock);
       ERROR("statsd plugin: pthread_create failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (status);
+      return status;
     }
   }
   network_thread_running = 1;
 
   pthread_mutex_unlock(&metrics_lock);
 
-  return (0);
+  return 0;
 } /* }}} int statsd_init */
 
 /* Must hold metrics_lock when calling this function. */
@@ -689,17 +689,17 @@ static int statsd_metric_clear_set_unsafe(statsd_metric_t *metric) /* {{{ */
   void *value;
 
   if ((metric == NULL) || (metric->type != STATSD_SET))
-    return (EINVAL);
+    return EINVAL;
 
   if (metric->set == NULL)
-    return (0);
+    return 0;
 
   while (c_avl_pick(metric->set, &key, &value) == 0) {
     sfree(key);
     sfree(value);
   }
 
-  return (0);
+  return 0;
 } /* }}} int statsd_metric_clear_set_unsafe */
 
 /* Must hold metrics_lock when calling this function. */
@@ -785,7 +785,7 @@ static int statsd_metric_submit_unsafe(char const *name,
     }
 
     latency_counter_reset(metric->latency);
-    return (0);
+    return 0;
   } else if (metric->type == STATSD_SET) {
     if (metric->set == NULL)
       vl.values[0].gauge = 0.0;
@@ -815,7 +815,7 @@ static int statsd_metric_submit_unsafe(char const *name,
     vl.values[0].derive = metric->counter;
   }
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 } /* }}} int statsd_metric_submit_unsafe */
 
 static int statsd_read(void) /* {{{ */
@@ -831,7 +831,7 @@ static int statsd_read(void) /* {{{ */
 
   if (metrics_tree == NULL) {
     pthread_mutex_unlock(&metrics_lock);
-    return (0);
+    return 0;
   }
 
   iter = c_avl_get_iterator(metrics_tree);
@@ -876,7 +876,7 @@ static int statsd_read(void) /* {{{ */
 
   strarray_free(to_be_deleted, to_be_deleted_num);
 
-  return (0);
+  return 0;
 } /* }}} int statsd_read */
 
 static int statsd_shutdown(void) /* {{{ */
@@ -905,7 +905,7 @@ static int statsd_shutdown(void) /* {{{ */
 
   pthread_mutex_unlock(&metrics_lock);
 
-  return (0);
+  return 0;
 } /* }}} int statsd_shutdown */
 
 void module_register(void) {
@@ -914,5 +914,3 @@ void module_register(void) {
   plugin_register_read("statsd", statsd_read);
   plugin_register_shutdown("statsd", statsd_shutdown);
 }
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index cbe1ab1..746ba51 100644 (file)
@@ -140,7 +140,7 @@ static int swap_config(oconfig_item_t *ci) /* {{{ */
       WARNING("swap plugin: Unknown config option: \"%s\"", child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int swap_config */
 
 static int swap_init(void) /* {{{ */
@@ -172,7 +172,7 @@ static int swap_init(void) /* {{{ */
 
   if (kvm_obj == NULL) {
     ERROR("swap plugin: kvm_openfiles failed, %s", errbuf);
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_LIBKVM_GETSWAPINFO */
 
@@ -184,7 +184,7 @@ static int swap_init(void) /* {{{ */
   pagesize = getpagesize();
 #endif /* HAVE_PERFSTAT */
 
-  return (0);
+  return 0;
 } /* }}} int swap_init */
 
 static void swap_submit_usage(char const *plugin_instance, /* {{{ */
@@ -234,7 +234,7 @@ static int swap_read_separate(void) /* {{{ */
     char errbuf[1024];
     WARNING("swap plugin: fopen (/proc/swaps) failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -273,7 +273,7 @@ static int swap_read_separate(void) /* {{{ */
 
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read_separate */
 
 static int swap_read_combined(void) /* {{{ */
@@ -291,7 +291,7 @@ static int swap_read_combined(void) /* {{{ */
     char errbuf[1024];
     WARNING("swap plugin: fopen (/proc/meminfo) failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -313,7 +313,7 @@ static int swap_read_combined(void) /* {{{ */
   fclose(fh);
 
   if (isnan(swap_total) || isnan(swap_free))
-    return (ENOENT);
+    return ENOENT;
 
   /* Some systems, OpenVZ for example, don't provide SwapCached. */
   if (isnan(swap_cached))
@@ -323,12 +323,12 @@ static int swap_read_combined(void) /* {{{ */
   assert(!isnan(swap_used));
 
   if (swap_used < 0.0)
-    return (EINVAL);
+    return EINVAL;
 
   swap_submit_usage(NULL, swap_used * 1024.0, swap_free * 1024.0,
                     isnan(swap_cached) ? NULL : "cached",
                     isnan(swap_cached) ? NAN : swap_cached * 1024.0);
-  return (0);
+  return 0;
 } /* }}} int swap_read_combined */
 
 static int swap_read_io(void) /* {{{ */
@@ -349,7 +349,7 @@ static int swap_read_io(void) /* {{{ */
     if (fh == NULL) {
       char errbuf[1024];
       WARNING("swap: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     } else
       old_kernel = 1;
   }
@@ -386,7 +386,7 @@ static int swap_read_io(void) /* {{{ */
   fclose(fh);
 
   if (have_data != 0x03)
-    return (ENOENT);
+    return ENOENT;
 
   if (report_bytes) {
     swap_in = swap_in * pagesize;
@@ -396,7 +396,7 @@ static int swap_read_io(void) /* {{{ */
   swap_submit_derive("in", swap_in);
   swap_submit_derive("out", swap_out);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read_io */
 
 static int swap_read(void) /* {{{ */
@@ -408,7 +408,7 @@ static int swap_read(void) /* {{{ */
 
   swap_read_io();
 
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif KERNEL_LINUX */
 
@@ -435,7 +435,7 @@ static int swap_read_kstat(void) /* {{{ */
     char errbuf[1024];
     ERROR("swap plugin: swapctl failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /*
@@ -464,7 +464,7 @@ static int swap_read_kstat(void) /* {{{ */
   swap_avail = (gauge_t)((ai.ani_max - ai.ani_resv) * pagesize);
 
   swap_submit_usage(NULL, swap_alloc, swap_avail, "reserved", swap_resv);
-  return (0);
+  return 0;
 } /* }}} int swap_read_kstat */
   /* #endif 0 && HAVE_LIBKSTAT */
 
@@ -483,15 +483,15 @@ static int swap_read(void) /* {{{ */
   swap_num = swapctl(SC_GETNSWP, NULL);
   if (swap_num < 0) {
     ERROR("swap plugin: swapctl (SC_GETNSWP) failed with status %i.", swap_num);
-    return (-1);
+    return -1;
   } else if (swap_num == 0)
-    return (0);
+    return 0;
 
   /* Allocate and initialize the swaptbl_t structure */
   s = malloc(swap_num * sizeof(swapent_t) + sizeof(struct swaptable));
   if (s == NULL) {
     ERROR("swap plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   /* Memory to store the path names. We only use these paths when the
@@ -501,7 +501,7 @@ static int swap_read(void) /* {{{ */
   if (s_paths == NULL) {
     ERROR("swap plugin: calloc failed.");
     sfree(s);
-    return (-1);
+    return -1;
   }
   for (int i = 0; i < swap_num; i++)
     s->swt_ent[i].ste_path = s_paths + (i * PATH_MAX);
@@ -514,7 +514,7 @@ static int swap_read(void) /* {{{ */
           sstrerror(errno, errbuf, sizeof(errbuf)));
     sfree(s_paths);
     sfree(s);
-    return (-1);
+    return -1;
   } else if (swap_num < status) {
     /* more elements returned than requested */
     ERROR("swap plugin: I allocated memory for %i structure%s, "
@@ -523,7 +523,7 @@ static int swap_read(void) /* {{{ */
           swap_num, (swap_num == 1) ? "" : "s", status);
     sfree(s_paths);
     sfree(s);
-    return (-1);
+    return -1;
   } else if (swap_num > status)
     /* less elements returned than requested */
     swap_num = status;
@@ -558,7 +558,7 @@ static int swap_read(void) /* {{{ */
         total, avail);
     sfree(s_paths);
     sfree(s);
-    return (-1);
+    return -1;
   }
 
   /* If the "separate" option was specified (report_by_device == 1), all
@@ -568,7 +568,7 @@ static int swap_read(void) /* {{{ */
 
   sfree(s_paths);
   sfree(s);
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif HAVE_SWAPCTL && HAVE_SWAPCTL_TWO_ARGS */
 
@@ -585,21 +585,21 @@ static int swap_read(void) /* {{{ */
   swap_num = swapctl(SWAP_NSWAP, NULL, 0);
   if (swap_num < 0) {
     ERROR("swap plugin: swapctl (SWAP_NSWAP) failed with status %i.", swap_num);
-    return (-1);
+    return -1;
   } else if (swap_num == 0)
-    return (0);
+    return 0;
 
   swap_entries = calloc(swap_num, sizeof(*swap_entries));
   if (swap_entries == NULL) {
     ERROR("swap plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = swapctl(SWAP_STATS, swap_entries, swap_num);
   if (status != swap_num) {
     ERROR("swap plugin: swapctl (SWAP_STATS) failed with status %i.", status);
     sfree(swap_entries);
-    return (-1);
+    return -1;
   }
 
 #if defined(DEV_BSIZE) && (DEV_BSIZE > 0)
@@ -623,13 +623,13 @@ static int swap_read(void) /* {{{ */
         "swap plugin: Total swap space (%g) is less than used swap space (%g).",
         total, used);
     sfree(swap_entries);
-    return (-1);
+    return -1;
   }
 
   swap_submit_usage(NULL, used, total - used, NULL, NAN);
 
   sfree(swap_entries);
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif HAVE_SWAPCTL && HAVE_SWAPCTL_THREE_ARGS */
 
@@ -648,13 +648,13 @@ static int swap_read(void) /* {{{ */
   sw_usage_len = sizeof(struct xsw_usage);
 
   if (sysctl(mib, mib_len, &sw_usage, &sw_usage_len, NULL, 0) != 0)
-    return (-1);
+    return -1;
 
   /* The returned values are bytes. */
   swap_submit_usage(NULL, (gauge_t)sw_usage.xsu_used,
                     (gauge_t)sw_usage.xsu_avail, NULL, NAN);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif VM_SWAPUSAGE */
 
@@ -668,12 +668,12 @@ static int swap_read(void) /* {{{ */
   gauge_t total;
 
   if (kvm_obj == NULL)
-    return (-1);
+    return -1;
 
   /* only one structure => only get the grand total, no details */
   status = kvm_getswapinfo(kvm_obj, &data_s, 1, 0);
   if (status == -1)
-    return (-1);
+    return -1;
 
   total = (gauge_t)data_s.ksw_total;
   used = (gauge_t)data_s.ksw_used;
@@ -683,7 +683,7 @@ static int swap_read(void) /* {{{ */
 
   swap_submit_usage(NULL, used, total - used, NULL, NAN);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif HAVE_LIBKVM_GETSWAPINFO */
 
@@ -694,11 +694,11 @@ static int swap_read(void) /* {{{ */
 
   swap = sg_get_swap_stats();
   if (swap == NULL)
-    return (-1);
+    return -1;
 
   swap_submit_usage(NULL, (gauge_t)swap->used, (gauge_t)swap->free, NULL, NAN);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read */
   /* #endif  HAVE_LIBSTATGRAB */
 
@@ -718,7 +718,7 @@ static int swap_read(void) /* {{{ */
     char errbuf[1024];
     WARNING("swap plugin: perfstat_memory_total failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   total = (gauge_t)(pmemory.pgsp_total * pagesize);
@@ -729,7 +729,7 @@ static int swap_read(void) /* {{{ */
   swap_submit_derive("in", (derive_t)pmemory.pgspins * pagesize);
   swap_submit_derive("out", (derive_t)pmemory.pgspouts * pagesize);
 
-  return (0);
+  return 0;
 } /* }}} int swap_read */
 #endif /* HAVE_PERFSTAT */
 
@@ -738,5 +738,3 @@ void module_register(void) {
   plugin_register_init("swap", swap_init);
   plugin_register_read("swap", swap_read);
 } /* void module_register */
-
-/* vim: set fdm=marker : */
index 6d326ff..8192d6a 100644 (file)
@@ -51,15 +51,15 @@ static int sl_config(const char *key, const char *value) {
     if (log_level < 0) {
       log_level = LOG_INFO;
       ERROR("syslog: invalid loglevel [%s] defaulting to 'info'", value);
-      return (1);
+      return 1;
     }
   } else if (strcasecmp(key, "NotifyLevel") == 0) {
     notif_severity = parse_notif_severity(value);
     if (notif_severity < 0)
-      return (1);
+      return 1;
   }
 
-  return (0);
+  return 0;
 } /* int sl_config */
 
 static void sl_log(int severity, const char *msg,
@@ -73,7 +73,7 @@ static void sl_log(int severity, const char *msg,
 static int sl_shutdown(void) {
   closelog();
 
-  return (0);
+  return 0;
 }
 
 static int sl_notification(const notification_t *n,
@@ -85,7 +85,7 @@ static int sl_notification(const notification_t *n,
   int status;
 
   if (n->severity > notif_severity)
-    return (0);
+    return 0;
 
   switch (n->severity) {
   case NOTIF_FAILURE:
@@ -109,9 +109,9 @@ static int sl_notification(const notification_t *n,
   do {                                                                         \
     status = ssnprintf(&buf[offset], sizeof(buf) - offset, __VA_ARGS__);       \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (sizeof(buf) - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -137,7 +137,7 @@ static int sl_notification(const notification_t *n,
 
   sl_log(log_severity, buf, NULL);
 
-  return (0);
+  return 0;
 } /* int sl_notification */
 
 void module_register(void) {
index 3e8fead..578e019 100644 (file)
@@ -520,5 +520,3 @@ void module_register(void) {
   plugin_register_complex_config("table", tbl_config);
   plugin_register_init("table", tbl_init);
 } /* module_register */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index bb4eb30..1b720b8 100644 (file)
@@ -66,7 +66,7 @@ static int ctail_config_add_match_dstype(ctail_config_match_t *cm,
                                          oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("tail plugin: `DSType' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   char const *ds_type = ci->values[0].value.string;
@@ -93,7 +93,7 @@ static int ctail_config_add_match_dstype(ctail_config_match_t *cm,
 
     int status = latency_config(&cm->latency, ci, "tail");
     if (status != 0)
-      return (status);
+      return status;
   } else if (strncasecmp("Counter", ds_type, strlen("Counter")) == 0) {
     cm->flags = UTILS_MATCH_DS_TYPE_COUNTER;
     if (strcasecmp("CounterSet", ds_type) == 0)
@@ -127,10 +127,10 @@ static int ctail_config_add_match_dstype(ctail_config_match_t *cm,
   if (cm->flags == 0) {
     WARNING("tail plugin: `%s' is not a valid argument to `DSType'.",
             ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int ctail_config_add_match_dstype */
 
 static int ctail_config_add_match(cu_tail_match_t *tm,
@@ -204,7 +204,7 @@ static int ctail_config_add_match(cu_tail_match_t *tm,
   sfree(cm.type_instance);
   latency_config_free(cm.latency);
 
-  return (status);
+  return status;
 } /* int ctail_config_add_match */
 
 static int ctail_config_add_file(oconfig_item_t *ci) {
@@ -215,14 +215,14 @@ static int ctail_config_add_file(oconfig_item_t *ci) {
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("tail plugin: `File' needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   tm = tail_match_create(ci->values[0].value.string);
   if (tm == NULL) {
     ERROR("tail plugin: tail_match_create (%s) failed.",
           ci->values[0].value.string);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -253,7 +253,7 @@ static int ctail_config_add_file(oconfig_item_t *ci) {
     ERROR("tail plugin: No (valid) matches found for file `%s'.",
           ci->values[0].value.string);
     tail_match_destroy(tm);
-    return (-1);
+    return -1;
   } else {
     cu_tail_match_t **temp;
 
@@ -262,7 +262,7 @@ static int ctail_config_add_file(oconfig_item_t *ci) {
     if (temp == NULL) {
       ERROR("tail plugin: realloc failed.");
       tail_match_destroy(tm);
-      return (-1);
+      return -1;
     }
 
     tail_match_list = temp;
@@ -271,7 +271,7 @@ static int ctail_config_add_file(oconfig_item_t *ci) {
     tail_match_list_num++;
   }
 
-  return (0);
+  return 0;
 } /* int ctail_config_add_file */
 
 static int ctail_config(oconfig_item_t *ci) {
@@ -285,7 +285,7 @@ static int ctail_config(oconfig_item_t *ci) {
     }
   } /* for (i = 0; i < ci->children_num; i++) */
 
-  return (0);
+  return 0;
 } /* int ctail_config */
 
 static int ctail_read(user_data_t *ud) {
@@ -294,10 +294,10 @@ static int ctail_read(user_data_t *ud) {
   status = tail_match_read((cu_tail_match_t *)ud->data);
   if (status != 0) {
     ERROR("tail plugin: tail_match_read failed.");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int ctail_read */
 
 static int ctail_init(void) {
@@ -305,7 +305,7 @@ static int ctail_init(void) {
 
   if (tail_match_list_num == 0) {
     WARNING("tail plugin: File list is empty. Returning an error.");
-    return (-1);
+    return -1;
   }
 
   for (size_t i = 0; i < tail_match_list_num; i++) {
@@ -318,7 +318,7 @@ static int ctail_init(void) {
                                  });
   }
 
-  return (0);
+  return 0;
 } /* int ctail_init */
 
 static int ctail_shutdown(void) {
@@ -329,7 +329,7 @@ static int ctail_shutdown(void) {
   sfree(tail_match_list);
   tail_match_list_num = 0;
 
-  return (0);
+  return 0;
 } /* int ctail_shutdown */
 
 void module_register(void) {
@@ -337,5 +337,3 @@ void module_register(void) {
   plugin_register_init("tail", ctail_init);
   plugin_register_shutdown("tail", ctail_shutdown);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index b1a3292..d512a52 100644 (file)
@@ -77,7 +77,7 @@ static int tcsv_submit(instance_definition_t *id, metric_definition_t *md,
   vl.time = t;
   vl.interval = id->interval;
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 }
 
 static cdtime_t parse_time(char const *tbuf) {
@@ -87,9 +87,9 @@ static cdtime_t parse_time(char const *tbuf) {
   errno = 0;
   t = strtod(tbuf, &endptr);
   if ((errno != 0) || (endptr == NULL) || (endptr[0] != 0))
-    return (cdtime());
+    return cdtime();
 
-  return (DOUBLE_TO_CDTIME_T(t));
+  return DOUBLE_TO_CDTIME_T(t);
 }
 
 static int tcsv_read_metric(instance_definition_t *id, metric_definition_t *md,
@@ -99,23 +99,23 @@ static int tcsv_read_metric(instance_definition_t *id, metric_definition_t *md,
   int status;
 
   if (md->data_source_type == -1)
-    return (EINVAL);
+    return EINVAL;
 
   assert(md->value_from >= 0);
   if (((size_t)md->value_from) >= fields_num)
-    return (EINVAL);
+    return EINVAL;
 
   status = parse_value(fields[md->value_from], &v, md->data_source_type);
   if (status != 0)
-    return (status);
+    return status;
 
   if (id->time_from >= 0) {
     if (((size_t)id->time_from) >= fields_num)
-      return (EINVAL);
+      return EINVAL;
     t = parse_time(fields[id->time_from]);
   }
 
-  return (tcsv_submit(id, md, v, t));
+  return tcsv_submit(id, md, v, t);
 }
 
 static _Bool tcsv_check_index(ssize_t index, size_t fields_num,
@@ -128,7 +128,7 @@ static _Bool tcsv_check_index(ssize_t index, size_t fields_num,
   ERROR("tail_csv plugin: Metric \"%s\": Request for index %zd when "
         "only %zu fields are available.",
         name, index, fields_num);
-  return (0);
+  return 0;
 }
 
 static int tcsv_read_buffer(instance_definition_t *id, char *buffer,
@@ -152,7 +152,7 @@ static int tcsv_read_buffer(instance_definition_t *id, char *buffer,
 
   /* Ignore empty lines. */
   if ((buffer_size == 0) || (buffer[0] == '#'))
-    return (0);
+    return 0;
 
   /* Count the number of fields. */
   metrics_num = 1;
@@ -165,14 +165,14 @@ static int tcsv_read_buffer(instance_definition_t *id, char *buffer,
     ERROR("tail_csv plugin: last line of `%s' does not contain "
           "enough values.",
           id->path);
-    return (-1);
+    return -1;
   }
 
   /* Create a list of all values */
   metrics = calloc(metrics_num, sizeof(*metrics));
   if (metrics == NULL) {
     ERROR("tail_csv plugin: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   ptr = buffer;
@@ -201,7 +201,7 @@ static int tcsv_read_buffer(instance_definition_t *id, char *buffer,
 
   /* Free up resources */
   sfree(metrics);
-  return (0);
+  return 0;
 }
 
 static int tcsv_read(user_data_t *ud) {
@@ -212,7 +212,7 @@ static int tcsv_read(user_data_t *ud) {
     id->tail = cu_tail_create(id->path);
     if (id->tail == NULL) {
       ERROR("tail_csv plugin: cu_tail_create (\"%s\") failed.", id->path);
-      return (-1);
+      return -1;
     }
   }
 
@@ -226,7 +226,7 @@ static int tcsv_read(user_data_t *ud) {
       ERROR("tail_csv plugin: File \"%s\": cu_tail_readline failed "
             "with status %i.",
             id->path, status);
-      return (-1);
+      return -1;
     }
 
     buffer_len = strlen(buffer);
@@ -236,7 +236,7 @@ static int tcsv_read(user_data_t *ud) {
     tcsv_read_buffer(id, buffer, buffer_len);
   }
 
-  return (0);
+  return 0;
 }
 
 static void tcsv_metric_definition_destroy(void *arg) {
@@ -263,18 +263,18 @@ static int tcsv_config_get_index(oconfig_item_t *ci, ssize_t *ret_index) {
     WARNING("tail_csv plugin: The \"%s\" config option needs exactly one "
             "integer argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.number < 0) {
     WARNING("tail_csv plugin: The \"%s\" config option must be positive "
             "(or zero).",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_index = (ssize_t)ci->values[0].value.number;
-  return (0);
+  return 0;
 }
 
 /* Parse metric  */
@@ -284,7 +284,7 @@ static int tcsv_config_add_metric(oconfig_item_t *ci) {
 
   md = calloc(1, sizeof(*md));
   if (md == NULL)
-    return (-1);
+    return -1;
   md->name = NULL;
   md->type = NULL;
   md->instance = NULL;
@@ -295,7 +295,7 @@ static int tcsv_config_add_metric(oconfig_item_t *ci) {
   status = cf_util_get_string(ci, &md->name);
   if (status != 0) {
     sfree(md);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->children_num; ++i) {
@@ -318,7 +318,7 @@ static int tcsv_config_add_metric(oconfig_item_t *ci) {
 
   if (status != 0) {
     tcsv_metric_definition_destroy(md);
-    return (-1);
+    return -1;
   }
 
   /* Verify all necessary options have been set. */
@@ -331,7 +331,7 @@ static int tcsv_config_add_metric(oconfig_item_t *ci) {
   }
   if (status != 0) {
     tcsv_metric_definition_destroy(md);
-    return (status);
+    return status;
   }
 
   if (metric_head == NULL)
@@ -344,7 +344,7 @@ static int tcsv_config_add_metric(oconfig_item_t *ci) {
     last->next = md;
   }
 
-  return (0);
+  return 0;
 }
 
 static void tcsv_instance_definition_destroy(void *arg) {
@@ -373,14 +373,14 @@ static int tcsv_config_add_instance_collect(instance_definition_t *id,
   if (ci->values_num < 1) {
     WARNING("tail_csv plugin: The `Collect' config option needs at least one "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   metric_list_size = id->metric_list_len + (size_t)ci->values_num;
   metric_list =
       realloc(id->metric_list, sizeof(*id->metric_list) * metric_list_size);
   if (metric_list == NULL)
-    return (-1);
+    return -1;
   id->metric_list = metric_list;
 
   for (int i = 0; i < ci->values_num; i++) {
@@ -406,7 +406,7 @@ static int tcsv_config_add_instance_collect(instance_definition_t *id,
     id->metric_list_len++;
   }
 
-  return (0);
+  return 0;
 }
 
 /* <File /> block */
@@ -419,7 +419,7 @@ static int tcsv_config_add_file(oconfig_item_t *ci) {
 
   id = calloc(1, sizeof(*id));
   if (id == NULL)
-    return (-1);
+    return -1;
   id->instance = NULL;
   id->path = NULL;
   id->metric_list = NULL;
@@ -429,7 +429,7 @@ static int tcsv_config_add_file(oconfig_item_t *ci) {
   status = cf_util_get_string(ci, &id->path);
   if (status != 0) {
     sfree(id);
-    return (status);
+    return status;
   }
 
   /* Use default interval. */
@@ -458,7 +458,7 @@ static int tcsv_config_add_file(oconfig_item_t *ci) {
 
   if (status != 0) {
     tcsv_instance_definition_destroy(id);
-    return (-1);
+    return -1;
   }
 
   /* Verify all necessary options have been set. */
@@ -472,7 +472,7 @@ static int tcsv_config_add_file(oconfig_item_t *ci) {
 
   if (status != 0) {
     tcsv_instance_definition_destroy(id);
-    return (-1);
+    return -1;
   }
 
   ssnprintf(cb_name, sizeof(cb_name), "tail_csv/%s", id->path);
@@ -485,10 +485,10 @@ static int tcsv_config_add_file(oconfig_item_t *ci) {
   if (status != 0) {
     ERROR("tail_csv plugin: Registering complex read function failed.");
     tcsv_instance_definition_destroy(id);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 /* Parse blocks */
@@ -504,7 +504,7 @@ static int tcsv_config(oconfig_item_t *ci) {
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* int tcsv_config */
 
 static int tcsv_init(void) { /* {{{ */
@@ -512,7 +512,7 @@ static int tcsv_init(void) { /* {{{ */
   metric_definition_t *md;
 
   if (have_init)
-    return (0);
+    return 0;
 
   for (md = metric_head; md != NULL; md = md->next) {
     data_set_t const *ds;
@@ -536,14 +536,14 @@ static int tcsv_init(void) { /* {{{ */
     md->data_source_type = ds->ds->type;
   }
 
-  return (0);
+  return 0;
 } /* }}} int tcsv_init */
 
 static int tcsv_shutdown(void) {
   tcsv_metric_definition_destroy(metric_head);
   metric_head = NULL;
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -551,5 +551,3 @@ void module_register(void) {
   plugin_register_init("tail_csv", tcsv_init);
   plugin_register_shutdown("tail_csv", tcsv_shutdown);
 }
-
-/* vim: set sw=4 sts=4 et : */
index 3f4bb55..debb1d2 100644 (file)
@@ -40,7 +40,7 @@ static int tape_init(void) {
   numtape = 0;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   for (numtape = 0, ksp_chain = kc->kc_chain;
        (numtape < MAX_NUMTAPE) && (ksp_chain != NULL);
@@ -52,7 +52,7 @@ static int tape_init(void) {
     ksp[numtape++] = ksp_chain;
   }
 
-  return (0);
+  return 0;
 } /* int tape_init */
 
 static void tape_submit(const char *plugin_instance, const char *type,
@@ -94,10 +94,10 @@ static int tape_read(void) {
   static kstat_io_t kio;
 
   if (kc == NULL)
-    return (-1);
+    return -1;
 
   if (numtape <= 0)
-    return (-1);
+    return -1;
 
   for (int i = 0; i < numtape; i++) {
     if (kstat_read(kc, ksp[i], &kio) == -1)
@@ -112,7 +112,7 @@ static int tape_read(void) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index dc93b98..2041510 100644 (file)
@@ -43,7 +43,7 @@ static int tn_config_add_severity(tn_data_t *data, /* {{{ */
     ERROR("Target `notification': The `%s' option requires exactly one string "
           "argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if ((strcasecmp("FAILURE", ci->values[0].value.string) == 0) ||
@@ -61,7 +61,7 @@ static int tn_config_add_severity(tn_data_t *data, /* {{{ */
     data->severity = NOTIF_FAILURE;
   }
 
-  return (0);
+  return 0;
 } /* }}} int tn_config_add_severity */
 
 static int tn_config_add_string(char **dest, /* {{{ */
@@ -69,32 +69,32 @@ static int tn_config_add_string(char **dest, /* {{{ */
   char *temp;
 
   if (dest == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     ERROR("Target `notification': The `%s' option requires exactly one string "
           "argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if (ci->values[0].value.string[0] == 0) {
     ERROR(
         "Target `notification': The `%s' option does not accept empty strings.",
         ci->key);
-    return (-1);
+    return -1;
   }
 
   temp = sstrdup(ci->values[0].value.string);
   if (temp == NULL) {
     ERROR("tn_config_add_string: sstrdup failed.");
-    return (-1);
+    return -1;
   }
 
   free(*dest);
   *dest = temp;
 
-  return (0);
+  return 0;
 } /* }}} int tn_config_add_string */
 
 static int tn_destroy(void **user_data) /* {{{ */
@@ -102,16 +102,16 @@ static int tn_destroy(void **user_data) /* {{{ */
   tn_data_t *data;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL)
-    return (0);
+    return 0;
 
   sfree(data->message);
   sfree(data);
 
-  return (0);
+  return 0;
 } /* }}} int tn_destroy */
 
 static int tn_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -122,7 +122,7 @@ static int tn_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   data = calloc(1, sizeof(*data));
   if (data == NULL) {
     ERROR("tn_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   data->message = NULL;
@@ -168,11 +168,11 @@ static int tn_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     tn_destroy((void *)&data);
-    return (status);
+    return status;
   }
 
   *user_data = data;
-  return (0);
+  return 0;
 } /* }}} int tn_create */
 
 static int tn_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -186,12 +186,12 @@ static int tn_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
   int rates_failed;
 
   if ((ds == NULL) || (vl == NULL) || (user_data == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL) {
     ERROR("Target `notification': Invoke: `data' is NULL.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   /* Initialize the structure. */
@@ -249,7 +249,7 @@ static int tn_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
 
   plugin_dispatch_notification(&n);
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int tn_invoke */
 
 void module_register(void) {
@@ -260,5 +260,3 @@ void module_register(void) {
   tproc.invoke = tn_invoke;
   fc_register_target("notification", tproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index b43a025..66fc98d 100644 (file)
@@ -68,16 +68,16 @@ static char *tr_strdup(const char *orig) /* {{{ */
   char *dest;
 
   if (orig == NULL)
-    return (NULL);
+    return NULL;
 
   sz = strlen(orig) + 1;
   dest = malloc(sz);
   if (dest == NULL)
-    return (NULL);
+    return NULL;
 
   memcpy(dest, orig, sz);
 
-  return (dest);
+  return dest;
 } /* }}} char *tr_strdup */
 
 static void tr_action_destroy(tr_action_t *act) /* {{{ */
@@ -115,20 +115,20 @@ static int tr_config_add_action(tr_action_t **dest, /* {{{ */
   int status;
 
   if (dest == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if ((ci->values_num != 2) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
       (ci->values[1].type != OCONFIG_TYPE_STRING)) {
     ERROR("Target `replace': The `%s' option requires exactly two string "
           "arguments.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   act = calloc(1, sizeof(*act));
   if (act == NULL) {
     ERROR("tr_config_add_action: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   act->replacement = NULL;
@@ -144,14 +144,14 @@ static int tr_config_add_action(tr_action_t **dest, /* {{{ */
           "failed: %s.",
           ci->values[0].value.string, errbuf);
     sfree(act);
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   act->replacement = tr_strdup(ci->values[1].value.string);
   if (act->replacement == NULL) {
     ERROR("tr_config_add_action: tr_strdup failed.");
     tr_action_destroy(act);
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   /* Insert action at end of list. */
@@ -167,7 +167,7 @@ static int tr_config_add_action(tr_action_t **dest, /* {{{ */
     prev->next = act;
   }
 
-  return (0);
+  return 0;
 } /* }}} int tr_config_add_action */
 
 static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
@@ -177,7 +177,7 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
   int status;
 
   if (dest == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if (should_delete) {
     if ((ci->values_num != 2) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
@@ -185,7 +185,7 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
       ERROR("Target `replace': The `%s' option requires exactly two string "
             "arguments.",
             ci->key);
-      return (-1);
+      return -1;
     }
   } else {
     if ((ci->values_num != 3) || (ci->values[0].type != OCONFIG_TYPE_STRING) ||
@@ -194,7 +194,7 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
       ERROR("Target `replace': The `%s' option requires exactly three string "
             "arguments.",
             ci->key);
-      return (-1);
+      return -1;
     }
   }
 
@@ -202,13 +202,13 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
     ERROR("Target `replace': The `%s' option does not accept empty string as "
           "first argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   act = calloc(1, sizeof(*act));
   if (act == NULL) {
     ERROR("tr_config_add_meta_action: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   act->key = NULL;
@@ -225,14 +225,14 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
           ci->values[1].value.string, errbuf);
     sfree(act->key);
     sfree(act);
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   act->key = tr_strdup(ci->values[0].value.string);
   if (act->key == NULL) {
     ERROR("tr_config_add_meta_action: tr_strdup failed.");
     tr_meta_data_action_destroy(act);
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   if (!should_delete) {
@@ -240,7 +240,7 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
     if (act->replacement == NULL) {
       ERROR("tr_config_add_meta_action: tr_strdup failed.");
       tr_meta_data_action_destroy(act);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
   }
 
@@ -257,7 +257,7 @@ static int tr_config_add_meta_action(tr_meta_data_action_t **dest, /* {{{ */
     prev->next = act;
   }
 
-  return (0);
+  return 0;
 } /* }}} int tr_config_add_meta_action */
 
 static int tr_action_invoke(tr_action_t *act_head, /* {{{ */
@@ -268,7 +268,7 @@ static int tr_action_invoke(tr_action_t *act_head, /* {{{ */
   regmatch_t matches[8] = {[0] = {0}};
 
   if (act_head == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   sstrncpy(buffer, buffer_in, sizeof(buffer));
 
@@ -308,13 +308,13 @@ static int tr_action_invoke(tr_action_t *act_head, /* {{{ */
   if ((may_be_empty == 0) && (buffer[0] == 0)) {
     WARNING("Target `replace': Replacement resulted in an empty string, "
             "which is not allowed for this buffer (`host' or `plugin').");
-    return (0);
+    return 0;
   }
 
   DEBUG("target_replace plugin: tr_action_invoke: -> buffer = %s;", buffer);
   sstrncpy(buffer_in, buffer, buffer_in_size);
 
-  return (0);
+  return 0;
 } /* }}} int tr_action_invoke */
 
 static int tr_meta_data_action_invoke(/* {{{ */
@@ -324,10 +324,10 @@ static int tr_meta_data_action_invoke(/* {{{ */
   regmatch_t matches[8] = {[0] = {0}};
 
   if (act_head == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if ((*dest) == NULL) /* nothing to do */
-    return (0);
+    return 0;
 
   for (tr_meta_data_action_t *act = act_head; act != NULL; act = act->next) {
     char temp[DATA_MAX_NAME_LEN];
@@ -351,7 +351,7 @@ static int tr_meta_data_action_invoke(/* {{{ */
     if (meta_data_status != 0) {
       ERROR("Target `replace': Unable to retrieve metadata value for `%s'.",
             act->key);
-      return (meta_data_status);
+      return meta_data_status;
     }
 
     DEBUG("target_replace plugin: tr_meta_data_action_invoke: `%s' "
@@ -401,7 +401,7 @@ static int tr_meta_data_action_invoke(/* {{{ */
     if ((result = meta_data_create()) == NULL) {
       ERROR("Target `replace': failed to create metadata for `%s'.", act->key);
       sfree(value);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     meta_data_status = meta_data_add_string(result, act->key, temp);
@@ -410,7 +410,7 @@ static int tr_meta_data_action_invoke(/* {{{ */
             act->key);
       meta_data_destroy(result);
       sfree(value);
-      return (meta_data_status);
+      return meta_data_status;
     }
 
     meta_data_clone_merge(dest, result);
@@ -418,7 +418,7 @@ static int tr_meta_data_action_invoke(/* {{{ */
     sfree(value);
   } /* for (act = act_head; act != NULL; act = act->next) */
 
-  return (0);
+  return 0;
 } /* }}} int tr_meta_data_action_invoke */
 
 static int tr_destroy(void **user_data) /* {{{ */
@@ -426,11 +426,11 @@ static int tr_destroy(void **user_data) /* {{{ */
   tr_data_t *data;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL)
-    return (0);
+    return 0;
 
   tr_action_destroy(data->host);
   tr_action_destroy(data->plugin);
@@ -440,7 +440,7 @@ static int tr_destroy(void **user_data) /* {{{ */
   tr_meta_data_action_destroy(data->meta);
   sfree(data);
 
-  return (0);
+  return 0;
 } /* }}} int tr_destroy */
 
 static int tr_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -451,7 +451,7 @@ static int tr_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   data = calloc(1, sizeof(*data));
   if (data == NULL) {
     ERROR("tr_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   data->host = NULL;
@@ -516,11 +516,11 @@ static int tr_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     tr_destroy((void *)&data);
-    return (status);
+    return status;
   }
 
   *user_data = data;
-  return (0);
+  return 0;
 } /* }}} int tr_create */
 
 static int tr_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -529,12 +529,12 @@ static int tr_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
   tr_data_t *data;
 
   if ((ds == NULL) || (vl == NULL) || (user_data == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL) {
     ERROR("Target `replace': Invoke: `data' is NULL.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   if (data->meta != NULL) {
@@ -550,7 +550,7 @@ static int tr_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
   /* HANDLE_FIELD (type, 0); */
   HANDLE_FIELD(type_instance, 1);
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int tr_invoke */
 
 void module_register(void) {
@@ -561,5 +561,3 @@ void module_register(void) {
   tproc.invoke = tr_invoke;
   fc_register_target("replace", tproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 347d627..8ec53d4 100644 (file)
@@ -120,7 +120,7 @@ static int ts_invoke_counter(const data_set_t *ds, value_list_t *vl, /* {{{ */
   uc_meta_data_add_unsigned_int(vl, key_int_counter, int_counter);
   uc_meta_data_add_double(vl, key_int_fraction, int_fraction);
 
-  return (0);
+  return 0;
 } /* }}} int ts_invoke_counter */
 
 static int ts_invoke_gauge(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -130,7 +130,7 @@ static int ts_invoke_gauge(const data_set_t *ds, value_list_t *vl, /* {{{ */
   if (!isnan(data->offset))
     vl->values[dsrc_index].gauge += data->offset;
 
-  return (0);
+  return 0;
 } /* }}} int ts_invoke_gauge */
 
 static int ts_invoke_derive(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -217,7 +217,7 @@ static int ts_invoke_derive(const data_set_t *ds, value_list_t *vl, /* {{{ */
   uc_meta_data_add_signed_int(vl, key_int_derive, int_derive);
   uc_meta_data_add_double(vl, key_int_fraction, int_fraction);
 
-  return (0);
+  return 0;
 } /* }}} int ts_invoke_derive */
 
 static int ts_invoke_absolute(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -260,7 +260,7 @@ static int ts_invoke_absolute(const data_set_t *ds, value_list_t *vl, /* {{{ */
   /* Update to the new absolute value */
   uc_meta_data_add_double(vl, key_int_fraction, int_fraction);
 
-  return (0);
+  return 0;
 } /* }}} int ts_invoke_absolute */
 
 static int ts_config_set_double(double *ret, oconfig_item_t *ci) /* {{{ */
@@ -269,13 +269,13 @@ static int ts_config_set_double(double *ret, oconfig_item_t *ci) /* {{{ */
     WARNING("scale target: The `%s' config option needs "
             "exactly one numeric argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret = ci->values[0].value.number;
   DEBUG("ts_config_set_double: *ret = %g", *ret);
 
-  return (0);
+  return 0;
 } /* }}} int ts_config_set_double */
 
 static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
@@ -286,7 +286,7 @@ static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
   /* Check number of arbuments. */
   if (ci->values_num < 1) {
     ERROR("`value' match: `%s' needs at least one argument.", ci->key);
-    return (-1);
+    return -1;
   }
 
   /* Check type of arguments */
@@ -299,7 +299,7 @@ static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
           ci->key, i + 1,
           (ci->values[i].type == OCONFIG_TYPE_BOOLEAN) ? "truth value"
                                                        : "number");
-    return (-1);
+    return -1;
   }
 
   /* Allocate space for the char pointers */
@@ -307,7 +307,7 @@ static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
   temp = realloc(data->data_sources, new_data_sources_num * sizeof(char *));
   if (temp == NULL) {
     ERROR("`value' match: realloc failed.");
-    return (-1);
+    return -1;
   }
   data->data_sources = temp;
 
@@ -327,7 +327,7 @@ static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
     data->data_sources_num++;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ts_config_add_data_source */
 
 static int ts_destroy(void **user_data) /* {{{ */
@@ -335,7 +335,7 @@ static int ts_destroy(void **user_data) /* {{{ */
   ts_data_t *data;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   data = (ts_data_t *)*user_data;
 
@@ -348,7 +348,7 @@ static int ts_destroy(void **user_data) /* {{{ */
   sfree(data);
   *user_data = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int ts_destroy */
 
 static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -359,7 +359,7 @@ static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   data = calloc(1, sizeof(*data));
   if (data == NULL) {
     ERROR("ts_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   data->factor = NAN;
@@ -399,11 +399,11 @@ static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     ts_destroy((void *)&data);
-    return (status);
+    return status;
   }
 
   *user_data = data;
-  return (0);
+  return 0;
 } /* }}} int ts_create */
 
 static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -412,12 +412,12 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
   ts_data_t *data;
 
   if ((ds == NULL) || (vl == NULL) || (user_data == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL) {
     ERROR("Target `scale': Invoke: `data' is NULL.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   for (size_t i = 0; i < ds->ds_num; i++) {
@@ -446,7 +446,7 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
             ds->ds[i].type);
   }
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int ts_invoke */
 
 void module_register(void) {
@@ -457,5 +457,3 @@ void module_register(void) {
   tproc.invoke = ts_invoke;
   fc_register_target("scale", tproc);
 } /* module_register */
-
-/* vim: set sw=2 ts=2 tw=78 fdm=marker : */
index a40273c..e3ec269 100644 (file)
@@ -70,13 +70,13 @@ static int ts_util_get_key_and_string_wo_strdup(const oconfig_item_t *ci,
     ERROR("ts_util_get_key_and_string_wo_strdup: The %s option requires "
           "exactly two string arguments.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   *ret_key = ci->values[0].value.string;
   *ret_string = ci->values[1].value.string;
 
-  return (0);
+  return 0;
 } /* }}} int ts_util_get_key_and_string_wo_strdup */
 
 static int ts_config_add_string(char **dest, /* {{{ */
@@ -86,17 +86,17 @@ static int ts_config_add_string(char **dest, /* {{{ */
 
   status = cf_util_get_string(ci, &tmp);
   if (status != 0)
-    return (status);
+    return status;
 
   if (!may_be_empty && (strlen(tmp) == 0)) {
     ERROR("Target `set': The `%s' option does not accept empty strings.",
           ci->key);
     sfree(tmp);
-    return (-1);
+    return -1;
   }
 
   *dest = tmp;
-  return (0);
+  return 0;
 } /* }}} int ts_config_add_string */
 
 static int ts_config_add_meta(meta_data_t **dest, /* {{{ */
@@ -107,31 +107,31 @@ static int ts_config_add_meta(meta_data_t **dest, /* {{{ */
 
   status = ts_util_get_key_and_string_wo_strdup(ci, &key, &string);
   if (status != 0)
-    return (status);
+    return status;
 
   if (strlen(key) == 0) {
     ERROR("Target `set': The `%s' option does not accept empty string as "
           "first argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if (!may_be_empty && (strlen(string) == 0)) {
     ERROR("Target `set': The `%s' option does not accept empty string as "
           "second argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
 
   if ((*dest) == NULL) {
     /* Create a new meta_data_t */
     if ((*dest = meta_data_create()) == NULL) {
       ERROR("Target `set': failed to create a meta data for `%s'.", ci->key);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
   }
 
-  return (meta_data_add_string(*dest, key, string));
+  return meta_data_add_string(*dest, key, string);
 } /* }}} int ts_config_add_meta */
 
 static int ts_config_add_meta_delete(ts_key_list_t **dest, /* {{{ */
@@ -141,12 +141,12 @@ static int ts_config_add_meta_delete(ts_key_list_t **dest, /* {{{ */
   entry = calloc(1, sizeof(*entry));
   if (entry == NULL) {
     ERROR("ts_config_add_meta_delete: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   if (cf_util_get_string(ci, &entry->key) != 0) {
     ts_key_list_free(entry);
-    return (-1); /* An error has already been reported. */
+    return -1; /* An error has already been reported. */
   }
 
   if (strlen(entry->key) == 0) {
@@ -154,13 +154,13 @@ static int ts_config_add_meta_delete(ts_key_list_t **dest, /* {{{ */
           "first argument.",
           ci->key);
     ts_key_list_free(entry);
-    return (-1);
+    return -1;
   }
 
   entry->next = *dest;
   *dest = entry;
 
-  return (0);
+  return 0;
 } /* }}} int ts_config_add_meta_delete */
 
 static void ts_subst(char *dest, size_t size, const char *string, /* {{{ */
@@ -210,11 +210,11 @@ static int ts_destroy(void **user_data) /* {{{ */
   ts_data_t *data;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL)
-    return (0);
+    return 0;
 
   free(data->host);
   free(data->plugin);
@@ -225,7 +225,7 @@ static int ts_destroy(void **user_data) /* {{{ */
   ts_key_list_free(data->meta_delete);
   free(data);
 
-  return (0);
+  return 0;
 } /* }}} int ts_destroy */
 
 static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
@@ -236,7 +236,7 @@ static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
   data = calloc(1, sizeof(*data));
   if (data == NULL) {
     ERROR("ts_create: calloc failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   data->host = NULL;
@@ -315,11 +315,11 @@ static int ts_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 
   if (status != 0) {
     ts_destroy((void *)&data);
-    return (status);
+    return status;
   }
 
   *user_data = data;
-  return (0);
+  return 0;
 } /* }}} int ts_create */
 
 static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
@@ -330,12 +330,12 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
   meta_data_t *new_meta = NULL;
 
   if ((ds == NULL) || (vl == NULL) || (user_data == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   data = *user_data;
   if (data == NULL) {
     ERROR("Target `set': Invoke: `data' is NULL.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   orig = *vl;
@@ -347,7 +347,7 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
 
     if ((new_meta = meta_data_create()) == NULL) {
       ERROR("Target `set': failed to create replacement metadata.");
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     meta_entries = meta_data_toc(data->meta, &meta_toc);
@@ -362,7 +362,7 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
               key);
         strarray_free(meta_toc, (size_t)meta_entries);
         meta_data_destroy(new_meta);
-        return (status);
+        return status;
       }
 
       ts_subst(temp, sizeof(temp), string, &orig);
@@ -378,7 +378,7 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
         ERROR("Target `set': Unable to set metadata value `%s'.", key);
         strarray_free(meta_toc, (size_t)meta_entries);
         meta_data_destroy(new_meta);
-        return (status);
+        return status;
       }
     }
 
@@ -409,7 +409,7 @@ static int ts_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
     meta_data_delete(vl->meta, l->key);
   }
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int ts_invoke */
 
 void module_register(void) {
@@ -420,5 +420,3 @@ void module_register(void) {
   tproc.invoke = ts_invoke;
   fc_register_target("set", tproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 54e37e1..90f8e00 100644 (file)
@@ -56,7 +56,7 @@ static int v5_df(const data_set_t *ds, value_list_t *vl) /* {{{ */
 
   /* Can't upgrade if both instances have been set. */
   if ((vl->plugin_instance[0] != 0) && (vl->type_instance[0] != 0))
-    return (FC_TARGET_CONTINUE);
+    return FC_TARGET_CONTINUE;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -83,7 +83,7 @@ static int v5_df(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_df */
 
 /*
@@ -96,10 +96,10 @@ static int v5_df(const data_set_t *ds, value_list_t *vl) /* {{{ */
 static int v5_interface(const data_set_t *ds, value_list_t *vl) /* {{{ */
 {
   if ((vl->plugin_instance[0] != 0) || (vl->type_instance[0] == 0))
-    return (FC_TARGET_CONTINUE);
+    return FC_TARGET_CONTINUE;
 
   v5_swap_instances(vl);
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int v5_interface */
 
 /*
@@ -113,7 +113,7 @@ static int v5_mysql_qcache(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 5)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -153,7 +153,7 @@ static int v5_mysql_qcache(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_mysql_qcache */
 
 /*
@@ -167,7 +167,7 @@ static int v5_mysql_threads(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 4)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -201,7 +201,7 @@ static int v5_mysql_threads(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_mysql_threads */
 
 /*
@@ -216,14 +216,14 @@ static int v5_zfs_arc_counts(const data_set_t *ds, value_list_t *vl) /* {{{ */
   _Bool is_hits;
 
   if (vl->values_len != 4)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   if (strcmp("hits", vl->type_instance) == 0)
     is_hits = 1;
   else if (strcmp("misses", vl->type_instance) == 0)
     is_hits = 0;
   else
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -258,7 +258,7 @@ static int v5_zfs_arc_counts(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_zfs_arc_counts */
 
 /*
@@ -271,7 +271,7 @@ static int v5_zfs_arc_l2_bytes(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 2)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -295,7 +295,7 @@ static int v5_zfs_arc_l2_bytes(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_zfs_arc_l2_bytes */
 
 /*
@@ -309,7 +309,7 @@ static int v5_zfs_arc_l2_size(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 1)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -331,7 +331,7 @@ static int v5_zfs_arc_l2_size(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_zfs_arc_l2_size */
 
 /*
@@ -345,7 +345,7 @@ static int v5_zfs_arc_ratio(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 1)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -368,7 +368,7 @@ static int v5_zfs_arc_ratio(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_zfs_arc_ratio */
 
 /*
@@ -382,7 +382,7 @@ static int v5_zfs_arc_size(const data_set_t *ds, value_list_t *vl) /* {{{ */
   value_list_t new_vl;
 
   if (vl->values_len != 4)
-    return (FC_TARGET_STOP);
+    return FC_TARGET_STOP;
 
   /* Copy everything: Time, interval, host, ... */
   memcpy(&new_vl, vl, sizeof(new_vl));
@@ -401,46 +401,46 @@ static int v5_zfs_arc_size(const data_set_t *ds, value_list_t *vl) /* {{{ */
   plugin_dispatch_values(&new_vl);
 
   /* Abort processing */
-  return (FC_TARGET_STOP);
+  return FC_TARGET_STOP;
 } /* }}} int v5_zfs_arc_size */
 
 static int v5_destroy(void **user_data) /* {{{ */
 {
-  return (0);
+  return 0;
 } /* }}} int v5_destroy */
 
 static int v5_create(const oconfig_item_t *ci, void **user_data) /* {{{ */
 {
   *user_data = NULL;
-  return (0);
+  return 0;
 } /* }}} int v5_create */
 
 static int v5_invoke(const data_set_t *ds, value_list_t *vl, /* {{{ */
                      notification_meta_t __attribute__((unused)) * *meta,
                      void __attribute__((unused)) * *user_data) {
   if ((ds == NULL) || (vl == NULL) || (user_data == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (strcmp("df", vl->type) == 0)
-    return (v5_df(ds, vl));
+    return v5_df(ds, vl);
   else if (strcmp("interface", vl->plugin) == 0)
-    return (v5_interface(ds, vl));
+    return v5_interface(ds, vl);
   else if (strcmp("mysql_qcache", vl->type) == 0)
-    return (v5_mysql_qcache(ds, vl));
+    return v5_mysql_qcache(ds, vl);
   else if (strcmp("mysql_threads", vl->type) == 0)
-    return (v5_mysql_threads(ds, vl));
+    return v5_mysql_threads(ds, vl);
   else if (strcmp("arc_counts", vl->type) == 0)
-    return (v5_zfs_arc_counts(ds, vl));
+    return v5_zfs_arc_counts(ds, vl);
   else if (strcmp("arc_l2_bytes", vl->type) == 0)
-    return (v5_zfs_arc_l2_bytes(ds, vl));
+    return v5_zfs_arc_l2_bytes(ds, vl);
   else if (strcmp("arc_l2_size", vl->type) == 0)
-    return (v5_zfs_arc_l2_size(ds, vl));
+    return v5_zfs_arc_l2_size(ds, vl);
   else if (strcmp("arc_ratio", vl->type) == 0)
-    return (v5_zfs_arc_ratio(ds, vl));
+    return v5_zfs_arc_ratio(ds, vl);
   else if (strcmp("arc_size", vl->type) == 0)
-    return (v5_zfs_arc_size(ds, vl));
+    return v5_zfs_arc_size(ds, vl);
 
-  return (FC_TARGET_CONTINUE);
+  return FC_TARGET_CONTINUE;
 } /* }}} int v5_invoke */
 
 void module_register(void) {
@@ -451,5 +451,3 @@ void module_register(void) {
   tproc.invoke = v5_invoke;
   fc_register_target("v5upgrade", tproc);
 } /* module_register */
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 7036d08..f12ce5c 100644 (file)
 #include "common.h"
 #include "plugin.h"
 
-#if defined(__OpenBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__)
+#define HAVE_KVM_GETFILES 1
+#endif
+
+#if defined(__NetBSD__)
 #undef HAVE_SYSCTLBYNAME /* force HAVE_LIBKVM_NLIST path */
 #endif
 
-#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !HAVE_LIBKVM_NLIST && !KERNEL_AIX
+#if !KERNEL_LINUX && !HAVE_SYSCTLBYNAME && !HAVE_KVM_GETFILES && !HAVE_LIBKVM_NLIST && !KERNEL_AIX
 #error "No applicable input method."
 #endif
 
 #include <netinet/tcpip.h>
 /* #endif HAVE_SYSCTLBYNAME */
 
-/* This is for OpenBSD and NetBSD. */
+#elif HAVE_KVM_GETFILES
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#define _KERNEL /* for DTYPE_SOCKET */
+#include <sys/file.h>
+#undef _KERNEL
+
+#include <netinet/in.h>
+
+#include <kvm.h>
+/* #endif HAVE_KVM_GETFILES */
+
+/* This is for NetBSD. */
 #elif HAVE_LIBKVM_NLIST
 #include <arpa/inet.h>
 #include <net/route.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <netinet/ip.h>
 #include <netinet/in_pcb.h>
 #include <netinet/in_systm.h>
-#include <netinet/ip.h>
 #include <netinet/ip_var.h>
 #include <netinet/tcp.h>
 #include <netinet/tcp_timer.h>
@@ -169,6 +185,19 @@ static const char *tcp_state[] = {"CLOSED",    "LISTEN",      "SYN_SENT",
 #define TCP_STATE_MAX 10
 /* #endif HAVE_SYSCTLBYNAME */
 
+#elif HAVE_KVM_GETFILES
+static const char *tcp_state[] = {"CLOSED",    "LISTEN",      "SYN_SENT",
+                                  "SYN_RECV",  "ESTABLISHED", "CLOSE_WAIT",
+                                  "FIN_WAIT1", "CLOSING",     "LAST_ACK",
+                                  "FIN_WAIT2", "TIME_WAIT"};
+
+#define TCP_STATE_LISTEN 1
+#define TCP_STATE_MIN 0
+#define TCP_STATE_MAX 10
+
+static kvm_t *kvmd;
+/* #endif HAVE_KVM_GETFILES */
+
 #elif HAVE_LIBKVM_NLIST
 static const char *tcp_state[] = {"CLOSED",    "LISTEN",      "SYN_SENT",
                                   "SYN_RECV",  "ESTABLISHED", "CLOSE_WAIT",
@@ -327,14 +356,14 @@ static port_entry_t *conn_get_port_entry(uint16_t port, int create) {
   if ((ret == NULL) && (create != 0)) {
     ret = calloc(1, sizeof(*ret));
     if (ret == NULL)
-      return (NULL);
+      return NULL;
 
     ret->port = port;
     ret->next = port_list_head;
     port_list_head = ret;
   }
 
-  return (ret);
+  return ret;
 } /* port_entry_t *conn_get_port_entry */
 
 /* Removes ports that were added automatically due to the `ListeningPorts'
@@ -388,7 +417,7 @@ static int conn_handle_ports(uint16_t port_local, uint16_t port_remote,
     NOTICE("tcpconns plugin: Ignoring connection with "
            "unknown state 0x%02" PRIx8 ".",
            state);
-    return (-1);
+    return -1;
   }
 
   count_total[state]++;
@@ -411,7 +440,7 @@ static int conn_handle_ports(uint16_t port_local, uint16_t port_remote,
   if (pe != NULL)
     pe->count_remote[state]++;
 
-  return (0);
+  return 0;
 } /* int conn_handle_ports */
 
 #if KERNEL_LINUX
@@ -430,7 +459,7 @@ static int conn_read_netlink(void) {
     ERROR("tcpconns plugin: conn_read_netlink: socket(AF_NETLINK, SOCK_RAW, "
           "NETLINK_INET_DIAG) failed: %s",
           sstrerror(errno, buf, sizeof(buf)));
-    return (-1);
+    return -1;
   }
 
   struct sockaddr_nl nladdr = {.nl_family = AF_NETLINK};
@@ -462,7 +491,7 @@ static int conn_read_netlink(void) {
     ERROR("tcpconns plugin: conn_read_netlink: sendmsg(2) failed: %s",
           sstrerror(errno, buf, sizeof(buf)));
     close(fd);
-    return (-1);
+    return -1;
   }
 
   iov.iov_base = buf;
@@ -486,12 +515,12 @@ static int conn_read_netlink(void) {
       ERROR("tcpconns plugin: conn_read_netlink: recvmsg(2) failed: %s",
             sstrerror(errno, buf, sizeof(buf)));
       close(fd);
-      return (-1);
+      return -1;
     } else if (status == 0) {
       close(fd);
       DEBUG("tcpconns plugin: conn_read_netlink: Unexpected zero-sized "
             "reply from netlink socket.");
-      return (0);
+      return 0;
     }
 
     h = (struct nlmsghdr *)buf;
@@ -503,7 +532,7 @@ static int conn_read_netlink(void) {
 
       if (h->nlmsg_type == NLMSG_DONE) {
         close(fd);
-        return (0);
+        return 0;
       } else if (h->nlmsg_type == NLMSG_ERROR) {
         struct nlmsgerr *msg_error;
 
@@ -512,7 +541,7 @@ static int conn_read_netlink(void) {
                 msg_error->error);
 
         close(fd);
-        return (1);
+        return 1;
       }
 
       r = NLMSG_DATA(h);
@@ -526,9 +555,9 @@ static int conn_read_netlink(void) {
   }   /* while (1) */
 
   /* Not reached because the while() loop above handles the exit condition. */
-  return (0);
+  return 0;
 #else
-  return (1);
+  return 1;
 #endif /* HAVE_STRUCT_LINUX_INET_DIAG_REQ */
 } /* int conn_read_netlink */
 
@@ -550,40 +579,40 @@ static int conn_handle_line(char *buffer) {
   while ((buffer_len > 0) && (buffer[buffer_len - 1] < 32))
     buffer[--buffer_len] = '\0';
   if (buffer_len <= 0)
-    return (-1);
+    return -1;
 
   fields_len = strsplit(buffer, fields, STATIC_ARRAY_SIZE(fields));
   if (fields_len < 12) {
     DEBUG("tcpconns plugin: Got %i fields, expected at least 12.", fields_len);
-    return (-1);
+    return -1;
   }
 
   port_local_str = strchr(fields[1], ':');
   port_remote_str = strchr(fields[2], ':');
 
   if ((port_local_str == NULL) || (port_remote_str == NULL))
-    return (-1);
+    return -1;
   port_local_str++;
   port_remote_str++;
   if ((*port_local_str == '\0') || (*port_remote_str == '\0'))
-    return (-1);
+    return -1;
 
   endptr = NULL;
   port_local = (uint16_t)strtol(port_local_str, &endptr, 16);
   if ((endptr == NULL) || (*endptr != '\0'))
-    return (-1);
+    return -1;
 
   endptr = NULL;
   port_remote = (uint16_t)strtol(port_remote_str, &endptr, 16);
   if ((endptr == NULL) || (*endptr != '\0'))
-    return (-1);
+    return -1;
 
   endptr = NULL;
   state = (uint8_t)strtol(fields[3], &endptr, 16);
   if ((endptr == NULL) || (*endptr != '\0'))
-    return (-1);
+    return -1;
 
-  return (conn_handle_ports(port_local, port_remote, state));
+  return conn_handle_ports(port_local, port_remote, state);
 } /* int conn_handle_line */
 
 static int conn_read_file(const char *file) {
@@ -592,7 +621,7 @@ static int conn_read_file(const char *file) {
 
   fh = fopen(file, "r");
   if (fh == NULL)
-    return (-1);
+    return -1;
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
     conn_handle_line(buffer);
@@ -600,7 +629,7 @@ static int conn_read_file(const char *file) {
 
   fclose(fh);
 
-  return (0);
+  return 0;
 } /* int conn_read_file */
 /* #endif KERNEL_LINUX */
 
@@ -623,13 +652,13 @@ static int conn_config(const char *key, const char *value) {
 
     if ((port < 1) || (port > 65535)) {
       ERROR("tcpconns plugin: Invalid port: %i", port);
-      return (1);
+      return 1;
     }
 
     pe = conn_get_port_entry((uint16_t)port, 1 /* create */);
     if (pe == NULL) {
       ERROR("tcpconns plugin: conn_get_port_entry failed.");
-      return (1);
+      return 1;
     }
 
     if (strcasecmp(key, "LocalPort") == 0)
@@ -642,10 +671,10 @@ static int conn_config(const char *key, const char *value) {
     else
       port_collect_total = 0;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int conn_config */
 
 #if KERNEL_LINUX
@@ -653,7 +682,7 @@ static int conn_init(void) {
   if (port_collect_total == 0 && port_list_head == NULL)
     port_collect_listening = 1;
 
-  return (0);
+  return 0;
 } /* int conn_init */
 
 static int conn_read(void) {
@@ -690,16 +719,16 @@ static int conn_read(void) {
       linux_source = SRC_PROC;
 
       /* return success here to avoid the "plugin failed" message. */
-      return (0);
+      return 0;
     }
   }
 
   if (status == 0)
     conn_submit_all();
   else
-    return (status);
+    return status;
 
-  return (0);
+  return 0;
 } /* int conn_read */
 /* #endif KERNEL_LINUX */
 
@@ -719,26 +748,26 @@ static int conn_read(void) {
   status = sysctlbyname("net.inet.tcp.pcblist", NULL, &buffer_len, 0, 0);
   if (status < 0) {
     ERROR("tcpconns plugin: sysctlbyname failed.");
-    return (-1);
+    return -1;
   }
 
   buffer = malloc(buffer_len);
   if (buffer == NULL) {
     ERROR("tcpconns plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   status = sysctlbyname("net.inet.tcp.pcblist", buffer, &buffer_len, 0, 0);
   if (status < 0) {
     ERROR("tcpconns plugin: sysctlbyname failed.");
     sfree(buffer);
-    return (-1);
+    return -1;
   }
 
   if (buffer_len <= sizeof(struct xinpgen)) {
     ERROR("tcpconns plugin: (buffer_len <= sizeof (struct xinpgen))");
     sfree(buffer);
-    return (-1);
+    return -1;
   }
 
   in_orig = (struct xinpgen *)buffer;
@@ -777,10 +806,53 @@ static int conn_read(void) {
 
   conn_submit_all();
 
-  return (0);
+  return 0;
 } /* int conn_read */
   /* #endif HAVE_SYSCTLBYNAME */
 
+#elif HAVE_KVM_GETFILES
+
+static int conn_init(void) {
+  char buf[_POSIX2_LINE_MAX];
+
+  kvmd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, buf);
+  if (kvmd == NULL) {
+    ERROR("tcpconns plugin: kvm_openfiles failed: %s", buf);
+    return -1;
+  }
+
+  return 0;
+} /* int conn_init */
+
+static int conn_read(void) {
+  struct kinfo_file *kf;
+  int i, fcnt;
+
+  conn_reset_port_entry();
+
+  kf = kvm_getfiles(kvmd, KERN_FILE_BYFILE, DTYPE_SOCKET,
+                   sizeof(*kf), &fcnt);
+  if (kf == NULL) {
+    ERROR("tcpconns plugin: kvm_getfiles failed.");
+    return -1;
+  }
+
+  for (i = 0; i < fcnt; i++) {
+    if (kf[i].so_protocol != IPPROTO_TCP)
+      continue;
+    if (kf[i].inp_fport == 0)
+      continue;
+    conn_handle_ports(ntohs(kf[i].inp_lport), ntohs(kf[i].inp_fport),
+                      kf[i].t_state);
+  }
+
+  conn_submit_all();
+
+  return 0;
+}
+/* int conn_read */
+/* #endif HAVE_KVM_GETFILES */
+
 #elif HAVE_LIBKVM_NLIST
 static int kread(u_long addr, void *buf, int size) {
   int status;
@@ -789,9 +861,9 @@ static int kread(u_long addr, void *buf, int size) {
   if (status != size) {
     ERROR("tcpconns plugin: kvm_read failed (got %i, expected %i): %s\n",
           status, size, kvm_geterr(kvmd));
-    return (-1);
+    return -1;
   }
-  return (0);
+  return 0;
 } /* int kread */
 
 static int conn_init(void) {
@@ -804,25 +876,25 @@ static int conn_init(void) {
   kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, buf);
   if (kvmd == NULL) {
     ERROR("tcpconns plugin: kvm_openfiles failed: %s", buf);
-    return (-1);
+    return -1;
   }
 
   status = kvm_nlist(kvmd, nl);
   if (status < 0) {
     ERROR("tcpconns plugin: kvm_nlist failed with status %i.", status);
-    return (-1);
+    return -1;
   }
 
   if (nl[N_TCBTABLE].n_type == 0) {
     ERROR("tcpconns plugin: Error looking up kernel's namelist: "
           "N_TCBTABLE is invalid.");
-    return (-1);
+    return -1;
   }
 
   inpcbtable_off = (u_long)nl[N_TCBTABLE].n_value;
   inpcbtable_ptr = (struct inpcbtable *)nl[N_TCBTABLE].n_value;
 
-  return (0);
+  return 0;
 } /* int conn_init */
 
 static int conn_read(void) {
@@ -841,7 +913,7 @@ static int conn_read(void) {
   /* Read the pcbtable from the kernel */
   status = kread(inpcbtable_off, &table, sizeof(table));
   if (status != 0)
-    return (-1);
+    return -1;
 
 #if defined(__OpenBSD__) ||                                                    \
     (defined(__NetBSD_Version__) && __NetBSD_Version__ > 699002700)
@@ -861,7 +933,7 @@ static int conn_read(void) {
     /* Read the pcb pointed to by `next' into `inpcb' */
     status = kread((u_long)next, &inpcb, sizeof(inpcb));
     if (status != 0)
-      return (-1);
+      return -1;
 
 /* Advance `next' */
 #if defined(__OpenBSD__) ||                                                    \
@@ -887,14 +959,14 @@ static int conn_read(void) {
 
     status = kread((u_long)inpcb.inp_ppcb, &tcpcb, sizeof(tcpcb));
     if (status != 0)
-      return (-1);
+      return -1;
     conn_handle_ports(ntohs(inpcb.inp_lport), ntohs(inpcb.inp_fport),
                       tcpcb.t_state);
   } /* while (next != head) */
 
   conn_submit_all();
 
-  return (0);
+  return 0;
 }
 /* #endif HAVE_LIBKVM_NLIST */
 
@@ -912,27 +984,27 @@ static int conn_read(void) {
   size = netinfo(NETINFO_TCP, 0, 0, 0);
   if (size < 0) {
     ERROR("tcpconns plugin: netinfo failed return: %i", size);
-    return (-1);
+    return -1;
   }
 
   if (size == 0)
-    return (0);
+    return 0;
 
   if ((size - sizeof(struct netinfo_header)) % sizeof(struct netinfo_conn)) {
     ERROR("tcpconns plugin: invalid buffer size");
-    return (-1);
+    return -1;
   }
 
   data = malloc(size);
   if (data == NULL) {
     ERROR("tcpconns plugin: malloc failed");
-    return (-1);
+    return -1;
   }
 
   if (netinfo(NETINFO_TCP, data, &size, 0) < 0) {
     ERROR("tcpconns plugin: netinfo failed");
     free(data);
-    return (-1);
+    return -1;
   }
 
   header = (struct netinfo_header *)data;
@@ -947,7 +1019,7 @@ static int conn_read(void) {
 
   conn_submit_all();
 
-  return (0);
+  return 0;
 }
 #endif /* KERNEL_AIX */
 
@@ -964,7 +1036,3 @@ void module_register(void) {
 #endif
   plugin_register_read("tcpconns", conn_read);
 } /* void module_register */
-
-/*
- * vim: set shiftwidth=2 softtabstop=2 tabstop=8 fdm=marker :
- */
index 960d646..a26d16e 100644 (file)
@@ -71,14 +71,14 @@ static int tss2_add_vserver(int vserver_port) {
   /* Check port range */
   if ((vserver_port <= 0) || (vserver_port > 65535)) {
     ERROR("teamspeak2 plugin: VServer port is invalid: %i", vserver_port);
-    return (-1);
+    return -1;
   }
 
   /* Allocate memory */
   entry = calloc(1, sizeof(*entry));
   if (entry == NULL) {
     ERROR("teamspeak2 plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
 
   /* Save data */
@@ -100,7 +100,7 @@ static int tss2_add_vserver(int vserver_port) {
 
   INFO("teamspeak2 plugin: Registered new vserver: %i", vserver_port);
 
-  return (0);
+  return 0;
 } /* int tss2_add_vserver */
 
 static void tss2_submit_gauge(const char *plugin_instance, const char *type,
@@ -182,7 +182,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
       *ret_read_fh = global_read_fh;
     if (ret_write_fh != NULL)
       *ret_write_fh = global_write_fh;
-    return (0);
+    return 0;
   }
 
   /* Get all addrs for this hostname */
@@ -195,7 +195,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
                        &ai_hints, &ai_head);
   if (status != 0) {
     ERROR("teamspeak2 plugin: getaddrinfo failed: %s", gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   /* Try all given hosts until we can connect to one */
@@ -231,7 +231,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
 
   /* Check if we really got connected */
   if (sd < 0)
-    return (-1);
+    return -1;
 
   /* Create file objects from sockets */
   global_read_fh = fdopen(sd, "r");
@@ -240,7 +240,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
     ERROR("teamspeak2 plugin: fdopen failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(sd);
-    return (-1);
+    return -1;
   }
 
   global_write_fh = fdopen(sd, "w");
@@ -249,7 +249,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
     ERROR("teamspeak2 plugin: fdopen failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     tss2_close_socket();
-    return (-1);
+    return -1;
   }
 
   { /* Check that the server correctly identifies itself. */
@@ -270,7 +270,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
             "to server. Expected ``[TS]'', got ``%s''.",
             buffer);
       tss2_close_socket();
-      return (-1);
+      return -1;
     }
     DEBUG("teamspeak2 plugin: Server send correct banner, connected!");
   }
@@ -280,7 +280,7 @@ static int tss2_get_socket(FILE **ret_read_fh, FILE **ret_write_fh) {
     *ret_read_fh = global_read_fh;
   if (ret_write_fh != NULL)
     *ret_write_fh = global_write_fh;
-  return (0);
+  return 0;
 } /* int tss2_get_socket */
 
 static int tss2_send_request(FILE *fh, const char *request) {
@@ -293,11 +293,11 @@ static int tss2_send_request(FILE *fh, const char *request) {
   if (status < 0) {
     ERROR("teamspeak2 plugin: fputs failed.");
     tss2_close_socket();
-    return (-1);
+    return -1;
   }
   fflush(fh);
 
-  return (0);
+  return 0;
 } /* int tss2_send_request */
 
 static int tss2_receive_line(FILE *fh, char *buffer, int buffer_size) {
@@ -316,11 +316,11 @@ static int tss2_receive_line(FILE *fh, char *buffer, int buffer_size) {
     ERROR("teamspeak2 plugin: fgets failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     tss2_close_socket();
-    return (-1);
+    return -1;
   }
 
   buffer[buffer_size - 1] = 0;
-  return (0);
+  return 0;
 } /* int tss2_receive_line */
 
 static int tss2_select_vserver(FILE *read_fh, FILE *write_fh,
@@ -338,26 +338,26 @@ static int tss2_select_vserver(FILE *read_fh, FILE *write_fh,
   status = tss2_send_request(write_fh, command);
   if (status != 0) {
     ERROR("teamspeak2 plugin: tss2_send_request (%s) failed.", command);
-    return (-1);
+    return -1;
   }
 
   /* Get answer */
   status = tss2_receive_line(read_fh, response, sizeof(response));
   if (status != 0) {
     ERROR("teamspeak2 plugin: tss2_receive_line failed.");
-    return (-1);
+    return -1;
   }
   response[sizeof(response) - 1] = 0;
 
   /* Check answer */
   if ((strncasecmp("OK", response, 2) == 0) &&
       ((response[2] == 0) || (response[2] == '\n') || (response[2] == '\r')))
-    return (0);
+    return 0;
 
   ERROR("teamspeak2 plugin: Command ``%s'' failed. "
         "Response received from server was: ``%s''.",
         command, response);
-  return (-1);
+  return -1;
 } /* int tss2_select_vserver */
 
 static int tss2_vserver_gapl(FILE *read_fh, FILE *write_fh,
@@ -373,7 +373,7 @@ static int tss2_vserver_gapl(FILE *read_fh, FILE *write_fh,
   status = tss2_send_request(write_fh, "gapl\r\n");
   if (status != 0) {
     ERROR("teamspeak2 plugin: tss2_send_request (gapl) failed.");
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -387,7 +387,7 @@ static int tss2_vserver_gapl(FILE *read_fh, FILE *write_fh,
       read_fh = NULL;
       write_fh = NULL;
       ERROR("teamspeak2 plugin: tss2_receive_line failed.");
-      return (-1);
+      return -1;
     }
     buffer[sizeof(buffer) - 1] = 0;
 
@@ -418,7 +418,7 @@ static int tss2_vserver_gapl(FILE *read_fh, FILE *write_fh,
       break;
     } else if (strncasecmp("ERROR", buffer, 5) == 0) {
       ERROR("teamspeak2 plugin: Server returned an error: %s", buffer);
-      return (-1);
+      return -1;
     } else {
       WARNING("teamspeak2 plugin: Server returned unexpected string: %s",
               buffer);
@@ -426,7 +426,7 @@ static int tss2_vserver_gapl(FILE *read_fh, FILE *write_fh,
   }
 
   *ret_value = packet_loss;
-  return (0);
+  return 0;
 } /* int tss2_vserver_gapl */
 
 static int tss2_read_vserver(vserver_list_t *vserver) {
@@ -455,7 +455,7 @@ static int tss2_read_vserver(vserver_list_t *vserver) {
   status = tss2_get_socket(&read_fh, &write_fh);
   if (status != 0) {
     ERROR("teamspeak2 plugin: tss2_get_socket failed.");
-    return (-1);
+    return -1;
   }
 
   if (vserver == NULL) {
@@ -469,14 +469,14 @@ static int tss2_read_vserver(vserver_list_t *vserver) {
     /* Select the server */
     status = tss2_select_vserver(read_fh, write_fh, vserver);
     if (status != 0)
-      return (status);
+      return status;
 
     status = tss2_send_request(write_fh, "si\r\n");
   }
 
   if (status != 0) {
     ERROR("teamspeak2 plugin: tss2_send_request failed.");
-    return (-1);
+    return -1;
   }
 
   /* Loop until break */
@@ -616,8 +616,8 @@ static int tss2_read_vserver(vserver_list_t *vserver) {
     tss2_submit_gauge(plugin_instance, "gauge", "servers", servers);
 
   if (valid == 0)
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* int tss2_read_vserver */
 
 static int tss2_config(const char *key, const char *value) {
@@ -630,7 +630,7 @@ static int tss2_config(const char *key, const char *value) {
     temp = strdup(value);
     if (temp == NULL) {
       ERROR("teamspeak2 plugin: strdup failed.");
-      return (1);
+      return 1;
     }
     sfree(config_host);
     config_host = temp;
@@ -640,7 +640,7 @@ static int tss2_config(const char *key, const char *value) {
     temp = strdup(value);
     if (temp == NULL) {
       ERROR("teamspeak2 plugin: strdup failed.");
-      return (1);
+      return 1;
     }
     sfree(config_port);
     config_port = temp;
@@ -650,10 +650,10 @@ static int tss2_config(const char *key, const char *value) {
 
     status = tss2_add_vserver(atoi(value));
     if (status != 0)
-      return (1);
+      return 1;
   } else {
     /* Unknown variable found */
-    return (-1);
+    return -1;
   }
 
   return 0;
@@ -690,8 +690,8 @@ static int tss2_read(void) {
   }
 
   if (success == 0)
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* int tss2_read */
 
 static int tss2_shutdown(void) {
@@ -716,7 +716,7 @@ static int tss2_shutdown(void) {
   sfree(config_host);
   sfree(config_port);
 
-  return (0);
+  return 0;
 } /* int tss2_shutdown */
 
 void module_register(void) {
@@ -728,5 +728,3 @@ void module_register(void) {
   plugin_register_read("teamspeak2", tss2_read);
   plugin_register_shutdown("teamspeak2", tss2_shutdown);
 } /* void module_register */
-
-/* vim: set sw=4 ts=4 : */
index cccb3db..94b4e3a 100644 (file)
--- a/src/ted.c
+++ b/src/ted.c
@@ -39,8 +39,7 @@
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_MATH_H
-#include <math.h>
+#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
 #include <termios.h>
 #else
@@ -90,7 +89,7 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
   status = write(fd, pkt_request, sizeof(pkt_request));
   if (status <= 0) {
     ERROR("ted plugin: swrite failed.");
-    return (-1);
+    return -1;
   }
 
   /* Loop until we find the end of the package */
@@ -105,7 +104,7 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
     {
       WARNING("ted plugin: Timeout while waiting for file descriptor "
               "to become ready.");
-      return (-1);
+      return -1;
     } else if ((status < 0) && ((errno == EAGAIN) || (errno == EINTR))) {
       /* Some signal or something. Start over.. */
       continue;
@@ -113,7 +112,7 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
       char errbuf[1024];
       ERROR("ted plugin: select failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     }
 
     receive_buffer_length = read(fd, receive_buffer, sizeof(receive_buffer));
@@ -123,15 +122,15 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
         continue;
       ERROR("ted plugin: read(2) failed: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (-1);
+      return -1;
     } else if (receive_buffer_length == 0) {
       /* Should we close the FD in this case? */
       WARNING("ted plugin: Received EOF from file descriptor.");
-      return (-1);
+      return -1;
     } else if (((size_t)receive_buffer_length) > sizeof(receive_buffer)) {
       ERROR("ted plugin: read(2) returned invalid value %zi.",
             receive_buffer_length);
-      return (-1);
+      return -1;
     }
 
     /*
@@ -176,7 +175,7 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
 
   /* Check for errors inside the loop. */
   if ((end_flag == 0) || (package_buffer_pos != EXPECTED_PACKAGE_LENGTH))
-    return (-1);
+    return -1;
 
   /*
    * Power is at positions 247 and 248 (LSB first) in [10kW].
@@ -191,7 +190,7 @@ static int ted_read_value(double *ret_power, double *ret_voltage) {
                                 ((int)package_buffer[251]));
 
   /* success */
-  return (0);
+  return 0;
 } /* int ted_read_value */
 
 static int ted_open_device(void) {
@@ -199,7 +198,7 @@ static int ted_open_device(void) {
   struct termios options;
 
   if (fd >= 0)
-    return (0);
+    return 0;
 
   dev = DEFAULT_DEVICE;
   if (conf_device != NULL)
@@ -208,7 +207,7 @@ static int ted_open_device(void) {
   fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
   if (fd < 0) {
     ERROR("ted plugin: Unable to open device %s.", dev);
-    return (-1);
+    return -1;
   }
 
   /* Get the current options for the port... */
@@ -225,7 +224,7 @@ static int ted_open_device(void) {
   tcsetattr(fd, TCSANOW, &options);
 
   INFO("ted plugin: Successfully opened %s.", dev);
-  return (0);
+  return 0;
 } /* int ted_open_device */
 
 static void ted_submit(const char *type, double value) {
@@ -249,15 +248,15 @@ static int ted_config(const char *key, const char *value) {
     tmp = atoi(value);
     if (tmp < 0) {
       WARNING("ted plugin: Invalid retry count: %i", tmp);
-      return (1);
+      return 1;
     }
     conf_retries = tmp;
   } else {
     ERROR("ted plugin: Unknown config option: %s", key);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int ted_config */
 
 static int ted_read(void) {
@@ -267,7 +266,7 @@ static int ted_read(void) {
 
   status = ted_open_device();
   if (status != 0)
-    return (-1);
+    return -1;
 
   power = NAN;
   voltage = NAN;
@@ -278,12 +277,12 @@ static int ted_read(void) {
   }
 
   if (status != 0)
-    return (-1);
+    return -1;
 
   ted_submit("power", power);
   ted_submit("voltage", voltage);
 
-  return (0);
+  return 0;
 } /* int ted_read */
 
 static int ted_shutdown(void) {
@@ -292,7 +291,7 @@ static int ted_shutdown(void) {
     fd = -1;
   }
 
-  return (0);
+  return 0;
 } /* int ted_shutdown */
 
 void module_register(void) {
@@ -300,5 +299,3 @@ void module_register(void) {
   plugin_register_read("ted", ted_read);
   plugin_register_shutdown("ted", ted_shutdown);
 } /* void module_register */
-
-/* vim: set sw=4 et : */
index 42f45ce..d3da9db 100644 (file)
@@ -71,7 +71,7 @@ static int check_count__ = 0;
     if (strcmp(expect, got__) != 0) {                                          \
       printf("not ok %i - %s = \"%s\", want \"%s\"\n", ++check_count__,        \
              #actual, got__, expect);                                          \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
     printf("ok %i - %s = \"%s\"\n", ++check_count__, #actual, got__);          \
   } while (0)
@@ -83,7 +83,7 @@ static int check_count__ = 0;
     if (got__ != want__) {                                                     \
       printf("not ok %i - %s = %d, want %d\n", ++check_count__, #actual,       \
              got__, want__);                                                   \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
     printf("ok %i - %s = %d\n", ++check_count__, #actual, got__);              \
   } while (0)
@@ -95,7 +95,7 @@ static int check_count__ = 0;
     if (got__ != want__) {                                                     \
       printf("not ok %i - %s = %" PRIu64 ", want %" PRIu64 "\n",               \
              ++check_count__, #actual, got__, want__);                         \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
     printf("ok %i - %s = %" PRIu64 "\n", ++check_count__, #actual, got__);     \
   } while (0)
@@ -104,15 +104,16 @@ static int check_count__ = 0;
   do {                                                                         \
     double want__ = (double)expect;                                            \
     double got__ = (double)actual;                                             \
-    if (isnan(want__) && !isnan(got__)) {                                      \
+    if ((isnan(want__) && !isnan(got__)) ||                                    \
+        (!isnan(want__) && isnan(got__))) {                                    \
       printf("not ok %i - %s = %.15g, want %.15g\n", ++check_count__, #actual, \
              got__, want__);                                                   \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (!isnan(want__) && (((want__ - got__) < -DBL_PRECISION) ||       \
                                   ((want__ - got__) > DBL_PRECISION))) {       \
       printf("not ok %i - %s = %.15g, want %.15g\n", ++check_count__, #actual, \
              got__, want__);                                                   \
-      return (-1);                                                             \
+      return -1;                                                               \
     }                                                                          \
     printf("ok %i - %s = %.15g\n", ++check_count__, #actual, got__);           \
   } while (0)
index fbae6cc..4815755 100644 (file)
@@ -78,7 +78,7 @@ static int thermal_sysfs_device_read(const char __attribute__((unused)) * dir,
     success = 1;
   }
 
-  return (success ? 0 : -1);
+  return success ? 0 : -1;
 }
 
 static int thermal_procfs_device_read(const char __attribute__((unused)) * dir,
@@ -168,13 +168,11 @@ static int thermal_config(const char *key, const char *value) {
 }
 
 static int thermal_sysfs_read(void) {
-  return walk_directory(dirname_sysfs, thermal_sysfs_device_read,
-                        /* user_data = */ NULL, /* include hidden */ 0);
+  return walk_directory(dirname_sysfs, thermal_sysfs_device_read, NULL, 0);
 }
 
 static int thermal_procfs_read(void) {
-  return walk_directory(dirname_procfs, thermal_procfs_device_read,
-                        /* user_data = */ NULL, /* include hidden */ 0);
+  return walk_directory(dirname_procfs, thermal_procfs_device_read, NULL, 0);
 }
 
 static int thermal_init(void) {
index 743db28..72e922e 100644 (file)
@@ -55,20 +55,20 @@ static int ut_threshold_add(const threshold_t *th) { /* {{{ */
   if (format_name(name, sizeof(name), th->host, th->plugin, th->plugin_instance,
                   th->type, th->type_instance) != 0) {
     ERROR("ut_threshold_add: format_name failed.");
-    return (-1);
+    return -1;
   }
 
   name_copy = strdup(name);
   if (name_copy == NULL) {
     ERROR("ut_threshold_add: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   th_copy = malloc(sizeof(*th_copy));
   if (th_copy == NULL) {
     sfree(name_copy);
     ERROR("ut_threshold_add: malloc failed.");
-    return (-1);
+    return -1;
   }
   memcpy(th_copy, th, sizeof(threshold_t));
 
@@ -100,7 +100,7 @@ static int ut_threshold_add(const threshold_t *th) { /* {{{ */
     sfree(th_copy);
   }
 
-  return (status);
+  return status;
 } /* }}} int ut_threshold_add */
 
 /*
@@ -113,26 +113,26 @@ static int ut_config_type_datasource(threshold_t *th, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `DataSource' option needs exactly one "
             "string argument.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(th->data_source, ci->values[0].value.string,
            sizeof(th->data_source));
 
-  return (0);
+  return 0;
 } /* int ut_config_type_datasource */
 
 static int ut_config_type_instance(threshold_t *th, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `Instance' option needs exactly one "
             "string argument.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(th->type_instance, ci->values[0].value.string,
            sizeof(th->type_instance));
 
-  return (0);
+  return 0;
 } /* int ut_config_type_instance */
 
 static int ut_config_type_max(threshold_t *th, oconfig_item_t *ci) {
@@ -140,7 +140,7 @@ static int ut_config_type_max(threshold_t *th, oconfig_item_t *ci) {
     WARNING("threshold values: The `%s' option needs exactly one "
             "number argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp(ci->key, "WarningMax") == 0)
@@ -148,7 +148,7 @@ static int ut_config_type_max(threshold_t *th, oconfig_item_t *ci) {
   else
     th->failure_max = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* int ut_config_type_max */
 
 static int ut_config_type_min(threshold_t *th, oconfig_item_t *ci) {
@@ -156,7 +156,7 @@ static int ut_config_type_min(threshold_t *th, oconfig_item_t *ci) {
     WARNING("threshold values: The `%s' option needs exactly one "
             "number argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   if (strcasecmp(ci->key, "WarningMin") == 0)
@@ -164,7 +164,7 @@ static int ut_config_type_min(threshold_t *th, oconfig_item_t *ci) {
   else
     th->failure_min = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* int ut_config_type_min */
 
 static int ut_config_type_hits(threshold_t *th, oconfig_item_t *ci) {
@@ -172,12 +172,12 @@ static int ut_config_type_hits(threshold_t *th, oconfig_item_t *ci) {
     WARNING("threshold values: The `%s' option needs exactly one "
             "number argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   th->hits = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* int ut_config_type_hits */
 
 static int ut_config_type_hysteresis(threshold_t *th, oconfig_item_t *ci) {
@@ -185,12 +185,12 @@ static int ut_config_type_hysteresis(threshold_t *th, oconfig_item_t *ci) {
     WARNING("threshold values: The `%s' option needs exactly one "
             "number argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   th->hysteresis = ci->values[0].value.number;
 
-  return (0);
+  return 0;
 } /* int ut_config_type_hysteresis */
 
 static int ut_config_type(const threshold_t *th_orig, oconfig_item_t *ci) {
@@ -200,12 +200,12 @@ static int ut_config_type(const threshold_t *th_orig, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `Type' block needs exactly one string "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->children_num < 1) {
     WARNING("threshold values: The `Type' block needs at least one option.");
-    return (-1);
+    return -1;
   }
 
   memcpy(&th, th_orig, sizeof(th));
@@ -261,20 +261,20 @@ static int ut_config_type(const threshold_t *th_orig, oconfig_item_t *ci) {
     status = ut_threshold_add(&th);
   }
 
-  return (status);
+  return status;
 } /* int ut_config_type */
 
 static int ut_config_plugin_instance(threshold_t *th, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `Instance' option needs exactly one "
             "string argument.");
-    return (-1);
+    return -1;
   }
 
   sstrncpy(th->plugin_instance, ci->values[0].value.string,
            sizeof(th->plugin_instance));
 
-  return (0);
+  return 0;
 } /* int ut_config_plugin_instance */
 
 static int ut_config_plugin(const threshold_t *th_orig, oconfig_item_t *ci) {
@@ -284,13 +284,13 @@ static int ut_config_plugin(const threshold_t *th_orig, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `Plugin' block needs exactly one string "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->children_num < 1) {
     WARNING("threshold values: The `Plugin' block needs at least one nested "
             "block.");
-    return (-1);
+    return -1;
   }
 
   memcpy(&th, th_orig, sizeof(th));
@@ -314,7 +314,7 @@ static int ut_config_plugin(const threshold_t *th_orig, oconfig_item_t *ci) {
       break;
   }
 
-  return (status);
+  return status;
 } /* int ut_config_plugin */
 
 static int ut_config_host(const threshold_t *th_orig, oconfig_item_t *ci) {
@@ -324,13 +324,13 @@ static int ut_config_host(const threshold_t *th_orig, oconfig_item_t *ci) {
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("threshold values: The `Host' block needs exactly one string "
             "argument.");
-    return (-1);
+    return -1;
   }
 
   if (ci->children_num < 1) {
     WARNING("threshold values: The `Host' block needs at least one nested "
             "block.");
-    return (-1);
+    return -1;
   }
 
   memcpy(&th, th_orig, sizeof(th));
@@ -354,7 +354,7 @@ static int ut_config_host(const threshold_t *th_orig, oconfig_item_t *ci) {
       break;
   }
 
-  return (status);
+  return status;
 } /* int ut_config_host */
   /*
    * End of the functions used to configure threshold values.
@@ -392,7 +392,7 @@ static int ut_report_state(const data_set_t *ds, const value_list_t *vl,
       DEBUG("ut_report_state: th->hits = %d, uc_get_hits = %d", th->hits,
             uc_get_hits(ds, vl));
       (void)uc_inc_hits(ds, vl, 1); /* increase hit counter */
-      return (0);
+      return 0;
     }
   } /* end check hits */
 
@@ -402,9 +402,9 @@ static int ut_report_state(const data_set_t *ds, const value_list_t *vl,
    * state is `okay', then only report if `persist_ok` flag is set. */
   if (state == state_old) {
     if ((th->flags & UT_FLAG_PERSIST) == 0)
-      return (0);
+      return 0;
     else if ((state == STATE_OKAY) && ((th->flags & UT_FLAG_PERSIST_OK) == 0))
-      return (0);
+      return 0;
   }
 
   if (state != state_old)
@@ -522,7 +522,7 @@ static int ut_report_state(const data_set_t *ds, const value_list_t *vl,
   plugin_dispatch_notification(&n);
 
   plugin_notification_meta_free(n.meta);
-  return (0);
+  return 0;
 } /* }}} int ut_report_state */
 
 /*
@@ -547,7 +547,7 @@ static int ut_check_one_data_source(
   if (ds != NULL) {
     ds_name = ds->ds[ds_index].name;
     if ((th->data_source[0] != 0) && (strcmp(ds_name, th->data_source) != 0))
-      return (STATE_OKAY);
+      return STATE_OKAY;
   }
 
   if ((th->flags & UT_FLAG_INVERT) != 0) {
@@ -604,12 +604,12 @@ static int ut_check_one_data_source(
   }
 
   if (is_failure != 0)
-    return (STATE_ERROR);
+    return STATE_ERROR;
 
   if (is_warning != 0)
-    return (STATE_WARNING);
+    return STATE_WARNING;
 
-  return (STATE_OKAY);
+  return STATE_OKAY;
 } /* }}} int ut_check_one_data_source */
 
 /*
@@ -674,7 +674,7 @@ static int ut_check_one_threshold(const data_set_t *ds, const value_list_t *vl,
   if (ret_ds_index != NULL)
     *ret_ds_index = ds_index;
 
-  return (ret);
+  return ret;
 } /* }}} int ut_check_one_threshold */
 
 /*
@@ -698,7 +698,7 @@ static int ut_check_threshold(const data_set_t *ds, const value_list_t *vl,
   int worst_ds_index = -1;
 
   if (threshold_tree == NULL)
-    return (0);
+    return 0;
 
   /* Is this lock really necessary? So far, thresholds are only inserted at
    * startup. -octo */
@@ -706,13 +706,13 @@ static int ut_check_threshold(const data_set_t *ds, const value_list_t *vl,
   th = threshold_search(vl);
   pthread_mutex_unlock(&threshold_lock);
   if (th == NULL)
-    return (0);
+    return 0;
 
   DEBUG("ut_check_threshold: Found matching threshold(s)");
 
   values = uc_get_rate(ds, vl);
   if (values == NULL)
-    return (0);
+    return 0;
 
   while (th != NULL) {
     int ds_index = -1;
@@ -721,7 +721,7 @@ static int ut_check_threshold(const data_set_t *ds, const value_list_t *vl,
     if (status < 0) {
       ERROR("ut_check_threshold: ut_check_one_threshold failed.");
       sfree(values);
-      return (-1);
+      return -1;
     }
 
     if (worst_state < status) {
@@ -738,12 +738,12 @@ static int ut_check_threshold(const data_set_t *ds, const value_list_t *vl,
   if (status != 0) {
     ERROR("ut_check_threshold: ut_report_state failed.");
     sfree(values);
-    return (-1);
+    return -1;
   }
 
   sfree(values);
 
-  return (0);
+  return 0;
 } /* }}} int ut_check_threshold */
 
 /*
@@ -760,12 +760,12 @@ static int ut_missing(const value_list_t *vl,
   cdtime_t now;
 
   if (threshold_tree == NULL)
-    return (0);
+    return 0;
 
   th = threshold_search(vl);
   /* dispatch notifications for "interesting" values only */
   if ((th == NULL) || ((th->flags & UT_FLAG_INTERESTING) == 0))
-    return (0);
+    return 0;
 
   now = cdtime();
   missing_time = now - vl->time;
@@ -779,7 +779,7 @@ static int ut_missing(const value_list_t *vl,
 
   plugin_dispatch_notification(&n);
 
-  return (0);
+  return 0;
 } /* }}} int ut_missing */
 
 static int ut_config(oconfig_item_t *ci) { /* {{{ */
@@ -790,7 +790,7 @@ static int ut_config(oconfig_item_t *ci) { /* {{{ */
     threshold_tree = c_avl_create((int (*)(const void *, const void *))strcmp);
     if (threshold_tree == NULL) {
       ERROR("ut_config: c_avl_create failed.");
-      return (-1);
+      return -1;
     }
   }
 
@@ -828,11 +828,9 @@ static int ut_config(oconfig_item_t *ci) { /* {{{ */
                           /* user data = */ NULL);
   }
 
-  return (status);
+  return status;
 } /* }}} int um_config */
 
 void module_register(void) {
   plugin_register_complex_config("threshold", ut_config);
 }
-
-/* vim: set sw=2 ts=8 sts=2 tw=78 et fdm=marker : */
index cb366d3..1534f51 100644 (file)
@@ -45,7 +45,7 @@ static int tt_config(const char *key, const char *value) {
     temp = strdup(value);
     if (temp == NULL) {
       ERROR("tokyotyrant plugin: Host strdup failed.");
-      return (1);
+      return 1;
     }
     sfree(config_host);
     config_host = temp;
@@ -55,16 +55,16 @@ static int tt_config(const char *key, const char *value) {
     temp = strdup(value);
     if (temp == NULL) {
       ERROR("tokyotyrant plugin: Port strdup failed.");
-      return (1);
+      return 1;
     }
     sfree(config_port);
     config_port = temp;
   } else {
     ERROR("tokyotyrant plugin: error: unrecognized configuration key %s", key);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 static void printerr(void) {
@@ -116,7 +116,7 @@ static int tt_read(void) {
 
   tt_open_db();
   if (rdb == NULL)
-    return (-1);
+    return -1;
 
   rnum = tcrdbrnum(rdb);
   tt_submit(rnum, "records");
@@ -124,7 +124,7 @@ static int tt_read(void) {
   size = tcrdbsize(rdb);
   tt_submit(size, "file_size");
 
-  return (0);
+  return 0;
 }
 
 static int tt_shutdown(void) {
@@ -135,13 +135,13 @@ static int tt_shutdown(void) {
     if (!tcrdbclose(rdb)) {
       printerr();
       tcrdbdel(rdb);
-      return (1);
+      return 1;
     }
     tcrdbdel(rdb);
     rdb = NULL;
   }
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -150,5 +150,3 @@ void module_register(void) {
   plugin_register_read("tokyotyrant", tt_read);
   plugin_register_shutdown("tokyotyrant", tt_shutdown);
 }
-
-/* vim: set sw=8 ts=8 tw=78 : */
index 62bd92b..45c8bd7 100644 (file)
@@ -1118,7 +1118,7 @@ for_all_proc_cpus(int(func)(unsigned int)) {
     retval = func(cpu_num);
     if (retval) {
       fclose(fp);
-      return (retval);
+      return retval;
     }
   }
   fclose(fp);
index 6855187..c9838e1 100644 (file)
@@ -26,7 +26,7 @@ clock_last_meas         value:GAUGE:0:U
 clock_last_update       value:GAUGE:U:U
 clock_mode              value:GAUGE:0:U
 clock_reachability      value:GAUGE:0:U
-clock_skew_ppm          value:GAUGE:-2:2
+clock_skew_ppm          value:GAUGE:0:1000000
 clock_state             value:GAUGE:0:U
 clock_stratum           value:GAUGE:0:U
 compression             uncompressed:DERIVE:0:U, compressed:DERIVE:0:U
@@ -37,6 +37,7 @@ contextswitch           value:DERIVE:0:U
 count                   value:GAUGE:0:U
 counter                 value:COUNTER:U:U
 cpu                     value:DERIVE:0:U
+cpu_affinity            value:GAUGE:0:1
 cpufreq                 value:GAUGE:0:U
 current                 value:GAUGE:U:U
 current_connections     value:GAUGE:0:U
@@ -47,6 +48,7 @@ df                      used:GAUGE:0:1125899906842623, free:GAUGE:0:112589990684
 df_complex              value:GAUGE:0:U
 df_inodes               value:GAUGE:0:U
 dilution_of_precision   value:GAUGE:0:U
+disk_error              value:GAUGE:0:U
 disk_io_time            io_time:DERIVE:0:U, weighted_io_time:DERIVE:0:U
 disk_latency            read:GAUGE:0:U, write:GAUGE:0:U
 disk_merged             read:DERIVE:0:U, write:DERIVE:0:U
@@ -70,6 +72,7 @@ dns_response            value:DERIVE:0:U
 dns_transfer            value:DERIVE:0:U
 dns_update              value:DERIVE:0:U
 dns_zops                value:DERIVE:0:U
+domain_state            state:GAUGE:0:U, reason:GAUGE:0:U
 drbd_resource           value:DERIVE:0:U
 duration                seconds:GAUGE:0:U
 email_check             value:GAUGE:0:U
@@ -89,7 +92,7 @@ filter_result           value:DERIVE:0:U
 flow                    value:GAUGE:0:U
 fork_rate               value:DERIVE:0:U
 frequency               value:GAUGE:0:U
-frequency_error         value:GAUGE:-2:2 
+frequency_error         value:GAUGE:-1000000:1000000
 frequency_offset        value:GAUGE:-1000000:1000000
 fscache_stat            value:DERIVE:0:U
 gauge                   value:GAUGE:U:U
@@ -119,6 +122,7 @@ ipc                     value:GAUGE:0:U
 ipt_bytes               value:DERIVE:0:U
 ipt_packets             value:DERIVE:0:U
 irq                     value:DERIVE:0:U
+job_stats               value:DERIVE:0:U
 latency                 value:GAUGE:0:U
 links                   value:GAUGE:0:U
 load                    shortterm:GAUGE:0:5000, midterm:GAUGE:0:5000, longterm:GAUGE:0:5000
@@ -168,6 +172,7 @@ pending_operations      value:GAUGE:0:U
 percent                 value:GAUGE:0:100.1
 percent_bytes           value:GAUGE:0:100.1
 percent_inodes          value:GAUGE:0:100.1
+perf                    value:DERIVE:0:U
 pf_counters             value:DERIVE:0:U
 pf_limits               value:DERIVE:0:U
 pf_source               value:DERIVE:0:U
index 32fa9bc..00b930e 100644 (file)
@@ -78,7 +78,7 @@ static int us_open_socket(void) {
     char errbuf[1024];
     ERROR("unixsock plugin: socket failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   sa.sun_family = AF_UNIX;
@@ -107,7 +107,7 @@ static int us_open_socket(void) {
     ERROR("unixsock plugin: bind failed: %s", errbuf);
     close(sock_fd);
     sock_fd = -1;
-    return (-1);
+    return -1;
   }
 
   status = chmod(sa.sun_path, sock_perms);
@@ -117,7 +117,7 @@ static int us_open_socket(void) {
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(sock_fd);
     sock_fd = -1;
-    return (-1);
+    return -1;
   }
 
   status = listen(sock_fd, 8);
@@ -127,7 +127,7 @@ static int us_open_socket(void) {
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(sock_fd);
     sock_fd = -1;
-    return (-1);
+    return -1;
   }
 
   do {
@@ -160,7 +160,7 @@ static int us_open_socket(void) {
     }
   } while (0);
 
-  return (0);
+  return 0;
 } /* int us_open_socket */
 
 static void *us_handle_client(void *arg) {
@@ -191,7 +191,7 @@ static void *us_handle_client(void *arg) {
     close(fdin);
     close(fdout);
     pthread_exit((void *)1);
-    return ((void *)1);
+    return (void *)1;
   }
 
   fhout = fdopen(fdout, "w");
@@ -202,7 +202,7 @@ static void *us_handle_client(void *arg) {
     fclose(fhin); /* this closes fdin as well */
     close(fdout);
     pthread_exit((void *)1);
-    return ((void *)1);
+    return (void *)1;
   }
 
   /* change output buffer to line buffered mode */
@@ -213,7 +213,7 @@ static void *us_handle_client(void *arg) {
     fclose(fhin);
     fclose(fhout);
     pthread_exit((void *)1);
-    return ((void *)0);
+    return (void *)0;
   }
 
   while (42) {
@@ -253,7 +253,7 @@ static void *us_handle_client(void *arg) {
       fclose(fhin);
       fclose(fhout);
       pthread_exit((void *)1);
-      return ((void *)1);
+      return (void *)1;
     }
 
     if (strcasecmp(fields[0], "getval") == 0) {
@@ -283,7 +283,7 @@ static void *us_handle_client(void *arg) {
   fclose(fhout);
 
   pthread_exit((void *)0);
-  return ((void *)0);
+  return (void *)0;
 } /* void *us_handle_client */
 
 static void *us_server_thread(void __attribute__((unused)) * arg) {
@@ -351,21 +351,21 @@ static void *us_server_thread(void __attribute__((unused)) * arg) {
            sstrerror(errno, errbuf, sizeof(errbuf)));
   }
 
-  return ((void *)0);
+  return (void *)0;
 } /* void *us_server_thread */
 
 static int us_config(const char *key, const char *val) {
   if (strcasecmp(key, "SocketFile") == 0) {
     char *new_sock_file = strdup(val);
     if (new_sock_file == NULL)
-      return (1);
+      return 1;
 
     sfree(sock_file);
     sock_file = new_sock_file;
   } else if (strcasecmp(key, "SocketGroup") == 0) {
     char *new_sock_group = strdup(val);
     if (new_sock_group == NULL)
-      return (1);
+      return 1;
 
     sfree(sock_group);
     sock_group = new_sock_group;
@@ -377,10 +377,10 @@ static int us_config(const char *key, const char *val) {
     else
       delete_socket = 0;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int us_config */
 
 static int us_init(void) {
@@ -390,7 +390,7 @@ static int us_init(void) {
 
   /* Initialize only once. */
   if (have_init != 0)
-    return (0);
+    return 0;
   have_init = 1;
 
   loop = 1;
@@ -401,10 +401,10 @@ static int us_init(void) {
     char errbuf[1024];
     ERROR("unixsock plugin: pthread_create failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int us_init */
 
 static int us_shutdown(void) {
@@ -421,7 +421,7 @@ static int us_shutdown(void) {
   plugin_unregister_init("unixsock");
   plugin_unregister_shutdown("unixsock");
 
-  return (0);
+  return 0;
 } /* int us_shutdown */
 
 void module_register(void) {
@@ -429,5 +429,3 @@ void module_register(void) {
   plugin_register_init("unixsock", us_init);
   plugin_register_shutdown("unixsock", us_shutdown);
 } /* void module_register (void) */
-
-/* vim: set sw=4 ts=4 sts=4 tw=78 : */
index 96a227d..2be9d79 100644 (file)
@@ -99,7 +99,7 @@ static int uptime_init(void) /* {{{ */
     char errbuf[1024];
     ERROR("uptime plugin: Cannot open " STAT_FILE ": %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, 1024, fh) != NULL) {
@@ -116,7 +116,7 @@ static int uptime_init(void) /* {{{ */
   /* loop done, check if no value has been found/read */
   if (ret != 1) {
     ERROR("uptime plugin: No value read from " STAT_FILE "");
-    return (-1);
+    return -1;
   }
 
   boottime = (time_t)starttime;
@@ -124,7 +124,7 @@ static int uptime_init(void) /* {{{ */
   if (boottime == 0) {
     ERROR("uptime plugin: btime read from " STAT_FILE ", "
           "but `boottime' is zero!");
-    return (-1);
+    return -1;
   }
 /* #endif KERNEL_LINUX */
 
@@ -139,24 +139,24 @@ static int uptime_init(void) /* {{{ */
    * went fine. */
   if (kc == NULL) {
     ERROR("uptime plugin: kstat chain control structure not available.");
-    return (-1);
+    return -1;
   }
 
   ksp = kstat_lookup(kc, "unix", 0, "system_misc");
   if (ksp == NULL) {
     ERROR("uptime plugin: Cannot find unix:0:system_misc kstat.");
-    return (-1);
+    return -1;
   }
 
   if (kstat_read(kc, ksp, NULL) < 0) {
     ERROR("uptime plugin: kstat_read failed.");
-    return (-1);
+    return -1;
   }
 
   knp = (kstat_named_t *)kstat_data_lookup(ksp, "boot_time");
   if (knp == NULL) {
     ERROR("uptime plugin: kstat_data_lookup (boot_time) failed.");
-    return (-1);
+    return -1;
   }
 
   boottime = (time_t)knp->value.ui32;
@@ -164,7 +164,7 @@ static int uptime_init(void) /* {{{ */
   if (boottime == 0) {
     ERROR("uptime plugin: kstat_data_lookup returned success, "
           "but `boottime' is zero!");
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_LIBKSTAT */
 
@@ -183,7 +183,7 @@ static int uptime_init(void) /* {{{ */
     char errbuf[1024];
     ERROR("uptime plugin: No value read from sysctl interface: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   boottime = boottv.tv_sec;
@@ -191,7 +191,7 @@ static int uptime_init(void) /* {{{ */
   if (boottime == 0) {
     ERROR("uptime plugin: sysctl(3) returned success, "
           "but `boottime' is zero!");
-    return (-1);
+    return -1;
   }
 /* #endif HAVE_SYS_SYSCTL_H */
 
@@ -205,7 +205,7 @@ static int uptime_init(void) /* {{{ */
     char errbuf[1024];
     ERROR("uptime plugin: perfstat_cpu_total: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   hertz = sysconf(_SC_CLK_TCK);
@@ -215,7 +215,7 @@ static int uptime_init(void) /* {{{ */
   boottime = time(NULL) - cputotal.lbolt / hertz;
 #endif /* HAVE_PERFSTAT */
 
-  return (0);
+  return 0;
 } /* }}} int uptime_init */
 
 static int uptime_read(void) {
@@ -229,7 +229,7 @@ static int uptime_read(void) {
 
   uptime_submit(uptime);
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index ff8c047..6bc7cc3 100644 (file)
@@ -101,7 +101,7 @@ static int users_read(void) {
   us = sg_get_user_stats();
 #endif
   if (us == NULL)
-    return (-1);
+    return -1;
 
   users_submit((gauge_t)
 #if HAVE_LIBSTATGRAB_0_90
@@ -115,7 +115,7 @@ static int users_read(void) {
 #error "No applicable input method."
 #endif
 
-  return (0);
+  return 0;
 } /* int users_read */
 
 void module_register(void) {
index a8de21a..b180a50 100644 (file)
@@ -39,7 +39,7 @@ cmd_status_t cmd_parse_flush(size_t argc, char **argv, cmd_flush_t *ret_flush,
   if ((ret_flush == NULL) || (opts == NULL)) {
     errno = EINVAL;
     cmd_error(CMD_ERROR, err, "Invalid arguments to cmd_parse_flush.");
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   for (size_t i = 0; i < argc; i++) {
@@ -54,7 +54,7 @@ cmd_status_t cmd_parse_flush(size_t argc, char **argv, cmd_flush_t *ret_flush,
       if (status == CMD_NO_OPTION)
         cmd_error(CMD_PARSE_ERROR, err, "Invalid option string `%s'.", argv[i]);
       cmd_destroy_flush(ret_flush);
-      return (CMD_PARSE_ERROR);
+      return CMD_PARSE_ERROR;
     }
 
     if (strcasecmp("plugin", opt_key) == 0) {
@@ -66,7 +66,7 @@ cmd_status_t cmd_parse_flush(size_t argc, char **argv, cmd_flush_t *ret_flush,
       if (id == NULL) {
         cmd_error(CMD_ERROR, err, "realloc failed.");
         cmd_destroy_flush(ret_flush);
-        return (CMD_ERROR);
+        return CMD_ERROR;
       }
 
       ret_flush->identifiers = id;
@@ -77,7 +77,7 @@ cmd_status_t cmd_parse_flush(size_t argc, char **argv, cmd_flush_t *ret_flush,
                            opts->identifier_default_host) != 0) {
         cmd_error(CMD_PARSE_ERROR, err, "Invalid identifier `%s'.", opt_value);
         cmd_destroy_flush(ret_flush);
-        return (CMD_PARSE_ERROR);
+        return CMD_PARSE_ERROR;
       }
     } else if (strcasecmp("timeout", opt_key) == 0) {
       char *endptr;
@@ -91,18 +91,18 @@ cmd_status_t cmd_parse_flush(size_t argc, char **argv, cmd_flush_t *ret_flush,
         cmd_error(CMD_PARSE_ERROR, err,
                   "Invalid value for option `timeout': %s", opt_value);
         cmd_destroy_flush(ret_flush);
-        return (CMD_PARSE_ERROR);
+        return CMD_PARSE_ERROR;
       } else if (ret_flush->timeout < 0.0) {
         ret_flush->timeout = 0.0;
       }
     } else {
       cmd_error(CMD_PARSE_ERROR, err, "Cannot parse option `%s'.", opt_key);
       cmd_destroy_flush(ret_flush);
-      return (CMD_PARSE_ERROR);
+      return CMD_PARSE_ERROR;
     }
   }
 
-  return (CMD_OK);
+  return CMD_OK;
 } /* cmd_status_t cmd_parse_flush */
 
 cmd_status_t cmd_handle_flush(FILE *fh, char *buffer) {
@@ -114,18 +114,18 @@ cmd_status_t cmd_handle_flush(FILE *fh, char *buffer) {
   int status;
 
   if ((fh == NULL) || (buffer == NULL))
-    return (-1);
+    return -1;
 
   DEBUG("utils_cmd_flush: cmd_handle_flush (fh = %p, buffer = %s);", (void *)fh,
         buffer);
 
   if ((status = cmd_parse(buffer, &cmd, NULL, &err)) != CMD_OK)
-    return (status);
+    return status;
   if (cmd.type != CMD_FLUSH) {
     cmd_error(CMD_UNKNOWN_COMMAND, &err, "Unexpected command: `%s'.",
               CMD_TO_STRING(cmd.type));
     cmd_destroy(&cmd);
-    return (CMD_UNKNOWN_COMMAND);
+    return CMD_UNKNOWN_COMMAND;
   }
 
   for (size_t i = 0; (i == 0) || (i < cmd.cmd.flush.plugins_num); i++) {
@@ -136,23 +136,21 @@ cmd_status_t cmd_handle_flush(FILE *fh, char *buffer) {
 
     for (size_t j = 0; (j == 0) || (j < cmd.cmd.flush.identifiers_num); j++) {
       char *identifier = NULL;
-      char buffer[1024];
-      int status;
+      char buf[1024];
 
       if (cmd.cmd.flush.identifiers_num != 0) {
         identifier_t *id = cmd.cmd.flush.identifiers + j;
-        if (format_name(buffer, sizeof(buffer), id->host, id->plugin,
+        if (format_name(buf, sizeof(buf), id->host, id->plugin,
                         id->plugin_instance, id->type,
                         id->type_instance) != 0) {
           error++;
           continue;
         }
-        identifier = buffer;
+        identifier = buf;
       }
 
-      status = plugin_flush(plugin, DOUBLE_TO_CDTIME_T(cmd.cmd.flush.timeout),
-                            identifier);
-      if (status == 0)
+      if (plugin_flush(plugin, DOUBLE_TO_CDTIME_T(cmd.cmd.flush.timeout),
+                       identifier) == 0)
         success++;
       else
         error++;
@@ -162,7 +160,7 @@ cmd_status_t cmd_handle_flush(FILE *fh, char *buffer) {
   cmd_error(CMD_OK, &err, "Done: %i successful, %i errors", success, error);
 
   cmd_destroy(&cmd);
-  return (0);
+  return 0;
 #undef PRINT_TO_SOCK
 } /* cmd_status_t cmd_handle_flush */
 
@@ -177,5 +175,3 @@ void cmd_destroy_flush(cmd_flush_t *flush) {
   sfree(flush->identifiers);
   flush->identifiers_num = 0;
 } /* void cmd_destroy_flush */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index d9b4e1b..129aa85 100644 (file)
@@ -40,5 +40,3 @@ cmd_status_t cmd_handle_flush(FILE *fh, char *buffer);
 void cmd_destroy_flush(cmd_flush_t *flush);
 
 #endif /* UTILS_CMD_FLUSH_H */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index 926375d..78f9a75 100644 (file)
@@ -59,7 +59,7 @@ int handle_getthreshold(FILE *fh, char *buffer) {
   size_t i;
 
   if ((fh == NULL) || (buffer == NULL))
-    return (-1);
+    return -1;
 
   DEBUG("utils_cmd_getthreshold: handle_getthreshold (fh = %p, buffer = %s);",
         (void *)fh, buffer);
@@ -68,26 +68,26 @@ int handle_getthreshold(FILE *fh, char *buffer) {
   status = parse_string(&buffer, &command);
   if (status != 0) {
     print_to_socket(fh, "-1 Cannot parse command.\n");
-    return (-1);
+    return -1;
   }
   assert(command != NULL);
 
   if (strcasecmp("GETTHRESHOLD", command) != 0) {
     print_to_socket(fh, "-1 Unexpected command: `%s'.\n", command);
-    return (-1);
+    return -1;
   }
 
   identifier = NULL;
   status = parse_string(&buffer, &identifier);
   if (status != 0) {
     print_to_socket(fh, "-1 Cannot parse identifier.\n");
-    return (-1);
+    return -1;
   }
   assert(identifier != NULL);
 
   if (*buffer != 0) {
     print_to_socket(fh, "-1 Garbage after end of command: %s\n", buffer);
-    return (-1);
+    return -1;
   }
 
   /* parse_identifier() modifies its first argument,
@@ -101,7 +101,7 @@ int handle_getthreshold(FILE *fh, char *buffer) {
     DEBUG("handle_getthreshold: Cannot parse identifier `%s'.", identifier);
     print_to_socket(fh, "-1 Cannot parse identifier `%s'.\n", identifier);
     sfree(identifier_copy);
-    return (-1);
+    return -1;
   }
 
   value_list_t vl = {.values = NULL};
@@ -118,10 +118,10 @@ int handle_getthreshold(FILE *fh, char *buffer) {
   if (status == ENOENT) {
     print_to_socket(fh, "-1 No threshold found for identifier %s\n",
                     identifier);
-    return (0);
+    return 0;
   } else if (status != 0) {
     print_to_socket(fh, "-1 Error while looking up threshold: %i\n", status);
-    return (-1);
+    return -1;
   }
 
   /* Lets count the number of lines we'll return. */
@@ -179,7 +179,5 @@ int handle_getthreshold(FILE *fh, char *buffer) {
   if (threshold.hits > 1)
     print_to_socket(fh, "Hits: %i\n", threshold.hits);
 
-  return (0);
+  return 0;
 } /* int handle_getthreshold */
-
-/* vim: set sw=2 sts=2 ts=8 et : */
index dd4e5cf..78700ee 100644 (file)
@@ -32,5 +32,3 @@
 int handle_getthreshold(FILE *fh, char *buffer);
 
 #endif /* UTILS_CMD_GETTHRESHOLD_H */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index c23650b..59046f6 100644 (file)
@@ -43,7 +43,7 @@ cmd_status_t cmd_parse_getval(size_t argc, char **argv,
   if ((ret_getval == NULL) || (opts == NULL)) {
     errno = EINVAL;
     cmd_error(CMD_ERROR, err, "Invalid arguments to cmd_parse_getval.");
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   if (argc != 1) {
@@ -52,7 +52,7 @@ cmd_status_t cmd_parse_getval(size_t argc, char **argv,
     else
       cmd_error(CMD_PARSE_ERROR, err, "Garbage after identifier: `%s'.",
                 argv[1]);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   /* parse_identifier() modifies its first argument,
@@ -68,11 +68,11 @@ cmd_status_t cmd_parse_getval(size_t argc, char **argv,
     cmd_error(CMD_PARSE_ERROR, err, "Cannot parse identifier `%s'.",
               identifier_copy);
     sfree(identifier_copy);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   ret_getval->raw_identifier = identifier_copy;
-  return (CMD_OK);
+  return CMD_OK;
 } /* cmd_status_t cmd_parse_getval */
 
 #define print_to_socket(fh, ...)                                               \
@@ -97,18 +97,18 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer) {
   const data_set_t *ds;
 
   if ((fh == NULL) || (buffer == NULL))
-    return (-1);
+    return -1;
 
   DEBUG("utils_cmd_getval: cmd_handle_getval (fh = %p, buffer = %s);",
         (void *)fh, buffer);
 
   if ((status = cmd_parse(buffer, &cmd, NULL, &err)) != CMD_OK)
-    return (status);
+    return status;
   if (cmd.type != CMD_GETVAL) {
     cmd_error(CMD_UNKNOWN_COMMAND, &err, "Unexpected command: `%s'.",
               CMD_TO_STRING(cmd.type));
     cmd_destroy(&cmd);
-    return (CMD_UNKNOWN_COMMAND);
+    return CMD_UNKNOWN_COMMAND;
   }
 
   ds = plugin_get_ds(cmd.cmd.getval.identifier.type);
@@ -118,7 +118,7 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer) {
     cmd_error(CMD_ERROR, &err, "Type `%s' is unknown.\n",
               cmd.cmd.getval.identifier.type);
     cmd_destroy(&cmd);
-    return (-1);
+    return -1;
   }
 
   values = NULL;
@@ -128,7 +128,7 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer) {
   if (status != 0) {
     cmd_error(CMD_ERROR, &err, "No such value.");
     cmd_destroy(&cmd);
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   if (ds->ds_num != values_num) {
@@ -138,7 +138,7 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer) {
     cmd_error(CMD_ERROR, &err, "Error reading value from cache.");
     sfree(values);
     cmd_destroy(&cmd);
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   print_to_socket(fh, "%zu Value%s found\n", values_num,
@@ -155,7 +155,7 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer) {
   sfree(values);
   cmd_destroy(&cmd);
 
-  return (CMD_OK);
+  return CMD_OK;
 } /* cmd_status_t cmd_handle_getval */
 
 void cmd_destroy_getval(cmd_getval_t *getval) {
@@ -164,5 +164,3 @@ void cmd_destroy_getval(cmd_getval_t *getval) {
 
   sfree(getval->raw_identifier);
 } /* void cmd_destroy_getval */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 8d488b3..5c03fa4 100644 (file)
@@ -41,5 +41,3 @@ cmd_status_t cmd_handle_getval(FILE *fh, char *buffer);
 void cmd_destroy_getval(cmd_getval_t *getval);
 
 #endif /* UTILS_CMD_GETVAL_H */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index f863889..3640630 100644 (file)
@@ -42,10 +42,10 @@ cmd_status_t cmd_parse_listval(size_t argc, char **argv,
   if (argc != 0) {
     cmd_error(CMD_PARSE_ERROR, err, "Garbage after end of command: `%s'.",
               argv[0]);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
-  return (CMD_OK);
+  return CMD_OK;
 } /* cmd_status_t cmd_parse_listval */
 
 #define free_everything_and_return(status)                                     \
@@ -56,7 +56,7 @@ cmd_status_t cmd_parse_listval(size_t argc, char **argv,
     }                                                                          \
     sfree(names);                                                              \
     sfree(times);                                                              \
-    return (status);                                                           \
+    return status;                                                             \
   } while (0)
 
 #define print_to_socket(fh, ...)                                               \
@@ -83,7 +83,7 @@ cmd_status_t cmd_handle_listval(FILE *fh, char *buffer) {
         buffer);
 
   if ((status = cmd_parse(buffer, &cmd, NULL, &err)) != CMD_OK)
-    return (status);
+    return status;
   if (cmd.type != CMD_LISTVAL) {
     cmd_error(CMD_UNKNOWN_COMMAND, &err, "Unexpected command: `%s'.",
               CMD_TO_STRING(cmd.type));
@@ -108,5 +108,3 @@ cmd_status_t cmd_handle_listval(FILE *fh, char *buffer) {
 void cmd_destroy_listval(cmd_listval_t *listval __attribute__((unused))) {
   /* nothing to do */
 } /* void cmd_destroy_listval */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 8a4e8c8..6abdeee 100644 (file)
@@ -41,5 +41,3 @@ cmd_status_t cmd_handle_listval(FILE *fh, char *buffer);
 void cmd_destroy_listval(cmd_listval_t *listval);
 
 #endif /* UTILS_CMD_LISTVAL_H */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 0edfbb8..0085c62 100644 (file)
@@ -51,9 +51,9 @@ static int set_option_severity(notification_t *n, const char *value) {
   else if (strcasecmp(value, "Okay") == 0)
     n->severity = NOTIF_OKAY;
   else
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 } /* int set_option_severity */
 
 static int set_option_time(notification_t *n, const char *value) {
@@ -66,17 +66,17 @@ static int set_option_time(notification_t *n, const char *value) {
       || (endptr == value) /* Invalid string */
       || (endptr == NULL)  /* This should not happen */
       || (*endptr != 0))   /* Trailing chars */
-    return (-1);
+    return -1;
 
   n->time = DOUBLE_TO_CDTIME_T(tmp);
 
-  return (0);
+  return 0;
 } /* int set_option_time */
 
 static int set_option(notification_t *n, const char *option,
                       const char *value) {
   if ((n == NULL) || (option == NULL) || (value == NULL))
-    return (-1);
+    return -1;
 
   DEBUG("utils_cmd_putnotif: set_option (option = %s, value = %s);", option,
         value);
@@ -85,18 +85,18 @@ static int set_option(notification_t *n, const char *option,
   if (option[0] != '\0' && option[1] == ':') {
     /* Refuse empty key */
     if (option[2] == '\0')
-      return (1);
+      return 1;
 
     if (option[0] == 's')
       return plugin_notification_meta_add_string(n, option + 2, value);
     else
-      return (1);
+      return 1;
   }
 
   if (strcasecmp("severity", option) == 0)
-    return (set_option_severity(n, value));
+    return set_option_severity(n, value);
   else if (strcasecmp("time", option) == 0)
-    return (set_option_time(n, value));
+    return set_option_time(n, value);
   else if (strcasecmp("message", option) == 0)
     sstrncpy(n->message, value, sizeof(n->message));
   else if (strcasecmp("host", option) == 0)
@@ -110,9 +110,9 @@ static int set_option(notification_t *n, const char *option,
   else if (strcasecmp("type_instance", option) == 0)
     sstrncpy(n->type_instance, value, sizeof(n->type_instance));
   else
-    return (1);
+    return 1;
 
-  return (0);
+  return 0;
 } /* int set_option */
 
 int handle_putnotif(FILE *fh, char *buffer) {
@@ -121,7 +121,7 @@ int handle_putnotif(FILE *fh, char *buffer) {
   int status;
 
   if ((fh == NULL) || (buffer == NULL))
-    return (-1);
+    return -1;
 
   DEBUG("utils_cmd_putnotif: handle_putnotif (fh = %p, buffer = %s);",
         (void *)fh, buffer);
@@ -130,13 +130,13 @@ int handle_putnotif(FILE *fh, char *buffer) {
   status = parse_string(&buffer, &command);
   if (status != 0) {
     print_to_socket(fh, "-1 Cannot parse command.\n");
-    return (-1);
+    return -1;
   }
   assert(command != NULL);
 
   if (strcasecmp("PUTNOTIF", command) != 0) {
     print_to_socket(fh, "-1 Unexpected command: `%s'.\n", command);
-    return (-1);
+    return -1;
   }
 
   status = 0;
@@ -178,7 +178,5 @@ int handle_putnotif(FILE *fh, char *buffer) {
     print_to_socket(fh, "0 Success\n");
   }
 
-  return (0);
+  return 0;
 } /* int handle_putnotif */
-
-/* vim: set shiftwidth=2 softtabstop=2 tabstop=8 : */
index af0b93e..7ad0f1a 100644 (file)
@@ -31,6 +31,4 @@
 
 int handle_putnotif(FILE *fh, char *buffer);
 
-/* vim: set shiftwidth=2 softtabstop=2 tabstop=8 : */
-
 #endif /* UTILS_CMD_PUTNOTIF_H */
index f1fe6d7..718425b 100644 (file)
@@ -37,7 +37,7 @@
 
 static int set_option(value_list_t *vl, const char *key, const char *value) {
   if ((vl == NULL) || (key == NULL) || (value == NULL))
-    return (-1);
+    return -1;
 
   if (strcasecmp("interval", key) == 0) {
     double tmp;
@@ -50,9 +50,9 @@ static int set_option(value_list_t *vl, const char *key, const char *value) {
     if ((errno == 0) && (endptr != NULL) && (endptr != value) && (tmp > 0.0))
       vl->interval = DOUBLE_TO_CDTIME_T(tmp);
   } else
-    return (1);
+    return 1;
 
-  return (0);
+  return 0;
 } /* int set_option */
 
 /*
@@ -81,12 +81,12 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
   if ((ret_putval == NULL) || (opts == NULL)) {
     errno = EINVAL;
     cmd_error(CMD_ERROR, err, "Invalid arguments to cmd_parse_putval.");
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   if (argc < 2) {
     cmd_error(CMD_PARSE_ERROR, err, "Missing identifier and/or value-list.");
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   identifier = argv[0];
@@ -103,7 +103,7 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
     cmd_error(CMD_PARSE_ERROR, err, "Cannot parse identifier `%s'.",
               identifier_copy);
     sfree(identifier_copy);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   if ((strlen(hostname) >= sizeof(vl.host)) ||
@@ -114,7 +114,7 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
        (strlen(type_instance) >= sizeof(vl.type_instance)))) {
     cmd_error(CMD_PARSE_ERROR, err, "Identifier too long.");
     sfree(identifier_copy);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   sstrncpy(vl.host, hostname, sizeof(vl.host));
@@ -129,7 +129,7 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
   if (ds == NULL) {
     cmd_error(CMD_PARSE_ERROR, err, "1 Type `%s' isn't defined.", type);
     sfree(identifier_copy);
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
   hostname = NULL;
@@ -143,7 +143,7 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
     cmd_error(CMD_ERROR, err, "malloc failed.");
     cmd_destroy_putval(ret_putval);
     sfree(vl.values);
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
   /* All the remaining fields are part of the option list. */
@@ -210,7 +210,7 @@ cmd_status_t cmd_parse_putval(size_t argc, char **argv,
   if (result != CMD_OK)
     cmd_destroy_putval(ret_putval);
 
-  return (result);
+  return result;
 } /* cmd_status_t cmd_parse_putval */
 
 void cmd_destroy_putval(cmd_putval_t *putval) {
@@ -239,12 +239,12 @@ cmd_status_t cmd_handle_putval(FILE *fh, char *buffer) {
         (void *)fh, buffer);
 
   if ((status = cmd_parse(buffer, &cmd, NULL, &err)) != CMD_OK)
-    return (status);
+    return status;
   if (cmd.type != CMD_PUTVAL) {
     cmd_error(CMD_UNKNOWN_COMMAND, &err, "Unexpected command: `%s'.",
               CMD_TO_STRING(cmd.type));
     cmd_destroy(&cmd);
-    return (CMD_UNKNOWN_COMMAND);
+    return CMD_UNKNOWN_COMMAND;
   }
 
   for (size_t i = 0; i < cmd.cmd.putval.vl_num; ++i)
@@ -256,7 +256,7 @@ cmd_status_t cmd_handle_putval(FILE *fh, char *buffer) {
               (cmd.cmd.putval.vl_num == 1) ? "value has" : "values have");
 
   cmd_destroy(&cmd);
-  return (CMD_OK);
+  return CMD_OK;
 } /* int cmd_handle_putval */
 
 int cmd_create_putval(char *ret, size_t ret_len, /* {{{ */
@@ -267,13 +267,13 @@ int cmd_create_putval(char *ret, size_t ret_len, /* {{{ */
 
   status = FORMAT_VL(buffer_ident, sizeof(buffer_ident), vl);
   if (status != 0)
-    return (status);
+    return status;
   escape_string(buffer_ident, sizeof(buffer_ident));
 
   status = format_values(buffer_values, sizeof(buffer_values), ds, vl,
                          /* store rates = */ 0);
   if (status != 0)
-    return (status);
+    return status;
   escape_string(buffer_values, sizeof(buffer_values));
 
   ssnprintf(ret, ret_len, "PUTVAL %s interval=%.3f %s", buffer_ident,
@@ -281,5 +281,5 @@ int cmd_create_putval(char *ret, size_t ret_len, /* {{{ */
                                : CDTIME_T_TO_DOUBLE(plugin_get_interval()),
             buffer_values);
 
-  return (0);
+  return 0;
 } /* }}} int cmd_create_putval */
index 3ea7c9d..9770225 100644 (file)
@@ -72,7 +72,7 @@ static cmd_status_t cmd_split(char *buffer, size_t *ret_len, char ***ret_fields,
   fields = malloc((estimate + 1) * sizeof(*fields));
   if (fields == NULL) {
     cmd_error(CMD_ERROR, err, "malloc failed.");
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
 
 #define END_FIELD()                                                            \
@@ -130,7 +130,7 @@ static cmd_status_t cmd_split(char *buffer, size_t *ret_len, char ***ret_fields,
       if (string[1] == '\0') {
         free(fields);
         cmd_error(CMD_PARSE_ERROR, err, "Backslash at end of string.");
-        return (CMD_PARSE_ERROR);
+        return CMD_PARSE_ERROR;
       }
 
       /* un-escape the next character; skip backslash */
@@ -148,7 +148,7 @@ static cmd_status_t cmd_split(char *buffer, size_t *ret_len, char ***ret_fields,
   if (in_quotes) {
     free(fields);
     cmd_error(CMD_PARSE_ERROR, err, "Unterminated quoted string.");
-    return (CMD_PARSE_ERROR);
+    return CMD_PARSE_ERROR;
   }
 
 #undef NEW_FIELD
@@ -161,7 +161,7 @@ static cmd_status_t cmd_split(char *buffer, size_t *ret_len, char ***ret_fields,
     *ret_fields = fields;
   else
     free(fields);
-  return (CMD_OK);
+  return CMD_OK;
 } /* int cmd_split */
 
 /*
@@ -215,12 +215,12 @@ cmd_status_t cmd_parsev(size_t argc, char **argv, cmd_t *ret_cmd,
   } else {
     ret_cmd->type = CMD_UNKNOWN;
     cmd_error(CMD_UNKNOWN_COMMAND, err, "Unknown command `%s'.", command);
-    return (CMD_UNKNOWN_COMMAND);
+    return CMD_UNKNOWN_COMMAND;
   }
 
   if (status != CMD_OK)
     ret_cmd->type = CMD_UNKNOWN;
-  return (status);
+  return status;
 } /* cmd_status_t cmd_parsev */
 
 cmd_status_t cmd_parse(char *buffer, cmd_t *ret_cmd, const cmd_options_t *opts,
@@ -234,7 +234,7 @@ cmd_status_t cmd_parse(char *buffer, cmd_t *ret_cmd, const cmd_options_t *opts,
 
   status = cmd_parsev(fields_num, fields, ret_cmd, opts, err);
   free(fields);
-  return (status);
+  return status;
 } /* cmd_status_t cmd_parse */
 
 void cmd_destroy(cmd_t *cmd) {
@@ -267,7 +267,7 @@ cmd_status_t cmd_parse_option(char *field, char **ret_key, char **ret_value,
   if (field == NULL) {
     errno = EINVAL;
     cmd_error(CMD_ERROR, err, "Invalid argument to cmd_parse_option.");
-    return (CMD_ERROR);
+    return CMD_ERROR;
   }
   key = value = field;
 
@@ -276,7 +276,7 @@ cmd_status_t cmd_parse_option(char *field, char **ret_key, char **ret_value,
     value++;
   if ((value[0] != '=') || (value == key)) {
     /* Whether this is a fatal error is up to the caller. */
-    return (CMD_NO_OPTION);
+    return CMD_NO_OPTION;
   }
   *value = '\0';
   value++;
@@ -286,7 +286,7 @@ cmd_status_t cmd_parse_option(char *field, char **ret_key, char **ret_value,
   if (ret_value != NULL)
     *ret_value = value;
 
-  return (CMD_OK);
+  return CMD_OK;
 } /* cmd_status_t cmd_parse_option */
 
 void cmd_error_fh(void *ud, cmd_status_t status, const char *format,
@@ -309,5 +309,3 @@ void cmd_error_fh(void *ud, cmd_status_t status, const char *format,
 
   fflush(fh);
 } /* void cmd_error_fh */
-
-/* vim: set sw=4 ts=4 tw=78 noexpandtab : */
index b540146..bb35ce8 100644 (file)
@@ -215,7 +215,7 @@ DEF_TEST(parse) {
     free(input);
   }
 
-  return (test_result);
+  return test_result;
 }
 
 int main(int argc, char **argv) {
index 9a58227..41f40d9 100644 (file)
@@ -100,20 +100,20 @@ static int udb_config_set_string(char **ret_string, /* {{{ */
     WARNING("db query utils: The `%s' config option "
             "needs exactly one string argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   string = strdup(ci->values[0].value.string);
   if (string == NULL) {
     ERROR("db query utils: strdup failed.");
-    return (-1);
+    return -1;
   }
 
   if (*ret_string != NULL)
     free(*ret_string);
   *ret_string = string;
 
-  return (0);
+  return 0;
 } /* }}} int udb_config_set_string */
 
 static int udb_config_add_string(char ***ret_array, /* {{{ */
@@ -125,7 +125,7 @@ static int udb_config_add_string(char ***ret_array, /* {{{ */
     WARNING("db query utils: The `%s' config option "
             "needs at least one argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   for (int i = 0; i < ci->values_num; i++) {
@@ -133,7 +133,7 @@ static int udb_config_add_string(char ***ret_array, /* {{{ */
       WARNING("db query utils: Argument %i to the `%s' option "
               "is not a string.",
               i + 1, ci->key);
-      return (-1);
+      return -1;
     }
   }
 
@@ -141,7 +141,7 @@ static int udb_config_add_string(char ***ret_array, /* {{{ */
   array = realloc(*ret_array, sizeof(char *) * (array_len + ci->values_num));
   if (array == NULL) {
     ERROR("db query utils: realloc failed.");
-    return (-1);
+    return -1;
   }
   *ret_array = array;
 
@@ -150,13 +150,13 @@ static int udb_config_add_string(char ***ret_array, /* {{{ */
     if (array[array_len] == NULL) {
       ERROR("db query utils: strdup failed.");
       *ret_array_len = array_len;
-      return (-1);
+      return -1;
     }
     array_len++;
   }
 
   *ret_array_len = array_len;
-  return (0);
+  return 0;
 } /* }}} int udb_config_add_string */
 
 static int udb_config_set_uint(unsigned int *ret_value, /* {{{ */
@@ -167,15 +167,15 @@ static int udb_config_set_uint(unsigned int *ret_value, /* {{{ */
     WARNING("db query utils: The `%s' config option "
             "needs exactly one numeric argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   tmp = ci->values[0].value.number;
   if ((tmp < 0.0) || (tmp > ((double)UINT_MAX)))
-    return (-ERANGE);
+    return -ERANGE;
 
   *ret_value = (unsigned int)(tmp + .5);
-  return (0);
+  return 0;
 } /* }}} int udb_config_set_uint */
 
 /*
@@ -195,7 +195,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
   vl.values = calloc(r->values_num, sizeof(*vl.values));
   if (vl.values == NULL) {
     ERROR("db query utils: calloc failed.");
-    return (-1);
+    return -1;
   }
   vl.values_len = r_area->ds->ds_num;
 
@@ -207,7 +207,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
             value_str, DS_TYPE_TO_STRING(r_area->ds->ds[i].type));
       errno = EINVAL;
       free(vl.values);
-      return (-1);
+      return -1;
     }
   }
 
@@ -241,7 +241,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
         ERROR(
             "udb_result_submit: creating type_instance failed with status %d.",
             status);
-        return (status);
+        return status;
       }
     } else {
       char tmp[DATA_MAX_NAME_LEN];
@@ -252,7 +252,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
         ERROR(
             "udb_result_submit: creating type_instance failed with status %d.",
             status);
-        return (status);
+        return status;
       }
       tmp[sizeof(tmp) - 1] = 0;
 
@@ -268,7 +268,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
     vl.meta = meta_data_create();
     if (vl.meta == NULL) {
       ERROR("db query utils:: meta_data_create failed.");
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     for (size_t i = 0; i < r->metadata_num; i++) {
@@ -278,7 +278,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
         ERROR("db query utils:: meta_data_add_string failed.");
         meta_data_destroy(vl.meta);
         vl.meta = NULL;
-        return (status);
+        return status;
       }
     }
   }
@@ -291,7 +291,7 @@ static int udb_result_submit(udb_result_t *r, /* {{{ */
     vl.meta = NULL;
   }
   sfree(vl.values);
-  return (0);
+  return 0;
 } /* }}} void udb_result_submit */
 
 static void udb_result_finish_result(udb_result_t const *r, /* {{{ */
@@ -334,7 +334,7 @@ static int udb_result_prepare_result(udb_result_t const *r, /* {{{ */
                                      udb_result_preparation_area_t *prep_area,
                                      char **column_names, size_t column_num) {
   if ((r == NULL) || (prep_area == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
 #define BAIL_OUT(status)                                                       \
   prep_area->ds = NULL;                                                        \
@@ -472,7 +472,7 @@ static int udb_result_prepare_result(udb_result_t const *r, /* {{{ */
   } /* }}} for (i = 0; i < r->metadata_num; i++) */
 
 #undef BAIL_OUT
-  return (0);
+  return 0;
 } /* }}} int udb_result_prepare_result */
 
 static void udb_result_free(udb_result_t *r) /* {{{ */
@@ -514,7 +514,7 @@ static int udb_result_create(const char *query_name, /* {{{ */
   r = calloc(1, sizeof(*r));
   if (r == NULL) {
     ERROR("db query utils: calloc failed.");
-    return (-1);
+    return -1;
   }
   r->type = NULL;
   r->instance_prefix = NULL;
@@ -568,7 +568,7 @@ static int udb_result_create(const char *query_name, /* {{{ */
 
   if (status != 0) {
     udb_result_free(r);
-    return (-1);
+    return -1;
   }
 
   /* If all went well, add this result to the list of results. */
@@ -584,7 +584,7 @@ static int udb_result_create(const char *query_name, /* {{{ */
     last->next = r;
   }
 
-  return (0);
+  return 0;
 } /* }}} int udb_result_create */
 
 /*
@@ -617,20 +617,20 @@ int udb_query_create(udb_query_t ***ret_query_list, /* {{{ */
   int status;
 
   if ((ret_query_list == NULL) || (ret_query_list_len == NULL))
-    return (-EINVAL);
+    return -EINVAL;
   query_list = *ret_query_list;
   query_list_len = *ret_query_list_len;
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("db query utils: The `Query' block "
             "needs exactly one string argument.");
-    return (-1);
+    return -1;
   }
 
   q = calloc(1, sizeof(*q));
   if (q == NULL) {
     ERROR("db query utils: calloc failed.");
-    return (-1);
+    return -1;
   }
   q->min_version = 0;
   q->max_version = UINT_MAX;
@@ -641,7 +641,7 @@ int udb_query_create(udb_query_t ***ret_query_list, /* {{{ */
   status = udb_config_set_string(&q->name, ci);
   if (status != 0) {
     sfree(q);
-    return (status);
+    return status;
   }
 
   /* Fill the `udb_query_t' structure.. */
@@ -708,13 +708,13 @@ int udb_query_create(udb_query_t ***ret_query_list, /* {{{ */
 
   if (status != 0) {
     udb_query_free_one(q);
-    return (-1);
+    return -1;
   }
 
   *ret_query_list = query_list;
   *ret_query_list_len = query_list_len;
 
-  return (0);
+  return 0;
 } /* }}} int udb_query_create */
 
 void udb_query_free(udb_query_t **query_list, size_t query_list_len) /* {{{ */
@@ -739,7 +739,7 @@ int udb_query_pick_from_list_by_name(const char *name, /* {{{ */
       (dst_list_len == NULL)) {
     ERROR("db query utils: udb_query_pick_from_list_by_name: "
           "Invalid argument.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   num_added = 0;
@@ -754,7 +754,7 @@ int udb_query_pick_from_list_by_name(const char *name, /* {{{ */
     tmp_list = realloc(*dst_list, (tmp_list_len + 1) * sizeof(udb_query_t *));
     if (tmp_list == NULL) {
       ERROR("db query utils: realloc failed.");
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     tmp_list[tmp_list_len] = src_list[i];
@@ -770,12 +770,12 @@ int udb_query_pick_from_list_by_name(const char *name, /* {{{ */
     ERROR("db query utils: Cannot find query `%s'. Make sure the <Query> "
           "block is above the database definition!",
           name);
-    return (-ENOENT);
+    return -ENOENT;
   } else {
     DEBUG("db query utils: Added %i versions of query `%s'.", num_added, name);
   }
 
-  return (0);
+  return 0;
 } /* }}} int udb_query_pick_from_list_by_name */
 
 int udb_query_pick_from_list(oconfig_item_t *ci, /* {{{ */
@@ -787,35 +787,35 @@ int udb_query_pick_from_list(oconfig_item_t *ci, /* {{{ */
       (dst_list_len == NULL)) {
     ERROR("db query utils: udb_query_pick_from_list: "
           "Invalid argument.");
-    return (-EINVAL);
+    return -EINVAL;
   }
 
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     ERROR("db query utils: The `%s' config option "
           "needs exactly one string argument.",
           ci->key);
-    return (-1);
+    return -1;
   }
   name = ci->values[0].value.string;
 
-  return (udb_query_pick_from_list_by_name(name, src_list, src_list_len,
-                                           dst_list, dst_list_len));
+  return udb_query_pick_from_list_by_name(name, src_list, src_list_len,
+                                          dst_list, dst_list_len);
 } /* }}} int udb_query_pick_from_list */
 
 const char *udb_query_get_name(udb_query_t *q) /* {{{ */
 {
   if (q == NULL)
-    return (NULL);
+    return NULL;
 
-  return (q->name);
+  return q->name;
 } /* }}} const char *udb_query_get_name */
 
 const char *udb_query_get_statement(udb_query_t *q) /* {{{ */
 {
   if (q == NULL)
-    return (NULL);
+    return NULL;
 
-  return (q->statement);
+  return q->statement;
 } /* }}} const char *udb_query_get_statement */
 
 void udb_query_set_user_data(udb_query_t *q, void *user_data) /* {{{ */
@@ -829,20 +829,20 @@ void udb_query_set_user_data(udb_query_t *q, void *user_data) /* {{{ */
 void *udb_query_get_user_data(udb_query_t *q) /* {{{ */
 {
   if (q == NULL)
-    return (NULL);
+    return NULL;
 
-  return (q->user_data);
+  return q->user_data;
 } /* }}} void *udb_query_get_user_data */
 
 int udb_query_check_version(udb_query_t *q, unsigned int version) /* {{{ */
 {
   if (q == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   if ((version < q->min_version) || (version > q->max_version))
-    return (0);
+    return 0;
 
-  return (1);
+  return 1;
 } /* }}} int udb_query_check_version */
 
 void udb_query_finish_result(udb_query_t const *q, /* {{{ */
@@ -878,14 +878,14 @@ int udb_query_handle_result(udb_query_t const *q, /* {{{ */
   int status;
 
   if ((q == NULL) || (prep_area == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if ((prep_area->column_num < 1) || (prep_area->host == NULL) ||
       (prep_area->plugin == NULL) || (prep_area->db_name == NULL)) {
     ERROR("db query utils: Query `%s': Query is not prepared; "
           "can't handle result.",
           q->name);
-    return (-EINVAL);
+    return -EINVAL;
   }
 
 #if defined(COLLECT_DEBUG) && COLLECT_DEBUG /* {{{ */
@@ -910,10 +910,10 @@ int udb_query_handle_result(udb_query_t const *q, /* {{{ */
     ERROR("db query utils: udb_query_handle_result (%s, %s): "
           "All results failed.",
           prep_area->db_name, q->name);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int udb_query_handle_result */
 
 int udb_query_prepare_result(udb_query_t const *q, /* {{{ */
@@ -926,7 +926,7 @@ int udb_query_prepare_result(udb_query_t const *q, /* {{{ */
   int status;
 
   if ((q == NULL) || (prep_area == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   udb_query_finish_result(q, prep_area);
 
@@ -942,7 +942,7 @@ int udb_query_prepare_result(udb_query_t const *q, /* {{{ */
     ERROR("db query utils: Query `%s': Prepare failed: Out of memory.",
           q->name);
     udb_query_finish_result(q, prep_area);
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
 #if defined(COLLECT_DEBUG) && COLLECT_DEBUG
@@ -971,7 +971,7 @@ int udb_query_prepare_result(udb_query_t const *q, /* {{{ */
             "Column `%s' from `PluginInstanceFrom' could not be found.",
             q->plugin_instance_from);
       udb_query_finish_result(q, prep_area);
-      return (-ENOENT);
+      return -ENOENT;
     }
   }
   /* }}} */
@@ -983,17 +983,17 @@ int udb_query_prepare_result(udb_query_t const *q, /* {{{ */
             "preparation areas.",
             q->name);
       udb_query_finish_result(q, prep_area);
-      return (-EINVAL);
+      return -EINVAL;
     }
 
     status = udb_result_prepare_result(r, r_area, column_names, column_num);
     if (status != 0) {
       udb_query_finish_result(q, prep_area);
-      return (status);
+      return status;
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int udb_query_prepare_result */
 
 udb_query_preparation_area_t *
@@ -1029,7 +1029,7 @@ udb_query_allocate_preparation_area(udb_query_t *q) /* {{{ */
     next_r_area = &r_area->next;
   }
 
-  return (q_area);
+  return q_area;
 } /* }}} udb_query_preparation_area_t *udb_query_allocate_preparation_area */
 
 void udb_query_delete_preparation_area(
@@ -1059,5 +1059,3 @@ void udb_query_delete_preparation_area(
 
   free(q_area);
 } /* }}} void udb_query_delete_preparation_area */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 8f06918..4d6129a 100644 (file)
@@ -83,4 +83,3 @@ udb_query_allocate_preparation_area(udb_query_t *q);
 void udb_query_delete_preparation_area(udb_query_preparation_area_t *q_area);
 
 #endif /* UTILS_DB_QUERY_H */
-/* vim: set sw=2 sts=2 et : */
index a4a5784..37fa930 100644 (file)
@@ -185,16 +185,16 @@ static int cmp_in6_addr(const struct in6_addr *a, const struct in6_addr *b) {
       break;
 
   if (i >= 16)
-    return (0);
+    return 0;
 
-  return (a->s6_addr[i] > b->s6_addr[i] ? 1 : -1);
+  return a->s6_addr[i] > b->s6_addr[i] ? 1 : -1;
 } /* int cmp_addrinfo */
 
 static inline int ignore_list_match(const struct in6_addr *addr) {
   for (ip_list_t *ptr = IgnoreList; ptr != NULL; ptr = ptr->next)
     if (cmp_in6_addr(addr, &ptr->addr) == 0)
-      return (1);
-  return (0);
+      return 1;
+  return 0;
 } /* int ignore_list_match */
 
 static void ignore_list_add(const struct in6_addr *addr) {
@@ -416,7 +416,7 @@ static int handle_ipv6(struct ip6_hdr *ipv6, int len) {
   uint16_t payload_len;
 
   if (0 > len)
-    return (0);
+    return 0;
 
   offset = sizeof(struct ip6_hdr);
   nexthdr = ipv6->ip6_nxt;
@@ -424,7 +424,7 @@ static int handle_ipv6(struct ip6_hdr *ipv6, int len) {
   payload_len = ntohs(ipv6->ip6_plen);
 
   if (ignore_list_match(&c_src_addr))
-    return (0);
+    return 0;
 
   /* Parse extension headers. This only handles the standard headers, as
    * defined in RFC 2460, correctly. Fragments are discarded. */
@@ -440,11 +440,11 @@ static int handle_ipv6(struct ip6_hdr *ipv6, int len) {
 
     /* Catch broken packets */
     if ((offset + sizeof(struct ip6_ext)) > (unsigned int)len)
-      return (0);
+      return 0;
 
     /* Cannot handle fragments. */
     if (IPPROTO_FRAGMENT == nexthdr)
-      return (0);
+      return 0;
 
     memcpy(&ext_hdr, (char *)ipv6 + offset, sizeof(struct ip6_ext));
     nexthdr = ext_hdr.ip6e_nxt;
@@ -452,7 +452,7 @@ static int handle_ipv6(struct ip6_hdr *ipv6, int len) {
 
     /* This header is longer than the packets payload.. WTF? */
     if (ext_hdr_len > payload_len)
-      return (0);
+      return 0;
 
     offset += ext_hdr_len;
     payload_len -= ext_hdr_len;
@@ -461,23 +461,23 @@ static int handle_ipv6(struct ip6_hdr *ipv6, int len) {
   /* Catch broken and empty packets */
   if (((offset + payload_len) > (unsigned int)len) || (payload_len == 0) ||
       (payload_len > PCAP_SNAPLEN))
-    return (0);
+    return 0;
 
   if (IPPROTO_UDP != nexthdr)
-    return (0);
+    return 0;
 
   memcpy(buf, (char *)ipv6 + offset, payload_len);
   if (handle_udp((struct udphdr *)buf, payload_len) == 0)
-    return (0);
+    return 0;
 
-  return (1); /* Success */
+  return 1; /* Success */
 } /* int handle_ipv6 */
 /* #endif HAVE_IPV6 */
 
 #else  /* if !HAVE_IPV6 */
 static int handle_ipv6(__attribute__((unused)) void *pkg,
                        __attribute__((unused)) int len) {
-  return (0);
+  return 0;
 }
 #endif /* !HAVE_IPV6 */
 
@@ -488,14 +488,14 @@ static int handle_ip(const struct ip *ip, int len) {
   struct in6_addr c_dst_addr;
 
   if (ip->ip_v == 6)
-    return (handle_ipv6((void *)ip, len));
+    return handle_ipv6((void *)ip, len);
 
   in6_addr_from_buffer(&c_src_addr, &ip->ip_src.s_addr,
                        sizeof(ip->ip_src.s_addr), AF_INET);
   in6_addr_from_buffer(&c_dst_addr, &ip->ip_dst.s_addr,
                        sizeof(ip->ip_dst.s_addr), AF_INET);
   if (ignore_list_match(&c_src_addr))
-    return (0);
+    return 0;
   if (IPPROTO_UDP != ip->ip_p)
     return 0;
   memcpy(buf, ((char *)ip) + offset, len - offset);
@@ -577,7 +577,7 @@ static int handle_ether(const u_char *pkt, int len) {
     return 0;
   memcpy(buf, pkt, len);
   if (ETHERTYPE_IPV6 == etype)
-    return (handle_ipv6((void *)buf, len));
+    return handle_ipv6((void *)buf, len);
   else
     return handle_ip((struct ip *)buf, len);
 }
@@ -594,7 +594,7 @@ static int handle_linux_sll(const u_char *pkt, int len) {
   uint16_t etype;
 
   if ((0 > len) || ((unsigned int)len < sizeof(struct sll_header)))
-    return (0);
+    return 0;
 
   hdr = (struct sll_header *)pkt;
   pkt = (u_char *)(hdr + 1);
@@ -606,7 +606,7 @@ static int handle_linux_sll(const u_char *pkt, int len) {
     return 0;
 
   if (ETHERTYPE_IPV6 == etype)
-    return (handle_ipv6((void *)pkt, len));
+    return handle_ipv6((void *)pkt, len);
   else
     return handle_ip((struct ip *)pkt, len);
 }
@@ -669,251 +669,251 @@ const char *qtype_str(int t) {
   switch (t) {
 #if (defined(__NAMESER)) && (__NAMESER >= 19991001)
   case ns_t_a:
-    return ("A");
+    return "A";
   case ns_t_ns:
-    return ("NS");
+    return "NS";
   case ns_t_md:
-    return ("MD");
+    return "MD";
   case ns_t_mf:
-    return ("MF");
+    return "MF";
   case ns_t_cname:
-    return ("CNAME");
+    return "CNAME";
   case ns_t_soa:
-    return ("SOA");
+    return "SOA";
   case ns_t_mb:
-    return ("MB");
+    return "MB";
   case ns_t_mg:
-    return ("MG");
+    return "MG";
   case ns_t_mr:
-    return ("MR");
+    return "MR";
   case ns_t_null:
-    return ("NULL");
+    return "NULL";
   case ns_t_wks:
-    return ("WKS");
+    return "WKS";
   case ns_t_ptr:
-    return ("PTR");
+    return "PTR";
   case ns_t_hinfo:
-    return ("HINFO");
+    return "HINFO";
   case ns_t_minfo:
-    return ("MINFO");
+    return "MINFO";
   case ns_t_mx:
-    return ("MX");
+    return "MX";
   case ns_t_txt:
-    return ("TXT");
+    return "TXT";
   case ns_t_rp:
-    return ("RP");
+    return "RP";
   case ns_t_afsdb:
-    return ("AFSDB");
+    return "AFSDB";
   case ns_t_x25:
-    return ("X25");
+    return "X25";
   case ns_t_isdn:
-    return ("ISDN");
+    return "ISDN";
   case ns_t_rt:
-    return ("RT");
+    return "RT";
   case ns_t_nsap:
-    return ("NSAP");
+    return "NSAP";
   case ns_t_nsap_ptr:
-    return ("NSAP-PTR");
+    return "NSAP-PTR";
   case ns_t_sig:
-    return ("SIG");
+    return "SIG";
   case ns_t_key:
-    return ("KEY");
+    return "KEY";
   case ns_t_px:
-    return ("PX");
+    return "PX";
   case ns_t_gpos:
-    return ("GPOS");
+    return "GPOS";
   case ns_t_aaaa:
-    return ("AAAA");
+    return "AAAA";
   case ns_t_loc:
-    return ("LOC");
+    return "LOC";
   case ns_t_nxt:
-    return ("NXT");
+    return "NXT";
   case ns_t_eid:
-    return ("EID");
+    return "EID";
   case ns_t_nimloc:
-    return ("NIMLOC");
+    return "NIMLOC";
   case ns_t_srv:
-    return ("SRV");
+    return "SRV";
   case ns_t_atma:
-    return ("ATMA");
+    return "ATMA";
   case ns_t_naptr:
-    return ("NAPTR");
+    return "NAPTR";
   case ns_t_opt:
-    return ("OPT");
+    return "OPT";
 #if __NAMESER >= 19991006
   case ns_t_kx:
-    return ("KX");
+    return "KX";
   case ns_t_cert:
-    return ("CERT");
+    return "CERT";
   case ns_t_a6:
-    return ("A6");
+    return "A6";
   case ns_t_dname:
-    return ("DNAME");
+    return "DNAME";
   case ns_t_sink:
-    return ("SINK");
+    return "SINK";
   case ns_t_tsig:
-    return ("TSIG");
+    return "TSIG";
 #endif
 #if __NAMESER >= 20090302
   case ns_t_apl:
-    return ("APL");
+    return "APL";
   case ns_t_ds:
-    return ("DS");
+    return "DS";
   case ns_t_sshfp:
-    return ("SSHFP");
+    return "SSHFP";
   case ns_t_ipseckey:
-    return ("IPSECKEY");
+    return "IPSECKEY";
   case ns_t_rrsig:
-    return ("RRSIG");
+    return "RRSIG";
   case ns_t_nsec:
-    return ("NSEC");
+    return "NSEC";
   case ns_t_dnskey:
-    return ("DNSKEY");
+    return "DNSKEY";
   case ns_t_dhcid:
-    return ("DHCID");
+    return "DHCID";
   case ns_t_nsec3:
-    return ("NSEC3");
+    return "NSEC3";
   case ns_t_nsec3param:
-    return ("NSEC3PARAM");
+    return "NSEC3PARAM";
   case ns_t_hip:
-    return ("HIP");
+    return "HIP";
   case ns_t_spf:
-    return ("SPF");
+    return "SPF";
   case ns_t_ixfr:
-    return ("IXFR");
+    return "IXFR";
 #endif
   case ns_t_axfr:
-    return ("AXFR");
+    return "AXFR";
   case ns_t_mailb:
-    return ("MAILB");
+    return "MAILB";
   case ns_t_maila:
-    return ("MAILA");
+    return "MAILA";
   case ns_t_any:
-    return ("ANY");
+    return "ANY";
 #if __NAMESER >= 19991006
   case ns_t_zxfr:
-    return ("ZXFR");
+    return "ZXFR";
 #endif
 #if __NAMESER >= 20090302
   case ns_t_dlv:
-    return ("DLV");
+    return "DLV";
 #endif
 /* #endif __NAMESER >= 19991001 */
 #elif (defined(__BIND)) && (__BIND >= 19950621)
   case T_A:
-    return ("A"); /* 1 ... */
+    return "A"; /* 1 ... */
   case T_NS:
-    return ("NS");
+    return "NS";
   case T_MD:
-    return ("MD");
+    return "MD";
   case T_MF:
-    return ("MF");
+    return "MF";
   case T_CNAME:
-    return ("CNAME");
+    return "CNAME";
   case T_SOA:
-    return ("SOA");
+    return "SOA";
   case T_MB:
-    return ("MB");
+    return "MB";
   case T_MG:
-    return ("MG");
+    return "MG";
   case T_MR:
-    return ("MR");
+    return "MR";
   case T_NULL:
-    return ("NULL");
+    return "NULL";
   case T_WKS:
-    return ("WKS");
+    return "WKS";
   case T_PTR:
-    return ("PTR");
+    return "PTR";
   case T_HINFO:
-    return ("HINFO");
+    return "HINFO";
   case T_MINFO:
-    return ("MINFO");
+    return "MINFO";
   case T_MX:
-    return ("MX");
+    return "MX";
   case T_TXT:
-    return ("TXT");
+    return "TXT";
   case T_RP:
-    return ("RP");
+    return "RP";
   case T_AFSDB:
-    return ("AFSDB");
+    return "AFSDB";
   case T_X25:
-    return ("X25");
+    return "X25";
   case T_ISDN:
-    return ("ISDN");
+    return "ISDN";
   case T_RT:
-    return ("RT");
+    return "RT";
   case T_NSAP:
-    return ("NSAP");
+    return "NSAP";
   case T_NSAP_PTR:
-    return ("NSAP_PTR");
+    return "NSAP_PTR";
   case T_SIG:
-    return ("SIG");
+    return "SIG";
   case T_KEY:
-    return ("KEY");
+    return "KEY";
   case T_PX:
-    return ("PX");
+    return "PX";
   case T_GPOS:
-    return ("GPOS");
+    return "GPOS";
   case T_AAAA:
-    return ("AAAA");
+    return "AAAA";
   case T_LOC:
-    return ("LOC");
+    return "LOC";
   case T_NXT:
-    return ("NXT");
+    return "NXT";
   case T_EID:
-    return ("EID");
+    return "EID";
   case T_NIMLOC:
-    return ("NIMLOC");
+    return "NIMLOC";
   case T_SRV:
-    return ("SRV");
+    return "SRV";
   case T_ATMA:
-    return ("ATMA");
+    return "ATMA";
   case T_NAPTR:
-    return ("NAPTR"); /* ... 35 */
+    return "NAPTR"; /* ... 35 */
 #if (__BIND >= 19960801)
   case T_KX:
-    return ("KX"); /* 36 ... */
+    return "KX"; /* 36 ... */
   case T_CERT:
-    return ("CERT");
+    return "CERT";
   case T_A6:
-    return ("A6");
+    return "A6";
   case T_DNAME:
-    return ("DNAME");
+    return "DNAME";
   case T_SINK:
-    return ("SINK");
+    return "SINK";
   case T_OPT:
-    return ("OPT");
+    return "OPT";
   case T_APL:
-    return ("APL");
+    return "APL";
   case T_DS:
-    return ("DS");
+    return "DS";
   case T_SSHFP:
-    return ("SSHFP");
+    return "SSHFP";
   case T_RRSIG:
-    return ("RRSIG");
+    return "RRSIG";
   case T_NSEC:
-    return ("NSEC");
+    return "NSEC";
   case T_DNSKEY:
-    return ("DNSKEY"); /* ... 48 */
+    return "DNSKEY"; /* ... 48 */
   case T_TKEY:
-    return ("TKEY"); /* 249 */
+    return "TKEY"; /* 249 */
 #endif /* __BIND >= 19960801 */
   case T_TSIG:
-    return ("TSIG"); /* 250 ... */
+    return "TSIG"; /* 250 ... */
   case T_IXFR:
-    return ("IXFR");
+    return "IXFR";
   case T_AXFR:
-    return ("AXFR");
+    return "AXFR";
   case T_MAILB:
-    return ("MAILB");
+    return "MAILB";
   case T_MAILA:
-    return ("MAILA");
+    return "MAILA";
   case T_ANY:
-    return ("ANY"); /* ... 255 */
+    return "ANY"; /* ... 255 */
 #endif /* __BIND >= 19950621 */
   default:
     ssnprintf(buf, sizeof(buf), "#%i", t);
-    return (buf);
+    return buf;
   } /* switch (t) */
 }
 
@@ -941,65 +941,65 @@ const char *rcode_str(int rcode) {
   switch (rcode) {
 #if (defined(__NAMESER)) && (__NAMESER >= 19991006)
   case ns_r_noerror:
-    return ("NOERROR");
+    return "NOERROR";
   case ns_r_formerr:
-    return ("FORMERR");
+    return "FORMERR";
   case ns_r_servfail:
-    return ("SERVFAIL");
+    return "SERVFAIL";
   case ns_r_nxdomain:
-    return ("NXDOMAIN");
+    return "NXDOMAIN";
   case ns_r_notimpl:
-    return ("NOTIMPL");
+    return "NOTIMPL";
   case ns_r_refused:
-    return ("REFUSED");
+    return "REFUSED";
   case ns_r_yxdomain:
-    return ("YXDOMAIN");
+    return "YXDOMAIN";
   case ns_r_yxrrset:
-    return ("YXRRSET");
+    return "YXRRSET";
   case ns_r_nxrrset:
-    return ("NXRRSET");
+    return "NXRRSET";
   case ns_r_notauth:
-    return ("NOTAUTH");
+    return "NOTAUTH";
   case ns_r_notzone:
-    return ("NOTZONE");
+    return "NOTZONE";
   case ns_r_max:
-    return ("MAX");
+    return "MAX";
   case ns_r_badsig:
-    return ("BADSIG");
+    return "BADSIG";
   case ns_r_badkey:
-    return ("BADKEY");
+    return "BADKEY";
   case ns_r_badtime:
-    return ("BADTIME");
+    return "BADTIME";
 /* #endif __NAMESER >= 19991006 */
 #elif (defined(__BIND)) && (__BIND >= 19950621)
   case NOERROR:
-    return ("NOERROR");
+    return "NOERROR";
   case FORMERR:
-    return ("FORMERR");
+    return "FORMERR";
   case SERVFAIL:
-    return ("SERVFAIL");
+    return "SERVFAIL";
   case NXDOMAIN:
-    return ("NXDOMAIN");
+    return "NXDOMAIN";
   case NOTIMP:
-    return ("NOTIMP");
+    return "NOTIMP";
   case REFUSED:
-    return ("REFUSED");
+    return "REFUSED";
 #if defined(YXDOMAIN) && defined(NXRRSET)
   case YXDOMAIN:
-    return ("YXDOMAIN");
+    return "YXDOMAIN";
   case YXRRSET:
-    return ("YXRRSET");
+    return "YXRRSET";
   case NXRRSET:
-    return ("NXRRSET");
+    return "NXRRSET";
   case NOTAUTH:
-    return ("NOTAUTH");
+    return "NOTAUTH";
   case NOTZONE:
-    return ("NOTZONE");
+    return "NOTZONE";
 #endif /* RFC2136 rcodes */
 #endif /* __BIND >= 19950621 */
   default:
     ssnprintf(buf, sizeof(buf), "RCode%i", rcode);
-    return (buf);
+    return buf;
   }
 } /* const char *rcode_str (int rcode) */
 
@@ -1169,6 +1169,3 @@ main(int argc, char *argv[])
     return 0;
 } /* static int main(int argc, char *argv[]) */
 #endif
-/*
- * vim:shiftwidth=4:tabstop=8:softtabstop=4
- */
diff --git a/src/utils_dpdk.c b/src/utils_dpdk.c
new file mode 100644 (file)
index 0000000..3a30438
--- /dev/null
@@ -0,0 +1,872 @@
+/*
+ * collectd - src/utils_dpdk.c
+ * MIT License
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Maryam Tahhan <maryam.tahhan@intel.com>
+ *   Harry van Haaren <harry.van.haaren@intel.com>
+ *   Taras Chornyi <tarasx.chornyi@intel.com>
+ *   Serhiy Pshyk <serhiyx.pshyk@intel.com>
+ *   Krzysztof Matczak <krzysztofx.matczak@intel.com>
+ */
+
+#include "collectd.h"
+
+#include <poll.h>
+#include <semaphore.h>
+#include <sys/mman.h>
+
+#include <rte_config.h>
+#include <rte_eal.h>
+#include <rte_ethdev.h>
+
+#include "common.h"
+#include "utils_dpdk.h"
+
+#define DPDK_DEFAULT_RTE_CONFIG "/var/run/.rte_config"
+#define DPDK_EAL_ARGC 5
+#define DPDK_MAX_BUFFER_SIZE (4096 * 4)
+#define DPDK_CDM_DEFAULT_TIMEOUT 10000
+
+enum DPDK_HELPER_STATUS {
+  DPDK_HELPER_NOT_INITIALIZED = 0,
+  DPDK_HELPER_INITIALIZING,
+  DPDK_HELPER_WAITING_ON_PRIMARY,
+  DPDK_HELPER_INITIALIZING_EAL,
+  DPDK_HELPER_ALIVE_SENDING_EVENTS,
+  DPDK_HELPER_GRACEFUL_QUIT,
+};
+
+#define DPDK_HELPER_TRACE(_name)                                               \
+  DEBUG("%s:%s:%d pid=%ld", _name, __FUNCTION__, __LINE__, (long)getpid())
+
+struct dpdk_helper_ctx_s {
+
+  dpdk_eal_config_t eal_config;
+  int eal_initialized;
+
+  size_t shm_size;
+  const char *shm_name;
+
+  sem_t sema_cmd_start;
+  sem_t sema_cmd_complete;
+  cdtime_t cmd_wait_time;
+
+  pid_t pid;
+  int pipes[2];
+  int status;
+
+  int cmd;
+  int cmd_result;
+
+  char priv_data[];
+};
+
+static int dpdk_shm_init(const char *name, size_t size, void **map);
+static void dpdk_shm_cleanup(const char *name, size_t size, void *map);
+
+static int dpdk_helper_spawn(dpdk_helper_ctx_t *phc);
+static int dpdk_helper_worker(dpdk_helper_ctx_t *phc);
+static int dpdk_helper_eal_init(dpdk_helper_ctx_t *phc);
+static int dpdk_helper_cmd_wait(dpdk_helper_ctx_t *phc, pid_t ppid);
+static int dpdk_helper_exit_command(dpdk_helper_ctx_t *phc,
+                                    enum DPDK_HELPER_STATUS status);
+static int dpdk_helper_exit(dpdk_helper_ctx_t *phc,
+                            enum DPDK_HELPER_STATUS status);
+static int dpdk_helper_status_check(dpdk_helper_ctx_t *phc);
+static void dpdk_helper_config_default(dpdk_helper_ctx_t *phc);
+static const char *dpdk_helper_status_str(enum DPDK_HELPER_STATUS status);
+
+static void dpdk_helper_config_default(dpdk_helper_ctx_t *phc) {
+  if (phc == NULL)
+    return;
+
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  ssnprintf(phc->eal_config.coremask, DATA_MAX_NAME_LEN, "%s", "0xf");
+  ssnprintf(phc->eal_config.memory_channels, DATA_MAX_NAME_LEN, "%s", "1");
+  ssnprintf(phc->eal_config.process_type, DATA_MAX_NAME_LEN, "%s", "secondary");
+  ssnprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, "%s",
+            DPDK_DEFAULT_RTE_CONFIG);
+}
+
+int dpdk_helper_eal_config_set(dpdk_helper_ctx_t *phc, dpdk_eal_config_t *ec) {
+  if (phc == NULL) {
+    ERROR("Invalid argument (phc)");
+    return -EINVAL;
+  }
+
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  if (ec == NULL) {
+    ERROR("Invalid argument (ec)");
+    return -EINVAL;
+  }
+
+  memcpy(&phc->eal_config, ec, sizeof(phc->eal_config));
+
+  return 0;
+}
+
+int dpdk_helper_eal_config_get(dpdk_helper_ctx_t *phc, dpdk_eal_config_t *ec) {
+  if (phc == NULL) {
+    ERROR("Invalid argument (phc)");
+    return -EINVAL;
+  }
+
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  if (ec == NULL) {
+    ERROR("Invalid argument (ec)");
+    return -EINVAL;
+  }
+
+  memcpy(ec, &phc->eal_config, sizeof(*ec));
+
+  return 0;
+}
+
+int dpdk_helper_eal_config_parse(dpdk_helper_ctx_t *phc, oconfig_item_t *ci) {
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  if (phc == NULL) {
+    ERROR("Invalid argument (phc)");
+    return -EINVAL;
+  }
+
+  if (ci == NULL) {
+    ERROR("Invalid argument (ci)");
+    return -EINVAL;
+  }
+
+  int status = 0;
+  for (int i = 0; i < ci->children_num; i++) {
+    oconfig_item_t *child = ci->children + i;
+    if (strcasecmp("Coremask", child->key) == 0) {
+      status = cf_util_get_string_buffer(child, phc->eal_config.coremask,
+                                         sizeof(phc->eal_config.coremask));
+      DEBUG("dpdk_common: EAL:Coremask %s", phc->eal_config.coremask);
+    } else if (strcasecmp("MemoryChannels", child->key) == 0) {
+      status =
+          cf_util_get_string_buffer(child, phc->eal_config.memory_channels,
+                                    sizeof(phc->eal_config.memory_channels));
+      DEBUG("dpdk_common: EAL:Memory Channels %s",
+            phc->eal_config.memory_channels);
+    } else if (strcasecmp("SocketMemory", child->key) == 0) {
+      status = cf_util_get_string_buffer(child, phc->eal_config.socket_memory,
+                                         sizeof(phc->eal_config.socket_memory));
+      DEBUG("dpdk_common: EAL:Socket memory %s", phc->eal_config.socket_memory);
+    } else if (strcasecmp("ProcessType", child->key) == 0) {
+      status = cf_util_get_string_buffer(child, phc->eal_config.process_type,
+                                         sizeof(phc->eal_config.process_type));
+      DEBUG("dpdk_common: EAL:Process type %s", phc->eal_config.process_type);
+    } else if ((strcasecmp("FilePrefix", child->key) == 0) &&
+               (child->values[0].type == OCONFIG_TYPE_STRING)) {
+      ssnprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN,
+                "/var/run/.%s_config", child->values[0].value.string);
+      DEBUG("dpdk_common: EAL:File prefix %s", phc->eal_config.file_prefix);
+    } else {
+      ERROR("dpdk_common: Invalid '%s' configuration option", child->key);
+      status = -EINVAL;
+    }
+
+    if (status != 0) {
+      ERROR("dpdk_common: Parsing EAL configuration failed");
+      break;
+    }
+  }
+
+  return status;
+}
+
+static int dpdk_shm_init(const char *name, size_t size, void **map) {
+  DPDK_HELPER_TRACE(name);
+
+  char errbuf[ERR_BUF_SIZE];
+
+  int fd = shm_open(name, O_CREAT | O_TRUNC | O_RDWR, 0666);
+  if (fd < 0) {
+    WARNING("dpdk_shm_init: Failed to open %s as SHM:%s", name,
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    *map = NULL;
+    return -1;
+  }
+
+  int ret = ftruncate(fd, size);
+  if (ret != 0) {
+    WARNING("dpdk_shm_init: Failed to resize SHM:%s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    close(fd);
+    *map = NULL;
+    dpdk_shm_cleanup(name, size, NULL);
+    return -1;
+  }
+
+  *map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+  if (*map == MAP_FAILED) {
+    WARNING("dpdk_shm_init:Failed to mmap SHM:%s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    close(fd);
+    *map = NULL;
+    dpdk_shm_cleanup(name, size, NULL);
+    return -1;
+  }
+  /* File descriptor no longer needed for shared memory operations */
+  close(fd);
+  memset(*map, 0, size);
+
+  return 0;
+}
+
+static void dpdk_shm_cleanup(const char *name, size_t size, void *map) {
+  DPDK_HELPER_TRACE(name);
+  char errbuf[ERR_BUF_SIZE];
+
+  if (map != NULL) {
+    if (munmap(map, size))
+      ERROR("munmap failure %s", sstrerror(errno, errbuf, sizeof(errbuf)));
+  }
+
+  if (shm_unlink(name))
+    ERROR("shm_unlink failure %s", sstrerror(errno, errbuf, sizeof(errbuf)));
+}
+
+void *dpdk_helper_priv_get(dpdk_helper_ctx_t *phc) {
+  if (phc)
+    return phc->priv_data;
+
+  return NULL;
+}
+
+int dpdk_helper_data_size_get(dpdk_helper_ctx_t *phc) {
+  if (phc == NULL) {
+    DPDK_CHILD_LOG("Invalid argument(phc)\n");
+    return -EINVAL;
+  }
+
+  return phc->shm_size - sizeof(dpdk_helper_ctx_t);
+}
+
+int dpdk_helper_init(const char *name, size_t data_size,
+                     dpdk_helper_ctx_t **pphc) {
+  dpdk_helper_ctx_t *phc = NULL;
+  size_t shm_size = sizeof(dpdk_helper_ctx_t) + data_size;
+  char errbuf[ERR_BUF_SIZE];
+
+  if (pphc == NULL) {
+    ERROR("%s:Invalid argument(pphc)", __FUNCTION__);
+    return -EINVAL;
+  }
+
+  if (name == NULL) {
+    ERROR("%s:Invalid argument(name)", __FUNCTION__);
+    return -EINVAL;
+  }
+
+  DPDK_HELPER_TRACE(name);
+
+  /* Allocate dpdk_helper_ctx_t and
+  * initialize a POSIX SHared Memory (SHM) object.
+  */
+  int err = dpdk_shm_init(name, shm_size, (void **)&phc);
+  if (err != 0) {
+    return -errno;
+  }
+
+  err = sem_init(&phc->sema_cmd_start, 1, 0);
+  if (err != 0) {
+    ERROR("sema_cmd_start semaphore init failed: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    int errno_m = errno;
+    dpdk_shm_cleanup(name, shm_size, (void *)phc);
+    return -errno_m;
+  }
+
+  err = sem_init(&phc->sema_cmd_complete, 1, 0);
+  if (err != 0) {
+    ERROR("sema_cmd_complete semaphore init failed: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    sem_destroy(&phc->sema_cmd_start);
+    int errno_m = errno;
+    dpdk_shm_cleanup(name, shm_size, (void *)phc);
+    return -errno_m;
+  }
+
+  phc->shm_size = shm_size;
+  phc->shm_name = name;
+
+  dpdk_helper_config_default(phc);
+
+  *pphc = phc;
+
+  return 0;
+}
+
+int dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) {
+  if (phc == NULL) {
+    ERROR("%s:Invalid argument(phc)", __FUNCTION__);
+    return -EINVAL;
+  }
+
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  close(phc->pipes[1]);
+
+  if (phc->status != DPDK_HELPER_NOT_INITIALIZED) {
+    dpdk_helper_exit_command(phc, DPDK_HELPER_GRACEFUL_QUIT);
+  }
+
+  sem_destroy(&phc->sema_cmd_start);
+  sem_destroy(&phc->sema_cmd_complete);
+  dpdk_shm_cleanup(phc->shm_name, phc->shm_size, (void *)phc);
+
+  return 0;
+}
+
+static int dpdk_helper_spawn(dpdk_helper_ctx_t *phc) {
+  char errbuf[ERR_BUF_SIZE];
+  if (phc == NULL) {
+    ERROR("Invalid argument(phc)");
+    return -EINVAL;
+  }
+
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  phc->eal_initialized = 0;
+  phc->cmd_wait_time = MS_TO_CDTIME_T(DPDK_CDM_DEFAULT_TIMEOUT);
+
+  /*
+   * Create a pipe for helper stdout back to collectd. This is necessary for
+   * logging EAL failures, as rte_eal_init() calls rte_panic().
+   */
+  if (phc->pipes[1]) {
+    DEBUG("dpdk_helper_spawn: collectd closing helper pipe %d", phc->pipes[1]);
+  } else {
+    DEBUG("dpdk_helper_spawn: collectd helper pipe %d, not closing",
+          phc->pipes[1]);
+  }
+
+  if (pipe(phc->pipes) != 0) {
+    DEBUG("dpdk_helper_spawn: Could not create helper pipe: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    return -1;
+  }
+
+  int pipe0_flags = fcntl(phc->pipes[0], F_GETFL, 0);
+  int pipe1_flags = fcntl(phc->pipes[1], F_GETFL, 0);
+  if (pipe0_flags == -1 || pipe1_flags == -1) {
+    WARNING("dpdk_helper_spawn: error setting up pipe flags: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+  }
+  int pipe0_err = fcntl(phc->pipes[0], F_SETFL, pipe1_flags | O_NONBLOCK);
+  int pipe1_err = fcntl(phc->pipes[1], F_SETFL, pipe0_flags | O_NONBLOCK);
+  if (pipe0_err == -1 || pipe1_err == -1) {
+    WARNING("dpdk_helper_spawn: error setting up pipes: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+  }
+
+  pid_t pid = fork();
+  if (pid > 0) {
+    phc->pid = pid;
+    close(phc->pipes[1]);
+    DEBUG("%s:dpdk_helper_spawn: helper pid %lu", phc->shm_name,
+          (long)phc->pid);
+  } else if (pid == 0) {
+    /* Replace stdout with a pipe to collectd. */
+    close(phc->pipes[0]);
+    close(STDOUT_FILENO);
+    dup2(phc->pipes[1], STDOUT_FILENO);
+    DPDK_CHILD_TRACE(phc->shm_name);
+    dpdk_helper_worker(phc);
+    exit(0);
+  } else {
+    ERROR("dpdk_helper_start: Failed to fork helper process: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    return -1;
+  }
+
+  return 0;
+}
+
+static int dpdk_helper_exit(dpdk_helper_ctx_t *phc,
+                            enum DPDK_HELPER_STATUS status) {
+  DPDK_CHILD_LOG("%s:%s:%d %s\n", phc->shm_name, __FUNCTION__, __LINE__,
+                 dpdk_helper_status_str(status));
+
+  close(phc->pipes[1]);
+
+  phc->status = status;
+
+  exit(0);
+
+  return 0;
+}
+
+static int dpdk_helper_exit_command(dpdk_helper_ctx_t *phc,
+                                    enum DPDK_HELPER_STATUS status) {
+  char errbuf[ERR_BUF_SIZE];
+  DPDK_HELPER_TRACE(phc->shm_name);
+
+  close(phc->pipes[1]);
+
+  if (phc->status == DPDK_HELPER_ALIVE_SENDING_EVENTS) {
+    phc->status = status;
+    DEBUG("%s:%s:%d %s", phc->shm_name, __FUNCTION__, __LINE__,
+          dpdk_helper_status_str(status));
+
+    int ret = dpdk_helper_command(phc, DPDK_CMD_QUIT, NULL, 0);
+    if (ret != 0) {
+      DEBUG("%s:%s:%d kill helper (pid=%lu)", phc->shm_name, __FUNCTION__,
+            __LINE__, (long)phc->pid);
+
+      int err = kill(phc->pid, SIGKILL);
+      if (err) {
+        ERROR("%s error sending kill to helper: %s", __FUNCTION__,
+              sstrerror(errno, errbuf, sizeof(errbuf)));
+      }
+    }
+  } else {
+
+    DEBUG("%s:%s:%d kill helper (pid=%lu)", phc->shm_name, __FUNCTION__,
+          __LINE__, (long)phc->pid);
+
+    int err = kill(phc->pid, SIGKILL);
+    if (err) {
+      ERROR("%s error sending kill to helper: %s", __FUNCTION__,
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+  }
+
+  return 0;
+}
+
+static int dpdk_helper_eal_init(dpdk_helper_ctx_t *phc) {
+  phc->status = DPDK_HELPER_INITIALIZING_EAL;
+  DPDK_CHILD_LOG("%s:%s:%d DPDK_HELPER_INITIALIZING_EAL (start)\n",
+                 phc->shm_name, __FUNCTION__, __LINE__);
+
+  char *argp[DPDK_EAL_ARGC * 2 + 1];
+  int argc = 0;
+
+  /* EAL config must be initialized */
+  assert(phc->eal_config.coremask[0] != 0);
+  assert(phc->eal_config.memory_channels[0] != 0);
+  assert(phc->eal_config.process_type[0] != 0);
+  assert(phc->eal_config.file_prefix[0] != 0);
+
+  argp[argc++] = "collectd-dpdk";
+
+  argp[argc++] = "-c";
+  argp[argc++] = phc->eal_config.coremask;
+
+  argp[argc++] = "-n";
+  argp[argc++] = phc->eal_config.memory_channels;
+
+  if (strcasecmp(phc->eal_config.socket_memory, "") != 0) {
+    argp[argc++] = "--socket-mem";
+    argp[argc++] = phc->eal_config.socket_memory;
+  }
+
+  if (strcasecmp(phc->eal_config.file_prefix, DPDK_DEFAULT_RTE_CONFIG) != 0) {
+    argp[argc++] = "--file-prefix";
+    argp[argc++] = phc->eal_config.file_prefix;
+  }
+
+  argp[argc++] = "--proc-type";
+  argp[argc++] = phc->eal_config.process_type;
+
+  assert(argc <= (DPDK_EAL_ARGC * 2 + 1));
+
+  int ret = rte_eal_init(argc, argp);
+
+  if (ret < 0) {
+
+    phc->eal_initialized = 0;
+
+    DPDK_CHILD_LOG("dpdk_helper_eal_init: ERROR initializing EAL ret=%d\n",
+                   ret);
+
+    printf("dpdk_helper_eal_init: EAL arguments: ");
+    for (int i = 0; i < argc; i++) {
+      printf("%s ", argp[i]);
+    }
+    printf("\n");
+
+    return ret;
+  }
+
+  phc->eal_initialized = 1;
+
+  DPDK_CHILD_LOG("%s:%s:%d DPDK_HELPER_INITIALIZING_EAL (done)\n",
+                 phc->shm_name, __FUNCTION__, __LINE__);
+
+  return 0;
+}
+
+static int dpdk_helper_cmd_wait(dpdk_helper_ctx_t *phc, pid_t ppid) {
+  DPDK_CHILD_TRACE(phc->shm_name);
+
+  struct timespec ts;
+  cdtime_t now = cdtime();
+  cdtime_t cmd_wait_time = MS_TO_CDTIME_T(1500) + phc->cmd_wait_time * 2;
+  ts = CDTIME_T_TO_TIMESPEC(now + cmd_wait_time);
+
+  int ret = sem_timedwait(&phc->sema_cmd_start, &ts);
+  DPDK_CHILD_LOG("%s:%s:%d pid=%lu got sema_cmd_start (ret=%d, errno=%d)\n",
+                 phc->shm_name, __FUNCTION__, __LINE__, (long)getpid(), ret,
+                 errno);
+
+  if (phc->cmd == DPDK_CMD_QUIT) {
+    DPDK_CHILD_LOG("%s:%s:%d pid=%lu exiting\n", phc->shm_name, __FUNCTION__,
+                   __LINE__, (long)getpid());
+    exit(0);
+  } else if (ret == -1 && errno == ETIMEDOUT) {
+    if (phc->status == DPDK_HELPER_ALIVE_SENDING_EVENTS) {
+      DPDK_CHILD_LOG("%s:dpdk_helper_cmd_wait: sem timedwait()"
+                     " timeout, did collectd terminate?\n",
+                     phc->shm_name);
+      dpdk_helper_exit(phc, DPDK_HELPER_GRACEFUL_QUIT);
+    }
+  }
+#if COLLECT_DEBUG
+  int val = 0;
+  if (sem_getvalue(&phc->sema_cmd_start, &val) == 0)
+    DPDK_CHILD_LOG("%s:%s:%d pid=%lu wait sema_cmd_start (value=%d)\n",
+                   phc->shm_name, __FUNCTION__, __LINE__, (long)getpid(), val);
+#endif
+
+  /* Parent PID change means collectd died so quit the helper process. */
+  if (ppid != getppid()) {
+    DPDK_CHILD_LOG("dpdk_helper_cmd_wait: parent PID changed, quitting.\n");
+    dpdk_helper_exit(phc, DPDK_HELPER_GRACEFUL_QUIT);
+  }
+
+  /* Checking for DPDK primary process. */
+  if (!rte_eal_primary_proc_alive(phc->eal_config.file_prefix)) {
+    if (phc->eal_initialized) {
+      DPDK_CHILD_LOG(
+          "%s:dpdk_helper_cmd_wait: no primary alive but EAL initialized:"
+          " quitting.\n",
+          phc->shm_name);
+      dpdk_helper_exit(phc, DPDK_HELPER_NOT_INITIALIZED);
+    }
+
+    phc->status = DPDK_HELPER_WAITING_ON_PRIMARY;
+    DPDK_CHILD_LOG("%s:%s:%d DPDK_HELPER_WAITING_ON_PRIMARY\n", phc->shm_name,
+                   __FUNCTION__, __LINE__);
+
+    return -1;
+  }
+
+  if (!phc->eal_initialized) {
+    int ret = dpdk_helper_eal_init(phc);
+    if (ret != 0) {
+      DPDK_CHILD_LOG("Error initializing EAL\n");
+      dpdk_helper_exit(phc, DPDK_HELPER_NOT_INITIALIZED);
+    }
+    phc->status = DPDK_HELPER_ALIVE_SENDING_EVENTS;
+    DPDK_CHILD_LOG("%s:%s:%d DPDK_HELPER_ALIVE_SENDING_EVENTS\n", phc->shm_name,
+                   __FUNCTION__, __LINE__);
+    return -1;
+  }
+
+  return 0;
+}
+
+static int dpdk_helper_worker(dpdk_helper_ctx_t *phc) {
+  DPDK_CHILD_TRACE(phc->shm_name);
+
+  pid_t ppid = getppid();
+
+  while (1) {
+    if (dpdk_helper_cmd_wait(phc, ppid) == 0) {
+      DPDK_CHILD_LOG("%s:%s:%d DPDK command handle (cmd=%d, pid=%lu)\n",
+                     phc->shm_name, __FUNCTION__, __LINE__, phc->cmd,
+                     (long)getpid());
+      phc->cmd_result = dpdk_helper_command_handler(phc, phc->cmd);
+    } else {
+      phc->cmd_result = -1;
+    }
+
+    /* now kick collectd to get results */
+    int err = sem_post(&phc->sema_cmd_complete);
+    DPDK_CHILD_LOG("%s:%s:%d post sema_cmd_complete (pid=%lu)\n", phc->shm_name,
+                   __FUNCTION__, __LINE__, (long)getpid());
+    if (err) {
+      char errbuf[ERR_BUF_SIZE];
+      DPDK_CHILD_LOG("dpdk_helper_worker: error posting sema_cmd_complete "
+                     "semaphore (%s)\n",
+                     sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+
+#if COLLECT_DEBUG
+    int val = 0;
+    if (sem_getvalue(&phc->sema_cmd_complete, &val) == 0)
+      DPDK_CHILD_LOG("%s:%s:%d pid=%lu sema_cmd_complete (value=%d)\n",
+                     phc->shm_name, __FUNCTION__, __LINE__, (long)getpid(),
+                     val);
+#endif
+
+  } /* while(1) */
+
+  return 0;
+}
+
+static const char *dpdk_helper_status_str(enum DPDK_HELPER_STATUS status) {
+  switch (status) {
+  case DPDK_HELPER_ALIVE_SENDING_EVENTS:
+    return "DPDK_HELPER_ALIVE_SENDING_EVENTS";
+  case DPDK_HELPER_WAITING_ON_PRIMARY:
+    return "DPDK_HELPER_WAITING_ON_PRIMARY";
+  case DPDK_HELPER_INITIALIZING:
+    return "DPDK_HELPER_INITIALIZING";
+  case DPDK_HELPER_INITIALIZING_EAL:
+    return "DPDK_HELPER_INITIALIZING_EAL";
+  case DPDK_HELPER_GRACEFUL_QUIT:
+    return "DPDK_HELPER_GRACEFUL_QUIT";
+  case DPDK_HELPER_NOT_INITIALIZED:
+    return "DPDK_HELPER_NOT_INITIALIZED";
+  default:
+    return "UNKNOWN";
+  }
+}
+
+static int dpdk_helper_status_check(dpdk_helper_ctx_t *phc) {
+  DEBUG("%s:%s:%d pid=%u %s", phc->shm_name, __FUNCTION__, __LINE__, getpid(),
+        dpdk_helper_status_str(phc->status));
+  char errbuf[ERR_BUF_SIZE];
+
+  if (phc->status == DPDK_HELPER_GRACEFUL_QUIT) {
+    return 0;
+  } else if (phc->status == DPDK_HELPER_NOT_INITIALIZED) {
+    phc->status = DPDK_HELPER_INITIALIZING;
+    DEBUG("%s:%s:%d DPDK_HELPER_INITIALIZING", phc->shm_name, __FUNCTION__,
+          __LINE__);
+    int err = dpdk_helper_spawn(phc);
+    if (err) {
+      ERROR("dpdkstat: error spawning helper %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+    return -1;
+  }
+
+  pid_t ws = waitpid(phc->pid, NULL, WNOHANG);
+  if (ws != 0) {
+    phc->status = DPDK_HELPER_INITIALIZING;
+    DEBUG("%s:%s:%d DPDK_HELPER_INITIALIZING", phc->shm_name, __FUNCTION__,
+          __LINE__);
+    int err = dpdk_helper_spawn(phc);
+    if (err) {
+      ERROR("dpdkstat: error spawning helper %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+    return -1;
+  }
+
+  if (phc->status == DPDK_HELPER_INITIALIZING_EAL) {
+    return -1;
+  }
+
+  return 0;
+}
+
+static void dpdk_helper_check_pipe(dpdk_helper_ctx_t *phc) {
+  char buf[DPDK_MAX_BUFFER_SIZE];
+  char out[DPDK_MAX_BUFFER_SIZE];
+
+  /* non blocking check on helper logging pipe */
+  struct pollfd fds = {
+      .fd = phc->pipes[0], .events = POLLIN,
+  };
+  int data_avail = poll(&fds, 1, 0);
+  if (data_avail < 0) {
+    if (errno != EINTR || errno != EAGAIN) {
+      char errbuf[ERR_BUF_SIZE];
+      ERROR("%s: poll(2) failed: %s", phc->shm_name,
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+    }
+  }
+  while (data_avail) {
+    int nbytes = read(phc->pipes[0], buf, sizeof(buf));
+    if (nbytes <= 0)
+      break;
+    sstrncpy(out, buf, nbytes);
+    DEBUG("%s: helper process:\n%s", phc->shm_name, out);
+  }
+}
+
+int dpdk_helper_command(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd, int *result,
+                        cdtime_t cmd_wait_time) {
+  if (phc == NULL) {
+    ERROR("Invalid argument(phc)");
+    return -EINVAL;
+  }
+
+  DEBUG("%s:%s:%d pid=%lu, cmd=%d", phc->shm_name, __FUNCTION__, __LINE__,
+        (long)getpid(), cmd);
+
+  phc->cmd_wait_time = cmd_wait_time;
+
+  int ret = dpdk_helper_status_check(phc);
+
+  dpdk_helper_check_pipe(phc);
+
+  if (ret != 0) {
+    return ret;
+  }
+
+  DEBUG("%s: DPDK command execute (cmd=%d)", phc->shm_name, cmd);
+
+  phc->cmd_result = 0;
+  phc->cmd = cmd;
+
+  /* kick helper to process command */
+  int err = sem_post(&phc->sema_cmd_start);
+  if (err) {
+    char errbuf[ERR_BUF_SIZE];
+    ERROR("dpdk_helper_worker: error posting sema_cmd_start semaphore (%s)",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+  }
+
+#if COLLECT_DEBUG
+  int val = 0;
+  if (sem_getvalue(&phc->sema_cmd_start, &val) == 0)
+    DEBUG("%s:dpdk_helper_command: post sema_cmd_start (value=%d)",
+          phc->shm_name, val);
+#endif
+
+  if (phc->cmd != DPDK_CMD_QUIT) {
+
+    /* wait for helper to complete processing */
+    struct timespec ts;
+    cdtime_t now = cdtime();
+
+    if (phc->status != DPDK_HELPER_ALIVE_SENDING_EVENTS) {
+      cmd_wait_time = MS_TO_CDTIME_T(DPDK_CDM_DEFAULT_TIMEOUT);
+    }
+
+    ts = CDTIME_T_TO_TIMESPEC(now + cmd_wait_time);
+    ret = sem_timedwait(&phc->sema_cmd_complete, &ts);
+    if (ret == -1 && errno == ETIMEDOUT) {
+      DPDK_HELPER_TRACE(phc->shm_name);
+      DEBUG("%s:sema_cmd_start: timeout in collectd thread: is a DPDK Primary "
+            "running?",
+            phc->shm_name);
+      return -ETIMEDOUT;
+    }
+
+#if COLLECT_DEBUG
+    val = 0;
+    if (sem_getvalue(&phc->sema_cmd_complete, &val) == 0)
+      DEBUG("%s:dpdk_helper_command: wait sema_cmd_complete (value=%d)",
+            phc->shm_name, val);
+#endif
+
+    if (result) {
+      *result = phc->cmd_result;
+    }
+  }
+
+  dpdk_helper_check_pipe(phc);
+
+  DEBUG("%s: DPDK command complete (cmd=%d, result=%d)", phc->shm_name,
+        phc->cmd, phc->cmd_result);
+
+  return 0;
+}
+
+uint64_t strtoull_safe(const char *str, int *err) {
+  uint64_t val = 0;
+  char *endptr;
+  int res = 0;
+
+  val = strtoull(str, &endptr, 16);
+  if (*endptr) {
+    ERROR("%s Failed to parse the value %s, endptr=%c", __FUNCTION__, str,
+          *endptr);
+    res = -EINVAL;
+  }
+  if (err != NULL)
+    *err = res;
+  return val;
+}
+
+uint128_t str_to_uint128(const char *str, int len) {
+  uint128_t lcore_mask;
+  int err = 0;
+
+  memset(&lcore_mask, 0, sizeof(lcore_mask));
+
+  if (len <= 2 || strncmp(str, "0x", 2) != 0) {
+    ERROR("%s Value %s should be represened in hexadecimal format",
+          __FUNCTION__, str);
+    return lcore_mask;
+  }
+  /* If str is <= 64 bit long ('0x' + 16 chars = 18 chars) then
+   * conversion is straightforward. Otherwise str is splitted into 64b long
+   * blocks */
+  if (len <= 18) {
+    lcore_mask.low = strtoull_safe(str, &err);
+    if (err)
+      return lcore_mask;
+  } else {
+    char low_str[DATA_MAX_NAME_LEN];
+    char high_str[DATA_MAX_NAME_LEN];
+
+    memset(high_str, 0, sizeof(high_str));
+    memset(low_str, 0, sizeof(low_str));
+
+    strncpy(high_str, str, len - 16);
+    strncpy(low_str, str + len - 16, 16);
+
+    lcore_mask.low = strtoull_safe(low_str, &err);
+    if (err)
+      return lcore_mask;
+
+    lcore_mask.high = strtoull_safe(high_str, &err);
+    if (err) {
+      lcore_mask.low = 0;
+      return lcore_mask;
+    }
+  }
+  return lcore_mask;
+}
+
+uint8_t dpdk_helper_eth_dev_count() {
+  uint8_t ports = rte_eth_dev_count();
+  if (ports == 0) {
+    ERROR(
+        "%s:%d: No DPDK ports available. Check bound devices to DPDK driver.\n",
+        __FUNCTION__, __LINE__);
+    return ports;
+  }
+
+  if (ports > RTE_MAX_ETHPORTS) {
+    ERROR("%s:%d: Number of DPDK ports (%u) is greater than "
+          "RTE_MAX_ETHPORTS=%d. Ignoring extra ports\n",
+          __FUNCTION__, __LINE__, ports, RTE_MAX_ETHPORTS);
+    ports = RTE_MAX_ETHPORTS;
+  }
+
+  return ports;
+}
diff --git a/src/utils_dpdk.h b/src/utils_dpdk.h
new file mode 100644 (file)
index 0000000..f97a6b5
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * collectd - src/utils_dpdk.h
+ * MIT License
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Maryam Tahhan <maryam.tahhan@intel.com>
+ *   Harry van Haaren <harry.van.haaren@intel.com>
+ *   Taras Chornyi <tarasx.chornyi@intel.com>
+ *   Serhiy Pshyk <serhiyx.pshyk@intel.com>
+ *   Krzysztof Matczak <krzysztofx.matczak@intel.com>
+ */
+
+#ifndef UTILS_DPDK_H
+#define UTILS_DPDK_H
+
+#include <rte_version.h>
+
+#define ERR_BUF_SIZE 1024
+
+enum DPDK_CMD {
+  DPDK_CMD_NONE = 0,
+  DPDK_CMD_QUIT,
+  DPDK_CMD_INIT,
+  DPDK_CMD_GET_STATS,
+  DPDK_CMD_GET_EVENTS,
+  __DPDK_CMD_LAST,
+};
+
+struct dpdk_eal_config_s {
+  char coremask[DATA_MAX_NAME_LEN];
+  char memory_channels[DATA_MAX_NAME_LEN];
+  char socket_memory[DATA_MAX_NAME_LEN];
+  char process_type[DATA_MAX_NAME_LEN];
+  char file_prefix[DATA_MAX_NAME_LEN];
+};
+typedef struct dpdk_eal_config_s dpdk_eal_config_t;
+
+struct uint128_s {
+  u_int64_t high;
+  u_int64_t low;
+};
+typedef struct uint128_s uint128_t;
+
+typedef struct dpdk_helper_ctx_s dpdk_helper_ctx_t;
+
+int dpdk_helper_init(const char *name, size_t data_size,
+                     dpdk_helper_ctx_t **pphc);
+int dpdk_helper_shutdown(dpdk_helper_ctx_t *phc);
+int dpdk_helper_eal_config_parse(dpdk_helper_ctx_t *phc, oconfig_item_t *ci);
+int dpdk_helper_eal_config_set(dpdk_helper_ctx_t *phc, dpdk_eal_config_t *ec);
+int dpdk_helper_eal_config_get(dpdk_helper_ctx_t *phc, dpdk_eal_config_t *ec);
+int dpdk_helper_command(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd, int *result,
+                        cdtime_t cmd_wait_time);
+void *dpdk_helper_priv_get(dpdk_helper_ctx_t *phc);
+int dpdk_helper_data_size_get(dpdk_helper_ctx_t *phc);
+uint8_t dpdk_helper_eth_dev_count();
+
+/* forward declaration of handler function that is called by helper from
+ * child process. not implemented in helper. must be provided by client. */
+int dpdk_helper_command_handler(dpdk_helper_ctx_t *phc, enum DPDK_CMD cmd);
+
+uint128_t str_to_uint128(const char *str, int len);
+
+/* logging functions that should be used in child process */
+#define DPDK_CHILD_LOG(...) fprintf(stdout, __VA_ARGS__)
+#define DPDK_CHILD_TRACE(_name)                                                \
+  fprintf(stdout, "%s:%s:%d pid=%u\n", _name, __FUNCTION__, __LINE__, getpid())
+
+#endif /* UTILS_DPDK_H */
index ecc5674..366b44b 100644 (file)
@@ -74,7 +74,7 @@ static int fbh_read_file(fbhash_t *h) /* {{{ */
 
   fh = fopen(h->filename, "r");
   if (fh == NULL)
-    return (-1);
+    return -1;
 
   fl.l_type = F_RDLCK;
   fl.l_whence = SEEK_SET;
@@ -83,13 +83,13 @@ static int fbh_read_file(fbhash_t *h) /* {{{ */
   status = fcntl(fileno(fh), F_SETLK, &fl);
   if (status != 0) {
     fclose(fh);
-    return (-1);
+    return -1;
   }
 
   tree = c_avl_create((int (*)(const void *, const void *))strcmp);
   if (tree == NULL) {
     fclose(fh);
-    return (-1);
+    return -1;
   }
 
   /* Read `fh' into `tree' */
@@ -162,7 +162,7 @@ static int fbh_read_file(fbhash_t *h) /* {{{ */
   fbh_free_tree(h->tree);
   h->tree = tree;
 
-  return (0);
+  return 0;
 } /* }}} int fbh_read_file */
 
 static int fbh_check_file(fbhash_t *h) /* {{{ */
@@ -172,16 +172,16 @@ static int fbh_check_file(fbhash_t *h) /* {{{ */
 
   status = stat(h->filename, &statbuf);
   if (status != 0)
-    return (-1);
+    return -1;
 
   if (h->mtime >= statbuf.st_mtime)
-    return (0);
+    return 0;
 
   status = fbh_read_file(h);
   if (status == 0)
     h->mtime = statbuf.st_mtime;
 
-  return (status);
+  return status;
 } /* }}} int fbh_check_file */
 
 /*
@@ -193,16 +193,16 @@ fbhash_t *fbh_create(const char *file) /* {{{ */
   int status;
 
   if (file == NULL)
-    return (NULL);
+    return NULL;
 
   h = calloc(1, sizeof(*h));
   if (h == NULL)
-    return (NULL);
+    return NULL;
 
   h->filename = strdup(file);
   if (h->filename == NULL) {
     free(h);
-    return (NULL);
+    return NULL;
   }
 
   h->mtime = 0;
@@ -212,10 +212,10 @@ fbhash_t *fbh_create(const char *file) /* {{{ */
   if (status != 0) {
     fbh_destroy(h);
     free(h);
-    return (NULL);
+    return NULL;
   }
 
-  return (h);
+  return h;
 } /* }}} fbhash_t *fbh_create */
 
 void fbh_destroy(fbhash_t *h) /* {{{ */
@@ -235,7 +235,7 @@ char *fbh_get(fbhash_t *h, const char *key) /* {{{ */
   int status;
 
   if ((h == NULL) || (key == NULL))
-    return (NULL);
+    return NULL;
 
   value = NULL;
   value_copy = NULL;
@@ -253,7 +253,5 @@ char *fbh_get(fbhash_t *h, const char *key) /* {{{ */
 
   pthread_mutex_unlock(&h->lock);
 
-  return (value_copy);
+  return value_copy;
 } /* }}} char *fbh_get */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 79e9c00..fcd6e92 100644 (file)
@@ -48,5 +48,3 @@ void fbh_destroy(fbhash_t *h);
 char *fbh_get(fbhash_t *h, const char *key);
 
 #endif /* UTILS_FBHASH_H */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 9c7d96f..f124ba1 100644 (file)
@@ -48,9 +48,9 @@ static int gr_format_values(char *ret, size_t ret_len, int ds_num,
   do {                                                                         \
     status = ssnprintf(ret + offset, ret_len - offset, __VA_ARGS__);           \
     if (status < 1) {                                                          \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (((size_t)status) >= (ret_len - offset)) {                       \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else                                                                     \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -68,12 +68,12 @@ static int gr_format_values(char *ret, size_t ret_len, int ds_num,
   else {
     ERROR("gr_format_values plugin: Unknown data source type: %i",
           ds->ds[ds_num].type);
-    return (-1);
+    return -1;
   }
 
 #undef BUFFER_ADD
 
-  return (0);
+  return 0;
 }
 
 static void gr_copy_escape_part(char *dst, const char *src, size_t dst_len,
@@ -161,7 +161,7 @@ static int gr_format_name(char *ret, int ret_len, value_list_t const *vl,
     ssnprintf(ret, ret_len, "%s%s%s.%s.%s", prefix, n_host, postfix, tmp_plugin,
               tmp_type);
 
-  return (0);
+  return 0;
 }
 
 static void escape_graphite_string(char *buffer, char escape_char) {
@@ -204,7 +204,7 @@ int format_graphite(char *buffer, size_t buffer_size, data_set_t const *ds,
     if (status != 0) {
       ERROR("format_graphite: error with gr_format_name");
       sfree(rates);
-      return (status);
+      return status;
     }
 
     escape_graphite_string(key, escape_char);
@@ -214,7 +214,7 @@ int format_graphite(char *buffer, size_t buffer_size, data_set_t const *ds,
     if (status != 0) {
       ERROR("format_graphite: error with gr_format_values");
       sfree(rates);
-      return (status);
+      return status;
     }
 
     /* Compute the graphite command */
@@ -226,21 +226,19 @@ int format_graphite(char *buffer, size_t buffer_size, data_set_t const *ds,
             "Need %zu bytes.",
             message_len + 1);
       sfree(rates);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
 
     /* Append it in case we got multiple data set */
     if ((buffer_pos + message_len) >= buffer_size) {
       ERROR("format_graphite: target buffer too small");
       sfree(rates);
-      return (-ENOMEM);
+      return -ENOMEM;
     }
     memcpy((void *)(buffer + buffer_pos), message, message_len);
     buffer_pos += message_len;
     buffer[buffer_pos] = '\0';
   }
   sfree(rates);
-  return (status);
+  return status;
 } /* int format_graphite */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 415a283..a82142f 100644 (file)
@@ -49,12 +49,12 @@ static data_set_t ds_double = {
 
 DEF_TEST(metric_name) {
   struct {
-    char *plugin_instance;
-    char *type_instance;
-    char *prefix;
-    char *suffix;
+    const char *plugin_instance;
+    const char *type_instance;
+    const char *prefix;
+    const char *suffix;
     unsigned int flags;
-    char *want_name;
+    const char *want_name;
   } cases[] = {
       {
           .want_name = "example@com.test.single",
@@ -157,8 +157,35 @@ DEF_TEST(metric_name) {
   return 0;
 }
 
+DEF_TEST(null_termination) {
+  value_list_t vl = {
+      .values = &(value_t){.gauge = 1337},
+      .values_len = 1,
+      .time = TIME_T_TO_CDTIME_T_STATIC(1480063672),
+      .interval = TIME_T_TO_CDTIME_T_STATIC(10),
+      .host = "example.com",
+      .plugin = "test",
+      .type = "single",
+  };
+  char const *want = "example_com.test.single 1337 1480063672\r\n";
+
+  char buffer[128];
+  for (size_t i = 0; i < sizeof(buffer); i++)
+    buffer[i] = (char)i;
+
+  EXPECT_EQ_INT(0, format_graphite(buffer, sizeof(buffer), &ds_single, &vl,
+                                   NULL, NULL, '_', 0));
+  EXPECT_EQ_STR(want, buffer);
+  EXPECT_EQ_INT(0, buffer[strlen(want)]);
+  for (size_t i = strlen(want) + 1; i < sizeof(buffer); i++)
+    EXPECT_EQ_INT((int)i, (int)buffer[i]);
+
+  return 0;
+}
+
 int main(void) {
   RUN_TEST(metric_name);
+  RUN_TEST(null_termination);
 
   END_TEST;
 }
index 0a95a86..67aebba 100644 (file)
@@ -48,10 +48,10 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */
   size_t dst_pos;
 
   if ((buffer == NULL) || (string == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (buffer_size < 3)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   dst_pos = 0;
 
@@ -59,7 +59,7 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     if (dst_pos >= (buffer_size - 1)) {                                        \
       buffer[buffer_size - 1] = 0;                                             \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     }                                                                          \
     buffer[dst_pos] = (c);                                                     \
     dst_pos++;                                                                 \
@@ -81,7 +81,7 @@ static int json_escape_string(char *buffer, size_t buffer_size, /* {{{ */
 
 #undef BUFFER_ADD
 
-  return (0);
+  return 0;
 } /* }}} int json_escape_string */
 
 static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */
@@ -98,10 +98,10 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1) {                                                          \
       sfree(rates);                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (((size_t)status) >= (buffer_size - offset)) {                   \
       sfree(rates);                                                            \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     } else                                                                     \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -122,7 +122,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */
       if (rates == NULL) {
         WARNING("utils_format_json: uc_get_rate failed.");
         sfree(rates);
-        return (-1);
+        return -1;
       }
 
       if (isfinite(rates[i]))
@@ -138,7 +138,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */
     else {
       ERROR("format_json: Unknown data source type: %i", ds->ds[i].type);
       sfree(rates);
-      return (-1);
+      return -1;
     }
   } /* for ds->ds_num */
   BUFFER_ADD("]");
@@ -147,7 +147,7 @@ static int values_to_json(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_json: values_to_json: buffer = %s;", buffer);
   sfree(rates);
-  return (0);
+  return 0;
 } /* }}} int values_to_json */
 
 static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */
@@ -161,9 +161,9 @@ static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */
     int status;                                                                \
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (buffer_size - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -181,7 +181,7 @@ static int dstypes_to_json(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_json: dstypes_to_json: buffer = %s;", buffer);
 
-  return (0);
+  return 0;
 } /* }}} int dstypes_to_json */
 
 static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */
@@ -195,9 +195,9 @@ static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */
     int status;                                                                \
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (buffer_size - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -215,7 +215,7 @@ static int dsnames_to_json(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_json: dsnames_to_json: buffer = %s;", buffer);
 
-  return (0);
+  return 0;
 } /* }}} int dsnames_to_json */
 
 static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */
@@ -230,9 +230,9 @@ static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (buffer_size - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -274,14 +274,14 @@ static int meta_data_keys_to_json(char *buffer, size_t buffer_size, /* {{{ */
   } /* for (keys) */
 
   if (offset == 0)
-    return (ENOENT);
+    return ENOENT;
 
   buffer[0] = '{'; /* replace leading ',' */
   BUFFER_ADD("}");
 
 #undef BUFFER_ADD
 
-  return (0);
+  return 0;
 } /* }}} int meta_data_keys_to_json */
 
 static int meta_data_to_json(char *buffer, size_t buffer_size, /* {{{ */
@@ -291,11 +291,11 @@ static int meta_data_to_json(char *buffer, size_t buffer_size, /* {{{ */
   int status;
 
   if ((buffer == NULL) || (buffer_size == 0) || (meta == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   status = meta_data_toc(meta, &keys);
   if (status <= 0)
-    return (status);
+    return status;
   keys_num = (size_t)status;
 
   status = meta_data_keys_to_json(buffer, buffer_size, meta, keys, keys_num);
@@ -320,9 +320,9 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (buffer_size - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -333,17 +333,17 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */
 
   status = values_to_json(temp, sizeof(temp), ds, vl, store_rates);
   if (status != 0)
-    return (status);
+    return status;
   BUFFER_ADD("\"values\":%s", temp);
 
   status = dstypes_to_json(temp, sizeof(temp), ds);
   if (status != 0)
-    return (status);
+    return status;
   BUFFER_ADD(",\"dstypes\":%s", temp);
 
   status = dsnames_to_json(temp, sizeof(temp), ds);
   if (status != 0)
-    return (status);
+    return status;
   BUFFER_ADD(",\"dsnames\":%s", temp);
 
   BUFFER_ADD(",\"time\":%.3f", CDTIME_T_TO_DOUBLE(vl->time));
@@ -353,7 +353,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     status = json_escape_string(temp, sizeof(temp), (value));                  \
     if (status != 0)                                                           \
-      return (status);                                                         \
+      return status;                                                           \
     BUFFER_ADD(",\"%s\":%s", (key), temp);                                     \
   } while (0)
 
@@ -368,7 +368,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */
     memset(meta_buffer, 0, sizeof(meta_buffer));
     status = meta_data_to_json(meta_buffer, sizeof(meta_buffer), vl->meta);
     if (status != 0)
-      return (status);
+      return status;
 
     BUFFER_ADD(",\"meta\":%s", meta_buffer);
   } /* if (vl->meta != NULL) */
@@ -380,7 +380,7 @@ static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_json: value_list_to_json: buffer = %s;", buffer);
 
-  return (0);
+  return 0;
 } /* }}} int value_list_to_json */
 
 static int format_json_value_list_nocheck(char *buffer, /* {{{ */
@@ -394,14 +394,14 @@ static int format_json_value_list_nocheck(char *buffer, /* {{{ */
 
   status = value_list_to_json(temp, sizeof(temp), ds, vl, store_rates);
   if (status != 0)
-    return (status);
+    return status;
   temp_size = strlen(temp);
 
   memcpy(buffer + (*ret_buffer_fill), temp, temp_size + 1);
   (*ret_buffer_fill) += temp_size;
   (*ret_buffer_free) -= temp_size;
 
-  return (0);
+  return 0;
 } /* }}} int format_json_value_list_nocheck */
 
 int format_json_initialize(char *buffer, /* {{{ */
@@ -411,7 +411,7 @@ int format_json_initialize(char *buffer, /* {{{ */
 
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   buffer_fill = *ret_buffer_fill;
   buffer_free = *ret_buffer_free;
@@ -420,13 +420,13 @@ int format_json_initialize(char *buffer, /* {{{ */
   buffer_fill = 0;
 
   if (buffer_free < 3)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   memset(buffer, 0, buffer_free);
   *ret_buffer_fill = buffer_fill;
   *ret_buffer_free = buffer_free;
 
-  return (0);
+  return 0;
 } /* }}} int format_json_initialize */
 
 int format_json_finalize(char *buffer, /* {{{ */
@@ -435,15 +435,15 @@ int format_json_finalize(char *buffer, /* {{{ */
 
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (*ret_buffer_free < 2)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   /* Replace the leading comma added in `value_list_to_json' with a square
    * bracket. */
   if (buffer[0] != ',')
-    return (-EINVAL);
+    return -EINVAL;
   buffer[0] = '[';
 
   pos = *ret_buffer_fill;
@@ -453,7 +453,7 @@ int format_json_finalize(char *buffer, /* {{{ */
   (*ret_buffer_fill)++;
   (*ret_buffer_free)--;
 
-  return (0);
+  return 0;
 } /* }}} int format_json_finalize */
 
 int format_json_value_list(char *buffer, /* {{{ */
@@ -462,14 +462,14 @@ int format_json_value_list(char *buffer, /* {{{ */
                            int store_rates) {
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL) || (ds == NULL) || (vl == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (*ret_buffer_free < 3)
-    return (-ENOMEM);
+    return -ENOMEM;
 
-  return (format_json_value_list_nocheck(buffer, ret_buffer_fill,
-                                         ret_buffer_free, ds, vl, store_rates,
-                                         (*ret_buffer_free) - 2));
+  return format_json_value_list_nocheck(buffer, ret_buffer_fill,
+                                        ret_buffer_free, ds, vl, store_rates,
+                                        (*ret_buffer_free) - 2);
 } /* }}} int format_json_value_list */
 
 #if HAVE_LIBYAJL
@@ -478,7 +478,7 @@ static int json_add_string(yajl_gen g, char const *str) /* {{{ */
   if (str == NULL)
     return (int)yajl_gen_null(g);
 
-  return (int)yajl_gen_string(g, (unsigned char const *)str,
+  return (int)yajl_gen_string(g, (const unsigned char *)str,
                               (unsigned int)strlen(str));
 } /* }}} int json_add_string */
 
@@ -685,5 +685,3 @@ int format_json_notification(char *buffer, size_t buffer_size, /* {{{ */
   return ENOTSUP;
 } /* }}} int format_json_notification */
 #endif
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 4c25d18..4378d7f 100644 (file)
@@ -59,10 +59,10 @@ static int kairosdb_escape_string(char *buffer, size_t buffer_size, /* {{{ */
   size_t dst_pos;
 
   if ((buffer == NULL) || (string == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (buffer_size < 3)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   dst_pos = 0;
 
@@ -70,7 +70,7 @@ static int kairosdb_escape_string(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     if (dst_pos >= (buffer_size - 1)) {                                        \
       buffer[buffer_size - 1] = 0;                                             \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     }                                                                          \
     buffer[dst_pos] = (c);                                                     \
     dst_pos++;                                                                 \
@@ -89,7 +89,7 @@ static int kairosdb_escape_string(char *buffer, size_t buffer_size, /* {{{ */
 
 #undef BUFFER_ADD
 
-  return (0);
+  return 0;
 } /* }}} int kairosdb_escape_string */
 
 static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
@@ -106,10 +106,10 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1) {                                                          \
       sfree(rates);                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     } else if (((size_t)status) >= (buffer_size - offset)) {                   \
       sfree(rates);                                                            \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     } else                                                                     \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -125,7 +125,7 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
             "%s|%s|%s|%s|%s",
             vl->plugin, vl->plugin_instance, vl->type, vl->type_instance,
             ds->ds[ds_idx].name);
-      return (-1);
+      return -1;
     }
   } else if (store_rates) {
     if (rates == NULL)
@@ -135,7 +135,7 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
               vl->plugin, vl->plugin_instance, vl->type, vl->type_instance,
               ds->ds[ds_idx].name);
 
-      return (-1);
+      return -1;
     }
 
     if (isfinite(rates[ds_idx])) {
@@ -148,7 +148,7 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
               vl->plugin, vl->plugin_instance, vl->type, vl->type_instance,
               ds->ds[ds_idx].name);
       sfree(rates);
-      return (-1);
+      return -1;
     }
   } else if (ds->ds[ds_idx].type == DS_TYPE_COUNTER) {
     BUFFER_ADD("[[");
@@ -168,7 +168,7 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
   } else {
     ERROR("format_kairosdb: Unknown data source type: %i", ds->ds[ds_idx].type);
     sfree(rates);
-    return (-1);
+    return -1;
   }
   BUFFER_ADD("]]");
 
@@ -176,12 +176,14 @@ static int values_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_kairosdb: values_to_kairosdb: buffer = %s;", buffer);
   sfree(rates);
-  return (0);
+  return 0;
 } /* }}} int values_to_kairosdb */
 
 static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
                                   const data_set_t *ds, const value_list_t *vl,
-                                  int store_rates) {
+                                  int store_rates,
+                                  char const *const *http_attrs,
+                                  size_t http_attrs_num, int data_ttl) {
   char temp[512];
   size_t offset = 0;
   int status;
@@ -192,9 +194,9 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__);    \
     if (status < 1)                                                            \
-      return (-1);                                                             \
+      return -1;                                                               \
     else if (((size_t)status) >= (buffer_size - offset))                       \
-      return (-ENOMEM);                                                        \
+      return -ENOMEM;                                                          \
     else                                                                       \
       offset += ((size_t)status);                                              \
   } while (0)
@@ -203,7 +205,7 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
   do {                                                                         \
     status = kairosdb_escape_string(temp, sizeof(temp), (value));              \
     if (status != 0)                                                           \
-      return (status);                                                         \
+      return status;                                                           \
     BUFFER_ADD(",\"%s\": %s", (key), temp);                                    \
   } while (0)
 
@@ -218,7 +220,7 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
 
     status = values_to_kairosdb(temp, sizeof(temp), ds, vl, store_rates, i);
     if (status != 0)
-      return (status);
+      return status;
 
     BUFFER_ADD("\", \"datapoints\": %s", temp);
 
@@ -228,9 +230,17 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
 
     memset(temp, 0, sizeof(temp));
 
+    if (data_ttl != 0)
+      BUFFER_ADD(", \"ttl\": %i", data_ttl);
+
     BUFFER_ADD(", \"tags\":\{");
 
     BUFFER_ADD("\"host\": \"%s\"", vl->host);
+    for (size_t j = 0; j < http_attrs_num; j += 2) {
+      BUFFER_ADD(", \"%s\":", http_attrs[j]);
+      BUFFER_ADD(" \"%s\"", http_attrs[j + 1]);
+    }
+
     if (strlen(vl->plugin_instance))
       BUFFER_ADD_KEYVAL("plugin_instance", vl->plugin_instance);
     BUFFER_ADD_KEYVAL("type", vl->type);
@@ -246,26 +256,28 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
 
   DEBUG("format_kairosdb: value_list_to_kairosdb: buffer = %s;", buffer);
 
-  return (0);
+  return 0;
 } /* }}} int value_list_to_kairosdb */
 
 static int format_kairosdb_value_list_nocheck(
     char *buffer, /* {{{ */
     size_t *ret_buffer_fill, size_t *ret_buffer_free, const data_set_t *ds,
-    const value_list_t *vl, int store_rates, size_t temp_size) {
+    const value_list_t *vl, int store_rates, size_t temp_size,
+    char const *const *http_attrs, size_t http_attrs_num, int data_ttl) {
   char temp[temp_size];
   int status;
 
-  status = value_list_to_kairosdb(temp, sizeof(temp), ds, vl, store_rates);
+  status = value_list_to_kairosdb(temp, sizeof(temp), ds, vl, store_rates,
+                                  http_attrs, http_attrs_num, data_ttl);
   if (status != 0)
-    return (status);
+    return status;
   temp_size = strlen(temp);
 
   memcpy(buffer + (*ret_buffer_fill), temp, temp_size + 1);
   (*ret_buffer_fill) += temp_size;
   (*ret_buffer_free) -= temp_size;
 
-  return (0);
+  return 0;
 } /* }}} int format_kairosdb_value_list_nocheck */
 
 int format_kairosdb_initialize(char *buffer, /* {{{ */
@@ -276,7 +288,7 @@ int format_kairosdb_initialize(char *buffer, /* {{{ */
 
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   buffer_fill = *ret_buffer_fill;
   buffer_free = *ret_buffer_free;
@@ -285,13 +297,13 @@ int format_kairosdb_initialize(char *buffer, /* {{{ */
   buffer_fill = 0;
 
   if (buffer_free < 3)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   memset(buffer, 0, buffer_free);
   *ret_buffer_fill = buffer_fill;
   *ret_buffer_free = buffer_free;
 
-  return (0);
+  return 0;
 } /* }}} int format_kairosdb_initialize */
 
 int format_kairosdb_finalize(char *buffer, /* {{{ */
@@ -300,15 +312,15 @@ int format_kairosdb_finalize(char *buffer, /* {{{ */
 
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (*ret_buffer_free < 2)
-    return (-ENOMEM);
+    return -ENOMEM;
 
   /* Replace the leading comma added in `value_list_to_kairosdb' with a square
    * bracket. */
   if (buffer[0] != ',')
-    return (-EINVAL);
+    return -EINVAL;
   buffer[0] = '[';
 
   pos = *ret_buffer_fill;
@@ -318,23 +330,27 @@ int format_kairosdb_finalize(char *buffer, /* {{{ */
   (*ret_buffer_fill)++;
   (*ret_buffer_free)--;
 
-  return (0);
+  return 0;
 } /* }}} int format_kairosdb_finalize */
 
 int format_kairosdb_value_list(char *buffer, /* {{{ */
                                size_t *ret_buffer_fill, size_t *ret_buffer_free,
                                const data_set_t *ds, const value_list_t *vl,
-                               int store_rates) {
+                               int store_rates, char const *const *http_attrs,
+                               size_t http_attrs_num, int data_ttl) {
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL) || (ds == NULL) || (vl == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   if (*ret_buffer_free < 3)
-    return (-ENOMEM);
-
-  return (format_kairosdb_value_list_nocheck(
-      buffer, ret_buffer_fill, ret_buffer_free, ds, vl, store_rates,
-      (*ret_buffer_free) - 2));
+    return -ENOMEM;
+
+  return format_kairosdb_value_list_nocheck(buffer, ret_buffer_fill,
+                                            ret_buffer_free, ds, vl,
+                                            store_rates,
+                                            (*ret_buffer_free) - 2,
+                                            http_attrs, http_attrs_num,
+                                            data_ttl);
 } /* }}} int format_kairosdb_value_list */
 
 /* vim: set sw=2 sts=2 et fdm=marker : */
index 9174318..3a4c7c7 100644 (file)
@@ -39,7 +39,9 @@ int format_kairosdb_initialize(char *buffer, size_t *ret_buffer_fill,
                                size_t *ret_buffer_free);
 int format_kairosdb_value_list(char *buffer, size_t *ret_buffer_fill,
                                size_t *ret_buffer_free, const data_set_t *ds,
-                               const value_list_t *vl, int store_rates);
+                               const value_list_t *vl, int store_rates,
+                               char const *const *http_attrs,
+                               size_t http_attrs_num, int data_ttl);
 int format_kairosdb_finalize(char *buffer, size_t *ret_buffer_fill,
                              size_t *ret_buffer_free);
 
diff --git a/src/utils_ignorelist.c b/src/utils_ignorelist.c
new file mode 100644 (file)
index 0000000..29b2af2
--- /dev/null
@@ -0,0 +1,309 @@
+/**
+ * collectd - src/utils_ignorelist.c
+ * Copyright (C) 2006 Lubos Stanek <lubek at users.sourceforge.net>
+ * Copyright (C) 2008 Florian Forster <octo at collectd.org>
+ *
+ * This program is free software; you can redistribute it and/
+ * or modify it under the terms of the GNU General Public Li-
+ * cence as published by the Free Software Foundation; either
+ * version 2 of the Licence, or any later version.
+ *
+ * This program is distributed in the hope that it will be use-
+ * ful, but WITHOUT ANY WARRANTY; without even the implied war-
+ * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public Licence for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Lubos Stanek <lubek at users.sourceforge.net>
+ *   Florian Forster <octo at collectd.org>
+ **/
+/**
+ * ignorelist handles plugin's list of configured collectable
+ * entries with global ignore action
+ **/
+/**
+ * Usage:
+ *
+ * Define plugin's global pointer variable of type ignorelist_t:
+ *   ignorelist_t *myconfig_ignore;
+ * If you know the state of the global ignore (IgnoreSelected),
+ * allocate the variable with:
+ *   myconfig_ignore = ignorelist_create (YourKnownIgnore);
+ * If you do not know the state of the global ignore,
+ * initialize the global variable and set the ignore flag later:
+ *   myconfig_ignore = ignorelist_init ();
+ * Append single entries in your cf_register'ed callback function:
+ *   ignorelist_add (myconfig_ignore, newentry);
+ * When you hit the IgnoreSelected config option,
+ * offer it to the list:
+ *   ignorelist_ignore (myconfig_ignore, instantly_got_value_of_ignore);
+ * That is all for the ignorelist initialization.
+ * Later during read and write (plugin's registered functions) get
+ * the information whether this entry would be collected or not:
+ *   if (ignorelist_match (myconfig_ignore, thisentry))
+ *     return;
+ **/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "common.h"
+#include "plugin.h"
+#include "utils_ignorelist.h"
+
+/*
+ * private prototypes
+ */
+struct ignorelist_item_s {
+#if HAVE_REGEX_H
+  regex_t *rmatch; /* regular expression entry identification */
+#endif
+  char *smatch; /* string entry identification */
+  struct ignorelist_item_s *next;
+};
+typedef struct ignorelist_item_s ignorelist_item_t;
+
+struct ignorelist_s {
+  int ignore;              /* ignore entries */
+  ignorelist_item_t *head; /* pointer to the first entry */
+};
+
+/* *** *** *** ********************************************* *** *** *** */
+/* *** *** *** *** *** ***   private functions   *** *** *** *** *** *** */
+/* *** *** *** ********************************************* *** *** *** */
+
+static inline void ignorelist_append(ignorelist_t *il,
+                                     ignorelist_item_t *item) {
+  assert((il != NULL) && (item != NULL));
+
+  item->next = il->head;
+  il->head = item;
+}
+
+#if HAVE_REGEX_H
+static int ignorelist_append_regex(ignorelist_t *il, const char *re_str) {
+  regex_t *re;
+  ignorelist_item_t *entry;
+  int status;
+
+  re = calloc(1, sizeof(*re));
+  if (re == NULL) {
+    ERROR("ignorelist_append_regex: calloc failed.");
+    return ENOMEM;
+  }
+
+  status = regcomp(re, re_str, REG_EXTENDED);
+  if (status != 0) {
+    char errbuf[1024];
+    (void)regerror(status, re, errbuf, sizeof(errbuf));
+    ERROR("utils_ignorelist: regcomp failed: %s", errbuf);
+    ERROR("ignorelist_append_regex: Compiling regular expression \"%s\" "
+          "failed: %s",
+          re_str, errbuf);
+    sfree(re);
+    return status;
+  }
+
+  entry = calloc(1, sizeof(*entry));
+  if (entry == NULL) {
+    ERROR("ignorelist_append_regex: calloc failed.");
+    regfree(re);
+    sfree(re);
+    return ENOMEM;
+  }
+  entry->rmatch = re;
+
+  ignorelist_append(il, entry);
+  return 0;
+} /* int ignorelist_append_regex */
+#endif
+
+static int ignorelist_append_string(ignorelist_t *il, const char *entry) {
+  ignorelist_item_t *new;
+
+  /* create new entry */
+  if ((new = calloc(1, sizeof(*new))) == NULL) {
+    ERROR("cannot allocate new entry");
+    return 1;
+  }
+  new->smatch = sstrdup(entry);
+
+  /* append new entry */
+  ignorelist_append(il, new);
+
+  return 0;
+} /* int ignorelist_append_string(ignorelist_t *il, const char *entry) */
+
+#if HAVE_REGEX_H
+/*
+ * check list for entry regex match
+ * return 1 if found
+ */
+static int ignorelist_match_regex(ignorelist_item_t *item, const char *entry) {
+  assert((item != NULL) && (item->rmatch != NULL) && (entry != NULL) &&
+         (strlen(entry) > 0));
+
+  /* match regex */
+  if (regexec(item->rmatch, entry, 0, NULL, 0) == 0)
+    return 1;
+
+  return 0;
+} /* int ignorelist_match_regex (ignorelist_item_t *item, const char *entry) */
+#endif
+
+/*
+ * check list for entry string match
+ * return 1 if found
+ */
+static int ignorelist_match_string(ignorelist_item_t *item, const char *entry) {
+  assert((item != NULL) && (item->smatch != NULL) && (entry != NULL) &&
+         (strlen(entry) > 0));
+
+  if (strcmp(entry, item->smatch) == 0)
+    return 1;
+
+  return 0;
+} /* int ignorelist_match_string (ignorelist_item_t *item, const char *entry) */
+
+/* *** *** *** ******************************************** *** *** *** */
+/* *** *** *** *** *** ***   public functions   *** *** *** *** *** *** */
+/* *** *** *** ******************************************** *** *** *** */
+
+/*
+ * create the ignorelist_t with known ignore state
+ * return pointer to ignorelist_t
+ */
+ignorelist_t *ignorelist_create(int invert) {
+  ignorelist_t *il;
+
+  il = calloc(1, sizeof(*il));
+  if (il == NULL)
+    return NULL;
+
+  /*
+   * ->ignore == 0  =>  collect
+   * ->ignore == 1  =>  ignore
+   */
+  il->ignore = invert ? 0 : 1;
+
+  return il;
+} /* ignorelist_t *ignorelist_create (int ignore) */
+
+/*
+ * free memory used by ignorelist_t
+ */
+void ignorelist_free(ignorelist_t *il) {
+  ignorelist_item_t *this;
+  ignorelist_item_t *next;
+
+  if (il == NULL)
+    return;
+
+  for (this = il->head; this != NULL; this = next) {
+    next = this->next;
+#if HAVE_REGEX_H
+    if (this->rmatch != NULL) {
+      regfree(this->rmatch);
+      sfree(this->rmatch);
+      this->rmatch = NULL;
+    }
+#endif
+    if (this->smatch != NULL) {
+      sfree(this->smatch);
+      this->smatch = NULL;
+    }
+    sfree(this);
+  }
+
+  sfree(il);
+} /* void ignorelist_destroy (ignorelist_t *il) */
+
+/*
+ * set ignore state of the ignorelist_t
+ */
+void ignorelist_set_invert(ignorelist_t *il, int invert) {
+  if (il == NULL) {
+    DEBUG("ignore call with ignorelist_t == NULL");
+    return;
+  }
+
+  il->ignore = invert ? 0 : 1;
+} /* void ignorelist_set_invert (ignorelist_t *il, int ignore) */
+
+/*
+ * append entry into ignorelist_t
+ * return 0 for success
+ */
+int ignorelist_add(ignorelist_t *il, const char *entry) {
+  size_t len;
+
+  if (il == NULL) {
+    DEBUG("add called with ignorelist_t == NULL");
+    return 1;
+  }
+
+  len = strlen(entry);
+
+  /* append nothing */
+  if (len == 0) {
+    DEBUG("not appending: empty entry");
+    return 1;
+  }
+
+#if HAVE_REGEX_H
+  /* regex string is enclosed in "/.../" */
+  if ((len > 2) && (entry[0] == '/') && entry[len - 1] == '/') {
+    char *copy;
+    int status;
+
+    /* skip leading slash */
+    copy = strdup(entry + 1);
+    if (copy == NULL)
+      return ENOMEM;
+
+    /* trim trailing slash */
+    copy[strlen(copy) - 1] = 0;
+
+    status = ignorelist_append_regex(il, copy);
+    sfree(copy);
+    return status;
+  }
+#endif
+
+  return ignorelist_append_string(il, entry);
+} /* int ignorelist_add (ignorelist_t *il, const char *entry) */
+
+/*
+ * check list for entry
+ * return 1 for ignored entry
+ */
+int ignorelist_match(ignorelist_t *il, const char *entry) {
+  /* if no entries, collect all */
+  if ((il == NULL) || (il->head == NULL))
+    return 0;
+
+  if ((entry == NULL) || (strlen(entry) == 0))
+    return 0;
+
+  /* traverse list and check entries */
+  for (ignorelist_item_t *traverse = il->head; traverse != NULL;
+       traverse = traverse->next) {
+#if HAVE_REGEX_H
+    if (traverse->rmatch != NULL) {
+      if (ignorelist_match_regex(traverse, entry))
+        return il->ignore;
+    } else
+#endif
+    {
+      if (ignorelist_match_string(traverse, entry))
+        return il->ignore;
+    }
+  } /* for traverse */
+
+  return 1 - il->ignore;
+} /* int ignorelist_match (ignorelist_t *il, const char *entry) */
diff --git a/src/utils_ignorelist.h b/src/utils_ignorelist.h
new file mode 100644 (file)
index 0000000..a7fa86d
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * collectd - src/utils_ignorelist.h
+ * Copyright (C) 2006 Lubos Stanek <lubek at users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/
+ * or modify it under the terms of the GNU General Public Li-
+ * cence as published by the Free Software Foundation; either
+ * version 2 of the Licence, or any later version.
+ *
+ * This program is distributed in the hope that it will be use-
+ * ful, but WITHOUT ANY WARRANTY; without even the implied war-
+ * ranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public Licence for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Lubos Stanek <lubek at users.sourceforge.net>
+ **/
+/**
+ * ignorelist handles plugin's list of configured collectable
+ * entries with global ignore action
+ **/
+
+#ifndef UTILS_IGNORELIST_H
+#define UTILS_IGNORELIST_H 1
+
+#include "collectd.h"
+
+#if HAVE_REGEX_H
+#include <regex.h>
+#endif
+
+/* public prototypes */
+
+struct ignorelist_s;
+typedef struct ignorelist_s ignorelist_t;
+
+/*
+ * create the ignorelist_t with known ignore state
+ * return pointer to ignorelist_t
+ */
+ignorelist_t *ignorelist_create(int invert);
+
+/*
+ * free memory used by ignorelist_t
+ */
+void ignorelist_free(ignorelist_t *il);
+
+/*
+ * set ignore state of the ignorelist_t
+ */
+void ignorelist_set_invert(ignorelist_t *il, int invert);
+
+/*
+ * append entry to ignorelist_t
+ * returns zero on success, non-zero upon failure.
+ */
+int ignorelist_add(ignorelist_t *il, const char *entry);
+
+/*
+ * check list for entry
+ * return 1 for ignored entry
+ */
+int ignorelist_match(ignorelist_t *il, const char *entry);
+
+#endif /* UTILS_IGNORELIST_H */
index f0311e8..625fc42 100644 (file)
@@ -119,11 +119,11 @@ latency_counter_t *latency_counter_create(void) /* {{{ */
 
   lc = calloc(1, sizeof(*lc));
   if (lc == NULL)
-    return (NULL);
+    return NULL;
 
   lc->bin_width = HISTOGRAM_DEFAULT_BIN_WIDTH;
   latency_counter_reset(lc);
-  return (lc);
+  return lc;
 } /* }}} latency_counter_t *latency_counter_create */
 
 void latency_counter_destroy(latency_counter_t *lc) /* {{{ */
@@ -198,29 +198,29 @@ void latency_counter_reset(latency_counter_t *lc) /* {{{ */
 cdtime_t latency_counter_get_min(latency_counter_t *lc) /* {{{ */
 {
   if (lc == NULL)
-    return (0);
-  return (lc->min);
+    return 0;
+  return lc->min;
 } /* }}} cdtime_t latency_counter_get_min */
 
 cdtime_t latency_counter_get_max(latency_counter_t *lc) /* {{{ */
 {
   if (lc == NULL)
-    return (0);
-  return (lc->max);
+    return 0;
+  return lc->max;
 } /* }}} cdtime_t latency_counter_get_max */
 
 cdtime_t latency_counter_get_sum(latency_counter_t *lc) /* {{{ */
 {
   if (lc == NULL)
-    return (0);
-  return (lc->sum);
+    return 0;
+  return lc->sum;
 } /* }}} cdtime_t latency_counter_get_sum */
 
 size_t latency_counter_get_num(latency_counter_t *lc) /* {{{ */
 {
   if (lc == NULL)
-    return (0);
-  return (lc->num);
+    return 0;
+  return lc->num;
 } /* }}} size_t latency_counter_get_num */
 
 cdtime_t latency_counter_get_average(latency_counter_t *lc) /* {{{ */
@@ -228,10 +228,10 @@ cdtime_t latency_counter_get_average(latency_counter_t *lc) /* {{{ */
   double average;
 
   if ((lc == NULL) || (lc->num == 0))
-    return (0);
+    return 0;
 
   average = CDTIME_T_TO_DOUBLE(lc->sum) / ((double)lc->num);
-  return (DOUBLE_TO_CDTIME_T(average));
+  return DOUBLE_TO_CDTIME_T(average);
 } /* }}} cdtime_t latency_counter_get_average */
 
 cdtime_t latency_counter_get_percentile(latency_counter_t *lc, /* {{{ */
@@ -245,7 +245,7 @@ cdtime_t latency_counter_get_percentile(latency_counter_t *lc, /* {{{ */
   size_t i;
 
   if ((lc == NULL) || (lc->num == 0) || !((percent > 0.0) && (percent < 100.0)))
-    return (0);
+    return 0;
 
   /* Find index i so that at least "percent" events are within i+1 ms. */
   percent_upper = 0.0;
@@ -264,13 +264,13 @@ cdtime_t latency_counter_get_percentile(latency_counter_t *lc, /* {{{ */
   }
 
   if (i >= HISTOGRAM_NUM_BINS)
-    return (0);
+    return 0;
 
   assert(percent_upper >= percent);
   assert(percent_lower < percent);
 
   if (i == 0)
-    return (lc->bin_width);
+    return lc->bin_width;
 
   latency_lower = ((cdtime_t)i) * lc->bin_width;
   p = (percent - percent_lower) / (percent_upper - percent_lower);
@@ -280,19 +280,19 @@ cdtime_t latency_counter_get_percentile(latency_counter_t *lc, /* {{{ */
 
   DEBUG("latency_counter_get_percentile: latency_interpolated = %.3f",
         CDTIME_T_TO_DOUBLE(latency_interpolated));
-  return (latency_interpolated);
+  return latency_interpolated;
 } /* }}} cdtime_t latency_counter_get_percentile */
 
 double latency_counter_get_rate(const latency_counter_t *lc, /* {{{ */
                                 cdtime_t lower, cdtime_t upper,
                                 const cdtime_t now) {
   if ((lc == NULL) || (lc->num == 0))
-    return (NAN);
+    return NAN;
 
   if (upper && (upper < lower))
-    return (NAN);
+    return NAN;
   if (lower == upper)
-    return (0);
+    return 0;
 
   /* Buckets have an exclusive lower bound and an inclusive upper bound. That
    * means that the first bucket, index 0, represents (0-bin_width]. That means
@@ -305,7 +305,7 @@ double latency_counter_get_rate(const latency_counter_t *lc, /* {{{ */
 
   /* lower is greater than the longest latency observed => rate is zero. */
   if (lower_bin >= HISTOGRAM_NUM_BINS)
-    return (0);
+    return 0;
 
   cdtime_t upper_bin = HISTOGRAM_NUM_BINS - 1;
   if (upper)
@@ -342,5 +342,3 @@ double latency_counter_get_rate(const latency_counter_t *lc, /* {{{ */
 
   return sum / (CDTIME_T_TO_DOUBLE(now - lc->start_time));
 } /* }}} double latency_counter_get_rate */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 85493e1..9d878da 100644 (file)
@@ -61,5 +61,3 @@ cdtime_t latency_counter_get_percentile(latency_counter_t *lc, double percent);
  */
 double latency_counter_get_rate(const latency_counter_t *lc, cdtime_t lower,
                                 cdtime_t upper, const cdtime_t now);
-
-/* vim: set sw=2 sts=2 et : */
index 674e275..d0832cb 100644 (file)
@@ -91,7 +91,7 @@ static int latency_config_add_bucket(latency_config_t *conf, oconfig_item_t *ci,
       DOUBLE_TO_CDTIME_T(ci->values[1].value.number);
   conf->buckets_num++;
 
-  return (0);
+  return 0;
 } /* int latency_config_add_bucket */
 
 int latency_config(latency_config_t *conf, oconfig_item_t *ci,
index ef29d8b..427a159 100644 (file)
@@ -232,5 +232,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
index dcb84af..4e570ff 100644 (file)
@@ -35,7 +35,7 @@ static int ltoc_values(lua_State *L, /* {{{ */
                        const data_set_t *ds, value_t *ret_values) {
   if (!lua_istable(L, -1)) {
     WARNING("ltoc_values: not a table");
-    return (-1);
+    return -1;
   }
 
   /* Push initial key */
@@ -60,10 +60,10 @@ static int ltoc_values(lua_State *L, /* {{{ */
     WARNING("ltoc_values: invalid size for datasource \"%s\": expected %zu, "
             "got %zu",
             ds->type, ds->ds_num, i);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ltoc_values */
 
 static int ltoc_table_values(lua_State *L, int idx, /* {{{ */
@@ -78,7 +78,7 @@ static int ltoc_table_values(lua_State *L, int idx, /* {{{ */
             "value, not a table.",
             lua_typename(L, lua_type(L, -1)));
     lua_pop(L, 1);
-    return (-1);
+    return -1;
   }
 
   vl->values_len = ds->ds_num;
@@ -87,7 +87,7 @@ static int ltoc_table_values(lua_State *L, int idx, /* {{{ */
     ERROR("utils_lua: calloc failed.");
     vl->values_len = 0;
     lua_pop(L, 1);
-    return (-1);
+    return -1;
   }
 
   int status = ltoc_values(L, ds, vl->values);
@@ -99,7 +99,7 @@ static int ltoc_table_values(lua_State *L, int idx, /* {{{ */
     sfree(vl->values);
   }
 
-  return (status);
+  return status;
 } /* }}} int ltoc_table_values */
 
 static int luaC_pushvalues(lua_State *L, const data_set_t *ds,
@@ -114,7 +114,7 @@ static int luaC_pushvalues(lua_State *L, const data_set_t *ds,
     lua_settable(L, -3);
   }
 
-  return (0);
+  return 0;
 } /* }}} int luaC_pushvalues */
 
 static int luaC_pushdstypes(lua_State *L, const data_set_t *ds) /* {{{ */
@@ -126,7 +126,7 @@ static int luaC_pushdstypes(lua_State *L, const data_set_t *ds) /* {{{ */
     lua_settable(L, -3);
   }
 
-  return (0);
+  return 0;
 } /* }}} int luaC_pushdstypes */
 
 static int luaC_pushdsnames(lua_State *L, const data_set_t *ds) /* {{{ */
@@ -138,7 +138,7 @@ static int luaC_pushdsnames(lua_State *L, const data_set_t *ds) /* {{{ */
     lua_settable(L, -3);
   }
 
-  return (0);
+  return 0;
 } /* }}} int luaC_pushdsnames */
 
 /*
@@ -147,21 +147,21 @@ static int luaC_pushdsnames(lua_State *L, const data_set_t *ds) /* {{{ */
 cdtime_t luaC_tocdtime(lua_State *L, int idx) /* {{{ */
 {
   if (!lua_isnumber(L, /* stack pos = */ idx))
-    return (0);
+    return 0;
 
   double d = lua_tonumber(L, idx);
 
-  return (DOUBLE_TO_CDTIME_T(d));
+  return DOUBLE_TO_CDTIME_T(d);
 } /* }}} int ltoc_table_cdtime */
 
 int luaC_tostringbuffer(lua_State *L, int idx, /* {{{ */
                         char *buffer, size_t buffer_size) {
   const char *str = lua_tostring(L, idx);
   if (str == NULL)
-    return (-1);
+    return -1;
 
   sstrncpy(buffer, str, buffer_size);
-  return (0);
+  return 0;
 } /* }}} int luaC_tostringbuffer */
 
 value_t luaC_tovalue(lua_State *L, int idx, int ds_type) /* {{{ */
@@ -169,7 +169,7 @@ value_t luaC_tovalue(lua_State *L, int idx, int ds_type) /* {{{ */
   value_t v = {0};
 
   if (!lua_isnumber(L, idx))
-    return (v);
+    return v;
 
   if (ds_type == DS_TYPE_GAUGE)
     v.gauge = (gauge_t)lua_tonumber(L, /* stack pos = */ -1);
@@ -180,7 +180,7 @@ value_t luaC_tovalue(lua_State *L, int idx, int ds_type) /* {{{ */
   else if (ds_type == DS_TYPE_ABSOLUTE)
     v.absolute = (absolute_t)lua_tointeger(L, /* stack pos = */ -1);
 
-  return (v);
+  return v;
 } /* }}} value_t luaC_tovalue */
 
 value_list_t *luaC_tovaluelist(lua_State *L, int idx) /* {{{ */
@@ -197,13 +197,13 @@ value_list_t *luaC_tovaluelist(lua_State *L, int idx) /* {{{ */
   /* Check that idx is in the valid range */
   if ((idx < 1) || (idx > lua_gettop(L))) {
     DEBUG("luaC_tovaluelist: idx(%d), top(%d)", idx, stack_top_before);
-    return (NULL);
+    return NULL;
   }
 
   value_list_t *vl = calloc(1, sizeof(*vl));
   if (vl == NULL) {
     DEBUG("luaC_tovaluelist: calloc failed");
-    return (NULL);
+    return NULL;
   }
 
   /* Push initial key */
@@ -243,20 +243,20 @@ value_list_t *luaC_tovaluelist(lua_State *L, int idx) /* {{{ */
   if (ds == NULL) {
     INFO("utils_lua: Unable to lookup type \"%s\".", vl->type);
     sfree(vl);
-    return (NULL);
+    return NULL;
   }
 
   int status = ltoc_table_values(L, idx, ds, vl);
   if (status != 0) {
     WARNING("utils_lua: ltoc_table_values failed.");
     sfree(vl);
-    return (NULL);
+    return NULL;
   }
 
 #if COLLECT_DEBUG
   assert(stack_top_before == lua_gettop(L));
 #endif
-  return (vl);
+  return vl;
 } /* }}} value_list_t *luaC_tovaluelist */
 
 int luaC_pushcdtime(lua_State *L, cdtime_t t) /* {{{ */
@@ -264,7 +264,7 @@ int luaC_pushcdtime(lua_State *L, cdtime_t t) /* {{{ */
   double d = CDTIME_T_TO_DOUBLE(t);
 
   lua_pushnumber(L, (lua_Number)d);
-  return (0);
+  return 0;
 } /* }}} int luaC_pushcdtime */
 
 int luaC_pushvalue(lua_State *L, value_t v, int ds_type) /* {{{ */
@@ -278,8 +278,8 @@ int luaC_pushvalue(lua_State *L, value_t v, int ds_type) /* {{{ */
   else if (ds_type == DS_TYPE_ABSOLUTE)
     lua_pushinteger(L, (lua_Integer)v.absolute);
   else
-    return (-1);
-  return (0);
+    return -1;
+  return 0;
 } /* }}} int luaC_pushvalue */
 
 int luaC_pushvaluelist(lua_State *L, const data_set_t *ds,
@@ -315,7 +315,5 @@ int luaC_pushvaluelist(lua_State *L, const data_set_t *ds,
   luaC_pushcdtime(L, vl->interval);
   lua_setfield(L, -2, "interval");
 
-  return (0);
+  return 0;
 } /* }}} int luaC_pushvaluelist */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 8ff507c..61d9070 100644 (file)
@@ -53,4 +53,3 @@ int luaC_pushvaluelist(lua_State *L, const data_set_t *ds,
                        const value_list_t *vl);
 
 #endif /* UTILS_LUA_H */
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 11b3f74..df70fbe 100644 (file)
@@ -55,21 +55,21 @@ static char *match_substr(const char *str, int begin, int end) {
   size_t ret_len;
 
   if ((begin < 0) || (end < 0) || (begin >= end))
-    return (NULL);
+    return NULL;
   if ((size_t)end > (strlen(str) + 1)) {
     ERROR("utils_match: match_substr: `end' points after end of string.");
-    return (NULL);
+    return NULL;
   }
 
   ret_len = end - begin;
   ret = malloc(ret_len + 1);
   if (ret == NULL) {
     ERROR("utils_match: match_substr: malloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   sstrncpy(ret, str + begin, ret_len + 1);
-  return (ret);
+  return ret;
 } /* char *match_substr */
 
 static int default_callback(const char __attribute__((unused)) * str,
@@ -84,20 +84,20 @@ static int default_callback(const char __attribute__((unused)) * str,
     if (data->ds_type & UTILS_MATCH_CF_GAUGE_INC) {
       data->value.gauge = isnan(data->value.gauge) ? 1 : data->value.gauge + 1;
       data->values_num++;
-      return (0);
+      return 0;
     }
 
     if (matches_num < 2)
-      return (-1);
+      return -1;
 
     value = (gauge_t)strtod(matches[1], &endptr);
     if (matches[1] == endptr)
-      return (-1);
+      return -1;
 
     if (data->ds_type & UTILS_MATCH_CF_GAUGE_DIST) {
       latency_counter_add(data->latency, DOUBLE_TO_CDTIME_T(value));
       data->values_num++;
-      return (0);
+      return 0;
     }
 
     if ((data->values_num == 0) ||
@@ -117,7 +117,7 @@ static int default_callback(const char __attribute__((unused)) * str,
       data->value.gauge += value;
     } else {
       ERROR("utils_match: default_callback: obj->ds_type is invalid!");
-      return (-1);
+      return -1;
     }
 
     data->values_num++;
@@ -128,15 +128,15 @@ static int default_callback(const char __attribute__((unused)) * str,
     if (data->ds_type & UTILS_MATCH_CF_COUNTER_INC) {
       data->value.counter++;
       data->values_num++;
-      return (0);
+      return 0;
     }
 
     if (matches_num < 2)
-      return (-1);
+      return -1;
 
     value = (counter_t)strtoull(matches[1], &endptr, 0);
     if (matches[1] == endptr)
-      return (-1);
+      return -1;
 
     if (data->ds_type & UTILS_MATCH_CF_COUNTER_SET)
       data->value.counter = value;
@@ -144,7 +144,7 @@ static int default_callback(const char __attribute__((unused)) * str,
       data->value.counter += value;
     else {
       ERROR("utils_match: default_callback: obj->ds_type is invalid!");
-      return (-1);
+      return -1;
     }
 
     data->values_num++;
@@ -155,15 +155,15 @@ static int default_callback(const char __attribute__((unused)) * str,
     if (data->ds_type & UTILS_MATCH_CF_DERIVE_INC) {
       data->value.derive++;
       data->values_num++;
-      return (0);
+      return 0;
     }
 
     if (matches_num < 2)
-      return (-1);
+      return -1;
 
     value = (derive_t)strtoll(matches[1], &endptr, 0);
     if (matches[1] == endptr)
-      return (-1);
+      return -1;
 
     if (data->ds_type & UTILS_MATCH_CF_DERIVE_SET)
       data->value.derive = value;
@@ -171,7 +171,7 @@ static int default_callback(const char __attribute__((unused)) * str,
       data->value.derive += value;
     else {
       ERROR("utils_match: default_callback: obj->ds_type is invalid!");
-      return (-1);
+      return -1;
     }
 
     data->values_num++;
@@ -180,26 +180,26 @@ static int default_callback(const char __attribute__((unused)) * str,
     char *endptr = NULL;
 
     if (matches_num < 2)
-      return (-1);
+      return -1;
 
     value = (absolute_t)strtoull(matches[1], &endptr, 0);
     if (matches[1] == endptr)
-      return (-1);
+      return -1;
 
     if (data->ds_type & UTILS_MATCH_CF_ABSOLUTE_SET)
       data->value.absolute = value;
     else {
       ERROR("utils_match: default_callback: obj->ds_type is invalid!");
-      return (-1);
+      return -1;
     }
 
     data->values_num++;
   } else {
     ERROR("utils_match: default_callback: obj->ds_type is invalid!");
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int default_callback */
 
 static void match_simple_free(void *data) {
@@ -227,13 +227,13 @@ match_create_callback(const char *regex, const char *excluderegex,
 
   obj = calloc(1, sizeof(*obj));
   if (obj == NULL)
-    return (NULL);
+    return NULL;
 
   status = regcomp(&obj->regex, regex, REG_EXTENDED | REG_NEWLINE);
   if (status != 0) {
     ERROR("Compiling the regular expression \"%s\" failed.", regex);
     sfree(obj);
-    return (NULL);
+    return NULL;
   }
   obj->flags |= UTILS_MATCH_FLAGS_REGEX;
 
@@ -243,7 +243,7 @@ match_create_callback(const char *regex, const char *excluderegex,
       ERROR("Compiling the excluding regular expression \"%s\" failed.",
             excluderegex);
       sfree(obj);
-      return (NULL);
+      return NULL;
     }
     obj->flags |= UTILS_MATCH_FLAGS_EXCLUDE_REGEX;
   }
@@ -252,7 +252,7 @@ match_create_callback(const char *regex, const char *excluderegex,
   obj->user_data = user_data;
   obj->free = free_user_data;
 
-  return (obj);
+  return obj;
 } /* cu_match_t *match_create_callback */
 
 cu_match_t *match_create_simple(const char *regex, const char *excluderegex,
@@ -262,7 +262,7 @@ cu_match_t *match_create_simple(const char *regex, const char *excluderegex,
 
   user_data = calloc(1, sizeof(*user_data));
   if (user_data == NULL)
-    return (NULL);
+    return NULL;
   user_data->ds_type = match_ds_type;
 
   if ((match_ds_type & UTILS_MATCH_DS_TYPE_GAUGE) &&
@@ -271,7 +271,7 @@ cu_match_t *match_create_simple(const char *regex, const char *excluderegex,
     if (user_data->latency == NULL) {
       ERROR("match_create_simple(): latency_counter_create() failed.");
       free(user_data);
-      return (NULL);
+      return NULL;
     }
   }
 
@@ -282,9 +282,9 @@ cu_match_t *match_create_simple(const char *regex, const char *excluderegex,
       latency_counter_destroy(user_data->latency);
 
     sfree(user_data);
-    return (NULL);
+    return NULL;
   }
-  return (obj);
+  return obj;
 } /* cu_match_t *match_create_simple */
 
 void match_value_reset(cu_match_value_t *mv) {
@@ -320,7 +320,7 @@ int match_apply(cu_match_t *obj, const char *str) {
   size_t matches_num;
 
   if ((obj == NULL) || (str == NULL))
-    return (-1);
+    return -1;
 
   if (obj->flags & UTILS_MATCH_FLAGS_EXCLUDE_REGEX) {
     status =
@@ -329,7 +329,7 @@ int match_apply(cu_match_t *obj, const char *str) {
     /* Regex did match, so exclude this line */
     if (status == 0) {
       DEBUG("ExludeRegex matched, don't count that line\n");
-      return (0);
+      return 0;
     }
   }
 
@@ -338,7 +338,7 @@ int match_apply(cu_match_t *obj, const char *str) {
 
   /* Regex did not match */
   if (status != 0)
-    return (0);
+    return 0;
 
   for (matches_num = 0; matches_num < STATIC_ARRAY_SIZE(matches);
        matches_num++) {
@@ -366,13 +366,11 @@ int match_apply(cu_match_t *obj, const char *str) {
     sfree(matches[i]);
   }
 
-  return (status);
+  return status;
 } /* int match_apply */
 
 void *match_get_user_data(cu_match_t *obj) {
   if (obj == NULL)
-    return (NULL);
-  return (obj->user_data);
+    return NULL;
+  return obj->user_data;
 } /* void *match_get_user_data */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 1383530..1cff1eb 100644 (file)
@@ -177,5 +177,3 @@ int match_apply(cu_match_t *obj, const char *str);
 void *match_get_user_data(cu_match_t *obj);
 
 #endif /* UTILS_MATCH_H */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 87f26df..bbc4c20 100644 (file)
@@ -270,11 +270,11 @@ static void uuidcache_init(void) {
 
 static unsigned char fromhex(char c) {
   if (isdigit((int)c)) {
-    return (c - '0');
+    return c - '0';
   } else if (islower((int)c)) {
-    return (c - 'a' + 10);
+    return c - 'a' + 10;
   } else {
-    return (c - 'A' + 10);
+    return c - 'A' + 10;
   }
 }
 
@@ -335,7 +335,7 @@ static char *get_device_name(const char *optstr) {
   char *rc;
 
   if (optstr == NULL) {
-    return (NULL);
+    return NULL;
   } else if (strncmp(optstr, "UUID=", 5) == 0) {
     DEBUG("utils_mount: TODO: check UUID= code!");
     rc = get_spec_by_uuid(optstr + 5);
@@ -401,7 +401,7 @@ static cu_mount_t *cu_mount_listmntent(void) {
     last->next = NULL;
   } /* for(p = mntlist; p; p = p->next) */
 
-  return (last);
+  return last;
 } /* cu_mount_t *cu_mount_listmntent(void) */
 /* #endif HAVE_LISTMNTENT */
 
@@ -435,11 +435,11 @@ static cu_mount_t *cu_mount_getfsstat(void) {
     DEBUG("utils_mount: getv?fsstat failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
 #endif /* COLLECT_DEBUG */
-    return (NULL);
+    return NULL;
   }
 
   if ((buf = calloc(bufsize, sizeof(*buf))) == NULL)
-    return (NULL);
+    return NULL;
 
   /* The bufsize needs to be passed in bytes. Really. This is not in the
    * manpage.. -octo */
@@ -451,7 +451,7 @@ static cu_mount_t *cu_mount_getfsstat(void) {
           sstrerror(errno, errbuf, sizeof(errbuf)));
 #endif /* COLLECT_DEBUG */
     free(buf);
-    return (NULL);
+    return NULL;
   }
 
   for (int i = 0; i < num; i++) {
@@ -478,7 +478,7 @@ static cu_mount_t *cu_mount_getfsstat(void) {
 
   free(buf);
 
-  return (first);
+  return first;
 }
 /* #endif HAVE_GETVFSSTAT || HAVE_GETFSSTAT */
 
@@ -498,7 +498,7 @@ static cu_mount_t *cu_mount_gen_getmntent(void) {
     char errbuf[1024];
     ERROR("fopen (%s): %s", COLLECTD_MNTTAB,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (NULL);
+    return NULL;
   }
 
   while (getmntent(fp, &mt) == 0) {
@@ -525,7 +525,7 @@ static cu_mount_t *cu_mount_gen_getmntent(void) {
 
   fclose(fp);
 
-  return (first);
+  return first;
 } /* static cu_mount_t *cu_mount_gen_getmntent (void) */
 /* #endif HAVE_TWO_GETMNTENT || HAVE_GEN_GETMNTENT || HAVE_SUN_GETMNTENT */
 
@@ -549,7 +549,7 @@ static cu_mount_t *cu_mount_getmntent(void) {
     char errbuf[1024];
     ERROR("setmntent (%s): %s", COLLECTD_MNTTAB,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (NULL);
+    return NULL;
   }
 
   while (getmntent_r(fp, &me, mntbuf, sizeof(mntbuf))) {
@@ -580,9 +580,9 @@ static cu_mount_t *cu_mount_getmntent(void) {
 
   endmntent(fp);
 
-  DEBUG("utils_mount: return (0x%p)", (void *)first);
+  DEBUG("utils_mount: return 0x%p", (void *)first);
 
-  return (first);
+  return first;
 } /* HAVE_GETMNTENT_R */
 
 #elif HAVE_ONE_GETMNTENT
@@ -600,7 +600,7 @@ static cu_mount_t *cu_mount_getmntent(void) {
     char errbuf[1024];
     ERROR("setmntent (%s): %s", COLLECTD_MNTTAB,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (NULL);
+    return NULL;
   }
 
   while ((me = getmntent(fp)) != NULL) {
@@ -631,9 +631,9 @@ static cu_mount_t *cu_mount_getmntent(void) {
 
   endmntent(fp);
 
-  DEBUG("utils_mount: return (0x%p)", (void *)first);
+  DEBUG("utils_mount: return 0x%p", (void *)first);
 
-  return (first);
+  return first;
 }
 #endif /* HAVE_ONE_GETMNTENT */
 
@@ -647,7 +647,7 @@ cu_mount_t *cu_mount_getlist(cu_mount_t **list) {
   cu_mount_t *last = NULL;
 
   if (list == NULL)
-    return (NULL);
+    return NULL;
 
   if (*list != NULL) {
     first = *list;
@@ -681,7 +681,7 @@ cu_mount_t *cu_mount_getlist(cu_mount_t **list) {
   while ((last != NULL) && (last->next != NULL))
     last = last->next;
 
-  return (last);
+  return last;
 } /* cu_mount_t *cu_mount_getlist(cu_mount_t **list) */
 
 void cu_mount_freelist(cu_mount_t *list) {
index 695038d..ca65950 100644 (file)
@@ -75,7 +75,7 @@ DEF_TEST(cu_mount_checkoption) {
   OK(NULL == cu_mount_checkoption(line_bool, "tw", 1));
   OK(NULL == cu_mount_checkoption(line_bool, "thr", 1));
 
-  return (0);
+  return 0;
 }
 DEF_TEST(cu_mount_getoptionvalue) {
   char line_opts[] = "foo=one,bar=two,qux=three";
@@ -100,7 +100,7 @@ DEF_TEST(cu_mount_getoptionvalue) {
   OK(NULL == (v = cu_mount_getoptionvalue(line_bool, "four")));
   sfree(v);
 
-  return (0);
+  return 0;
 }
 
 int main(void) {
@@ -109,5 +109,3 @@ int main(void) {
 
   END_TEST;
 }
-
-/* vim: set sw=2 sts=2 et : */
diff --git a/src/utils_ovs.c b/src/utils_ovs.c
new file mode 100644 (file)
index 0000000..2f7baea
--- /dev/null
@@ -0,0 +1,1379 @@
+/**
+ * collectd - src/utils_ovs.c
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Volodymyr Mytnyk <volodymyrx.mytnyk@intel.com>
+ **/
+
+/* clang-format off */
+/*
+ *                         OVS DB API internal architecture diagram
+ * +------------------------------------------------------------------------------+
+ * |OVS plugin      |OVS utils                                                    |
+ * |                |     +------------------------+                              |
+ * |                |     |      echo handler      |                JSON request/ |
+ * |                |  +--+ (ovs_db_table_echo_cb) +<---+---------+ update event/ |
+ * |                |  |  |                        |    |         | result        |
+ * |                |  |  +------------------------+    |         |               |
+ * |                |  |                                |    +----+---+--------+  |
+ * |  +----------+  |  |  +------------------------+    |    |        |        |  |
+ * |  |  update  |  |  |  |     update handler     |    |    |  YAJL  |  JSON  |  |
+ * |  | callback +<-------+(ovs_db_table_update_cp)+<---+    | parser | reader |  |
+ * |  +----------+  |  |  |                        |    |    |        |        |  |
+ * |                |  |  +------------------------+    |    +--------+---+----+  |
+ * |                |  |                                |                 ^       |
+ * |  +----------+  |  |  +------------------------+    |                 |       |
+ * |  |  result  |  |  |  |     result handler     |    |                 |       |
+ * |  | callback +<-------+   (ovs_db_result_cb)   +<---+        JSON raw |       |
+ * |  +----------+  |  |  |                        |               data   |       |
+ * |                |  |  +------------------------+                      |       |
+ * |                |  |                                                  |       |
+ * |                |  |    +------------------+             +------------+----+  |
+ * |  +----------+  |  |    |thread|           |             |thread|          |  |
+ * |  |   init   |  |  |    |                  |  reconnect  |                 |  |
+ * |  | callback +<---------+   EVENT WORKER   +<------------+   POLL WORKER   |  |
+ * |  +----------+  |  |    +------------------+             +--------+--------+  |
+ * |                |  |                                              ^           |
+ * +----------------+-------------------------------------------------------------+
+ *                     |                                              |
+ *                 JSON|echo reply                                 raw|data
+ *                     v                                              v
+ * +-------------------+----------------------------------------------+-----------+
+ * |                                 TCP/UNIX socket                              |
+ * +-------------------------------------------------------------------------------
+ */
+/* clang-format on */
+
+/* collectd headers */
+#include "collectd.h"
+
+#include "common.h"
+
+/* private headers */
+#include "utils_ovs.h"
+
+/* system libraries */
+#if HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#if HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#if HAVE_POLL_H
+#include <poll.h>
+#endif
+#if HAVE_SYS_UN_H
+#include <sys/un.h>
+#endif
+
+#include <semaphore.h>
+
+#define OVS_ERROR(fmt, ...)                                                    \
+  do {                                                                         \
+    ERROR("ovs_utils: " fmt, ##__VA_ARGS__);                                   \
+  } while (0)
+#define OVS_DEBUG(fmt, ...)                                                    \
+  do {                                                                         \
+    DEBUG("%s:%d:%s(): " fmt, __FILE__, __LINE__, __FUNCTION__,                \
+          ##__VA_ARGS__);                                                      \
+  } while (0)
+
+#define OVS_DB_POLL_TIMEOUT 1           /* poll receive timeout (sec) */
+#define OVS_DB_POLL_READ_BLOCK_SIZE 512 /* read block size (bytes) */
+#define OVS_DB_DEFAULT_DB_NAME "Open_vSwitch"
+
+#define OVS_DB_EVENT_TIMEOUT 5 /* event thread timeout (sec) */
+#define OVS_DB_EVENT_TERMINATE 1
+#define OVS_DB_EVENT_CONN_ESTABLISHED 2
+#define OVS_DB_EVENT_CONN_TERMINATED 3
+
+#define OVS_DB_POLL_STATE_RUNNING 1
+#define OVS_DB_POLL_STATE_EXITING 2
+
+#define OVS_DB_SEND_REQ_TIMEOUT 5 /* send request timeout (sec) */
+
+#define OVS_YAJL_CALL(func, ...)                                               \
+  do {                                                                         \
+    yajl_gen_ret = yajl_gen_status_ok;                                         \
+    if ((yajl_gen_ret = func(__VA_ARGS__)) != yajl_gen_status_ok)              \
+      goto yajl_gen_failure;                                                   \
+  } while (0)
+#define OVS_YAJL_ERROR_BUFFER_SIZE 1024
+#define OVS_ERROR_BUFF_SIZE 512
+#define OVS_UID_STR_SIZE 17 /* 64-bit HEX string len + '\0' */
+
+/* JSON reader internal data */
+struct ovs_json_reader_s {
+  char *buff_ptr;
+  size_t buff_size;
+  size_t buff_offset;
+  size_t json_offset;
+};
+typedef struct ovs_json_reader_s ovs_json_reader_t;
+
+/* Result callback declaration */
+struct ovs_result_cb_s {
+  sem_t sync;
+  ovs_db_result_cb_t call;
+};
+typedef struct ovs_result_cb_s ovs_result_cb_t;
+
+/* Table callback declaration */
+struct ovs_table_cb_s {
+  ovs_db_table_cb_t call;
+};
+typedef struct ovs_table_cb_s ovs_table_cb_t;
+
+/* Callback declaration */
+struct ovs_callback_s {
+  uint64_t uid;
+  union {
+    ovs_result_cb_t result;
+    ovs_table_cb_t table;
+  };
+  struct ovs_callback_s *next;
+  struct ovs_callback_s *prev;
+};
+typedef struct ovs_callback_s ovs_callback_t;
+
+/* Event thread data declaration */
+struct ovs_event_thread_s {
+  pthread_t tid;
+  pthread_mutex_t mutex;
+  pthread_cond_t cond;
+  int value;
+};
+typedef struct ovs_event_thread_s ovs_event_thread_t;
+
+/* Poll thread data declaration */
+struct ovs_poll_thread_s {
+  pthread_t tid;
+  pthread_mutex_t mutex;
+  int state;
+};
+typedef struct ovs_poll_thread_s ovs_poll_thread_t;
+
+/* OVS DB internal data declaration */
+struct ovs_db_s {
+  ovs_poll_thread_t poll_thread;
+  ovs_event_thread_t event_thread;
+  pthread_mutex_t mutex;
+  ovs_callback_t *remote_cb;
+  ovs_db_callback_t cb;
+  char service[OVS_DB_ADDR_SERVICE_SIZE];
+  char node[OVS_DB_ADDR_NODE_SIZE];
+  char unix_path[OVS_DB_ADDR_NODE_SIZE];
+  int sock;
+};
+
+/* Global variables */
+static uint64_t ovs_uid = 0;
+static pthread_mutex_t ovs_uid_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Post an event to event thread.
+ * Possible events are:
+ *  OVS_DB_EVENT_TERMINATE
+ *  OVS_DB_EVENT_CONN_ESTABLISHED
+ *  OVS_DB_EVENT_CONN_TERMINATED
+ */
+static void ovs_db_event_post(ovs_db_t *pdb, int event) {
+  pthread_mutex_lock(&pdb->event_thread.mutex);
+  pdb->event_thread.value = event;
+  pthread_mutex_unlock(&pdb->event_thread.mutex);
+  pthread_cond_signal(&pdb->event_thread.cond);
+}
+
+/* Check if POLL thread is still running. Returns
+ * 1 if running otherwise 0 is returned */
+static _Bool ovs_db_poll_is_running(ovs_db_t *pdb) {
+  int state = 0;
+  pthread_mutex_lock(&pdb->poll_thread.mutex);
+  state = pdb->poll_thread.state;
+  pthread_mutex_unlock(&pdb->poll_thread.mutex);
+  return state == OVS_DB_POLL_STATE_RUNNING;
+}
+
+/* Generate unique identifier (UID). It is used by OVS DB API
+ * to set "id" field for any OVS DB JSON request. */
+static uint64_t ovs_uid_generate() {
+  uint64_t new_uid;
+  pthread_mutex_lock(&ovs_uid_mutex);
+  new_uid = ++ovs_uid;
+  pthread_mutex_unlock(&ovs_uid_mutex);
+  return new_uid;
+}
+
+/*
+ * Callback API. These function are used to store
+ * registered callbacks in OVS DB API.
+ */
+
+/* Add new callback into OVS DB object */
+static void ovs_db_callback_add(ovs_db_t *pdb, ovs_callback_t *new_cb) {
+  pthread_mutex_lock(&pdb->mutex);
+  if (pdb->remote_cb)
+    pdb->remote_cb->prev = new_cb;
+  new_cb->next = pdb->remote_cb;
+  new_cb->prev = NULL;
+  pdb->remote_cb = new_cb;
+  pthread_mutex_unlock(&pdb->mutex);
+}
+
+/* Remove callback from OVS DB object */
+static void ovs_db_callback_remove(ovs_db_t *pdb, ovs_callback_t *del_cb) {
+  pthread_mutex_lock(&pdb->mutex);
+  ovs_callback_t *pre_cb = del_cb->prev;
+  ovs_callback_t *next_cb = del_cb->next;
+
+  if (next_cb)
+    next_cb->prev = del_cb->prev;
+
+  if (pre_cb)
+    pre_cb->next = del_cb->next;
+  else
+    pdb->remote_cb = del_cb->next;
+
+  free(del_cb);
+  pthread_mutex_unlock(&pdb->mutex);
+}
+
+/* Remove all callbacks form OVS DB object */
+static void ovs_db_callback_remove_all(ovs_db_t *pdb) {
+  pthread_mutex_lock(&pdb->mutex);
+  for (ovs_callback_t *del_cb = pdb->remote_cb; pdb->remote_cb;
+       del_cb = pdb->remote_cb) {
+    pdb->remote_cb = del_cb->next;
+    free(del_cb);
+  }
+  pdb->remote_cb = NULL;
+  pthread_mutex_unlock(&pdb->mutex);
+}
+
+/* Get/find callback in OVS DB object by UID. Returns pointer
+ * to requested callback otherwise NULL is returned.
+ *
+ * IMPORTANT NOTE:
+ *   The OVS DB mutex MUST be locked by the caller
+ *   to make sure that returned callback is still valid.
+ */
+static ovs_callback_t *ovs_db_callback_get(ovs_db_t *pdb, uint64_t uid) {
+  for (ovs_callback_t *cb = pdb->remote_cb; cb != NULL; cb = cb->next)
+    if (cb->uid == uid)
+      return cb;
+  return NULL;
+}
+
+/* Send all requested data to the socket. Returns 0 if
+ * ALL request data has been sent otherwise negative value
+ * is returned */
+static int ovs_db_data_send(const ovs_db_t *pdb, const char *data, size_t len) {
+  ssize_t nbytes = 0;
+  size_t rem = len;
+  size_t off = 0;
+
+  while (rem > 0) {
+    if ((nbytes = send(pdb->sock, data + off, rem, 0)) <= 0)
+      return -1;
+    rem -= (size_t)nbytes;
+    off += (size_t)nbytes;
+  }
+  return 0;
+}
+
+/*
+ * YAJL (Yet Another JSON Library) helper functions
+ * Documentation (https://lloyd.github.io/yajl/)
+ */
+
+/* Add null-terminated string into YAJL generator handle (JSON object).
+ * Similar function to yajl_gen_string() but takes null-terminated string
+ * instead of string and its length.
+ *
+ * jgen   - YAJL generator handle allocated by yajl_gen_alloc()
+ * string - Null-terminated string
+ */
+static yajl_gen_status ovs_yajl_gen_tstring(yajl_gen hander,
+                                            const char *string) {
+  return yajl_gen_string(hander, (const unsigned char *)string,
+                         strlen(string));
+}
+
+/* Add YAJL value into YAJL generator handle (JSON object)
+ *
+ * jgen - YAJL generator handle allocated by yajl_gen_alloc()
+ * jval - YAJL value usually returned by yajl_tree_get()
+ */
+static yajl_gen_status ovs_yajl_gen_val(yajl_gen jgen, yajl_val jval) {
+  size_t array_len = 0;
+  yajl_val *jvalues = NULL;
+  yajl_val jobj_value = NULL;
+  const char *obj_key = NULL;
+  size_t obj_len = 0;
+  yajl_gen_status yajl_gen_ret = yajl_gen_status_ok;
+
+  if (jval == NULL)
+    return yajl_gen_generation_complete;
+
+  if (YAJL_IS_STRING(jval))
+    OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, YAJL_GET_STRING(jval));
+  else if (YAJL_IS_DOUBLE(jval))
+    OVS_YAJL_CALL(yajl_gen_double, jgen, YAJL_GET_DOUBLE(jval));
+  else if (YAJL_IS_INTEGER(jval))
+    OVS_YAJL_CALL(yajl_gen_double, jgen, YAJL_GET_INTEGER(jval));
+  else if (YAJL_IS_TRUE(jval))
+    OVS_YAJL_CALL(yajl_gen_bool, jgen, 1);
+  else if (YAJL_IS_FALSE(jval))
+    OVS_YAJL_CALL(yajl_gen_bool, jgen, 0);
+  else if (YAJL_IS_NULL(jval))
+    OVS_YAJL_CALL(yajl_gen_null, jgen);
+  else if (YAJL_IS_ARRAY(jval)) {
+    /* create new array and add all elements into the array */
+    array_len = YAJL_GET_ARRAY(jval)->len;
+    jvalues = YAJL_GET_ARRAY(jval)->values;
+    OVS_YAJL_CALL(yajl_gen_array_open, jgen);
+    for (size_t i = 0; i < array_len; i++)
+      OVS_YAJL_CALL(ovs_yajl_gen_val, jgen, jvalues[i]);
+    OVS_YAJL_CALL(yajl_gen_array_close, jgen);
+  } else if (YAJL_IS_OBJECT(jval)) {
+    /* create new object and add all elements into the object */
+    OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+    obj_len = YAJL_GET_OBJECT(jval)->len;
+    for (size_t i = 0; i < obj_len; i++) {
+      obj_key = YAJL_GET_OBJECT(jval)->keys[i];
+      jobj_value = YAJL_GET_OBJECT(jval)->values[i];
+      OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, obj_key);
+      OVS_YAJL_CALL(ovs_yajl_gen_val, jgen, jobj_value);
+    }
+    OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+  } else {
+    OVS_ERROR("%s() unsupported value type %d (skip)", __FUNCTION__,
+              (int)(jval)->type);
+    goto yajl_gen_failure;
+  }
+  return yajl_gen_status_ok;
+
+yajl_gen_failure:
+  OVS_ERROR("%s() error to generate value", __FUNCTION__);
+  return yajl_gen_ret;
+}
+
+/* OVS DB echo request handler. When OVS DB sends
+ * "echo" request to the client, client should generate
+ * "echo" replay with the same content received in the
+ * request */
+static int ovs_db_table_echo_cb(const ovs_db_t *pdb, yajl_val jnode) {
+  yajl_val jparams;
+  yajl_val jid;
+  yajl_gen jgen;
+  size_t resp_len = 0;
+  const char *resp = NULL;
+  const char *params_path[] = {"params", NULL};
+  const char *id_path[] = {"id", NULL};
+  yajl_gen_status yajl_gen_ret;
+
+  if ((jgen = yajl_gen_alloc(NULL)) == NULL)
+    return -1;
+
+  /* check & get request attributes */
+  if ((jparams = yajl_tree_get(jnode, params_path, yajl_t_array)) == NULL ||
+      ((jid = yajl_tree_get(jnode, id_path, yajl_t_any)) == NULL)) {
+    OVS_ERROR("parse echo request failed");
+    goto yajl_gen_failure;
+  }
+
+  /* generate JSON echo response */
+  OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "result");
+  OVS_YAJL_CALL(ovs_yajl_gen_val, jgen, jparams);
+
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "error");
+  OVS_YAJL_CALL(yajl_gen_null, jgen);
+
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "id");
+  OVS_YAJL_CALL(ovs_yajl_gen_val, jgen, jid);
+
+  OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+  OVS_YAJL_CALL(yajl_gen_get_buf, jgen, (const unsigned char **)&resp,
+                &resp_len);
+
+  /* send the response */
+  OVS_DEBUG("response: %s", resp);
+  if (ovs_db_data_send(pdb, resp, resp_len) < 0) {
+    OVS_ERROR("send echo reply failed");
+    goto yajl_gen_failure;
+  }
+  /* clean up and return success */
+  yajl_gen_clear(jgen);
+  return 0;
+
+yajl_gen_failure:
+  /* release memory */
+  yajl_gen_clear(jgen);
+  return -1;
+}
+
+/* Get OVS DB registered callback by YAJL val. The YAJL
+ * value should be YAJL string (UID). Returns NULL if
+ * callback hasn't been found. See also ovs_db_callback_get()
+ * description for addition info.
+ */
+static ovs_callback_t *ovs_db_table_callback_get(ovs_db_t *pdb, yajl_val jid) {
+  char *endptr = NULL;
+  const char *suid = NULL;
+  uint64_t uid;
+
+  if (jid && YAJL_IS_STRING(jid)) {
+    suid = YAJL_GET_STRING(jid);
+    uid = (uint64_t)strtoul(suid, &endptr, 16);
+    if (*endptr == '\0' && uid)
+      return ovs_db_callback_get(pdb, uid);
+  }
+
+  return NULL;
+}
+
+/* OVS DB table update event handler.
+ * This callback is called by POLL thread if OVS DB
+ * table update callback is received from the DB
+ * server. Once registered callback found, it's called
+ * by this handler. */
+static int ovs_db_table_update_cb(ovs_db_t *pdb, yajl_val jnode) {
+  ovs_callback_t *cb = NULL;
+  yajl_val jvalue;
+  yajl_val jparams;
+  yajl_val jtable_updates;
+  const char *params_path[] = {"params", NULL};
+  const char *id_path[] = {"id", NULL};
+
+  /* check & get request attributes */
+  if ((jparams = yajl_tree_get(jnode, params_path, yajl_t_array)) == NULL ||
+      (yajl_tree_get(jnode, id_path, yajl_t_null) == NULL)) {
+    OVS_ERROR("invalid OVS DB request received");
+    return -1;
+  }
+
+  /* check array length: [<json-value>, <table-updates>] */
+  if ((YAJL_GET_ARRAY(jparams) == NULL) ||
+      (YAJL_GET_ARRAY(jparams)->len != 2)) {
+    OVS_ERROR("invalid OVS DB request received");
+    return -1;
+  }
+
+  jvalue = YAJL_GET_ARRAY(jparams)->values[0];
+  jtable_updates = YAJL_GET_ARRAY(jparams)->values[1];
+  if ((!YAJL_IS_OBJECT(jtable_updates)) || (!YAJL_IS_STRING(jvalue))) {
+    OVS_ERROR("invalid OVS DB request id or table update received");
+    return -1;
+  }
+
+  /* find registered callback based on <json-value> */
+  pthread_mutex_lock(&pdb->mutex);
+  cb = ovs_db_table_callback_get(pdb, jvalue);
+  if (cb == NULL || cb->table.call == NULL) {
+    OVS_ERROR("No OVS DB table update callback found");
+    pthread_mutex_unlock(&pdb->mutex);
+    return -1;
+  }
+
+  /* call registered callback */
+  cb->table.call(jtable_updates);
+  pthread_mutex_unlock(&pdb->mutex);
+  return 0;
+}
+
+/* OVS DB result request handler.
+ * This callback is called by POLL thread if OVS DB
+ * result reply is received from the DB server.
+ * Once registered callback found, it's called
+ * by this handler. */
+static int ovs_db_result_cb(ovs_db_t *pdb, yajl_val jnode) {
+  ovs_callback_t *cb = NULL;
+  yajl_val jresult;
+  yajl_val jerror;
+  yajl_val jid;
+  const char *result_path[] = {"result", NULL};
+  const char *error_path[] = {"error", NULL};
+  const char *id_path[] = {"id", NULL};
+
+  jresult = yajl_tree_get(jnode, result_path, yajl_t_any);
+  jerror = yajl_tree_get(jnode, error_path, yajl_t_any);
+  jid = yajl_tree_get(jnode, id_path, yajl_t_string);
+
+  /* check & get result attributes */
+  if (!jresult || !jerror || !jid)
+    return -1;
+
+  /* try to find registered callback */
+  pthread_mutex_lock(&pdb->mutex);
+  cb = ovs_db_table_callback_get(pdb, jid);
+  if (cb != NULL && cb->result.call != NULL) {
+    /* call registered callback */
+    cb->result.call(jresult, jerror);
+    /* unlock owner of the reply */
+    sem_post(&cb->result.sync);
+  }
+
+  pthread_mutex_unlock(&pdb->mutex);
+  return 0;
+}
+
+/* Handle JSON data (one request) and call
+ * appropriate event OVS DB handler. Currently,
+ * update callback 'ovs_db_table_update_cb' and
+ * result callback 'ovs_db_result_cb' is supported.
+ */
+static int ovs_db_json_data_process(ovs_db_t *pdb, const char *data,
+                                    size_t len) {
+  const char *method = NULL;
+  char yajl_errbuf[OVS_YAJL_ERROR_BUFFER_SIZE];
+  const char *method_path[] = {"method", NULL};
+  const char *result_path[] = {"result", NULL};
+  char *sjson = NULL;
+  yajl_val jnode, jval;
+
+  /* duplicate the data to make null-terminated string
+   * required for yajl_tree_parse() */
+  if ((sjson = calloc(1, len + 1)) == NULL)
+    return -1;
+
+  sstrncpy(sjson, data, len + 1);
+  OVS_DEBUG("[len=%zu] %s", len, sjson);
+
+  /* parse json data */
+  jnode = yajl_tree_parse(sjson, yajl_errbuf, sizeof(yajl_errbuf));
+  if (jnode == NULL) {
+    OVS_ERROR("yajl_tree_parse() %s", yajl_errbuf);
+    sfree(sjson);
+    return -1;
+  }
+
+  /* get method name */
+  if ((jval = yajl_tree_get(jnode, method_path, yajl_t_string)) != NULL) {
+    if ((method = YAJL_GET_STRING(jval)) == NULL) {
+      yajl_tree_free(jnode);
+      sfree(sjson);
+      return -1;
+    }
+    if (strcmp("echo", method) == 0) {
+      /* echo request from the server */
+      if (ovs_db_table_echo_cb(pdb, jnode) < 0)
+        OVS_ERROR("handle echo request failed");
+    } else if (strcmp("update", method) == 0) {
+      /* update notification */
+      if (ovs_db_table_update_cb(pdb, jnode) < 0)
+        OVS_ERROR("handle update notification failed");
+    }
+  } else if ((jval = yajl_tree_get(jnode, result_path, yajl_t_any)) != NULL) {
+    /* result notification */
+    if (ovs_db_result_cb(pdb, jnode) < 0)
+      OVS_ERROR("handle result reply failed");
+  } else
+    OVS_ERROR("connot find method or result failed");
+
+  /* release memory */
+  yajl_tree_free(jnode);
+  sfree(sjson);
+  return 0;
+}
+
+/*
+ * JSON reader implementation.
+ *
+ * This module process raw JSON data (byte stream) and
+ * returns fully-fledged JSON data which can be processed
+ * (parsed) by YAJL later.
+ */
+
+/* Allocate JSON reader instance */
+static ovs_json_reader_t *ovs_json_reader_alloc() {
+  ovs_json_reader_t *jreader = NULL;
+
+  if ((jreader = calloc(sizeof(ovs_json_reader_t), 1)) == NULL)
+    return NULL;
+
+  return jreader;
+}
+
+/* Push raw data into into the JSON reader for processing */
+static int ovs_json_reader_push_data(ovs_json_reader_t *jreader,
+                                     const char *data, size_t data_len) {
+  char *new_buff = NULL;
+  size_t available = jreader->buff_size - jreader->buff_offset;
+
+  /* check/update required memory space */
+  if (available < data_len) {
+    OVS_DEBUG("Reallocate buffer [size=%d, available=%d required=%d]",
+              (int)jreader->buff_size, (int)available, (int)data_len);
+
+    /* allocate new chunk of memory */
+    new_buff = realloc(jreader->buff_ptr, (jreader->buff_size + data_len));
+    if (new_buff == NULL)
+      return -1;
+
+    /* point to new allocated memory */
+    jreader->buff_ptr = new_buff;
+    jreader->buff_size += data_len;
+  }
+
+  /* store input data */
+  memcpy(jreader->buff_ptr + jreader->buff_offset, data, data_len);
+  jreader->buff_offset += data_len;
+  return 0;
+}
+
+/* Pop one fully-fledged JSON if already exists. Returns 0 if
+ * completed JSON already exists otherwise negative value is
+ * returned */
+static int ovs_json_reader_pop(ovs_json_reader_t *jreader,
+                               const char **json_ptr, size_t *json_len_ptr) {
+  size_t nbraces = 0;
+  size_t json_len = 0;
+  char *json = NULL;
+
+  /* search open/close brace */
+  for (size_t i = jreader->json_offset; i < jreader->buff_offset; i++) {
+    if (jreader->buff_ptr[i] == '{') {
+      nbraces++;
+    } else if (jreader->buff_ptr[i] == '}')
+      if (nbraces)
+        if (!(--nbraces)) {
+          /* JSON data */
+          *json_ptr = jreader->buff_ptr + jreader->json_offset;
+          *json_len_ptr = json_len + 1;
+          jreader->json_offset = i + 1;
+          return 0;
+        }
+
+    /* increase JSON data length */
+    if (nbraces)
+      json_len++;
+  }
+
+  if (jreader->json_offset) {
+    if (jreader->json_offset < jreader->buff_offset) {
+      /* shift data to the beginning of the buffer
+       * and zero rest of the buffer data */
+      json = &jreader->buff_ptr[jreader->json_offset];
+      json_len = jreader->buff_offset - jreader->json_offset;
+      for (size_t i = 0; i < jreader->buff_size; i++)
+        jreader->buff_ptr[i] = ((i < json_len) ? (json[i]) : (0));
+      jreader->buff_offset = json_len;
+    } else
+      /* reset the buffer */
+      jreader->buff_offset = 0;
+
+    /* data is at the beginning of the buffer */
+    jreader->json_offset = 0;
+  }
+
+  return -1;
+}
+
+/* Reset JSON reader. It is useful when start processing
+ * new raw data. E.g.: in case of lost stream connection.
+ */
+static void ovs_json_reader_reset(ovs_json_reader_t *jreader) {
+  if (jreader) {
+    jreader->buff_offset = 0;
+    jreader->json_offset = 0;
+  }
+}
+
+/* Release internal data allocated for JSON reader */
+static void ovs_json_reader_free(ovs_json_reader_t *jreader) {
+  if (jreader) {
+    free(jreader->buff_ptr);
+    free(jreader);
+  }
+}
+
+/* Reconnect to OVS DB and call the OVS DB post connection init callback
+ * if connection has been established.
+ */
+static void ovs_db_reconnect(ovs_db_t *pdb) {
+  const char *node_info = pdb->node;
+  struct addrinfo *result;
+
+  if (pdb->unix_path[0] != '\0') {
+    /* use UNIX socket instead of INET address */
+    node_info = pdb->unix_path;
+    result = calloc(1, sizeof(struct addrinfo));
+    struct sockaddr_un *sa_unix = calloc(1, sizeof(struct sockaddr_un));
+    if (result == NULL || sa_unix == NULL) {
+      sfree(result);
+      sfree(sa_unix);
+      return;
+    }
+    result->ai_family = AF_UNIX;
+    result->ai_socktype = SOCK_STREAM;
+    result->ai_addrlen = sizeof(*sa_unix);
+    result->ai_addr = (struct sockaddr *)sa_unix;
+    sa_unix->sun_family = result->ai_family;
+    sstrncpy(sa_unix->sun_path, pdb->unix_path, sizeof(sa_unix->sun_path));
+  } else {
+    /* inet socket address */
+    struct addrinfo hints;
+
+    /* setup criteria for selecting the socket address */
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = AF_UNSPEC;
+    hints.ai_socktype = SOCK_STREAM;
+
+    /* get socket addresses */
+    int ret = getaddrinfo(pdb->node, pdb->service, &hints, &result);
+    if (ret != 0) {
+      OVS_ERROR("getaddrinfo(): %s", gai_strerror(ret));
+      return;
+    }
+  }
+  /* try to connect to the server */
+  for (struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) {
+    char errbuff[OVS_ERROR_BUFF_SIZE];
+    int sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+    if (sock < 0) {
+      sstrerror(errno, errbuff, sizeof(errbuff));
+      OVS_DEBUG("socket(): %s", errbuff);
+      continue;
+    }
+    if (connect(sock, rp->ai_addr, rp->ai_addrlen) < 0) {
+      close(sock);
+      sstrerror(errno, errbuff, sizeof(errbuff));
+      OVS_DEBUG("connect(): %s [family=%d]", errbuff, rp->ai_family);
+    } else {
+      /* send notification to event thread */
+      ovs_db_event_post(pdb, OVS_DB_EVENT_CONN_ESTABLISHED);
+      pdb->sock = sock;
+      break;
+    }
+  }
+
+  if (pdb->sock < 0)
+    OVS_ERROR("connect to \"%s\" failed", node_info);
+
+  freeaddrinfo(result);
+}
+
+/* POLL worker thread.
+ * It listens on OVS DB connection for incoming
+ * requests/reply/events etc. Also, it reconnects to OVS DB
+ * if connection has been lost.
+ */
+static void *ovs_poll_worker(void *arg) {
+  ovs_db_t *pdb = (ovs_db_t *)arg; /* pointer to OVS DB */
+  ovs_json_reader_t *jreader = NULL;
+  struct pollfd poll_fd = {
+      .fd = pdb->sock, .events = POLLIN | POLLPRI, .revents = 0,
+  };
+
+  /* create JSON reader instance */
+  if ((jreader = ovs_json_reader_alloc()) == NULL) {
+    OVS_ERROR("initialize json reader failed");
+    return NULL;
+  }
+
+  /* poll data */
+  while (ovs_db_poll_is_running(pdb)) {
+    char errbuff[OVS_ERROR_BUFF_SIZE];
+    poll_fd.fd = pdb->sock;
+    int poll_ret = poll(&poll_fd, 1, /* ms */ OVS_DB_POLL_TIMEOUT * 1000);
+    if (poll_ret < 0) {
+      sstrerror(errno, errbuff, sizeof(errbuff));
+      OVS_ERROR("poll(): %s", errbuff);
+      break;
+    } else if (poll_ret == 0) {
+      OVS_DEBUG("poll(): timeout");
+      if (pdb->sock < 0)
+        /* invalid fd, so try to reconnect */
+        ovs_db_reconnect(pdb);
+      continue;
+    }
+    if (poll_fd.revents & POLLNVAL) {
+      /* invalid file descriptor, clean-up */
+      ovs_db_callback_remove_all(pdb);
+      ovs_json_reader_reset(jreader);
+      /* setting poll FD to -1 tells poll() call to ignore this FD.
+       * In that case poll() call will return timeout all the time */
+      pdb->sock = (-1);
+    } else if ((poll_fd.revents & POLLERR) || (poll_fd.revents & POLLHUP)) {
+      /* connection is broken */
+      close(poll_fd.fd);
+      ovs_db_event_post(pdb, OVS_DB_EVENT_CONN_TERMINATED);
+      OVS_ERROR("poll() peer closed its end of the channel");
+    } else if ((poll_fd.revents & POLLIN) || (poll_fd.revents & POLLPRI)) {
+      /* read incoming data */
+      char buff[OVS_DB_POLL_READ_BLOCK_SIZE];
+      ssize_t nbytes = recv(poll_fd.fd, buff, sizeof(buff), 0);
+      if (nbytes < 0) {
+        sstrerror(errno, errbuff, sizeof(errbuff));
+        OVS_ERROR("recv(): %s", errbuff);
+        /* read error? Try to reconnect */
+        close(poll_fd.fd);
+        continue;
+      } else if (nbytes == 0) {
+        close(poll_fd.fd);
+        ovs_db_event_post(pdb, OVS_DB_EVENT_CONN_TERMINATED);
+        OVS_ERROR("recv() peer has performed an orderly shutdown");
+        continue;
+      }
+      /* read incoming data */
+      size_t json_len = 0;
+      const char *json = NULL;
+      OVS_DEBUG("recv(): received %zd bytes of data", nbytes);
+      ovs_json_reader_push_data(jreader, buff, nbytes);
+      while (!ovs_json_reader_pop(jreader, &json, &json_len))
+        /* process JSON data */
+        ovs_db_json_data_process(pdb, json, json_len);
+    }
+  }
+
+  OVS_DEBUG("poll thread has been completed");
+  ovs_json_reader_free(jreader);
+  return NULL;
+}
+
+/* EVENT worker thread.
+ * Perform task based on incoming events. This
+ * task can be done asynchronously which allows to
+ * handle OVS DB callback like 'init_cb'.
+ */
+static void *ovs_event_worker(void *arg) {
+  ovs_db_t *pdb = (ovs_db_t *)arg;
+
+  while (pdb->event_thread.value != OVS_DB_EVENT_TERMINATE) {
+    /* wait for an event */
+    struct timespec ts;
+    clock_gettime(CLOCK_REALTIME, &ts);
+    ts.tv_sec += (OVS_DB_EVENT_TIMEOUT);
+    int ret = pthread_cond_timedwait(&pdb->event_thread.cond,
+                                     &pdb->event_thread.mutex, &ts);
+    if (!ret) {
+      /* handle the event */
+      OVS_DEBUG("handle event %d", pdb->event_thread.value);
+      switch (pdb->event_thread.value) {
+      case OVS_DB_EVENT_CONN_ESTABLISHED:
+        if (pdb->cb.post_conn_init)
+          pdb->cb.post_conn_init(pdb);
+        break;
+      case OVS_DB_EVENT_CONN_TERMINATED:
+        if (pdb->cb.post_conn_terminate)
+          pdb->cb.post_conn_terminate();
+        break;
+      default:
+        OVS_DEBUG("unknown event received");
+        break;
+      }
+    } else if (ret == ETIMEDOUT) {
+      /* wait timeout */
+      OVS_DEBUG("no event received (timeout)");
+      continue;
+    } else {
+      /* unexpected error */
+      OVS_ERROR("pthread_cond_timedwait() failed");
+      break;
+    }
+  }
+
+  OVS_DEBUG("event thread has been completed");
+  return NULL;
+}
+
+/* Initialize EVENT thread */
+static int ovs_db_event_thread_init(ovs_db_t *pdb) {
+  pdb->event_thread.tid = (pthread_t)-1;
+  /* init event thread condition variable */
+  if (pthread_cond_init(&pdb->event_thread.cond, NULL)) {
+    return -1;
+  }
+  /* init event thread mutex */
+  if (pthread_mutex_init(&pdb->event_thread.mutex, NULL)) {
+    pthread_cond_destroy(&pdb->event_thread.cond);
+    return -1;
+  }
+  /* Hold the event thread mutex. It ensures that no events
+   * will be lost while thread is still starting. Once event
+   * thread is started and ready to accept events, it will release
+   * the mutex */
+  if (pthread_mutex_lock(&pdb->event_thread.mutex)) {
+    pthread_mutex_destroy(&pdb->event_thread.mutex);
+    pthread_cond_destroy(&pdb->event_thread.cond);
+    return -1;
+  }
+  /* start event thread */
+  pthread_t tid;
+  if (plugin_thread_create(&tid, NULL, ovs_event_worker, pdb,
+                           "utils_ovs:event") != 0) {
+    pthread_mutex_unlock(&pdb->event_thread.mutex);
+    pthread_mutex_destroy(&pdb->event_thread.mutex);
+    pthread_cond_destroy(&pdb->event_thread.cond);
+    return -1;
+  }
+  pdb->event_thread.tid = tid;
+  return 0;
+}
+
+/* Destroy EVENT thread */
+static int ovs_db_event_thread_destroy(ovs_db_t *pdb) {
+  if (pdb->event_thread.tid == (pthread_t)-1)
+    /* already destroyed */
+    return 0;
+  ovs_db_event_post(pdb, OVS_DB_EVENT_TERMINATE);
+  if (pthread_join(pdb->event_thread.tid, NULL) != 0)
+    return -1;
+  /* Event thread always holds the thread mutex when
+   * performs some task (handles event) and releases it when
+   * while sleeping. Thus, if event thread exits, the mutex
+   * remains locked */
+  pthread_mutex_unlock(&pdb->event_thread.mutex);
+  pthread_mutex_destroy(&pdb->event_thread.mutex);
+  pthread_cond_destroy(&pdb->event_thread.cond);
+  pdb->event_thread.tid = (pthread_t)-1;
+  return 0;
+}
+
+/* Initialize POLL thread */
+static int ovs_db_poll_thread_init(ovs_db_t *pdb) {
+  pdb->poll_thread.tid = (pthread_t)-1;
+  /* init event thread mutex */
+  if (pthread_mutex_init(&pdb->poll_thread.mutex, NULL)) {
+    return -1;
+  }
+  /* start poll thread */
+  pthread_t tid;
+  pdb->poll_thread.state = OVS_DB_POLL_STATE_RUNNING;
+  if (plugin_thread_create(&tid, NULL, ovs_poll_worker, pdb,
+                           "utils_ovs:poll") != 0) {
+    pthread_mutex_destroy(&pdb->poll_thread.mutex);
+    return -1;
+  }
+  pdb->poll_thread.tid = tid;
+  return 0;
+}
+
+/* Destroy POLL thread */
+static int ovs_db_poll_thread_destroy(ovs_db_t *pdb) {
+  if (pdb->poll_thread.tid == (pthread_t)-1)
+    /* already destroyed */
+    return 0;
+  /* change thread state */
+  pthread_mutex_lock(&pdb->poll_thread.mutex);
+  pdb->poll_thread.state = OVS_DB_POLL_STATE_EXITING;
+  pthread_mutex_unlock(&pdb->poll_thread.mutex);
+  /* join the thread */
+  if (pthread_join(pdb->poll_thread.tid, NULL) != 0)
+    return -1;
+  pthread_mutex_destroy(&pdb->poll_thread.mutex);
+  pdb->poll_thread.tid = (pthread_t)-1;
+  return 0;
+}
+
+/*
+ * Public OVS DB API implementation
+ */
+
+ovs_db_t *ovs_db_init(const char *node, const char *service,
+                      const char *unix_path, ovs_db_callback_t *cb) {
+  /* sanity check */
+  if (node == NULL || service == NULL || unix_path == NULL)
+    return NULL;
+
+  /* allocate db data & fill it */
+  ovs_db_t *pdb = pdb = calloc(1, sizeof(*pdb));
+  if (pdb == NULL)
+    return NULL;
+
+  /* store the OVS DB address */
+  sstrncpy(pdb->node, node, sizeof(pdb->node));
+  sstrncpy(pdb->service, service, sizeof(pdb->service));
+  sstrncpy(pdb->unix_path, unix_path, sizeof(pdb->unix_path));
+
+  /* setup OVS DB callbacks */
+  if (cb)
+    pdb->cb = *cb;
+
+  /* init OVS DB mutex attributes */
+  pthread_mutexattr_t mutex_attr;
+  if (pthread_mutexattr_init(&mutex_attr)) {
+    OVS_ERROR("OVS DB mutex attribute init failed");
+    sfree(pdb);
+    return NULL;
+  }
+  /* set OVS DB mutex as recursive */
+  if (pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE)) {
+    OVS_ERROR("Failed to set OVS DB mutex as recursive");
+    pthread_mutexattr_destroy(&mutex_attr);
+    sfree(pdb);
+    return NULL;
+  }
+  /* init OVS DB mutex */
+  if (pthread_mutex_init(&pdb->mutex, &mutex_attr)) {
+    OVS_ERROR("OVS DB mutex init failed");
+    pthread_mutexattr_destroy(&mutex_attr);
+    sfree(pdb);
+    return NULL;
+  }
+  /* destroy mutex attributes */
+  pthread_mutexattr_destroy(&mutex_attr);
+
+  /* init event thread */
+  if (ovs_db_event_thread_init(pdb) < 0) {
+    ovs_db_destroy(pdb);
+    return NULL;
+  }
+
+  /* init polling thread */
+  pdb->sock = -1;
+  if (ovs_db_poll_thread_init(pdb) < 0) {
+    ovs_db_destroy(pdb);
+    return NULL;
+  }
+  return pdb;
+}
+
+int ovs_db_send_request(ovs_db_t *pdb, const char *method, const char *params,
+                        ovs_db_result_cb_t cb) {
+  int ret = 0;
+  yajl_gen_status yajl_gen_ret;
+  yajl_val jparams;
+  yajl_gen jgen;
+  ovs_callback_t *new_cb = NULL;
+  uint64_t uid;
+  char uid_buff[OVS_UID_STR_SIZE];
+  const char *req = NULL;
+  size_t req_len = 0;
+  struct timespec ts;
+
+  /* sanity check */
+  if (!pdb || !method || !params)
+    return -1;
+
+  if ((jgen = yajl_gen_alloc(NULL)) == NULL)
+    return -1;
+
+  /* try to parse params */
+  if ((jparams = yajl_tree_parse(params, NULL, 0)) == NULL) {
+    OVS_ERROR("params is not a JSON string");
+    yajl_gen_clear(jgen);
+    return -1;
+  }
+
+  /* generate method field */
+  OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "method");
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, method);
+
+  /* generate params field */
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "params");
+  OVS_YAJL_CALL(ovs_yajl_gen_val, jgen, jparams);
+  yajl_tree_free(jparams);
+
+  /* generate id field */
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "id");
+  uid = ovs_uid_generate();
+  ssnprintf(uid_buff, sizeof(uid_buff), "%" PRIX64, uid);
+  OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, uid_buff);
+
+  OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+
+  if (cb) {
+    /* register result callback */
+    if ((new_cb = calloc(1, sizeof(ovs_callback_t))) == NULL)
+      goto yajl_gen_failure;
+
+    /* add new callback to front */
+    sem_init(&new_cb->result.sync, 0, 0);
+    new_cb->result.call = cb;
+    new_cb->uid = uid;
+    ovs_db_callback_add(pdb, new_cb);
+  }
+
+  /* send the request */
+  OVS_YAJL_CALL(yajl_gen_get_buf, jgen, (const unsigned char **)&req, &req_len);
+  OVS_DEBUG("%s", req);
+  if (!ovs_db_data_send(pdb, req, req_len)) {
+    if (cb) {
+      /* wait for result */
+      clock_gettime(CLOCK_REALTIME, &ts);
+      ts.tv_sec += OVS_DB_SEND_REQ_TIMEOUT;
+      if (sem_timedwait(&new_cb->result.sync, &ts) < 0) {
+        OVS_ERROR("%s() no replay received within %d sec", __FUNCTION__,
+                  OVS_DB_SEND_REQ_TIMEOUT);
+        ret = (-1);
+      }
+    }
+  } else {
+    OVS_ERROR("ovs_db_data_send() failed");
+    ret = (-1);
+  }
+
+yajl_gen_failure:
+  if (new_cb) {
+    /* destroy callback */
+    sem_destroy(&new_cb->result.sync);
+    ovs_db_callback_remove(pdb, new_cb);
+  }
+
+  /* release memory */
+  yajl_gen_clear(jgen);
+  return (yajl_gen_ret != yajl_gen_status_ok) ? (-1) : ret;
+}
+
+int ovs_db_table_cb_register(ovs_db_t *pdb, const char *tb_name,
+                             const char **tb_column,
+                             ovs_db_table_cb_t update_cb,
+                             ovs_db_result_cb_t result_cb, unsigned int flags) {
+  yajl_gen jgen;
+  yajl_gen_status yajl_gen_ret;
+  ovs_callback_t *new_cb = NULL;
+  char uid_str[OVS_UID_STR_SIZE];
+  char *params;
+  size_t params_len;
+  int ovs_db_ret = 0;
+
+  /* sanity check */
+  if (pdb == NULL || tb_name == NULL || update_cb == NULL)
+    return -1;
+
+  /* allocate new update callback */
+  if ((new_cb = calloc(1, sizeof(ovs_callback_t))) == NULL)
+    return -1;
+
+  /* init YAJL generator */
+  if ((jgen = yajl_gen_alloc(NULL)) == NULL) {
+    sfree(new_cb);
+    return -1;
+  }
+
+  /* add new callback to front */
+  new_cb->table.call = update_cb;
+  new_cb->uid = ovs_uid_generate();
+  ovs_db_callback_add(pdb, new_cb);
+
+  /* make update notification request
+   * [<db-name>, <json-value>, <monitor-requests>] */
+  OVS_YAJL_CALL(yajl_gen_array_open, jgen);
+  {
+    OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, OVS_DB_DEFAULT_DB_NAME);
+
+    /* uid string <json-value> */
+    ssnprintf(uid_str, sizeof(uid_str), "%" PRIX64, new_cb->uid);
+    OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, uid_str);
+
+    /* <monitor-requests> */
+    OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+    {
+      OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, tb_name);
+      OVS_YAJL_CALL(yajl_gen_array_open, jgen);
+      {
+        /* <monitor-request> */
+        OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+        {
+          if (tb_column) {
+            /* columns within the table to be monitored */
+            OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "columns");
+            OVS_YAJL_CALL(yajl_gen_array_open, jgen);
+            for (; *tb_column; tb_column++)
+              OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, *tb_column);
+            OVS_YAJL_CALL(yajl_gen_array_close, jgen);
+          }
+          /* specify select option */
+          OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "select");
+          {
+            OVS_YAJL_CALL(yajl_gen_map_open, jgen);
+            {
+              OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "initial");
+              OVS_YAJL_CALL(yajl_gen_bool, jgen,
+                            flags & OVS_DB_TABLE_CB_FLAG_INITIAL);
+              OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "insert");
+              OVS_YAJL_CALL(yajl_gen_bool, jgen,
+                            flags & OVS_DB_TABLE_CB_FLAG_INSERT);
+              OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "delete");
+              OVS_YAJL_CALL(yajl_gen_bool, jgen,
+                            flags & OVS_DB_TABLE_CB_FLAG_DELETE);
+              OVS_YAJL_CALL(ovs_yajl_gen_tstring, jgen, "modify");
+              OVS_YAJL_CALL(yajl_gen_bool, jgen,
+                            flags & OVS_DB_TABLE_CB_FLAG_MODIFY);
+            }
+            OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+          }
+        }
+        OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+      }
+      OVS_YAJL_CALL(yajl_gen_array_close, jgen);
+    }
+    OVS_YAJL_CALL(yajl_gen_map_close, jgen);
+  }
+  OVS_YAJL_CALL(yajl_gen_array_close, jgen);
+
+  /* make a request to subscribe to given table */
+  OVS_YAJL_CALL(yajl_gen_get_buf, jgen, (const unsigned char **)&params,
+                &params_len);
+  if (ovs_db_send_request(pdb, "monitor", params, result_cb) < 0) {
+    OVS_ERROR("Failed to subscribe to \"%s\" table", tb_name);
+    ovs_db_ret = (-1);
+  }
+
+yajl_gen_failure:
+  /* release memory */
+  yajl_gen_clear(jgen);
+  return ovs_db_ret;
+}
+
+int ovs_db_destroy(ovs_db_t *pdb) {
+  int ovs_db_ret = 0;
+  int ret = 0;
+
+  /* sanity check */
+  if (pdb == NULL)
+    return -1;
+
+  /* try to lock the structure before releasing */
+  if ((ret = pthread_mutex_lock(&pdb->mutex))) {
+    OVS_ERROR("pthread_mutex_lock() DB mutex lock failed (%d)", ret);
+    return -1;
+  }
+
+  /* stop poll thread */
+  if (ovs_db_event_thread_destroy(pdb) < 0) {
+    OVS_ERROR("destroy poll thread failed");
+    ovs_db_ret = (-1);
+  }
+
+  /* stop event thread */
+  if (ovs_db_poll_thread_destroy(pdb) < 0) {
+    OVS_ERROR("stop event thread failed");
+    ovs_db_ret = (-1);
+  }
+
+  /* unsubscribe callbacks */
+  ovs_db_callback_remove_all(pdb);
+
+  /* close connection */
+  if (pdb->sock >= 0)
+    close(pdb->sock);
+
+  /* release DB handler */
+  pthread_mutex_unlock(&pdb->mutex);
+  pthread_mutex_destroy(&pdb->mutex);
+  sfree(pdb);
+  return ovs_db_ret;
+}
+
+/*
+ * Public OVS utils API implementation
+ */
+
+/* Get YAJL value by key from YAJL dictionary
+ *
+ * EXAMPLE:
+ *  {
+ *    "key_a" : <YAJL return value>
+ *    "key_b" : <YAJL return value>
+ *  }
+ */
+yajl_val ovs_utils_get_value_by_key(yajl_val jval, const char *key) {
+  const char *obj_key = NULL;
+
+  /* check params */
+  if (!YAJL_IS_OBJECT(jval) || (key == NULL))
+    return NULL;
+
+  /* find a value by key */
+  for (size_t i = 0; i < YAJL_GET_OBJECT(jval)->len; i++) {
+    obj_key = YAJL_GET_OBJECT(jval)->keys[i];
+    if (strcmp(obj_key, key) == 0)
+      return YAJL_GET_OBJECT(jval)->values[i];
+  }
+
+  return NULL;
+}
+
+/* Get OVS DB map value by given map key
+ *
+ * FROM RFC7047:
+ *
+ *   <pair>
+ *     A 2-element JSON array that represents a pair within a database
+ *     map.  The first element is an <atom> that represents the key, and
+ *     the second element is an <atom> that represents the value.
+ *
+ *   <map>
+ *     A 2-element JSON array that represents a database map value.  The
+ *     first element of the array must be the string "map", and the
+ *     second element must be an array of zero or more <pair>s giving the
+ *     values in the map.  All of the <pair>s must have the same key and
+ *     value types.
+ *
+ * EXAMPLE:
+ *  [
+ *    "map", [
+ *             [ "key_a", <YAJL value>], [ "key_b", <YAJL value>], ...
+ *           ]
+ *  ]
+ */
+yajl_val ovs_utils_get_map_value(yajl_val jval, const char *key) {
+  size_t map_len = 0;
+  size_t array_len = 0;
+  yajl_val *map_values = NULL;
+  yajl_val *array_values = NULL;
+  const char *str_val = NULL;
+
+  /* check YAJL array */
+  if (!YAJL_IS_ARRAY(jval) || (key == NULL))
+    return NULL;
+
+  /* check a database map value (2-element, first one should be a string */
+  array_len = YAJL_GET_ARRAY(jval)->len;
+  array_values = YAJL_GET_ARRAY(jval)->values;
+  if ((array_len != 2) || (!YAJL_IS_STRING(array_values[0])) ||
+      (!YAJL_IS_ARRAY(array_values[1])))
+    return NULL;
+
+  /* check first element of the array */
+  str_val = YAJL_GET_STRING(array_values[0]);
+  if (strcmp("map", str_val) != 0)
+    return NULL;
+
+  /* try to find map value by map key */
+  map_len = YAJL_GET_ARRAY(array_values[1])->len;
+  map_values = YAJL_GET_ARRAY(array_values[1])->values;
+  for (size_t i = 0; i < map_len; i++) {
+    /* check YAJL array */
+    if (!YAJL_IS_ARRAY(map_values[i]))
+      break;
+
+    /* check a database pair value (2-element, first one represents a key
+     * and it should be a string in our case */
+    array_len = YAJL_GET_ARRAY(map_values[i])->len;
+    array_values = YAJL_GET_ARRAY(map_values[i])->values;
+    if ((array_len != 2) || (!YAJL_IS_STRING(array_values[0])))
+      break;
+
+    /* return map value if given key equals map key */
+    str_val = YAJL_GET_STRING(array_values[0]);
+    if (strcmp(key, str_val) == 0)
+      return array_values[1];
+  }
+  return NULL;
+}
diff --git a/src/utils_ovs.h b/src/utils_ovs.h
new file mode 100644 (file)
index 0000000..52c2f91
--- /dev/null
@@ -0,0 +1,236 @@
+/**
+ * collectd - src/utils_ovs.h
+ *
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * 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:
+ *   Volodymyr Mytnyk <volodymyrx.mytnyk@intel.com>
+ *
+ * Description:
+ *  The OVS util module provides the following features:
+ *   - Implements the OVS DB communication transport specified
+ *     by RFC7047:
+ *     * Connect/disconnect to OVS DB;
+ *     * Recovery mechanism in case of OVS DB connection lost;
+ *     * Subscription mechanism to OVS DB table update events
+ *       (insert/modify/delete);
+ *     * Send custom JSON request to OVS DB (poll table data, etc.)
+ *     * Handling of echo request from OVS DB server to verify the
+ *       liveness of the connection.
+ *   - Provides YAJL helpers functions.
+ *
+ *  OVS DB API User Guide:
+ *    All OVS DB function/structure names begins from 'ovs_db_*' prefix. To
+ *   start using OVS DB API, client (plugin) should initialize the OVS DB
+ *   object (`ovs_db_t') by calling `ovs_db_init' function. It initializes
+ *   internal data and creates two main workers (threads). The result of the
+ *   function is a pointer to new OVS DB object which can be used by other
+ *   OVS DB API later and must be released by `ovs_db_destroy' function if
+ *   the object isn't needed anymore.
+ *    Once OVS DB API is initialized, the `init_cb' callback is called if
+ *   the connection to OVS DB has been established. This callback is called
+ *   every time the OVS DB is reconnected. So, if the client registers table
+ *   update event callbacks or does any other OVS DB setup that can be lost
+ *   after OVS DB reconnecting, it should be done in `init_cb' callback.
+ *    The `ovs_db_table_cb_register` function is used to register OVS DB
+ *   table update event callback and receive the table update notification
+ *   when requested event occurs (registered callback is called). See
+ *   function API for more info.
+ *    To send custom JSON-RPC request to OVS DB, the `ovs_db_send_request'
+ *   function is used. Please note, that connection to OVS DB should be
+ *   established otherwise the function will return error.
+ *    To verify the liveness of established connection, the OVS DB server
+ *   sends echo request to the client with a given interval. The OVS utils
+ *   takes care about this request and handles it properly.
+ **/
+
+#ifndef UTILS_OVS_H
+#define UTILS_OVS_H
+
+#include <yajl/yajl_gen.h>
+#include <yajl/yajl_tree.h>
+
+/* Forward declaration */
+typedef struct ovs_db_s ovs_db_t;
+
+/* OVS DB callback type declaration */
+typedef void (*ovs_db_table_cb_t)(yajl_val jupdates);
+typedef void (*ovs_db_result_cb_t)(yajl_val jresult, yajl_val jerror);
+
+/* OVS DB structures */
+struct ovs_db_callback_s {
+  /*
+   * This callback is called when OVS DB connection
+   * has been established and ready to use. Client
+   * can use this callback to configure OVS DB, e.g.
+   * to subscribe to table update notification or poll
+   * some OVS DB data. This field can be NULL.
+   */
+  void (*post_conn_init)(ovs_db_t *pdb);
+  /*
+   * This callback is called when OVS DB connection
+   * has been lost. This field can be NULL.
+   */
+  void (*post_conn_terminate)(void);
+};
+typedef struct ovs_db_callback_s ovs_db_callback_t;
+
+/* OVS DB defines */
+#define OVS_DB_ADDR_NODE_SIZE 256
+#define OVS_DB_ADDR_SERVICE_SIZE 128
+#define OVS_DB_ADDR_UNIX_SIZE 108
+
+/* OVS DB prototypes */
+
+/*
+ * NAME
+ *   ovs_db_init
+ *
+ * DESCRIPTION
+ *   Initialize OVS DB internal data. The `ovs_db_destroy' function
+ *   shall destroy the returned object.
+ *
+ * PARAMETERS
+ *   `node'        OVS DB Address.
+ *   `service'     OVS DB service name.
+ *   `unix'        OVS DB unix socket path.
+ *   `cb'          OVS DB callbacks.
+ *
+ * RETURN VALUE
+ *   New ovs_db_t object upon success or NULL if an error occurred.
+ */
+ovs_db_t *ovs_db_init(const char *node, const char *service,
+                      const char *unix_path, ovs_db_callback_t *cb);
+
+/*
+ * NAME
+ *   ovs_db_destroy
+ *
+ * DESCRIPTION
+ *   Destroy OVS DB object referenced by `pdb'.
+ *
+ * PARAMETERS
+ *   `pdb'         Pointer to OVS DB object.
+ *
+ * RETURN VALUE
+ *   Zero upon success or non-zero if an error occurred.
+ */
+int ovs_db_destroy(ovs_db_t *pdb);
+
+/*
+ * NAME
+ *   ovs_db_send_request
+ *
+ * DESCRIPTION
+ *   Send JSON request to OVS DB server.
+ *
+ * PARAMETERS
+ *   `pdb'         Pointer to OVS DB object.
+ *   `method'      Request method name.
+ *   `params'      Method params to be sent (JSON value as a string).
+ *   `cb'          Result callback of the request. If NULL, the request
+ *                 is sent asynchronously.
+ *
+ * RETURN VALUE
+ *   Zero upon success or non-zero if an error occurred.
+ */
+int ovs_db_send_request(ovs_db_t *pdb, const char *method, const char *params,
+                        ovs_db_result_cb_t cb);
+
+/* callback types */
+#define OVS_DB_TABLE_CB_FLAG_INITIAL 0x01U
+#define OVS_DB_TABLE_CB_FLAG_INSERT 0x02U
+#define OVS_DB_TABLE_CB_FLAG_DELETE 0x04U
+#define OVS_DB_TABLE_CB_FLAG_MODIFY 0x08U
+#define OVS_DB_TABLE_CB_FLAG_ALL 0x0FU
+
+/*
+ * NAME
+ *   ovs_db_table_cb_register
+ *
+ * DESCRIPTION
+ *   Subscribe a callback on OVS DB table event. It allows to
+ *   receive notifications (`update_cb' callback is called) of
+ *   changes to requested table.
+ *
+ * PARAMETERS
+ *   `pdb'         Pointer to OVS DB object.
+ *   `tb_name'     OVS DB Table name to be monitored.
+ *   `tb_column'   OVS DB Table columns to be monitored. Last
+ *                 element in the array should be NULL.
+ *   `update_cb'   Callback function that is called when
+ *                 requested table columns are changed.
+ *   `cb'          Result callback of the request. If NULL, the call
+ *                 becomes asynchronous.
+ *                 Useful, if OVS_DB_TABLE_CB_FLAG_INITIAL is set.
+ *   `flags'       Bit mask of:
+ *                   OVS_DB_TABLE_CB_FLAG_INITIAL Receive initial values in
+ *                                               result callback.
+ *                   OVS_DB_TABLE_CB_FLAG_INSERT  Receive table insert events.
+ *                   OVS_DB_TABLE_CB_FLAG_DELETE  Receive table remove events.
+ *                   OVS_DB_TABLE_CB_FLAG_MODIFY  Receive table update events.
+ *                   OVS_DB_TABLE_CB_FLAG_ALL     Receive all events.
+ *
+ * RETURN VALUE
+ *   Zero upon success or non-zero if an error occurred.
+ */
+int ovs_db_table_cb_register(ovs_db_t *pdb, const char *tb_name,
+                             const char **tb_column,
+                             ovs_db_table_cb_t update_cb,
+                             ovs_db_result_cb_t result_cb, unsigned int flags);
+
+/*
+ * OVS utils API
+ */
+
+/*
+ * NAME
+ *   ovs_utils_get_value_by_key
+ *
+ * DESCRIPTION
+ *   Get YAJL value by object name.
+ *
+ * PARAMETERS
+ *   `jval'        YAJL object value.
+ *   `key'         Object key name.
+ *
+ * RETURN VALUE
+ *   YAJL value upon success or NULL if key not found.
+ */
+yajl_val ovs_utils_get_value_by_key(yajl_val jval, const char *key);
+
+/*
+ * NAME
+ *   ovs_utils_get_map_value
+ *
+ * DESCRIPTION
+ *   Get OVS DB map value by given map key (rfc7047, "Notation" section).
+ *
+ * PARAMETERS
+ *   `jval'        A 2-element YAJL array that represents a OVS DB map value.
+ *   `key'         OVS DB map key name.
+ *
+ * RETURN VALUE
+ *   YAJL value upon success or NULL if key not found.
+ */
+yajl_val ovs_utils_get_map_value(yajl_val jval, const char *key);
+
+#endif
index ba37f03..005715c 100644 (file)
@@ -39,7 +39,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
   while (isspace((int)*string))
     string++;
   if (*string == 0)
-    return (1);
+    return 1;
 
   /* A quoted string */
   if (*string == '"') {
@@ -47,7 +47,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
 
     string++;
     if (*string == 0)
-      return (1);
+      return 1;
 
     dst = string;
     buffer = string;
@@ -57,7 +57,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
         buffer++;
         /* Catch a backslash at the end of buffer */
         if (*buffer == 0)
-          return (-1);
+          return -1;
       }
       *dst = *buffer;
       buffer++;
@@ -65,7 +65,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
     }
     /* No quote sign has been found */
     if (*buffer == 0)
-      return (-1);
+      return -1;
 
     *dst = 0;
     dst++;
@@ -74,7 +74,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
 
     /* Check for trailing spaces. */
     if ((*buffer != 0) && !isspace((int)*buffer))
-      return (-1);
+      return -1;
   } else /* an unquoted string */
   {
     buffer = string;
@@ -93,7 +93,7 @@ int parse_string(char **ret_buffer, char **ret_string) {
   *ret_buffer = buffer;
   *ret_string = string;
 
-  return (0);
+  return 0;
 } /* int parse_string */
 
 /*
@@ -120,23 +120,23 @@ int parse_option(char **ret_buffer, char **ret_key, char **ret_value) {
   while (isspace((int)*key))
     key++;
   if (*key == 0)
-    return (1);
+    return 1;
 
   /* Look for the equal sign */
   buffer = key;
   while (isalnum((int)*buffer) || *buffer == '_' || *buffer == ':')
     buffer++;
   if ((*buffer != '=') || (buffer == key))
-    return (1);
+    return 1;
   *buffer = 0;
   buffer++;
   /* Empty values must be written as "" */
   if (isspace((int)*buffer) || (*buffer == 0))
-    return (-1);
+    return -1;
 
   status = parse_string(&buffer, &value);
   if (status != 0)
-    return (-1);
+    return -1;
 
   /* NB: parse_string will have eaten up all trailing spaces. */
 
@@ -144,7 +144,5 @@ int parse_option(char **ret_buffer, char **ret_key, char **ret_value) {
   *ret_key = key;
   *ret_value = value;
 
-  return (0);
+  return 0;
 } /* int parse_option */
-
-/* vim: set sw=2 ts=8 tw=78 et : */
index a638e69..3dd0a79 100644 (file)
@@ -31,5 +31,3 @@ int parse_string(char **ret_buffer, char **ret_string);
 int parse_option(char **ret_buffer, char **ret_key, char **ret_value);
 
 #endif /* UTILS_PARSE_OPTION */
-
-/* vim: set sw=2 ts=8 tw=78 et : */
index 750d265..86f7f3f 100644 (file)
@@ -97,7 +97,7 @@ static srrd_create_args_t *srrd_create_args_create(const char *filename,
   args = calloc(1, sizeof(*args));
   if (args == NULL) {
     ERROR("srrd_create_args_create: calloc failed.");
-    return (NULL);
+    return NULL;
   }
   args->filename = NULL;
   args->pdp_step = pdp_step;
@@ -108,14 +108,14 @@ static srrd_create_args_t *srrd_create_args_create(const char *filename,
   if (args->filename == NULL) {
     ERROR("srrd_create_args_create: strdup failed.");
     srrd_create_args_destroy(args);
-    return (NULL);
+    return NULL;
   }
 
   args->argv = calloc((size_t)(argc + 1), sizeof(*args->argv));
   if (args->argv == NULL) {
     ERROR("srrd_create_args_create: calloc failed.");
     srrd_create_args_destroy(args);
-    return (NULL);
+    return NULL;
   }
 
   for (args->argc = 0; args->argc < argc; args->argc++) {
@@ -123,13 +123,13 @@ static srrd_create_args_t *srrd_create_args_create(const char *filename,
     if (args->argv[args->argc] == NULL) {
       ERROR("srrd_create_args_create: strdup failed.");
       srrd_create_args_destroy(args);
-      return (NULL);
+      return NULL;
     }
   }
   assert(args->argc == argc);
   args->argv[args->argc] = NULL;
 
-  return (args);
+  return args;
 } /* srrd_create_args_t *srrd_create_args_create */
 
 /* * * * * * * * * *
@@ -154,12 +154,12 @@ static int rra_get(char ***ret, const value_list_t *vl, /* {{{ */
 
   if (cfg->rrarows <= 0) {
     *ret = NULL;
-    return (-1);
+    return -1;
   }
 
   if ((cfg->xff < 0) || (cfg->xff >= 1.0)) {
     *ret = NULL;
-    return (-1);
+    return -1;
   }
 
   if (cfg->stepsize > 0)
@@ -168,7 +168,7 @@ static int rra_get(char ***ret, const value_list_t *vl, /* {{{ */
     ss = (int)CDTIME_T_TO_TIME_T(vl->interval);
   if (ss <= 0) {
     *ret = NULL;
-    return (-1);
+    return -1;
   }
 
   /* Use the configured timespans or fall back to the built-in defaults */
@@ -184,7 +184,7 @@ static int rra_get(char ***ret, const value_list_t *vl, /* {{{ */
   assert(rra_max > 0);
 
   if ((rra_def = calloc(rra_max + 1, sizeof(*rra_def))) == NULL)
-    return (-1);
+    return -1;
   rra_num = 0;
 
   cdp_len = 0;
@@ -222,11 +222,11 @@ static int rra_get(char ***ret, const value_list_t *vl, /* {{{ */
 
   if (rra_num <= 0) {
     sfree(rra_def);
-    return (0);
+    return 0;
   }
 
   *ret = rra_def;
-  return (rra_num);
+  return rra_num;
 } /* }}} int rra_get */
 
 static void ds_free(int ds_num, char **ds_def) /* {{{ */
@@ -254,7 +254,7 @@ static int ds_get(char ***ret, /* {{{ */
     char errbuf[1024];
     ERROR("rrdtool plugin: calloc failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   for (ds_num = 0; ds_num < ds->ds_num; ds_num++) {
@@ -300,16 +300,16 @@ static int ds_get(char ***ret, /* {{{ */
 
   if (ds_num != ds->ds_num) {
     ds_free(ds_num, ds_def);
-    return (-1);
+    return -1;
   }
 
   if (ds_num == 0) {
     sfree(ds_def);
-    return (0);
+    return 0;
   }
 
   *ret = ds_def;
-  return (ds_num);
+  return ds_num;
 } /* }}} int ds_get */
 
 #if HAVE_THREADSAFE_LIBRRD
@@ -320,7 +320,7 @@ static int srrd_create(const char *filename, /* {{{ */
   char *filename_copy;
 
   if ((filename == NULL) || (argv == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   /* Some versions of librrd don't have the `const' qualifier for the first
    * argument, so we have to copy the pointer here to avoid warnings. It sucks,
@@ -328,7 +328,7 @@ static int srrd_create(const char *filename, /* {{{ */
   filename_copy = strdup(filename);
   if (filename_copy == NULL) {
     ERROR("srrd_create: strdup failed.");
-    return (-ENOMEM);
+    return -ENOMEM;
   }
 
   optind = 0; /* bug in librrd? */
@@ -343,7 +343,7 @@ static int srrd_create(const char *filename, /* {{{ */
 
   sfree(filename_copy);
 
-  return (status);
+  return status;
 } /* }}} int srrd_create */
 /* #endif HAVE_THREADSAFE_LIBRRD */
 
@@ -363,7 +363,7 @@ static int srrd_create(const char *filename, /* {{{ */
   new_argv = malloc((new_argc + 1) * sizeof(*new_argv));
   if (new_argv == NULL) {
     ERROR("rrdtool plugin: malloc failed.");
-    return (-1);
+    return -1;
   }
 
   if (last_up == 0)
@@ -396,7 +396,7 @@ static int srrd_create(const char *filename, /* {{{ */
 
   sfree(new_argv);
 
-  return (status);
+  return status;
 } /* }}} int srrd_create */
 #endif /* !HAVE_THREADSAFE_LIBRRD */
 
@@ -414,26 +414,26 @@ static int lock_file(char const *filename) /* {{{ */
 
   if (ptr != NULL) {
     pthread_mutex_unlock(&async_creation_lock);
-    return (EEXIST);
+    return EEXIST;
   }
 
   status = stat(filename, &sb);
   if ((status == 0) || (errno != ENOENT)) {
     pthread_mutex_unlock(&async_creation_lock);
-    return (EEXIST);
+    return EEXIST;
   }
 
   ptr = malloc(sizeof(*ptr));
   if (ptr == NULL) {
     pthread_mutex_unlock(&async_creation_lock);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   ptr->filename = strdup(filename);
   if (ptr->filename == NULL) {
     pthread_mutex_unlock(&async_creation_lock);
     sfree(ptr);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   ptr->next = async_creation_list;
@@ -441,7 +441,7 @@ static int lock_file(char const *filename) /* {{{ */
 
   pthread_mutex_unlock(&async_creation_lock);
 
-  return (0);
+  return 0;
 } /* }}} int lock_file */
 
 static int unlock_file(char const *filename) /* {{{ */
@@ -460,7 +460,7 @@ static int unlock_file(char const *filename) /* {{{ */
 
   if (this == NULL) {
     pthread_mutex_unlock(&async_creation_lock);
-    return (ENOENT);
+    return ENOENT;
   }
 
   if (prev == NULL) {
@@ -477,7 +477,7 @@ static int unlock_file(char const *filename) /* {{{ */
   sfree(this->filename);
   sfree(this);
 
-  return (0);
+  return 0;
 } /* }}} int unlock_file */
 
 static void *srrd_create_thread(void *targs) /* {{{ */
@@ -494,7 +494,7 @@ static void *srrd_create_thread(void *targs) /* {{{ */
     else
       ERROR("srrd_create_thread: Unable to lock file \"%s\".", args->filename);
     srrd_create_args_destroy(args);
-    return (0);
+    return 0;
   }
 
   ssnprintf(tmpfile, sizeof(tmpfile), "%s.async", args->filename);
@@ -507,7 +507,7 @@ static void *srrd_create_thread(void *targs) /* {{{ */
     unlink(tmpfile);
     unlock_file(args->filename);
     srrd_create_args_destroy(args);
-    return (0);
+    return 0;
   }
 
   status = rename(tmpfile, args->filename);
@@ -518,7 +518,7 @@ static void *srrd_create_thread(void *targs) /* {{{ */
     unlink(tmpfile);
     unlock_file(args->filename);
     srrd_create_args_destroy(args);
-    return (0);
+    return 0;
   }
 
   DEBUG("srrd_create_thread: Successfully created RRD file \"%s\".",
@@ -527,7 +527,7 @@ static void *srrd_create_thread(void *targs) /* {{{ */
   unlock_file(args->filename);
   srrd_create_args_destroy(args);
 
-  return (0);
+  return 0;
 } /* }}} void *srrd_create_thread */
 
 static int srrd_create_async(const char *filename, /* {{{ */
@@ -542,19 +542,19 @@ static int srrd_create_async(const char *filename, /* {{{ */
 
   args = srrd_create_args_create(filename, pdp_step, last_up, argc, argv);
   if (args == NULL)
-    return (-1);
+    return -1;
 
   status = pthread_attr_init(&attr);
   if (status != 0) {
     srrd_create_args_destroy(args);
-    return (-1);
+    return -1;
   }
 
   status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   if (status != 0) {
     pthread_attr_destroy(&attr);
     srrd_create_args_destroy(args);
-    return (-1);
+    return -1;
   }
 
   status = pthread_create(&thread, &attr, srrd_create_thread, args);
@@ -564,12 +564,12 @@ static int srrd_create_async(const char *filename, /* {{{ */
           sstrerror(status, errbuf, sizeof(errbuf)));
     pthread_attr_destroy(&attr);
     srrd_create_args_destroy(args);
-    return (status);
+    return status;
   }
 
   pthread_attr_destroy(&attr);
   /* args is freed in srrd_create_thread(). */
-  return (0);
+  return 0;
 } /* }}} int srrd_create_async */
 
 /*
@@ -589,17 +589,17 @@ int cu_rrd_create_file(const char *filename, /* {{{ */
   unsigned long stepsize;
 
   if (check_create_dir(filename))
-    return (-1);
+    return -1;
 
   if ((rra_num = rra_get(&rra_def, vl, cfg)) < 1) {
     ERROR("cu_rrd_create_file failed: Could not calculate RRAs");
-    return (-1);
+    return -1;
   }
 
   if ((ds_num = ds_get(&ds_def, ds, vl, cfg)) < 1) {
     ERROR("cu_rrd_create_file failed: Could not calculate DSes");
     rra_free(rra_num, rra_def);
-    return (-1);
+    return -1;
   }
 
   argc = ds_num + rra_num;
@@ -610,7 +610,7 @@ int cu_rrd_create_file(const char *filename, /* {{{ */
           sstrerror(errno, errbuf, sizeof(errbuf)));
     rra_free(rra_num, rra_def);
     ds_free(ds_num, ds_def);
-    return (-1);
+    return -1;
   }
 
   memcpy(argv, ds_def, ds_num * sizeof(char *));
@@ -662,7 +662,5 @@ int cu_rrd_create_file(const char *filename, /* {{{ */
   ds_free(ds_num, ds_def);
   rra_free(rra_num, rra_def);
 
-  return (status);
+  return status;
 } /* }}} int cu_rrd_create_file */
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 9bc67ae..d5f9a12 100644 (file)
@@ -51,5 +51,3 @@ int cu_rrd_create_file(const char *filename, const data_set_t *ds,
                        const value_list_t *vl, const rrdcreate_config_t *cfg);
 
 #endif /* UTILS_RRDCREATE_H */
-
-/* vim: set sw=2 sts=2 et : */
index 565a224..cdab6a7 100644 (file)
@@ -52,7 +52,7 @@ static int cu_tail_reopen(cu_tail_t *obj) {
     char errbuf[1024];
     ERROR("utils_tail: stat (%s) failed: %s", obj->file,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   /* The file is already open.. */
@@ -67,11 +67,11 @@ static int cu_tail_reopen(cu_tail_t *obj) {
               sstrerror(errno, errbuf, sizeof(errbuf)));
         fclose(obj->fh);
         obj->fh = NULL;
-        return (-1);
+        return -1;
       }
     }
     memcpy(&obj->stat, &stat_buf, sizeof(struct stat));
-    return (1);
+    return 1;
   }
 
   /* Seek to the end if we re-open the same file again or the file opened
@@ -84,7 +84,7 @@ static int cu_tail_reopen(cu_tail_t *obj) {
     char errbuf[1024];
     ERROR("utils_tail: fopen (%s) failed: %s", obj->file,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   if (seek_end != 0) {
@@ -94,7 +94,7 @@ static int cu_tail_reopen(cu_tail_t *obj) {
       ERROR("utils_tail: fseek (%s) failed: %s", obj->file,
             sstrerror(errno, errbuf, sizeof(errbuf)));
       fclose(fh);
-      return (-1);
+      return -1;
     }
   }
 
@@ -103,7 +103,7 @@ static int cu_tail_reopen(cu_tail_t *obj) {
   obj->fh = fh;
   memcpy(&obj->stat, &stat_buf, sizeof(struct stat));
 
-  return (0);
+  return 0;
 } /* int cu_tail_reopen */
 
 cu_tail_t *cu_tail_create(const char *file) {
@@ -111,17 +111,17 @@ cu_tail_t *cu_tail_create(const char *file) {
 
   obj = calloc(1, sizeof(*obj));
   if (obj == NULL)
-    return (NULL);
+    return NULL;
 
   obj->file = strdup(file);
   if (obj->file == NULL) {
     free(obj);
-    return (NULL);
+    return NULL;
   }
 
   obj->fh = NULL;
 
-  return (obj);
+  return obj;
 } /* cu_tail_t *cu_tail_create */
 
 int cu_tail_destroy(cu_tail_t *obj) {
@@ -130,7 +130,7 @@ int cu_tail_destroy(cu_tail_t *obj) {
   free(obj->file);
   free(obj);
 
-  return (0);
+  return 0;
 } /* int cu_tail_destroy */
 
 int cu_tail_readline(cu_tail_t *obj, char *buf, int buflen) {
@@ -138,13 +138,13 @@ int cu_tail_readline(cu_tail_t *obj, char *buf, int buflen) {
 
   if (buflen < 1) {
     ERROR("utils_tail: cu_tail_readline: buflen too small: %i bytes.", buflen);
-    return (-1);
+    return -1;
   }
 
   if (obj->fh == NULL) {
     status = cu_tail_reopen(obj);
     if (status < 0)
-      return (status);
+      return status;
   }
   assert(obj->fh != NULL);
 
@@ -153,7 +153,7 @@ int cu_tail_readline(cu_tail_t *obj, char *buf, int buflen) {
   clearerr(obj->fh);
   if (fgets(buf, buflen, obj->fh) != NULL) {
     buf[buflen - 1] = 0;
-    return (0);
+    return 0;
   }
 
   /* Check if we encountered an error */
@@ -168,18 +168,18 @@ int cu_tail_readline(cu_tail_t *obj, char *buf, int buflen) {
   status = cu_tail_reopen(obj);
   /* error -> return with error */
   if (status < 0)
-    return (status);
+    return status;
   /* file end reached and file not reopened -> nothing more to read */
   else if (status > 0) {
     buf[0] = 0;
-    return (0);
+    return 0;
   }
 
   /* If we get here: file was re-opened and there may be more to read.. Let's
    * try again. */
   if (fgets(buf, buflen, obj->fh) != NULL) {
     buf[buflen - 1] = 0;
-    return (0);
+    return 0;
   }
 
   if (ferror(obj->fh) != 0) {
@@ -188,12 +188,12 @@ int cu_tail_readline(cu_tail_t *obj, char *buf, int buflen) {
             sstrerror(errno, errbuf, sizeof(errbuf)));
     fclose(obj->fh);
     obj->fh = NULL;
-    return (-1);
+    return -1;
   }
 
   /* EOf, well, apparently the new file is empty.. */
   buf[0] = 0;
-  return (0);
+  return 0;
 } /* int cu_tail_readline */
 
 int cu_tail_read(cu_tail_t *obj, char *buf, int buflen, tailfunc_t *callback,
index 505c693..f046f6b 100644 (file)
@@ -76,7 +76,7 @@ static int simple_submit_match(cu_match_t *match, void *user_data) {
 
   match_value = (cu_match_value_t *)match_get_user_data(match);
   if (match_value == NULL)
-    return (-1);
+    return -1;
 
   if ((match_value->ds_type & UTILS_MATCH_DS_TYPE_GAUGE) &&
       (match_value->values_num == 0))
@@ -96,7 +96,7 @@ static int simple_submit_match(cu_match_t *match, void *user_data) {
   plugin_dispatch_values(&vl);
 
   match_value_reset(match_value);
-  return (0);
+  return 0;
 } /* int simple_submit_match */
 
 static int latency_submit_match(cu_match_t *match, void *user_data) {
@@ -106,7 +106,7 @@ static int latency_submit_match(cu_match_t *match, void *user_data) {
 
   match_value = (cu_match_value_t *)match_get_user_data(match);
   if (match_value == NULL)
-    return (-1);
+    return -1;
 
   sstrncpy(vl.host, hostname_g, sizeof(vl.host));
   sstrncpy(vl.plugin, data->plugin, sizeof(vl.plugin));
@@ -167,7 +167,7 @@ static int latency_submit_match(cu_match_t *match, void *user_data) {
   match_value->values_num = 0;
   latency_counter_reset(match_value->latency);
 
-  return (0);
+  return 0;
 } /* int latency_submit_match */
 
 static int tail_callback(void *data, char *buf,
@@ -177,7 +177,7 @@ static int tail_callback(void *data, char *buf,
   for (size_t i = 0; i < obj->matches_num; i++)
     match_apply(obj->matches[i].match, buf);
 
-  return (0);
+  return 0;
 } /* int tail_callback */
 
 static void tail_match_simple_free(void *data) {
@@ -194,15 +194,15 @@ cu_tail_match_t *tail_match_create(const char *filename) {
 
   obj = calloc(1, sizeof(*obj));
   if (obj == NULL)
-    return (NULL);
+    return NULL;
 
   obj->tail = cu_tail_create(filename);
   if (obj->tail == NULL) {
     sfree(obj);
-    return (NULL);
+    return NULL;
   }
 
-  return (obj);
+  return obj;
 } /* cu_tail_match_t *tail_match_create */
 
 void tail_match_destroy(cu_tail_match_t *obj) {
@@ -240,7 +240,7 @@ int tail_match_add_match(cu_tail_match_t *obj, cu_match_t *match,
   temp = realloc(obj->matches,
                  sizeof(cu_tail_match_match_t) * (obj->matches_num + 1));
   if (temp == NULL)
-    return (-1);
+    return -1;
 
   obj->matches = temp;
   obj->matches_num++;
@@ -254,7 +254,7 @@ int tail_match_add_match(cu_tail_match_t *obj, cu_match_t *match,
   temp->submit = submit_match;
   temp->free = free_user_data;
 
-  return (0);
+  return 0;
 } /* int tail_match_add_match */
 
 int tail_match_add_match_simple(cu_tail_match_t *obj, const char *regex,
@@ -269,12 +269,12 @@ int tail_match_add_match_simple(cu_tail_match_t *obj, const char *regex,
 
   match = match_create_simple(regex, excluderegex, ds_type);
   if (match == NULL)
-    return (-1);
+    return -1;
 
   user_data = calloc(1, sizeof(*user_data));
   if (user_data == NULL) {
     match_destroy(match);
-    return (-1);
+    return -1;
   }
 
   sstrncpy(user_data->plugin, plugin, sizeof(user_data->plugin));
@@ -311,7 +311,7 @@ out:
     match_destroy(match);
   }
 
-  return (status);
+  return status;
 } /* int tail_match_add_match_simple */
 
 int tail_match_read(cu_tail_match_t *obj) {
@@ -322,7 +322,7 @@ int tail_match_read(cu_tail_match_t *obj) {
                         (void *)obj);
   if (status != 0) {
     ERROR("tail_match: cu_tail_read failed.");
-    return (status);
+    return status;
   }
 
   for (size_t i = 0; i < obj->matches_num; i++) {
@@ -334,7 +334,5 @@ int tail_match_read(cu_tail_match_t *obj) {
     (*lt_match->submit)(lt_match->match, lt_match->user_data);
   }
 
-  return (0);
+  return 0;
 } /* int tail_match_read */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 09e3d40..03b70e9 100644 (file)
@@ -137,5 +137,3 @@ int tail_match_add_match_simple(cu_tail_match_t *obj, const char *regex,
  *   Zero on success, nonzero on failure.
 */
 int tail_match_read(cu_tail_match_t *obj);
-
-/* vim: set sw=2 sts=2 ts=8 : */
index 8bcaf40..76c0674 100644 (file)
@@ -115,19 +115,19 @@ static _Bool lu_part_matches(part_match_t const *match, /* {{{ */
   if (match->is_regex) {
     /* Short cut popular catch-all regex. */
     if (strcmp(".*", match->str) == 0)
-      return (1);
+      return 1;
 
     int status = regexec(&match->regex, str,
                          /* nmatch = */ 0, /* pmatch = */ NULL,
                          /* flags = */ 0);
     if (status == 0)
-      return (1);
+      return 1;
     else
-      return (0);
+      return 0;
   } else if (strcmp(match->str, str) == 0)
-    return (1);
+    return 1;
   else
-    return (0);
+    return 0;
 } /* }}} _Bool lu_part_matches */
 
 static int lu_copy_ident_to_match_part(part_match_t *match_part, /* {{{ */
@@ -138,7 +138,7 @@ static int lu_copy_ident_to_match_part(part_match_t *match_part, /* {{{ */
   if ((len < 3) || (ident_part[0] != '/') || (ident_part[len - 1] != '/')) {
     sstrncpy(match_part->str, ident_part, sizeof(match_part->str));
     match_part->is_regex = 0;
-    return (0);
+    return 0;
   }
 
   /* Copy string without the leading slash. */
@@ -154,11 +154,11 @@ static int lu_copy_ident_to_match_part(part_match_t *match_part, /* {{{ */
     regerror(status, &match_part->regex, errbuf, sizeof(errbuf));
     ERROR("utils_vl_lookup: Compiling regular expression \"%s\" failed: %s",
           match_part->str, errbuf);
-    return (EINVAL);
+    return EINVAL;
   }
   match_part->is_regex = 1;
 
-  return (0);
+  return 0;
 } /* }}} int lu_copy_ident_to_match_part */
 
 static int lu_copy_ident_to_match(identifier_match_t *match, /* {{{ */
@@ -172,7 +172,7 @@ static int lu_copy_ident_to_match(identifier_match_t *match, /* {{{ */
   do {                                                                         \
     int status = lu_copy_ident_to_match_part(&match->field, ident->field);     \
     if (status != 0)                                                           \
-      return (status);                                                         \
+      return status;                                                           \
   } while (0)
 
   COPY_FIELD(host);
@@ -183,7 +183,7 @@ static int lu_copy_ident_to_match(identifier_match_t *match, /* {{{ */
 
 #undef COPY_FIELD
 
-  return (0);
+  return 0;
 } /* }}} int lu_copy_ident_to_match */
 
 /* user_class->lock must be held when calling this function */
@@ -195,7 +195,7 @@ static void *lu_create_user_obj(lookup_t *obj, /* {{{ */
   user_obj = calloc(1, sizeof(*user_obj));
   if (user_obj == NULL) {
     ERROR("utils_vl_lookup: calloc failed.");
-    return (NULL);
+    return NULL;
   }
   user_obj->next = NULL;
 
@@ -203,7 +203,7 @@ static void *lu_create_user_obj(lookup_t *obj, /* {{{ */
   if (user_obj->user_obj == NULL) {
     sfree(user_obj);
     WARNING("utils_vl_lookup: User-provided constructor failed.");
-    return (NULL);
+    return NULL;
   }
 
 #define COPY_FIELD(field, group_mask)                                          \
@@ -233,7 +233,7 @@ static void *lu_create_user_obj(lookup_t *obj, /* {{{ */
     last->next = user_obj;
   }
 
-  return (user_obj);
+  return user_obj;
 } /* }}} void *lu_create_user_obj */
 
 /* user_class->lock must be held when calling this function */
@@ -259,10 +259,10 @@ static user_obj_t *lu_find_user_obj(user_class_t *user_class, /* {{{ */
         (strcmp(vl->type_instance, ptr->ident.type_instance) != 0))
       continue;
 
-    return (ptr);
+    return ptr;
   }
 
-  return (NULL);
+  return NULL;
 } /* }}} user_obj_t *lu_find_user_obj */
 
 static int lu_handle_user_class(lookup_t *obj, /* {{{ */
@@ -280,7 +280,7 @@ static int lu_handle_user_class(lookup_t *obj, /* {{{ */
                        vl->plugin_instance) ||
       !lu_part_matches(&user_class->match.plugin, vl->plugin) ||
       !lu_part_matches(&user_class->match.host, vl->host))
-    return (1);
+    return 1;
 
   pthread_mutex_lock(&user_class->lock);
   user_obj = lu_find_user_obj(user_class, vl);
@@ -290,7 +290,7 @@ static int lu_handle_user_class(lookup_t *obj, /* {{{ */
     user_obj = lu_create_user_obj(obj, ds, vl, user_class);
     if (user_obj == NULL) {
       pthread_mutex_unlock(&user_class->lock);
-      return (-1);
+      return -1;
     }
   }
   pthread_mutex_unlock(&user_class->lock);
@@ -301,12 +301,12 @@ static int lu_handle_user_class(lookup_t *obj, /* {{{ */
           status);
     /* Returning a negative value means: abort! */
     if (status < 0)
-      return (status);
+      return status;
     else
-      return (1);
+      return 1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int lu_handle_user_class */
 
 static int lu_handle_user_class_list(lookup_t *obj, /* {{{ */
@@ -321,12 +321,12 @@ static int lu_handle_user_class_list(lookup_t *obj, /* {{{ */
 
     status = lu_handle_user_class(obj, ds, vl, &ptr->entry);
     if (status < 0)
-      return (status);
+      return status;
     else if (status == 0)
       retval++;
   }
 
-  return (retval);
+  return retval;
 } /* }}} int lu_handle_user_class_list */
 
 static by_type_entry_t *lu_search_by_type(lookup_t *obj, /* {{{ */
@@ -338,22 +338,22 @@ static by_type_entry_t *lu_search_by_type(lookup_t *obj, /* {{{ */
 
   status = c_avl_get(obj->by_type_tree, type, (void *)&by_type);
   if (status == 0)
-    return (by_type);
+    return by_type;
 
   if (!allocate_if_missing)
-    return (NULL);
+    return NULL;
 
   type_copy = strdup(type);
   if (type_copy == NULL) {
     ERROR("utils_vl_lookup: strdup failed.");
-    return (NULL);
+    return NULL;
   }
 
   by_type = calloc(1, sizeof(*by_type));
   if (by_type == NULL) {
     ERROR("utils_vl_lookup: calloc failed.");
     sfree(type_copy);
-    return (NULL);
+    return NULL;
   }
   by_type->wildcard_plugin_list = NULL;
 
@@ -363,7 +363,7 @@ static by_type_entry_t *lu_search_by_type(lookup_t *obj, /* {{{ */
     ERROR("utils_vl_lookup: c_avl_create failed.");
     sfree(by_type);
     sfree(type_copy);
-    return (NULL);
+    return NULL;
   }
 
   status = c_avl_insert(obj->by_type_tree,
@@ -374,10 +374,10 @@ static by_type_entry_t *lu_search_by_type(lookup_t *obj, /* {{{ */
     c_avl_destroy(by_type->by_plugin_tree);
     sfree(by_type);
     sfree(type_copy);
-    return (NULL);
+    return NULL;
   }
 
-  return (by_type);
+  return by_type;
 } /* }}} by_type_entry_t *lu_search_by_type */
 
 static int lu_add_by_plugin(by_type_entry_t *by_type, /* {{{ */
@@ -391,7 +391,7 @@ static int lu_add_by_plugin(by_type_entry_t *by_type, /* {{{ */
   if (match->plugin.is_regex) {
     if (by_type->wildcard_plugin_list == NULL) {
       by_type->wildcard_plugin_list = user_class_list;
-      return (0);
+      return 0;
     }
 
     ptr = by_type->wildcard_plugin_list;
@@ -410,7 +410,7 @@ static int lu_add_by_plugin(by_type_entry_t *by_type, /* {{{ */
       if (plugin_copy == NULL) {
         ERROR("utils_vl_lookup: strdup failed.");
         sfree(user_class_list);
-        return (ENOMEM);
+        return ENOMEM;
       }
 
       status =
@@ -420,9 +420,9 @@ static int lu_add_by_plugin(by_type_entry_t *by_type, /* {{{ */
               plugin_copy, status);
         sfree(plugin_copy);
         sfree(user_class_list);
-        return (status);
+        return status;
       } else {
-        return (0);
+        return 0;
       }
     } /* if (plugin not yet in tree) */
   }   /* if (plugin is not wildcard) */
@@ -433,7 +433,7 @@ static int lu_add_by_plugin(by_type_entry_t *by_type, /* {{{ */
     ptr = ptr->next;
   ptr->next = user_class_list;
 
-  return (0);
+  return 0;
 } /* }}} int lu_add_by_plugin */
 
 static void lu_destroy_user_obj(lookup_t *obj, /* {{{ */
@@ -522,14 +522,14 @@ lookup_t *lookup_create(lookup_class_callback_t cb_user_class, /* {{{ */
   lookup_t *obj = calloc(1, sizeof(*obj));
   if (obj == NULL) {
     ERROR("utils_vl_lookup: calloc failed.");
-    return (NULL);
+    return NULL;
   }
 
   obj->by_type_tree = c_avl_create((int (*)(const void *, const void *))strcmp);
   if (obj->by_type_tree == NULL) {
     ERROR("utils_vl_lookup: c_avl_create failed.");
     sfree(obj);
-    return (NULL);
+    return NULL;
   }
 
   obj->cb_user_class = cb_user_class;
@@ -537,7 +537,7 @@ lookup_t *lookup_create(lookup_class_callback_t cb_user_class, /* {{{ */
   obj->cb_free_class = cb_free_class;
   obj->cb_free_obj = cb_free_obj;
 
-  return (obj);
+  return obj;
 } /* }}} lookup_t *lookup_create */
 
 void lookup_destroy(lookup_t *obj) /* {{{ */
@@ -574,12 +574,12 @@ int lookup_add(lookup_t *obj, /* {{{ */
 
   by_type = lu_search_by_type(obj, ident->type, /* allocate = */ 1);
   if (by_type == NULL)
-    return (-1);
+    return -1;
 
   user_class_obj = calloc(1, sizeof(*user_class_obj));
   if (user_class_obj == NULL) {
     ERROR("utils_vl_lookup: calloc failed.");
-    return (ENOMEM);
+    return ENOMEM;
   }
   pthread_mutex_init(&user_class_obj->entry.lock, /* attr = */ NULL);
   user_class_obj->entry.user_class = user_class;
@@ -587,7 +587,7 @@ int lookup_add(lookup_t *obj, /* {{{ */
   user_class_obj->entry.user_obj_list = NULL;
   user_class_obj->next = NULL;
 
-  return (lu_add_by_plugin(by_type, user_class_obj));
+  return lu_add_by_plugin(by_type, user_class_obj);
 } /* }}} int lookup_add */
 
 /* returns the number of successful calls to the callback function */
@@ -599,18 +599,18 @@ int lookup_search(lookup_t *obj, /* {{{ */
   int status;
 
   if ((obj == NULL) || (ds == NULL) || (vl == NULL))
-    return (-EINVAL);
+    return -EINVAL;
 
   by_type = lu_search_by_type(obj, vl->type, /* allocate = */ 0);
   if (by_type == NULL)
-    return (0);
+    return 0;
 
   status =
       c_avl_get(by_type->by_plugin_tree, vl->plugin, (void *)&user_class_list);
   if (status == 0) {
     status = lu_handle_user_class_list(obj, ds, vl, user_class_list);
     if (status < 0)
-      return (status);
+      return status;
     retval += status;
   }
 
@@ -618,9 +618,9 @@ int lookup_search(lookup_t *obj, /* {{{ */
     status =
         lu_handle_user_class_list(obj, ds, vl, by_type->wildcard_plugin_list);
     if (status < 0)
-      return (status);
+      return status;
     retval += status;
   }
 
-  return (retval);
+  return retval;
 } /* }}} lookup_search */
index 776a520..058015e 100644 (file)
@@ -53,9 +53,9 @@ static int lookup_obj_callback(data_set_t const *ds, value_list_t const *vl,
   memcpy(&last_obj_ident, obj, sizeof(last_obj_ident));
 
   if (strcmp(obj->plugin_instance, "failure") == 0)
-    return (-1);
+    return -1;
 
-  return (0);
+  return 0;
 }
 
 static void *lookup_class_callback(data_set_t const *ds, value_list_t const *vl,
@@ -77,7 +77,7 @@ static void *lookup_class_callback(data_set_t const *ds, value_list_t const *vl,
 
   have_new_obj = 1;
 
-  return ((void *)obj);
+  return (void *)obj;
 }
 
 static int checked_lookup_add(lookup_t *obj, /* {{{ */
@@ -123,7 +123,7 @@ static int checked_lookup_search(lookup_t *obj, char const *host,
   have_new_obj = 0;
 
   status = lookup_search(obj, ds, &vl);
-  return (status);
+  return status;
 }
 
 DEF_TEST(group_by_specific_host) {
@@ -142,7 +142,7 @@ DEF_TEST(group_by_specific_host) {
                         /* expect new = */ 0);
 
   lookup_destroy(obj);
-  return (0);
+  return 0;
 }
 
 DEF_TEST(group_by_any_host) {
@@ -170,7 +170,7 @@ DEF_TEST(group_by_any_host) {
                         /* expect new = */ 0);
 
   lookup_destroy(obj);
-  return (0);
+  return 0;
 }
 
 DEF_TEST(multiple_lookups) {
@@ -198,7 +198,7 @@ DEF_TEST(multiple_lookups) {
   assert(status == 2);
 
   lookup_destroy(obj);
-  return (0);
+  return 0;
 }
 
 DEF_TEST(regex) {
@@ -228,7 +228,7 @@ DEF_TEST(regex) {
                         /* expect new = */ 1);
 
   lookup_destroy(obj);
-  return (0);
+  return 0;
 }
 
 int main(int argc, char **argv) /* {{{ */
index 89c9e7d..4846841 100644 (file)
 #include <sys/sysctl.h>
 #endif
 
-#if HAVE_LIBHAL_H
-#include <libhal.h>
-#endif
-
 #define UUID_RAW_LENGTH 16
 #define UUID_PRINTABLE_COMPACT_LENGTH (UUID_RAW_LENGTH * 2)
 #define UUID_PRINTABLE_NORMAL_LENGTH (UUID_PRINTABLE_COMPACT_LENGTH + 4)
@@ -49,19 +45,19 @@ static int looks_like_a_uuid(const char *uuid) {
   int len;
 
   if (!uuid)
-    return (0);
+    return 0;
 
   len = strlen(uuid);
 
   if (len < UUID_PRINTABLE_COMPACT_LENGTH)
-    return (0);
+    return 0;
 
   while (*uuid) {
     if (!isxdigit((int)*uuid) && *uuid != '-')
-      return (0);
+      return 0;
     uuid++;
   }
-  return (1);
+  return 1;
 }
 
 static char *uuid_parse_dmidecode(FILE *file) {
@@ -86,9 +82,9 @@ static char *uuid_parse_dmidecode(FILE *file) {
     if (!looks_like_a_uuid(fields[1]))
       continue;
 
-    return (strdup(fields[1]));
+    return strdup(fields[1]);
   }
-  return (NULL);
+  return NULL;
 }
 
 static char *uuid_get_from_dmidecode(void) {
@@ -96,12 +92,12 @@ static char *uuid_get_from_dmidecode(void) {
   char *uuid;
 
   if (!dmidecode)
-    return (NULL);
+    return NULL;
 
   uuid = uuid_parse_dmidecode(dmidecode);
 
   pclose(dmidecode);
-  return (uuid);
+  return uuid;
 }
 
 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
@@ -110,7 +106,7 @@ static char *uuid_get_from_sysctlbyname(const char *name) {
   size_t len = sizeof(uuid);
   if (sysctlbyname(name, &uuid, &len, NULL, 0) == -1)
     return NULL;
-  return (strdup(uuid));
+  return strdup(uuid);
 }
 #elif defined(__OpenBSD__)
 static char *uuid_get_from_sysctl(void) {
@@ -123,53 +119,7 @@ static char *uuid_get_from_sysctl(void) {
 
   if (sysctl(mib, 2, uuid, &len, NULL, 0) == -1)
     return NULL;
-  return (strdup(uuid));
-}
-#endif
-
-#if HAVE_LIBHAL_H
-
-#define UUID_PATH "/org/freedesktop/Hal/devices/computer"
-#define UUID_PROPERTY "smbios.system.uuid"
-
-static char *uuid_get_from_hal(void) {
-  LibHalContext *ctx;
-
-  DBusError error;
-  DBusConnection *con;
-
-  dbus_error_init(&error);
-
-  if (!(con = dbus_bus_get(DBUS_BUS_SYSTEM, &error)))
-    goto bailout_nobus;
-
-  ctx = libhal_ctx_new();
-  libhal_ctx_set_dbus_connection(ctx, con);
-
-  if (!libhal_ctx_init(ctx, &error))
-    goto bailout;
-
-  if (!libhal_device_property_exists(ctx, UUID_PATH, UUID_PROPERTY, &error))
-    goto bailout;
-
-  char *uuid =
-      libhal_device_get_property_string(ctx, UUID_PATH, UUID_PROPERTY, &error);
-  if (looks_like_a_uuid(uuid))
-    return (uuid);
-
-bailout : {
-  DBusError ctxerror;
-  dbus_error_init(&ctxerror);
-  if (!(libhal_ctx_shutdown(ctx, &ctxerror)))
-    dbus_error_free(&ctxerror);
-}
-
-  libhal_ctx_free(ctx);
-
-bailout_nobus:
-  if (dbus_error_is_set(&error))
-    dbus_error_free(&error);
-  return (NULL);
+  return strdup(uuid);
 }
 #endif
 
@@ -179,16 +129,16 @@ static char *uuid_get_from_file(const char *path) {
 
   file = fopen(path, "r");
   if (file == NULL)
-    return (NULL);
+    return NULL;
 
   if (!fgets(uuid, sizeof(uuid), file)) {
     fclose(file);
-    return (NULL);
+    return NULL;
   }
   fclose(file);
   strstripnewline(uuid);
 
-  return (strdup(uuid));
+  return strdup(uuid);
 }
 
 static char *uuid_get_local(void) {
@@ -196,52 +146,47 @@ static char *uuid_get_local(void) {
 
   /* Check /etc/uuid / UUIDFile before any other method. */
   if ((uuid = uuid_get_from_file(uuidfile ? uuidfile : "/etc/uuid")) != NULL)
-    return (uuid);
+    return uuid;
 
 #if defined(__APPLE__)
   if ((uuid = uuid_get_from_sysctlbyname("kern.uuid")) != NULL)
-    return (uuid);
+    return uuid;
 #elif defined(__FreeBSD__)
   if ((uuid = uuid_get_from_sysctlbyname("kern.hostuuid")) != NULL)
-    return (uuid);
+    return uuid;
 #elif defined(__NetBSD__)
   if ((uuid = uuid_get_from_sysctlbyname("machdep.dmi.system-uuid")) != NULL)
-    return (uuid);
+    return uuid;
 #elif defined(__OpenBSD__)
   if ((uuid = uuid_get_from_sysctl()) != NULL)
-    return (uuid);
+    return uuid;
 #elif defined(__linux__)
   if ((uuid = uuid_get_from_file("/sys/class/dmi/id/product_uuid")) != NULL)
-    return (uuid);
-#endif
-
-#if HAVE_LIBHAL_H
-  if ((uuid = uuid_get_from_hal()) != NULL)
-    return (uuid);
+    return uuid;
 #endif
 
   if ((uuid = uuid_get_from_dmidecode()) != NULL)
-    return (uuid);
+    return uuid;
 
 #if defined(__linux__)
   if ((uuid = uuid_get_from_file("/sys/hypervisor/uuid")) != NULL)
-    return (uuid);
+    return uuid;
 #endif
 
-  return (NULL);
+  return NULL;
 }
 
 static int uuid_config(const char *key, const char *value) {
   if (strcasecmp(key, "UUIDFile") == 0) {
     char *tmp = strdup(value);
     if (tmp == NULL)
-      return (-1);
+      return -1;
     sfree(uuidfile);
     uuidfile = tmp;
-    return (0);
+    return 0;
   }
 
-  return (1);
+  return 1;
 }
 
 static int uuid_init(void) {
@@ -250,11 +195,11 @@ static int uuid_init(void) {
   if (uuid) {
     sstrncpy(hostname_g, uuid, DATA_MAX_NAME_LEN);
     sfree(uuid);
-    return (0);
+    return 0;
   }
 
   WARNING("uuid: could not read UUID using any known method");
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
@@ -262,17 +207,3 @@ void module_register(void) {
                          STATIC_ARRAY_SIZE(config_keys));
   plugin_register_init("uuid", uuid_init);
 }
-
-/*
- * vim: set tabstop=4:
- * vim: set shiftwidth=4:
- * vim: set expandtab:
- */
-/*
- * Local variables:
- *  indent-tabs-mode: nil
- *  c-indent-level: 4
- *  c-basic-offset: 4
- *  tab-width: 4
- * End:
- */
index 7a23817..862085d 100644 (file)
@@ -2,7 +2,6 @@
    strlen_bogus_invalid_read_after_strdup
    Memcheck:Addr4
    fun:parse_value
-   fun:parse_values
    ...
    fun:main
 }
index 41b60d8..1a71d8c 100644 (file)
@@ -106,23 +106,25 @@ static int varnish_submit(const char *plugin_instance, /* {{{ */
   if (type_instance != NULL)
     sstrncpy(vl.type_instance, type_instance, sizeof(vl.type_instance));
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 } /* }}} int varnish_submit */
 
 static int varnish_submit_gauge(const char *plugin_instance, /* {{{ */
                                 const char *category, const char *type,
                                 const char *type_instance,
                                 uint64_t gauge_value) {
-  return (varnish_submit(plugin_instance, category, type, type_instance,
-                         (value_t){.gauge = (gauge_t)gauge_value}));
+  return varnish_submit(plugin_instance, category, type, type_instance, (value_t){
+      .gauge=(gauge_t)gauge_value,
+    });
 } /* }}} int varnish_submit_gauge */
 
 static int varnish_submit_derive(const char *plugin_instance, /* {{{ */
                                  const char *category, const char *type,
                                  const char *type_instance,
                                  uint64_t derive_value) {
-  return (varnish_submit(plugin_instance, category, type, type_instance,
-                         (value_t){.derive = (derive_t)derive_value}));
+  return varnish_submit(plugin_instance, category, type, type_instance, (value_t){
+      .derive=(derive_t)derive_value,
+    });
 } /* }}} int varnish_submit_derive */
 
 #if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
@@ -135,7 +137,7 @@ static int varnish_monitor(void *priv,
   const char *name;
 
   if (pt == NULL)
-    return (0);
+    return 0;
 
   conf = priv;
 
@@ -144,14 +146,14 @@ static int varnish_monitor(void *priv,
   name = pt->desc->name;
 
   if (strcmp(class, "MAIN") != 0)
-    return (0);
+    return 0;
 
 #elif HAVE_VARNISH_V3
   class = pt->class;
   name = pt->name;
 
   if (strcmp(class, "") != 0)
-    return (0);
+    return 0;
 #endif
 
   val = *(const volatile uint64_t *)pt->ptr;
@@ -170,21 +172,21 @@ static int varnish_monitor(void *priv,
 
   if (conf->collect_connections) {
     if (strcmp(name, "client_conn") == 0)
-      return varnish_submit_derive(conf->instance, "connections", "connections",
-                                   "accepted", val);
+      return varnish_submit_derive(conf->instance, "connections",
+                                   "connections", "accepted", val);
     else if (strcmp(name, "client_drop") == 0)
-      return varnish_submit_derive(conf->instance, "connections", "connections",
-                                   "dropped", val);
+      return varnish_submit_derive(conf->instance, "connections",
+                                   "connections", "dropped", val);
     else if (strcmp(name, "client_req") == 0)
-      return varnish_submit_derive(conf->instance, "connections", "connections",
-                                   "received", val);
+      return varnish_submit_derive(conf->instance, "connections",
+                                   "connections", "received", val);
   }
 
 #ifdef HAVE_VARNISH_V3
   if (conf->collect_dirdns) {
     if (strcmp(name, "dir_dns_lookups") == 0)
-      return varnish_submit_derive(conf->instance, "dirdns", "cache_operation",
-                                   "lookups", val);
+      return varnish_submit_derive(conf->instance, "dirdns",
+                                   "cache_operation", "lookups", val);
     else if (strcmp(name, "dir_dns_failed") == 0)
       return varnish_submit_derive(conf->instance, "dirdns", "cache_result",
                                    "failed", val);
@@ -439,26 +441,26 @@ static int varnish_monitor(void *priv,
       return varnish_submit_gauge(conf->instance, "sms", "requests",
                                   "outstanding", val);
     else if (strcmp(name, "sms_nbytes") == 0)
-      return varnish_submit_gauge(conf->instance, "sms", "bytes", "outstanding",
-                                  val);
+      return varnish_submit_gauge(conf->instance, "sms", "bytes",
+                                  "outstanding", val);
     else if (strcmp(name, "sms_balloc") == 0)
       return varnish_submit_derive(conf->instance, "sms", "total_bytes",
                                    "allocated", val);
     else if (strcmp(name, "sms_bfree") == 0)
-      return varnish_submit_derive(conf->instance, "sms", "total_bytes", "free",
-                                   val);
+      return varnish_submit_derive(conf->instance, "sms", "total_bytes",
+                                   "free", val);
   }
 
   if (conf->collect_struct) {
     if (strcmp(name, "n_sess_mem") == 0)
-      return varnish_submit_gauge(conf->instance, "struct", "current_sessions",
-                                  "sess_mem", val);
+      return varnish_submit_gauge(conf->instance, "struct",
+                                  "current_sessions", "sess_mem", val);
     else if (strcmp(name, "n_sess") == 0)
-      return varnish_submit_gauge(conf->instance, "struct", "current_sessions",
-                                  "sess", val);
+      return varnish_submit_gauge(conf->instance, "struct",
+                                  "current_sessions", "sess", val);
     else if (strcmp(name, "n_object") == 0)
-      return varnish_submit_gauge(conf->instance, "struct", "objects", "object",
-                                  val);
+      return varnish_submit_gauge(conf->instance, "struct", "objects",
+                                  "object", val);
     else if (strcmp(name, "n_vampireobject") == 0)
       return varnish_submit_gauge(conf->instance, "struct", "objects",
                                   "vampireobject", val);
@@ -493,14 +495,14 @@ static int varnish_monitor(void *priv,
       return varnish_submit_derive(conf->instance, "totals", "total_requests",
                                    "requests", val);
     else if (strcmp(name, "s_pipe") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "pipe", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "pipe", val);
     else if (strcmp(name, "s_pass") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "pass", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "pass", val);
     else if (strcmp(name, "s_fetch") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "fetches", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "fetches", val);
     else if (strcmp(name, "s_synth") == 0)
       return varnish_submit_derive(conf->instance, "totals", "total_bytes",
                                    "synth", val);
@@ -526,8 +528,8 @@ static int varnish_monitor(void *priv,
       return varnish_submit_derive(conf->instance, "totals", "total_bytes",
                                    "pipe_out", val);
     else if (strcmp(name, "n_purges") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "purges", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "purges", val);
     else if (strcmp(name, "s_hdrbytes") == 0)
       return varnish_submit_derive(conf->instance, "totals", "total_bytes",
                                    "header-bytes", val);
@@ -535,11 +537,11 @@ static int varnish_monitor(void *priv,
       return varnish_submit_derive(conf->instance, "totals", "total_bytes",
                                    "body-bytes", val);
     else if (strcmp(name, "n_gzip") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "gzip", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "gzip", val);
     else if (strcmp(name, "n_gunzip") == 0)
-      return varnish_submit_derive(conf->instance, "totals", "total_operations",
-                                   "gunzip", val);
+      return varnish_submit_derive(conf->instance, "totals",
+                                   "total_operations", "gunzip", val);
   }
 
   if (conf->collect_uptime) {
@@ -556,8 +558,8 @@ static int varnish_monitor(void *priv,
       return varnish_submit_gauge(conf->instance, "vcl", "vcl", "avail_vcl",
                                   val);
     else if (strcmp(name, "n_vcl_discard") == 0)
-      return varnish_submit_gauge(conf->instance, "vcl", "vcl", "discarded_vcl",
-                                  val);
+      return varnish_submit_gauge(conf->instance, "vcl", "vcl",
+                                  "discarded_vcl", val);
     else if (strcmp(name, "vmods") == 0)
       return varnish_submit_gauge(conf->instance, "vcl", "objects", "vmod",
                                   val);
@@ -598,17 +600,17 @@ static int varnish_monitor(void *priv,
       return varnish_submit_derive(conf->instance, "workers", "total_threads",
                                    "dropped", val);
     else if (strcmp(name, "n_wrk_queue") == 0)
-      return varnish_submit_derive(conf->instance, "workers", "total_requests",
-                                   "queued", val);
+      return varnish_submit_derive(conf->instance, "workers",
+                                   "total_requests", "queued", val);
     else if (strcmp(name, "n_wrk_overflow") == 0)
-      return varnish_submit_derive(conf->instance, "workers", "total_requests",
-                                   "overflowed", val);
+      return varnish_submit_derive(conf->instance, "workers",
+                                   "total_requests", "overflowed", val);
     else if (strcmp(name, "n_wrk_queued") == 0)
-      return varnish_submit_derive(conf->instance, "workers", "total_requests",
-                                   "queued", val);
+      return varnish_submit_derive(conf->instance, "workers",
+                                   "total_requests", "queued", val);
     else if (strcmp(name, "n_wrk_lqueue") == 0)
-      return varnish_submit_derive(conf->instance, "workers", "total_requests",
-                                   "queue_length", val);
+      return varnish_submit_derive(conf->instance, "workers",
+                                   "total_requests", "queue_length", val);
   }
 
 #if HAVE_VARNISH_V4
@@ -629,7 +631,7 @@ static int varnish_monitor(void *priv,
   }
 #endif
 
-  return (0);
+  return 0;
 
 } /* }}} static int varnish_monitor */
 #else /* if HAVE_VARNISH_V2 */
@@ -981,7 +983,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
   user_config_t *conf;
 
   if ((ud == NULL) || (ud->data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   conf = ud->data;
 
@@ -999,7 +1001,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
       ERROR("varnish plugin: VSM_n_Arg (\"%s\") failed "
             "with status %i.",
             conf->instance, status);
-      return (-1);
+      return -1;
     }
   }
 
@@ -1012,7 +1014,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
     VSM_Delete(vd);
     ERROR("varnish plugin: Unable to open connection.");
 
-    return (-1);
+    return -1;
   }
 
 #if HAVE_VARNISH_V3
@@ -1024,7 +1026,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
     VSM_Delete(vd);
     ERROR("varnish plugin: Unable to get statistics.");
 
-    return (-1);
+    return -1;
   }
 
 #if HAVE_VARNISH_V3
@@ -1034,7 +1036,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
 #endif
   VSM_Delete(vd);
 
-  return (0);
+  return 0;
 } /* }}} */
 #else /* if HAVE_VARNISH_V2 */
 static int varnish_read(user_data_t *ud) /* {{{ */
@@ -1044,7 +1046,7 @@ static int varnish_read(user_data_t *ud) /* {{{ */
   user_config_t *conf;
 
   if ((ud == NULL) || (ud->data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   conf = ud->data;
 
@@ -1052,12 +1054,12 @@ static int varnish_read(user_data_t *ud) /* {{{ */
   if (stats == NULL) {
     ERROR("Varnish plugin : unable to load statistics");
 
-    return (-1);
+    return -1;
   }
 
   varnish_monitor(conf, stats);
 
-  return (0);
+  return 0;
 } /* }}} */
 #endif
 
@@ -1075,7 +1077,7 @@ static void varnish_config_free(void *ptr) /* {{{ */
 static int varnish_config_apply_default(user_config_t *conf) /* {{{ */
 {
   if (conf == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   conf->collect_backend = 1;
   conf->collect_cache = 1;
@@ -1110,7 +1112,7 @@ static int varnish_config_apply_default(user_config_t *conf) /* {{{ */
   conf->collect_vsm = 0;
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int varnish_config_apply_default */
 
 static int varnish_init(void) /* {{{ */
@@ -1118,11 +1120,11 @@ static int varnish_init(void) /* {{{ */
   user_config_t *conf;
 
   if (have_instance)
-    return (0);
+    return 0;
 
   conf = calloc(1, sizeof(*conf));
   if (conf == NULL)
-    return (ENOMEM);
+    return ENOMEM;
 
   /* Default settings: */
   conf->instance = NULL;
@@ -1137,7 +1139,7 @@ static int varnish_init(void) /* {{{ */
                                .data = conf, .free_func = varnish_config_free,
                            });
 
-  return (0);
+  return 0;
 } /* }}} int varnish_init */
 
 static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
@@ -1147,7 +1149,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
 
   conf = calloc(1, sizeof(*conf));
   if (conf == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   conf->instance = NULL;
 
   varnish_config_apply_default(conf);
@@ -1158,7 +1160,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
     status = cf_util_get_string(ci, &conf->instance);
     if (status != 0) {
       sfree(conf);
-      return (status);
+      return status;
     }
     assert(conf->instance != NULL);
 
@@ -1170,7 +1172,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
     WARNING("Varnish plugin: \"Instance\" blocks accept only "
             "one argument.");
     sfree(conf);
-    return (EINVAL);
+    return EINVAL;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -1290,7 +1292,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
             "instance \"%s\". Disabling this instance.",
             (conf->instance == NULL) ? "localhost" : conf->instance);
     sfree(conf);
-    return (EINVAL);
+    return EINVAL;
   }
 
   ssnprintf(callback_name, sizeof(callback_name), "varnish/%s",
@@ -1306,7 +1308,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
 
   have_instance = 1;
 
-  return (0);
+  return 0;
 } /* }}} int varnish_config_instance */
 
 static int varnish_config(oconfig_item_t *ci) /* {{{ */
@@ -1323,7 +1325,7 @@ static int varnish_config(oconfig_item_t *ci) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int varnish_config */
 
 void module_register(void) /* {{{ */
@@ -1331,5 +1333,3 @@ void module_register(void) /* {{{ */
   plugin_register_complex_config("varnish", varnish_config);
   plugin_register_init("varnish", varnish_init);
 } /* }}} */
-
-/* vim: set sw=8 noet fdm=marker : */
index c3c07a0..14095df 100644 (file)
@@ -17,6 +17,7 @@
  *
  * Authors:
  *   Richard W.M. Jones <rjones@redhat.com>
+ *   Przemyslaw Szczerbik <przemyslawx.szczerbik@intel.com>
  **/
 
 #include "collectd.h"
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <libxml/xpath.h>
+#include <libxml/xpathInternals.h>
 
 /* Plugin name */
 #define PLUGIN_NAME "virt"
 
+#ifdef LIBVIR_CHECK_VERSION
+
+#if LIBVIR_CHECK_VERSION(0, 9, 2)
+#define HAVE_DOM_REASON 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(0, 9, 5)
+#define HAVE_BLOCK_STATS_FLAGS 1
+#define HAVE_DOM_REASON_PAUSED_SHUTTING_DOWN 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(0, 9, 10)
+#define HAVE_DISK_ERR 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(0, 9, 11)
+#define HAVE_CPU_STATS 1
+#define HAVE_DOM_STATE_PMSUSPENDED 1
+#define HAVE_DOM_REASON_RUNNING_WAKEUP 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 0, 1)
+#define HAVE_DOM_REASON_PAUSED_SNAPSHOT 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 1, 1)
+#define HAVE_DOM_REASON_PAUSED_CRASHED 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 2, 9)
+#define HAVE_JOB_STATS 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 2, 10)
+#define HAVE_DOM_REASON_CRASHED 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 2, 11)
+#define HAVE_FS_INFO 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 2, 15)
+#define HAVE_DOM_REASON_PAUSED_STARTING_UP 1
+#endif
+
+#if LIBVIR_CHECK_VERSION(1, 3, 3)
+#define HAVE_PERF_STATS 1
+#define HAVE_DOM_REASON_POSTCOPY 1
+#endif
+
+#endif /* LIBVIR_CHECK_VERSION */
+
 static const char *config_keys[] = {"Connection",
 
                                     "RefreshInterval",
@@ -52,14 +106,148 @@ static const char *config_keys[] = {"Connection",
 
                                     "PluginInstanceFormat",
 
+                                    "Instances",
+                                    "ExtraStats",
                                     NULL};
+
+const char *domain_states[] = {
+        [VIR_DOMAIN_NOSTATE] = "no state",
+        [VIR_DOMAIN_RUNNING] = "the domain is running",
+        [VIR_DOMAIN_BLOCKED] = "the domain is blocked on resource",
+        [VIR_DOMAIN_PAUSED] = "the domain is paused by user",
+        [VIR_DOMAIN_SHUTDOWN] = "the domain is being shut down",
+        [VIR_DOMAIN_SHUTOFF] = "the domain is shut off",
+        [VIR_DOMAIN_CRASHED] = "the domain is crashed",
+#ifdef HAVE_DOM_STATE_PMSUSPENDED
+        [VIR_DOMAIN_PMSUSPENDED] =
+            "the domain is suspended by guest power management",
+#endif
+};
+
+#ifdef HAVE_DOM_REASON
+#define DOMAIN_STATE_REASON_MAX_SIZE 20
+const char *domain_reasons[][DOMAIN_STATE_REASON_MAX_SIZE] = {
+        [VIR_DOMAIN_NOSTATE][VIR_DOMAIN_NOSTATE_UNKNOWN] =
+            "the reason is unknown",
+
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_UNKNOWN] =
+            "the reason is unknown",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_BOOTED] =
+            "normal startup from boot",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_MIGRATED] =
+            "migrated from another host",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_RESTORED] =
+            "restored from a state file",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_FROM_SNAPSHOT] =
+            "restored from snapshot",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_UNPAUSED] =
+            "returned from paused state",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_MIGRATION_CANCELED] =
+            "returned from migration",
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_SAVE_CANCELED] =
+            "returned from failed save process",
+#ifdef HAVE_DOM_REASON_RUNNING_WAKEUP
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_WAKEUP] =
+            "returned from pmsuspended due to wakeup event",
+#endif
+#ifdef HAVE_DOM_REASON_CRASHED
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_CRASHED] =
+            "resumed from crashed",
+#endif
+#ifdef HAVE_DOM_REASON_POSTCOPY
+        [VIR_DOMAIN_RUNNING][VIR_DOMAIN_RUNNING_POSTCOPY] =
+            "running in post-copy migration mode",
+#endif
+
+        [VIR_DOMAIN_BLOCKED][VIR_DOMAIN_BLOCKED_UNKNOWN] =
+            "the reason is unknown",
+
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_UNKNOWN] =
+            "the reason is unknown",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_USER] = "paused on user request",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_MIGRATION] =
+            "paused for offline migration",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_SAVE] = "paused for save",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_DUMP] =
+            "paused for offline core dump",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_IOERROR] =
+            "paused due to a disk I/O error",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_WATCHDOG] =
+            "paused due to a watchdog event",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_FROM_SNAPSHOT] =
+            "paused after restoring from snapshot",
+#ifdef HAVE_DOM_REASON_PAUSED_SHUTTING_DOWN
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_SHUTTING_DOWN] =
+            "paused during shutdown process",
+#endif
+#ifdef HAVE_DOM_REASON_PAUSED_SNAPSHOT
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_SNAPSHOT] =
+            "paused while creating a snapshot",
+#endif
+#ifdef HAVE_DOM_REASON_PAUSED_CRASHED
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_CRASHED] =
+            "paused due to a guest crash",
+#endif
+#ifdef HAVE_DOM_REASON_PAUSED_STARTING_UP
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_STARTING_UP] =
+            "the domain is being started",
+#endif
+#ifdef HAVE_DOM_REASON_POSTCOPY
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_POSTCOPY] =
+            "paused for post-copy migration",
+        [VIR_DOMAIN_PAUSED][VIR_DOMAIN_PAUSED_POSTCOPY_FAILED] =
+            "paused after failed post-copy",
+#endif
+
+        [VIR_DOMAIN_SHUTDOWN][VIR_DOMAIN_SHUTDOWN_UNKNOWN] =
+            "the reason is unknown",
+        [VIR_DOMAIN_SHUTDOWN][VIR_DOMAIN_SHUTDOWN_USER] =
+            "shutting down on user request",
+
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_UNKNOWN] =
+            "the reason is unknown",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_SHUTDOWN] = "normal shutdown",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_DESTROYED] = "forced poweroff",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_CRASHED] = "domain crashed",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_MIGRATED] =
+            "migrated to another host",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_SAVED] = "saved to a file",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_FAILED] =
+            "domain failed to start",
+        [VIR_DOMAIN_SHUTOFF][VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT] =
+            "restored from a snapshot which was taken while domain was shutoff",
+
+        [VIR_DOMAIN_CRASHED][VIR_DOMAIN_CRASHED_UNKNOWN] =
+            "the reason is unknown",
+#ifdef VIR_DOMAIN_CRASHED_PANICKED
+        [VIR_DOMAIN_CRASHED][VIR_DOMAIN_CRASHED_PANICKED] = "domain panicked",
+#endif
+
+#ifdef HAVE_DOM_STATE_PMSUSPENDED
+        [VIR_DOMAIN_PMSUSPENDED][VIR_DOMAIN_PMSUSPENDED_UNKNOWN] =
+            "the reason is unknown",
+#endif
+};
+#endif /* HAVE_DOM_REASON */
+
 #define NR_CONFIG_KEYS ((sizeof config_keys / sizeof config_keys[0]) - 1)
+#define NANOSEC_IN_SEC 1e9
+
+#define GET_STATS(_f, _name, ...)                                              \
+  do {                                                                         \
+    status = _f(__VA_ARGS__);                                                  \
+    if (status != 0)                                                           \
+      ERROR(PLUGIN_NAME ": Failed to get " _name);                             \
+  } while (0)
 
 /* Connection. */
 static virConnectPtr conn = 0;
 static char *conn_string = NULL;
 static c_complain_t conn_complain = C_COMPLAIN_INIT_STATIC;
 
+/* Node information required for %CPU */
+static virNodeInfo nodeinfo;
+
 /* Seconds between list refreshes, 0 disables completely. */
 static int interval = 60;
 
@@ -73,25 +261,12 @@ static ignorelist_t *il_interface_devices = NULL;
 static int ignore_device_match(ignorelist_t *, const char *domname,
                                const char *devpath);
 
-/* Actual list of domains found on last refresh. */
-static virDomainPtr *domains = NULL;
-static int nr_domains = 0;
-
-static void free_domains(void);
-static int add_domain(virDomainPtr dom);
-
 /* Actual list of block devices found on last refresh. */
 struct block_device {
   virDomainPtr dom; /* domain */
   char *path;       /* name of block device */
 };
 
-static struct block_device *block_devices = NULL;
-static int nr_block_devices = 0;
-
-static void free_block_devices(void);
-static int add_block_device(virDomainPtr dom, const char *path);
-
 /* Actual list of network interfaces found on last refresh. */
 struct interface_device {
   virDomainPtr dom; /* domain */
@@ -100,12 +275,57 @@ struct interface_device {
   char *number;     /* interface device number */
 };
 
-static struct interface_device *interface_devices = NULL;
-static int nr_interface_devices = 0;
+typedef struct domain_s {
+  virDomainPtr ptr;
+  virDomainInfo info;
+} domain_t;
+
+struct lv_read_state {
+  /* Actual list of domains found on last refresh. */
+  domain_t *domains;
+  int nr_domains;
+
+  struct block_device *block_devices;
+  int nr_block_devices;
+
+  struct interface_device *interface_devices;
+  int nr_interface_devices;
+};
+
+static void free_domains(struct lv_read_state *state);
+static int add_domain(struct lv_read_state *state, virDomainPtr dom);
+
+static void free_block_devices(struct lv_read_state *state);
+static int add_block_device(struct lv_read_state *state, virDomainPtr dom,
+                            const char *path);
+
+static void free_interface_devices(struct lv_read_state *state);
+static int add_interface_device(struct lv_read_state *state, virDomainPtr dom,
+                                const char *path, const char *address,
+                                unsigned int number);
+
+#define METADATA_VM_PARTITION_URI "http://ovirt.org/ovirtmap/tag/1.0"
+#define METADATA_VM_PARTITION_ELEMENT "tag"
+#define METADATA_VM_PARTITION_PREFIX "ovirtmap"
+
+#define BUFFER_MAX_LEN 256
+#define PARTITION_TAG_MAX_LEN 32
+
+struct lv_read_instance {
+  struct lv_read_state read_state;
+  char tag[PARTITION_TAG_MAX_LEN];
+  size_t id;
+};
+
+struct lv_user_data {
+  struct lv_read_instance inst;
+  user_data_t ud;
+};
 
-static void free_interface_devices(void);
-static int add_interface_device(virDomainPtr dom, const char *path,
-                                const char *address, unsigned int number);
+#define NR_INSTANCES_DEFAULT 1
+#define NR_INSTANCES_MAX 128
+static int nr_instances = NR_INSTANCES_DEFAULT;
+static struct lv_user_data lv_read_user_data[NR_INSTANCES_MAX];
 
 /* HostnameFormat. */
 #define HF_MAX_FIELDS 3
@@ -128,6 +348,58 @@ enum bd_field { target, source };
 /* InterfaceFormat. */
 enum if_field { if_address, if_name, if_number };
 
+/* ExtraStats */
+#define EX_STATS_MAX_FIELDS 15
+enum ex_stats {
+  ex_stats_none = 0,
+  ex_stats_disk = 1 << 0,
+  ex_stats_pcpu = 1 << 1,
+  ex_stats_cpu_util = 1 << 2,
+  ex_stats_domain_state = 1 << 3,
+#ifdef HAVE_PERF_STATS
+  ex_stats_perf = 1 << 4,
+#endif
+  ex_stats_vcpupin = 1 << 5,
+#ifdef HAVE_DISK_ERR
+  ex_stats_disk_err = 1 << 6,
+#endif
+#ifdef HAVE_FS_INFO
+  ex_stats_fs_info = 1 << 7,
+#endif
+#ifdef HAVE_JOB_STATS
+  ex_stats_job_stats_completed = 1 << 8,
+  ex_stats_job_stats_background = 1 << 9,
+#endif
+};
+
+static unsigned int extra_stats = ex_stats_none;
+
+struct ex_stats_item {
+  const char *name;
+  enum ex_stats flag;
+};
+static const struct ex_stats_item ex_stats_table[] = {
+    {"disk", ex_stats_disk},
+    {"pcpu", ex_stats_pcpu},
+    {"cpu_util", ex_stats_cpu_util},
+    {"domain_state", ex_stats_domain_state},
+#ifdef HAVE_PERF_STATS
+    {"perf", ex_stats_perf},
+#endif
+    {"vcpupin", ex_stats_vcpupin},
+#ifdef HAVE_DISK_ERR
+    {"disk_err", ex_stats_disk_err},
+#endif
+#ifdef HAVE_FS_INFO
+    {"fs_info", ex_stats_fs_info},
+#endif
+#ifdef HAVE_JOB_STATS
+    {"job_stats_completed", ex_stats_job_stats_completed},
+    {"job_stats_background", ex_stats_job_stats_background},
+#endif
+    {NULL, ex_stats_none},
+};
+
 /* BlockDeviceFormatBasename */
 _Bool blockdevice_format_basename = 0;
 static enum bd_field blockdevice_format = target;
@@ -136,7 +408,72 @@ static enum if_field interface_format = if_name;
 /* Time that we last refreshed. */
 static time_t last_refresh = (time_t)0;
 
-static int refresh_lists(void);
+static int refresh_lists(struct lv_read_instance *inst);
+
+struct lv_info {
+  virDomainInfo di;
+  unsigned long long total_user_cpu_time;
+  unsigned long long total_syst_cpu_time;
+};
+
+struct lv_block_info {
+  virDomainBlockStatsStruct bi;
+
+  long long rd_total_times;
+  long long wr_total_times;
+
+  long long fl_req;
+  long long fl_total_times;
+};
+
+static void init_block_info(struct lv_block_info *binfo) {
+  if (binfo == NULL)
+    return;
+
+  binfo->bi.rd_req = -1;
+  binfo->bi.wr_req = -1;
+  binfo->bi.rd_bytes = -1;
+  binfo->bi.wr_bytes = -1;
+
+  binfo->rd_total_times = -1;
+  binfo->wr_total_times = -1;
+  binfo->fl_req = -1;
+  binfo->fl_total_times = -1;
+}
+
+#ifdef HAVE_BLOCK_STATS_FLAGS
+
+#define GET_BLOCK_INFO_VALUE(NAME, FIELD)                                      \
+  do {                                                                         \
+    if (!strcmp(param[i].field, NAME)) {                                       \
+      binfo->FIELD = param[i].value.l;                                         \
+      continue;                                                                \
+    }                                                                          \
+  } while (0)
+
+static int get_block_info(struct lv_block_info *binfo,
+                          virTypedParameterPtr param, int nparams) {
+  if (binfo == NULL || param == NULL)
+    return -1;
+
+  for (int i = 0; i < nparams; ++i) {
+    /* ignore type. Everything must be LLONG anyway. */
+    GET_BLOCK_INFO_VALUE("rd_operations", bi.rd_req);
+    GET_BLOCK_INFO_VALUE("wr_operations", bi.wr_req);
+    GET_BLOCK_INFO_VALUE("rd_bytes", bi.rd_bytes);
+    GET_BLOCK_INFO_VALUE("wr_bytes", bi.wr_bytes);
+    GET_BLOCK_INFO_VALUE("rd_total_times", rd_total_times);
+    GET_BLOCK_INFO_VALUE("wr_total_times", wr_total_times);
+    GET_BLOCK_INFO_VALUE("flush_operations", fl_req);
+    GET_BLOCK_INFO_VALUE("flush_total_times", fl_total_times);
+  }
+
+  return 0;
+}
+
+#undef GET_BLOCK_INFO_VALUE
+
+#endif /* HAVE_BLOCK_STATS_FLAGS */
 
 /* ERROR(...) macro for virterrors. */
 #define VIRT_ERROR(conn, s)                                                    \
@@ -147,6 +484,56 @@ static int refresh_lists(void);
       ERROR("%s: %s", (s), err->message);                                      \
   } while (0)
 
+static void init_lv_info(struct lv_info *info) {
+  if (info != NULL)
+    memset(info, 0, sizeof(*info));
+}
+
+static int lv_domain_info(virDomainPtr dom, struct lv_info *info) {
+#ifdef HAVE_CPU_STATS
+  virTypedParameterPtr param = NULL;
+  int nparams = 0;
+#endif /* HAVE_CPU_STATS */
+  int ret = virDomainGetInfo(dom, &(info->di));
+  if (ret != 0) {
+    return ret;
+  }
+
+#ifdef HAVE_CPU_STATS
+  nparams = virDomainGetCPUStats(dom, NULL, 0, -1, 1, 0);
+  if (nparams < 0) {
+    VIRT_ERROR(conn, "getting the CPU params count");
+    return -1;
+  }
+
+  param = calloc(nparams, sizeof(virTypedParameter));
+  if (param == NULL) {
+    ERROR("virt plugin: alloc(%i) for cpu parameters failed.", nparams);
+    return -1;
+  }
+
+  ret = virDomainGetCPUStats(dom, param, nparams, -1, 1, 0); // total stats.
+  if (ret < 0) {
+    virTypedParamsClear(param, nparams);
+    sfree(param);
+    VIRT_ERROR(conn, "getting the disk params values");
+    return -1;
+  }
+
+  for (int i = 0; i < nparams; ++i) {
+    if (!strcmp(param[i].field, "user_time"))
+      info->total_user_cpu_time = param[i].value.ul;
+    else if (!strcmp(param[i].field, "system_time"))
+      info->total_syst_cpu_time = param[i].value.ul;
+  }
+
+  virTypedParamsClear(param, nparams);
+  sfree(param);
+#endif /* HAVE_CPU_STATS */
+
+  return 0;
+}
+
 static void init_value_list(value_list_t *vl, virDomainPtr dom) {
   int n;
   const char *name;
@@ -219,6 +606,34 @@ static void init_value_list(value_list_t *vl, virDomainPtr dom) {
 
 } /* void init_value_list */
 
+static int init_notif(notification_t *notif, const virDomainPtr domain,
+                      int severity, const char *msg, const char *type,
+                      const char *type_instance) {
+  value_list_t vl = VALUE_LIST_INIT;
+
+  if (!notif) {
+    ERROR(PLUGIN_NAME ": init_notif: NULL pointer");
+    return -1;
+  }
+
+  init_value_list(&vl, domain);
+  notification_init(notif, severity, msg, vl.host, vl.plugin,
+                    vl.plugin_instance, type, type_instance);
+  notif->time = cdtime();
+  return 0;
+}
+
+static void submit_notif(const virDomainPtr domain, int severity,
+                         const char *msg, const char *type,
+                         const char *type_instance) {
+  notification_t notif;
+
+  init_notif(&notif, domain, severity, msg, type, type_instance);
+  plugin_dispatch_notification(&notif);
+  if (notif.meta)
+    plugin_notification_meta_free(notif.meta);
+}
+
 static void submit(virDomainPtr dom, char const *type,
                    char const *type_instance, value_t *values,
                    size_t values_len) {
@@ -235,7 +650,7 @@ static void submit(virDomainPtr dom, char const *type,
   plugin_dispatch_values(&vl);
 }
 
-static void memory_submit(gauge_t value, virDomainPtr dom) {
+static void memory_submit(virDomainPtr dom, gauge_t value) {
   submit(dom, "memory", "total", &(value_t){.gauge = value}, 1);
 }
 
@@ -243,9 +658,10 @@ static void memory_stats_submit(gauge_t value, virDomainPtr dom,
                                 int tag_index) {
   static const char *tags[] = {"swap_in",        "swap_out", "major_fault",
                                "minor_fault",    "unused",   "available",
-                               "actual_balloon", "rss"};
+                               "actual_balloon", "rss",      "usable",
+                               "last_update"};
 
-  if ((tag_index < 0) || (tag_index >= STATIC_ARRAY_SIZE(tags))) {
+  if ((tag_index < 0) || (tag_index >= (int)STATIC_ARRAY_SIZE(tags))) {
     ERROR("virt plugin: Array index out of bounds: tag_index = %d", tag_index);
     return;
   }
@@ -253,9 +669,62 @@ static void memory_stats_submit(gauge_t value, virDomainPtr dom,
   submit(dom, "memory", tags[tag_index], &(value_t){.gauge = value}, 1);
 }
 
-static void cpu_submit(unsigned long long value, virDomainPtr dom,
-                       const char *type) {
-  submit(dom, type, NULL, &(value_t){.derive = (derive_t)value}, 1);
+static void submit_derive2(const char *type, derive_t v0, derive_t v1,
+                           virDomainPtr dom, const char *devname) {
+  value_t values[] = {
+      {.derive = v0}, {.derive = v1},
+  };
+
+  submit(dom, type, devname, values, STATIC_ARRAY_SIZE(values));
+} /* void submit_derive2 */
+
+static void pcpu_submit(virDomainPtr dom, struct lv_info *info) {
+#ifdef HAVE_CPU_STATS
+  if (extra_stats & ex_stats_pcpu)
+    submit_derive2("ps_cputime", info->total_user_cpu_time,
+                   info->total_syst_cpu_time, dom, NULL);
+#endif /* HAVE_CPU_STATS */
+}
+
+static double cpu_ns_to_percent(unsigned int node_cpus,
+                                unsigned long long cpu_time_old,
+                                unsigned long long cpu_time_new) {
+  double percent = 0.0;
+  unsigned long long cpu_time_diff = 0;
+  double time_diff_sec = CDTIME_T_TO_DOUBLE(plugin_get_interval());
+
+  if (node_cpus != 0 && time_diff_sec != 0 && cpu_time_old != 0) {
+    cpu_time_diff = cpu_time_new - cpu_time_old;
+    percent = ((double)(100 * cpu_time_diff)) /
+              (time_diff_sec * node_cpus * NANOSEC_IN_SEC);
+  }
+
+  DEBUG(PLUGIN_NAME ": node_cpus=%u cpu_time_old=%llu cpu_time_new=%llu"
+                    "cpu_time_diff=%llu time_diff_sec=%f percent=%f",
+        node_cpus, cpu_time_old, cpu_time_new, cpu_time_diff, time_diff_sec,
+        percent);
+
+  return percent;
+}
+
+static void cpu_submit(const domain_t *dom, unsigned long long cpuTime_new) {
+
+  if (!dom)
+    return;
+
+  if (extra_stats & ex_stats_cpu_util) {
+    /* Computing %CPU requires 2 samples of cpuTime */
+    if (dom->info.cpuTime != 0 && cpuTime_new != 0) {
+
+      submit(dom->ptr, "percent", "virt_cpu_total",
+             &(value_t){.gauge = cpu_ns_to_percent(
+                            nodeinfo.cpus, dom->info.cpuTime, cpuTime_new)},
+             1);
+    }
+  }
+
+  submit(dom->ptr, "virt_cpu_total", NULL, &(value_t){.derive = cpuTime_new},
+         1);
 }
 
 static void vcpu_submit(derive_t value, virDomainPtr dom, int vcpu_nr,
@@ -263,24 +732,128 @@ static void vcpu_submit(derive_t value, virDomainPtr dom, int vcpu_nr,
   char type_instance[DATA_MAX_NAME_LEN];
 
   ssnprintf(type_instance, sizeof(type_instance), "%d", vcpu_nr);
-
   submit(dom, type, type_instance, &(value_t){.derive = value}, 1);
 }
 
-static void submit_derive2(const char *type, derive_t v0, derive_t v1,
-                           virDomainPtr dom, const char *devname) {
-  value_t values[] = {
-      {.derive = v0}, {.derive = v1},
-  };
+static void disk_submit(struct lv_block_info *binfo, virDomainPtr dom,
+                        const char *dev) {
+  char *dev_copy = strdup(dev);
+  const char *type_instance = dev_copy;
 
-  submit(dom, type, devname, values, STATIC_ARRAY_SIZE(values));
-} /* void submit_derive2 */
+  if (!dev_copy)
+    return;
 
-static int lv_init(void) {
-  if (virInitialize() != 0)
-    return -1;
-  else
-    return 0;
+  if (blockdevice_format_basename && blockdevice_format == source)
+    type_instance = basename(dev_copy);
+
+  if (!type_instance) {
+    sfree(dev_copy);
+    return;
+  }
+
+  char flush_type_instance[DATA_MAX_NAME_LEN];
+  ssnprintf(flush_type_instance, sizeof(flush_type_instance), "flush-%s",
+            type_instance);
+
+  if ((binfo->bi.rd_req != -1) && (binfo->bi.wr_req != -1))
+    submit_derive2("disk_ops", (derive_t)binfo->bi.rd_req,
+                   (derive_t)binfo->bi.wr_req, dom, type_instance);
+
+  if ((binfo->bi.rd_bytes != -1) && (binfo->bi.wr_bytes != -1))
+    submit_derive2("disk_octets", (derive_t)binfo->bi.rd_bytes,
+                   (derive_t)binfo->bi.wr_bytes, dom, type_instance);
+
+  if (extra_stats & ex_stats_disk) {
+    if ((binfo->rd_total_times != -1) && (binfo->wr_total_times != -1))
+      submit_derive2("disk_time", (derive_t)binfo->rd_total_times,
+                     (derive_t)binfo->wr_total_times, dom, type_instance);
+
+    if (binfo->fl_req != -1)
+      submit(dom, "total_requests", flush_type_instance,
+             &(value_t){.derive = (derive_t)binfo->fl_req}, 1);
+    if (binfo->fl_total_times != -1) {
+      derive_t value = binfo->fl_total_times / 1000; // ns -> ms
+      submit(dom, "total_time_in_ms", flush_type_instance,
+             &(value_t){.derive = value}, 1);
+    }
+  }
+
+  sfree(dev_copy);
+}
+
+static unsigned int parse_ex_stats_flags(char **exstats, int numexstats) {
+  unsigned int ex_stats_flags = ex_stats_none;
+  for (int i = 0; i < numexstats; i++) {
+    for (int j = 0; ex_stats_table[j].name != NULL; j++) {
+      if (strcasecmp(exstats[i], ex_stats_table[j].name) == 0) {
+        DEBUG(PLUGIN_NAME " plugin: enabling extra stats for '%s'",
+              ex_stats_table[j].name);
+        ex_stats_flags |= ex_stats_table[j].flag;
+        break;
+      }
+
+      if (ex_stats_table[j + 1].name == NULL) {
+        ERROR(PLUGIN_NAME ": Unmatched ExtraStats option: %s", exstats[i]);
+      }
+    }
+  }
+  return ex_stats_flags;
+}
+
+static void domain_state_submit(virDomainPtr dom, int state, int reason) {
+
+  if ((state < 0) || (state >= STATIC_ARRAY_SIZE(domain_states))) {
+    ERROR(PLUGIN_NAME ": Array index out of bounds: state=%d", state);
+    return;
+  }
+
+  char msg[DATA_MAX_NAME_LEN];
+  const char *state_str = domain_states[state];
+#ifdef HAVE_DOM_REASON
+  if ((reason < 0) || (reason >= STATIC_ARRAY_SIZE(domain_reasons[0]))) {
+    ERROR(PLUGIN_NAME ": Array index out of bounds: reason=%d", reason);
+    return;
+  }
+
+  const char *reason_str = domain_reasons[state][reason];
+  /* Array size for domain reasons is fixed, but different domain states can
+   * have different number of reasons. We need to check if reason was
+   * successfully parsed */
+  if (!reason_str) {
+    ERROR(PLUGIN_NAME ": Invalid reason (%d) for domain state: %s", reason,
+          state_str);
+    return;
+  }
+#else
+  const char *reason_str = "N/A";
+#endif
+
+  ssnprintf(msg, sizeof(msg), "Domain state: %s. Reason: %s", state_str,
+            reason_str);
+
+  int severity;
+  switch (state) {
+  case VIR_DOMAIN_NOSTATE:
+  case VIR_DOMAIN_RUNNING:
+  case VIR_DOMAIN_SHUTDOWN:
+  case VIR_DOMAIN_SHUTOFF:
+    severity = NOTIF_OKAY;
+    break;
+  case VIR_DOMAIN_BLOCKED:
+  case VIR_DOMAIN_PAUSED:
+#ifdef DOM_STATE_PMSUSPENDED
+  case VIR_DOMAIN_PMSUSPENDED:
+#endif
+    severity = NOTIF_WARNING;
+    break;
+  case VIR_DOMAIN_CRASHED:
+    severity = NOTIF_FAILURE;
+    break;
+  default:
+    ERROR(PLUGIN_NAME ": Unrecognized domain state (%d)", state);
+    return;
+  }
+  submit_notif(dom, severity, msg, "domain_state", NULL);
 }
 
 static int lv_config(const char *key, const char *value) {
@@ -453,35 +1026,586 @@ static int lv_config(const char *key, const char *value) {
     return 0;
   }
 
+  if (strcasecmp(key, "Instances") == 0) {
+    char *eptr = NULL;
+    double val = strtod(value, &eptr);
+
+    if (*eptr != '\0') {
+      ERROR(PLUGIN_NAME " plugin: Invalid value for Instances = '%s'", value);
+      return 1;
+    }
+    if (val <= 0) {
+      ERROR(PLUGIN_NAME " plugin: Instances <= 0 makes no sense.");
+      return 1;
+    }
+    if (val > NR_INSTANCES_MAX) {
+      ERROR(PLUGIN_NAME " plugin: Instances=%f > NR_INSTANCES_MAX=%i"
+                        " use a lower setting or recompile the plugin.",
+            val, NR_INSTANCES_MAX);
+      return 1;
+    }
+
+    nr_instances = (int)val;
+    DEBUG(PLUGIN_NAME " plugin: configured %i instances", nr_instances);
+    return 0;
+  }
+
+  if (strcasecmp(key, "ExtraStats") == 0) {
+    char *localvalue = strdup(value);
+    if (localvalue != NULL) {
+      char *exstats[EX_STATS_MAX_FIELDS];
+      int numexstats =
+          strsplit(localvalue, exstats, STATIC_ARRAY_SIZE(exstats));
+      extra_stats = parse_ex_stats_flags(exstats, numexstats);
+      sfree(localvalue);
+
+#ifdef HAVE_JOB_STATS
+      if ((extra_stats & ex_stats_job_stats_completed) &&
+          (extra_stats & ex_stats_job_stats_background)) {
+        ERROR(PLUGIN_NAME " plugin: Invalid job stats configuration. Only one "
+                          "type of job statistics can be collected at the same "
+                          "time");
+        return 1;
+      }
+#endif
+    }
+  }
+
   /* Unrecognised option. */
   return -1;
 }
 
-static int lv_read(void) {
-  time_t t;
-
+static int lv_connect(void) {
   if (conn == NULL) {
-    /* `conn_string == NULL' is acceptable. */
-    conn = virConnectOpenReadOnly(conn_string);
+/* `conn_string == NULL' is acceptable */
+#ifdef HAVE_FS_INFO
+    /* virDomainGetFSInfo requires full read-write access connection */
+    if (extra_stats & ex_stats_fs_info)
+      conn = virConnectOpen(conn_string);
+    else
+#endif
+      conn = virConnectOpenReadOnly(conn_string);
     if (conn == NULL) {
       c_complain(LOG_ERR, &conn_complain,
                  PLUGIN_NAME " plugin: Unable to connect: "
-                             "virConnectOpenReadOnly failed.");
+                             "virConnectOpen failed.");
+      return -1;
+    }
+    int status = virNodeGetInfo(conn, &nodeinfo);
+    if (status != 0) {
+      ERROR(PLUGIN_NAME ": virNodeGetInfo failed");
       return -1;
     }
   }
   c_release(LOG_NOTICE, &conn_complain,
             PLUGIN_NAME " plugin: Connection established.");
+  return 0;
+}
+
+static void lv_disconnect(void) {
+  if (conn != NULL)
+    virConnectClose(conn);
+  conn = NULL;
+  WARNING(PLUGIN_NAME " plugin: closed connection to libvirt");
+}
+
+static int lv_domain_block_info(virDomainPtr dom, const char *path,
+                                struct lv_block_info *binfo) {
+#ifdef HAVE_BLOCK_STATS_FLAGS
+  int nparams = 0;
+  if (virDomainBlockStatsFlags(dom, path, NULL, &nparams, 0) < 0 ||
+      nparams <= 0) {
+    VIRT_ERROR(conn, "getting the disk params count");
+    return -1;
+  }
+
+  virTypedParameterPtr params = calloc((size_t)nparams, sizeof(*params));
+  if (params == NULL) {
+    ERROR("virt plugin: alloc(%i) for block=%s parameters failed.", nparams,
+          path);
+    return -1;
+  }
+
+  int rc = -1;
+  if (virDomainBlockStatsFlags(dom, path, params, &nparams, 0) < 0) {
+    VIRT_ERROR(conn, "getting the disk params values");
+  } else {
+    rc = get_block_info(binfo, params, nparams);
+  }
+
+  virTypedParamsClear(params, nparams);
+  sfree(params);
+  return rc;
+#else
+  return virDomainBlockStats(dom, path, &(binfo->bi), sizeof(binfo->bi));
+#endif /* HAVE_BLOCK_STATS_FLAGS */
+}
+
+#ifdef HAVE_PERF_STATS
+static void perf_submit(virDomainStatsRecordPtr stats) {
+  for (int i = 0; i < stats->nparams; ++i) {
+    /* Replace '.' with '_' in event field to match other metrics' naming
+     * convention */
+    char *c = strchr(stats->params[i].field, '.');
+    if (c)
+      *c = '_';
+    submit(stats->dom, "perf", stats->params[i].field,
+           &(value_t){.derive = stats->params[i].value.ul}, 1);
+  }
+}
+
+static int get_perf_events(virDomainPtr domain) {
+  virDomainStatsRecordPtr *stats = NULL;
+  /* virDomainListGetStats requires a NULL terminated list of domains */
+  virDomainPtr domain_array[] = {domain, NULL};
+
+  int status =
+      virDomainListGetStats(domain_array, VIR_DOMAIN_STATS_PERF, &stats, 0);
+  if (status == -1) {
+    ERROR("virt plugin: virDomainListGetStats failed with status %i.", status);
+    return status;
+  }
+
+  for (int i = 0; i < status; ++i)
+    perf_submit(stats[i]);
+
+  virDomainStatsRecordListFree(stats);
+  return 0;
+}
+#endif /* HAVE_PERF_STATS */
+
+static void vcpu_pin_submit(virDomainPtr dom, int max_cpus, int vcpu,
+                            unsigned char *cpu_maps, int cpu_map_len) {
+  for (int cpu = 0; cpu < max_cpus; ++cpu) {
+    char type_instance[DATA_MAX_NAME_LEN];
+    _Bool is_set = VIR_CPU_USABLE(cpu_maps, cpu_map_len, vcpu, cpu) ? 1 : 0;
+
+    ssnprintf(type_instance, sizeof(type_instance), "vcpu_%d-cpu_%d", vcpu,
+              cpu);
+    submit(dom, "cpu_affinity", type_instance, &(value_t){.gauge = is_set}, 1);
+  }
+}
+
+static int get_vcpu_stats(virDomainPtr domain, unsigned short nr_virt_cpu) {
+  int max_cpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+  int cpu_map_len = VIR_CPU_MAPLEN(max_cpus);
+
+  virVcpuInfoPtr vinfo = calloc(nr_virt_cpu, sizeof(vinfo[0]));
+  if (vinfo == NULL) {
+    ERROR(PLUGIN_NAME " plugin: malloc failed.");
+    return -1;
+  }
+
+  unsigned char *cpumaps = calloc(nr_virt_cpu, cpu_map_len);
+  if (cpumaps == NULL) {
+    ERROR(PLUGIN_NAME " plugin: malloc failed.");
+    sfree(vinfo);
+    return -1;
+  }
+
+  int status =
+      virDomainGetVcpus(domain, vinfo, nr_virt_cpu, cpumaps, cpu_map_len);
+  if (status < 0) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetVcpus failed with status %i.",
+          status);
+    sfree(cpumaps);
+    sfree(vinfo);
+    return status;
+  }
+
+  for (int i = 0; i < nr_virt_cpu; ++i) {
+    vcpu_submit(vinfo[i].cpuTime, domain, vinfo[i].number, "virt_vcpu");
+    if (extra_stats & ex_stats_vcpupin)
+      vcpu_pin_submit(domain, max_cpus, i, cpumaps, cpu_map_len);
+  }
+
+  sfree(cpumaps);
+  sfree(vinfo);
+  return 0;
+}
+
+#ifdef HAVE_DOM_REASON
+static int get_domain_state(virDomainPtr domain) {
+  int domain_state = 0;
+  int domain_reason = 0;
+
+  int status = virDomainGetState(domain, &domain_state, &domain_reason, 0);
+  if (status != 0) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetState failed with status %i.",
+          status);
+    return status;
+  }
+
+  domain_state_submit(domain, domain_state, domain_reason);
+  return status;
+}
+#endif /* HAVE_DOM_REASON */
+
+static int get_memory_stats(virDomainPtr domain) {
+  virDomainMemoryStatPtr minfo =
+      calloc(VIR_DOMAIN_MEMORY_STAT_NR, sizeof(virDomainMemoryStatStruct));
+  if (minfo == NULL) {
+    ERROR("virt plugin: malloc failed.");
+    return -1;
+  }
+
+  int mem_stats =
+      virDomainMemoryStats(domain, minfo, VIR_DOMAIN_MEMORY_STAT_NR, 0);
+  if (mem_stats < 0) {
+    ERROR("virt plugin: virDomainMemoryStats failed with mem_stats %i.",
+          mem_stats);
+    sfree(minfo);
+    return mem_stats;
+  }
+
+  for (int i = 0; i < mem_stats; i++)
+    memory_stats_submit((gauge_t)minfo[i].val * 1024, domain, minfo[i].tag);
+
+  sfree(minfo);
+  return 0;
+}
+
+#ifdef HAVE_DISK_ERR
+static void disk_err_submit(virDomainPtr domain,
+                            virDomainDiskErrorPtr disk_err) {
+  submit(domain, "disk_error", disk_err->disk,
+         &(value_t){.gauge = disk_err->error}, 1);
+}
+
+static int get_disk_err(virDomainPtr domain) {
+  /* Get preferred size of disk errors array */
+  int disk_err_count = virDomainGetDiskErrors(domain, NULL, 0, 0);
+  if (disk_err_count == -1) {
+    ERROR(PLUGIN_NAME
+          " plugin: failed to get preferred size of disk errors array");
+    return -1;
+  }
+
+  DEBUG(PLUGIN_NAME
+        " plugin: preferred size of disk errors array: %d for domain %s",
+        disk_err_count, virDomainGetName(domain));
+  virDomainDiskError disk_err[disk_err_count];
+
+  disk_err_count = virDomainGetDiskErrors(domain, disk_err, disk_err_count, 0);
+  if (disk_err_count == -1) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetDiskErrors failed with status %d",
+          disk_err_count);
+    return -1;
+  }
+
+  DEBUG(PLUGIN_NAME " plugin: detected %d disk errors in domain %s",
+        disk_err_count, virDomainGetName(domain));
+
+  for (int i = 0; i < disk_err_count; ++i) {
+    disk_err_submit(domain, &disk_err[i]);
+    sfree(disk_err[i].disk);
+  }
+
+  return 0;
+}
+#endif /* HAVE_DISK_ERR */
+
+static int get_block_stats(struct block_device *block_dev) {
+
+  if (!block_dev) {
+    ERROR(PLUGIN_NAME " plugin: get_block_stats NULL pointer");
+    return -1;
+  }
+
+  struct lv_block_info binfo;
+  init_block_info(&binfo);
+
+  if (lv_domain_block_info(block_dev->dom, block_dev->path, &binfo) < 0) {
+    ERROR(PLUGIN_NAME " plugin: lv_domain_block_info failed");
+    return -1;
+  }
+
+  disk_submit(&binfo, block_dev->dom, block_dev->path);
+  return 0;
+}
+
+#ifdef HAVE_FS_INFO
+
+#define NM_ADD_ITEM(_fun, _name, _val)                                         \
+  do {                                                                         \
+    ret = _fun(&notif, _name, _val);                                           \
+    if (ret != 0) {                                                            \
+      ERROR(PLUGIN_NAME " plugin: failed to add notification metadata");       \
+      goto cleanup;                                                            \
+    }                                                                          \
+  } while (0)
+
+#define NM_ADD_STR_ITEMS(_items, _size)                                        \
+  do {                                                                         \
+    for (int _i = 0; _i < _size; ++_i) {                                       \
+      DEBUG(PLUGIN_NAME                                                        \
+            " plugin: Adding notification metadata name=%s value=%s",          \
+            _items[_i].name, _items[_i].value);                                \
+      NM_ADD_ITEM(plugin_notification_meta_add_string, _items[_i].name,        \
+                  _items[_i].value);                                           \
+    }                                                                          \
+  } while (0)
+
+static int fs_info_notify(virDomainPtr domain, virDomainFSInfoPtr fs_info) {
+  notification_t notif;
+  int ret = 0;
+
+  /* Local struct, just for the purpose of this function. */
+  typedef struct nm_str_item_s {
+    const char *name;
+    const char *value;
+  } nm_str_item_t;
+
+  nm_str_item_t fs_dev_alias[fs_info->ndevAlias];
+  nm_str_item_t fs_str_items[] = {
+      {.name = "mountpoint", .value = fs_info->mountpoint},
+      {.name = "name", .value = fs_info->name},
+      {.name = "fstype", .value = fs_info->fstype}};
+
+  for (int i = 0; i < fs_info->ndevAlias; ++i) {
+    fs_dev_alias[i].name = "devAlias";
+    fs_dev_alias[i].value = fs_info->devAlias[i];
+  }
+
+  init_notif(&notif, domain, NOTIF_OKAY, "File system information",
+             "file_system", NULL);
+  NM_ADD_STR_ITEMS(fs_str_items, STATIC_ARRAY_SIZE(fs_str_items));
+  NM_ADD_ITEM(plugin_notification_meta_add_unsigned_int, "ndevAlias",
+              fs_info->ndevAlias);
+  NM_ADD_STR_ITEMS(fs_dev_alias, fs_info->ndevAlias);
+
+  plugin_dispatch_notification(&notif);
+
+cleanup:
+  if (notif.meta)
+    plugin_notification_meta_free(notif.meta);
+  return ret;
+}
+
+#undef RETURN_ON_ERR
+#undef NM_ADD_STR_ITEMS
+
+static int get_fs_info(virDomainPtr domain) {
+  virDomainFSInfoPtr *fs_info = NULL;
+  int ret = 0;
+
+  int mount_points_cnt = virDomainGetFSInfo(domain, &fs_info, 0);
+  if (mount_points_cnt == -1) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetFSInfo failed: %d",
+          mount_points_cnt);
+    return mount_points_cnt;
+  }
+
+  for (int i = 0; i < mount_points_cnt; ++i) {
+    if (fs_info_notify(domain, fs_info[i]) != 0) {
+      ERROR(PLUGIN_NAME " plugin: failed to send file system notification "
+                        "for mount point %s",
+            fs_info[i]->mountpoint);
+      ret = -1;
+    }
+    virDomainFSInfoFree(fs_info[i]);
+  }
+
+  sfree(fs_info);
+  return ret;
+}
+
+#endif /* HAVE_FS_INFO */
+
+#ifdef HAVE_JOB_STATS
+static void job_stats_submit(virDomainPtr domain, virTypedParameterPtr param) {
+  value_t vl = {0};
+
+  if (param->type == VIR_TYPED_PARAM_INT)
+    vl.derive = param->value.i;
+  else if (param->type == VIR_TYPED_PARAM_UINT)
+    vl.derive = param->value.ui;
+  else if (param->type == VIR_TYPED_PARAM_LLONG)
+    vl.derive = param->value.l;
+  else if (param->type == VIR_TYPED_PARAM_ULLONG)
+    vl.derive = param->value.ul;
+  else if (param->type == VIR_TYPED_PARAM_DOUBLE)
+    vl.derive = param->value.d;
+  else if (param->type == VIR_TYPED_PARAM_BOOLEAN)
+    vl.derive = param->value.b;
+  else if (param->type == VIR_TYPED_PARAM_STRING) {
+    submit_notif(domain, NOTIF_OKAY, param->value.s, "job_stats", param->field);
+    return;
+  } else {
+    ERROR(PLUGIN_NAME " plugin: unrecognized virTypedParameterType");
+    return;
+  }
+
+  submit(domain, "job_stats", param->field, &vl, 1);
+}
+
+static int get_job_stats(virDomainPtr domain) {
+  int ret = 0;
+  int job_type = 0;
+  int nparams = 0;
+  virTypedParameterPtr params = NULL;
+  int flags = (extra_stats & ex_stats_job_stats_completed)
+                  ? VIR_DOMAIN_JOB_STATS_COMPLETED
+                  : 0;
+
+  ret = virDomainGetJobStats(domain, &job_type, &params, &nparams, flags);
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetJobStats failed: %d", ret);
+    return ret;
+  }
+
+  DEBUG(PLUGIN_NAME " plugin: job_type=%d nparams=%d", job_type, nparams);
+
+  for (int i = 0; i < nparams; ++i) {
+    DEBUG(PLUGIN_NAME " plugin: param[%d] field=%s type=%d", i, params[i].field,
+          params[i].type);
+    job_stats_submit(domain, &params[i]);
+  }
+
+  virTypedParamsFree(params, nparams);
+  return ret;
+}
+#endif /* HAVE_JOB_STATS */
+
+static int get_domain_metrics(domain_t *domain) {
+  struct lv_info info;
+
+  if (!domain || !domain->ptr) {
+    ERROR(PLUGIN_NAME ": get_domain_metrics: NULL pointer");
+    return -1;
+  }
+
+  init_lv_info(&info);
+  int status = lv_domain_info(domain->ptr, &info);
+  if (status != 0) {
+    ERROR(PLUGIN_NAME " plugin: virDomainGetInfo failed with status %i.",
+          status);
+    return -1;
+  }
+
+  if (extra_stats & ex_stats_domain_state) {
+#ifdef HAVE_DOM_REASON
+    /* At this point we already know domain's state from virDomainGetInfo call,
+     * however it doesn't provide a reason for entering particular state.
+     * We need to get it from virDomainGetState.
+     */
+    GET_STATS(get_domain_state, "domain reason", domain->ptr);
+#else
+    /* virDomainGetState is not available. Submit 0, which corresponds to
+     * unknown reason. */
+    domain_state_submit(domain->ptr, info.di.state, 0);
+#endif
+  }
+
+  /* Gather remaining stats only for running domains */
+  if (info.di.state != VIR_DOMAIN_RUNNING)
+    return 0;
+
+  pcpu_submit(domain->ptr, &info);
+  cpu_submit(domain, info.di.cpuTime);
+
+  memory_submit(domain->ptr, (gauge_t)info.di.memory * 1024);
+
+  GET_STATS(get_vcpu_stats, "vcpu stats", domain->ptr, info.di.nrVirtCpu);
+  GET_STATS(get_memory_stats, "memory stats", domain->ptr);
+
+#ifdef HAVE_PERF_STATS
+  if (extra_stats & ex_stats_perf)
+    GET_STATS(get_perf_events, "performance monitoring events", domain->ptr);
+#endif
+
+#ifdef HAVE_FS_INFO
+  if (extra_stats & ex_stats_fs_info)
+    GET_STATS(get_fs_info, "file system info", domain->ptr);
+#endif
+
+#ifdef HAVE_DISK_ERR
+  if (extra_stats & ex_stats_disk_err)
+    GET_STATS(get_disk_err, "disk errors", domain->ptr);
+#endif
+
+#ifdef HAVE_JOB_STATS
+  if (extra_stats &
+      (ex_stats_job_stats_completed | ex_stats_job_stats_background))
+    GET_STATS(get_job_stats, "job stats", domain->ptr);
+#endif
+
+  /* Update cached virDomainInfo. It has to be done after cpu_submit */
+  memcpy(&domain->info, &info.di, sizeof(domain->info));
+  return 0;
+}
+
+static int get_if_dev_stats(struct interface_device *if_dev) {
+  virDomainInterfaceStatsStruct stats = {0};
+  char *display_name = NULL;
+
+  if (!if_dev) {
+    ERROR(PLUGIN_NAME " plugin: get_if_dev_stats: NULL pointer");
+    return -1;
+  }
+
+  switch (interface_format) {
+  case if_address:
+    display_name = if_dev->address;
+    break;
+  case if_number:
+    display_name = if_dev->number;
+    break;
+  case if_name:
+  default:
+    display_name = if_dev->path;
+  }
+
+  if (virDomainInterfaceStats(if_dev->dom, if_dev->path, &stats,
+                              sizeof(stats)) != 0) {
+    ERROR(PLUGIN_NAME " plugin: virDomainInterfaceStats failed");
+    return -1;
+  }
+
+  if ((stats.rx_bytes != -1) && (stats.tx_bytes != -1))
+    submit_derive2("if_octets", (derive_t)stats.rx_bytes,
+                   (derive_t)stats.tx_bytes, if_dev->dom, display_name);
+
+  if ((stats.rx_packets != -1) && (stats.tx_packets != -1))
+    submit_derive2("if_packets", (derive_t)stats.rx_packets,
+                   (derive_t)stats.tx_packets, if_dev->dom, display_name);
+
+  if ((stats.rx_errs != -1) && (stats.tx_errs != -1))
+    submit_derive2("if_errors", (derive_t)stats.rx_errs,
+                   (derive_t)stats.tx_errs, if_dev->dom, display_name);
+
+  if ((stats.rx_drop != -1) && (stats.tx_drop != -1))
+    submit_derive2("if_dropped", (derive_t)stats.rx_drop,
+                   (derive_t)stats.tx_drop, if_dev->dom, display_name);
+  return 0;
+}
+
+static int lv_read(user_data_t *ud) {
+  time_t t;
+  struct lv_read_instance *inst = NULL;
+  struct lv_read_state *state = NULL;
+
+  if (ud->data == NULL) {
+    ERROR(PLUGIN_NAME " plugin: NULL userdata");
+    return -1;
+  }
+
+  inst = ud->data;
+  state = &inst->read_state;
+
+  if (inst->id == 0) {
+    if (lv_connect() < 0)
+      return -1;
+  }
 
   time(&t);
 
   /* Need to refresh domain or device lists? */
   if ((last_refresh == (time_t)0) ||
       ((interval > 0) && ((last_refresh + interval) <= t))) {
-    if (refresh_lists() != 0) {
-      if (conn != NULL)
-        virConnectClose(conn);
-      conn = NULL;
+    if (refresh_lists(inst) != 0) {
+      if (inst->id == 0)
+        lv_disconnect();
       return -1;
     }
     last_refresh = t;
@@ -489,7 +1613,7 @@ static int lv_read(void) {
 
 #if 0
     for (int i = 0; i < nr_domains; ++i)
-        fprintf (stderr, "domain %s\n", virDomainGetName (domains[i]));
+        fprintf (stderr, "domain %s\n", virDomainGetName (state->domains[i].ptr));
     for (int i = 0; i < nr_block_devices; ++i)
         fprintf  (stderr, "block device %d %s:%s\n",
                   i, virDomainGetName (block_devices[i].dom),
@@ -500,145 +1624,191 @@ static int lv_read(void) {
                  interface_devices[i].path);
 #endif
 
-  /* Get CPU usage, memory, VCPU usage for each domain. */
-  for (int i = 0; i < nr_domains; ++i) {
-    virDomainInfo info;
-    virVcpuInfoPtr vinfo = NULL;
-    virDomainMemoryStatPtr minfo = NULL;
-    int status;
+  /* Get domains' metrics */
+  for (int i = 0; i < state->nr_domains; ++i) {
+    int status = get_domain_metrics(&state->domains[i]);
+    if (status != 0)
+      ERROR(PLUGIN_NAME " failed to get metrics for domain=%s",
+            virDomainGetName(state->domains[i].ptr));
+  }
 
-    status = virDomainGetInfo(domains[i], &info);
-    if (status != 0) {
-      ERROR(PLUGIN_NAME " plugin: virDomainGetInfo failed with status %i.",
-            status);
-      continue;
-    }
+  /* Get block device stats for each domain. */
+  for (int i = 0; i < state->nr_block_devices; ++i) {
+    int status = get_block_stats(&state->block_devices[i]);
+    if (status != 0)
+      ERROR(PLUGIN_NAME
+            " failed to get stats for block device (%s) in domain %s",
+            state->block_devices[i].path,
+            virDomainGetName(state->domains[i].ptr));
+  }
 
-    if (info.state != VIR_DOMAIN_RUNNING) {
-      /* only gather stats for running domains */
-      continue;
-    }
+  /* Get interface stats for each domain. */
+  for (int i = 0; i < state->nr_interface_devices; ++i) {
+    int status = get_if_dev_stats(&state->interface_devices[i]);
+    if (status != 0)
+      ERROR(PLUGIN_NAME
+            " failed to get interface stats for device (%s) in domain %s",
+            state->interface_devices[i].path,
+            virDomainGetName(state->interface_devices[i].dom));
+  }
 
-    cpu_submit(info.cpuTime, domains[i], "virt_cpu_total");
-    memory_submit((gauge_t)info.memory * 1024, domains[i]);
+  return 0;
+}
 
-    vinfo = malloc(info.nrVirtCpu * sizeof(vinfo[0]));
-    if (vinfo == NULL) {
-      ERROR(PLUGIN_NAME " plugin: malloc failed.");
-      continue;
-    }
+static int lv_init_instance(size_t i, plugin_read_cb callback) {
+  struct lv_user_data *lv_ud = &(lv_read_user_data[i]);
+  struct lv_read_instance *inst = &(lv_ud->inst);
 
-    status = virDomainGetVcpus(domains[i], vinfo, info.nrVirtCpu,
-                               /* cpu map = */ NULL, /* cpu map length = */ 0);
-    if (status < 0) {
-      ERROR(PLUGIN_NAME " plugin: virDomainGetVcpus failed with status %i.",
-            status);
-      sfree(vinfo);
-      continue;
-    }
+  memset(lv_ud, 0, sizeof(*lv_ud));
 
-    for (int j = 0; j < info.nrVirtCpu; ++j)
-      vcpu_submit(vinfo[j].cpuTime, domains[i], vinfo[j].number, "virt_vcpu");
+  ssnprintf(inst->tag, sizeof(inst->tag), "%s-%zu", PLUGIN_NAME, i);
+  inst->id = i;
 
-    sfree(vinfo);
+  user_data_t *ud = &(lv_ud->ud);
+  ud->data = inst;
+  ud->free_func = NULL;
 
-    minfo =
-        malloc(VIR_DOMAIN_MEMORY_STAT_NR * sizeof(virDomainMemoryStatStruct));
-    if (minfo == NULL) {
-      ERROR("virt plugin: malloc failed.");
-      continue;
-    }
+  INFO(PLUGIN_NAME " plugin: reader %s initialized", inst->tag);
+  return plugin_register_complex_read(NULL, inst->tag, callback, 0, ud);
+}
 
-    status =
-        virDomainMemoryStats(domains[i], minfo, VIR_DOMAIN_MEMORY_STAT_NR, 0);
+static void lv_clean_read_state(struct lv_read_state *state) {
+  free_block_devices(state);
+  free_interface_devices(state);
+  free_domains(state);
+}
 
-    if (status < 0) {
-      ERROR("virt plugin: virDomainMemoryStats failed with status %i.", status);
-      sfree(minfo);
-      continue;
-    }
+static void lv_fini_instance(size_t i) {
+  struct lv_read_instance *inst = &(lv_read_user_data[i].inst);
+  struct lv_read_state *state = &(inst->read_state);
 
-    for (int j = 0; j < status; j++) {
-      memory_stats_submit((gauge_t)minfo[j].val * 1024, domains[i],
-                          minfo[j].tag);
-    }
+  lv_clean_read_state(state);
+  INFO(PLUGIN_NAME " plugin: reader %s finalized", inst->tag);
+}
 
-    sfree(minfo);
-  }
+static int lv_init(void) {
+  if (virInitialize() != 0)
+    return -1;
 
-  /* Get block device stats for each domain. */
-  for (int i = 0; i < nr_block_devices; ++i) {
-    struct _virDomainBlockStats stats;
+  if (lv_connect() != 0)
+    return -1;
 
-    if (virDomainBlockStats(block_devices[i].dom, block_devices[i].path, &stats,
-                            sizeof stats) != 0)
-      continue;
+  DEBUG(PLUGIN_NAME " plugin: starting %i instances", nr_instances);
 
-    char *type_instance = NULL;
-    if (blockdevice_format_basename && blockdevice_format == source)
-      type_instance = strdup(basename(block_devices[i].path));
-    else
-      type_instance = strdup(block_devices[i].path);
+  for (int i = 0; i < nr_instances; ++i)
+    lv_init_instance(i, lv_read);
 
-    if ((stats.rd_req != -1) && (stats.wr_req != -1))
-      submit_derive2("disk_ops", (derive_t)stats.rd_req, (derive_t)stats.wr_req,
-                     block_devices[i].dom, type_instance);
+  return 0;
+}
 
-    if ((stats.rd_bytes != -1) && (stats.wr_bytes != -1))
-      submit_derive2("disk_octets", (derive_t)stats.rd_bytes,
-                     (derive_t)stats.wr_bytes, block_devices[i].dom,
-                     type_instance);
+/*
+ * returns 0 on success and <0 on error
+ */
+static int lv_domain_get_tag(xmlXPathContextPtr xpath_ctx, const char *dom_name,
+                             char *dom_tag) {
+  char xpath_str[BUFFER_MAX_LEN] = {'\0'};
+  xmlXPathObjectPtr xpath_obj = NULL;
+  xmlNodePtr xml_node = NULL;
+  int ret = -1;
+  int err;
+
+  err = xmlXPathRegisterNs(xpath_ctx,
+                           (const xmlChar *)METADATA_VM_PARTITION_PREFIX,
+                           (const xmlChar *)METADATA_VM_PARTITION_URI);
+  if (err) {
+    ERROR(PLUGIN_NAME " plugin: xmlXpathRegisterNs(%s, %s) failed on domain %s",
+          METADATA_VM_PARTITION_PREFIX, METADATA_VM_PARTITION_URI, dom_name);
+    goto done;
+  }
 
-    sfree(type_instance);
-  } /* for (nr_block_devices) */
+  ssnprintf(xpath_str, sizeof(xpath_str), "/domain/metadata/%s:%s/text()",
+            METADATA_VM_PARTITION_PREFIX, METADATA_VM_PARTITION_ELEMENT);
+  xpath_obj = xmlXPathEvalExpression((xmlChar *)xpath_str, xpath_ctx);
+  if (xpath_obj == NULL) {
+    ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) failed on domain %s",
+          xpath_str, dom_name);
+    goto done;
+  }
 
-  /* Get interface stats for each domain. */
-  for (int i = 0; i < nr_interface_devices; ++i) {
-    struct _virDomainInterfaceStats stats;
-    char *display_name = NULL;
+  if (xpath_obj->type != XPATH_NODESET) {
+    ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) unexpected return type %d "
+                      "(wanted %d) on domain %s",
+          xpath_str, xpath_obj->type, XPATH_NODESET, dom_name);
+    goto done;
+  }
 
-    switch (interface_format) {
-    case if_address:
-      display_name = interface_devices[i].address;
-      break;
-    case if_number:
-      display_name = interface_devices[i].number;
-      break;
-    case if_name:
-    default:
-      display_name = interface_devices[i].path;
-    }
+  /*
+   * from now on there is no real error, it's ok if a domain
+   * doesn't have the metadata partition tag.
+   */
+  ret = 0;
+  if (xpath_obj->nodesetval == NULL || xpath_obj->nodesetval->nodeNr != 1) {
+    DEBUG(PLUGIN_NAME " plugin: xmlXPathEval(%s) return nodeset size=%i "
+                      "expected=1 on domain %s",
+          xpath_str,
+          (xpath_obj->nodesetval == NULL) ? 0 : xpath_obj->nodesetval->nodeNr,
+          dom_name);
+  } else {
+    xml_node = xpath_obj->nodesetval->nodeTab[0];
+    sstrncpy(dom_tag, (const char *)xml_node->content, PARTITION_TAG_MAX_LEN);
+  }
 
-    if (virDomainInterfaceStats(interface_devices[i].dom,
-                                interface_devices[i].path, &stats,
-                                sizeof stats) != 0)
-      continue;
+done:
+  /* deregister to clean up */
+  err = xmlXPathRegisterNs(xpath_ctx,
+                           (const xmlChar *)METADATA_VM_PARTITION_PREFIX, NULL);
+  if (err) {
+    /* we can't really recover here */
+    ERROR(PLUGIN_NAME
+          " plugin: deregistration of namespace %s failed for domain %s",
+          METADATA_VM_PARTITION_PREFIX, dom_name);
+  }
+  if (xpath_obj)
+    xmlXPathFreeObject(xpath_obj);
 
-    if ((stats.rx_bytes != -1) && (stats.tx_bytes != -1))
-      submit_derive2("if_octets", (derive_t)stats.rx_bytes,
-                     (derive_t)stats.tx_bytes, interface_devices[i].dom,
-                     display_name);
+  return ret;
+}
 
-    if ((stats.rx_packets != -1) && (stats.tx_packets != -1))
-      submit_derive2("if_packets", (derive_t)stats.rx_packets,
-                     (derive_t)stats.tx_packets, interface_devices[i].dom,
-                     display_name);
+static int is_known_tag(const char *dom_tag) {
+  for (int i = 0; i < nr_instances; ++i)
+    if (!strcmp(dom_tag, lv_read_user_data[i].inst.tag))
+      return 1;
+  return 0;
+}
 
-    if ((stats.rx_errs != -1) && (stats.tx_errs != -1))
-      submit_derive2("if_errors", (derive_t)stats.rx_errs,
-                     (derive_t)stats.tx_errs, interface_devices[i].dom,
-                     display_name);
+static int lv_instance_include_domain(struct lv_read_instance *inst,
+                                      const char *dom_name,
+                                      const char *dom_tag) {
+  if ((dom_tag[0] != '\0') && (strcmp(dom_tag, inst->tag) == 0))
+    return 1;
 
-    if ((stats.rx_drop != -1) && (stats.tx_drop != -1))
-      submit_derive2("if_dropped", (derive_t)stats.rx_drop,
-                     (derive_t)stats.tx_drop, interface_devices[i].dom,
-                     display_name);
-  } /* for (nr_interface_devices) */
+  /* instance#0 will always be there, so it is in charge of extra duties */
+  if (inst->id == 0) {
+    if (dom_tag[0] == '\0' || !is_known_tag(dom_tag)) {
+      DEBUG(PLUGIN_NAME " plugin#%s: refreshing domain %s "
+                        "with unknown tag '%s'",
+            inst->tag, dom_name, dom_tag);
+      return 1;
+    }
+  }
 
   return 0;
 }
 
-static int refresh_lists(void) {
+/*
+  virConnectListAllDomains() appeared in 0.10.2
+  Note that LIBVIR_CHECK_VERSION appeared a year later, so
+  in some systems which actually have virConnectListAllDomains()
+  we can't detect this.
+ */
+#ifdef LIBVIR_CHECK_VERSION
+#if LIBVIR_CHECK_VERSION(0, 10, 2)
+#define HAVE_LIST_ALL_DOMAINS 1
+#endif
+#endif
+
+static int refresh_lists(struct lv_read_instance *inst) {
+  struct lv_read_state *state = &inst->read_state;
   int n;
 
   n = virConnectNumOfDomains(conn);
@@ -647,7 +1817,14 @@ static int refresh_lists(void) {
     return -1;
   }
 
+  lv_clean_read_state(state);
+
   if (n > 0) {
+#ifdef HAVE_LIST_ALL_DOMAINS
+    virDomainPtr *domains;
+    n = virConnectListAllDomains(conn, &domains,
+                                 VIR_CONNECT_LIST_DOMAINS_ACTIVE);
+#else
     int *domids;
 
     /* Get list of domains. */
@@ -658,31 +1835,38 @@ static int refresh_lists(void) {
     }
 
     n = virConnectListDomains(conn, domids, n);
+#endif
+
     if (n < 0) {
       VIRT_ERROR(conn, "reading list of domains");
+#ifndef HAVE_LIST_ALL_DOMAINS
       sfree(domids);
+#endif
       return -1;
     }
 
-    free_block_devices();
-    free_interface_devices();
-    free_domains();
-
     /* Fetch each domain and add it to the list, unless ignore. */
     for (int i = 0; i < n; ++i) {
-      virDomainPtr dom = NULL;
       const char *name;
       char *xml = NULL;
       xmlDocPtr xml_doc = NULL;
       xmlXPathContextPtr xpath_ctx = NULL;
       xmlXPathObjectPtr xpath_obj = NULL;
+      char tag[PARTITION_TAG_MAX_LEN] = {'\0'};
+      virDomainInfo info;
+      int status;
 
+#ifdef HAVE_LIST_ALL_DOMAINS
+      virDomainPtr dom = domains[i];
+#else
+      virDomainPtr dom = NULL;
       dom = virDomainLookupByID(conn, domids[i]);
       if (dom == NULL) {
         VIRT_ERROR(conn, "virDomainLookupByID");
         /* Could be that the domain went away -- ignore it anyway. */
         continue;
       }
+#endif
 
       name = virDomainGetName(dom);
       if (name == NULL) {
@@ -690,14 +1874,21 @@ static int refresh_lists(void) {
         goto cont;
       }
 
-      if (il_domains && ignorelist_match(il_domains, name) != 0)
-        goto cont;
+      status = virDomainGetInfo(dom, &info);
+      if (status != 0) {
+        ERROR(PLUGIN_NAME " plugin: virDomainGetInfo failed with status %i.",
+              status);
+        continue;
+      }
 
-      if (add_domain(dom) < 0) {
-        ERROR(PLUGIN_NAME " plugin: malloc failed.");
-        goto cont;
+      if (info.state != VIR_DOMAIN_RUNNING) {
+        DEBUG(PLUGIN_NAME " plugin: skipping inactive domain %s", name);
+        continue;
       }
 
+      if (il_domains && ignorelist_match(il_domains, name) != 0)
+        goto cont;
+
       /* Get a list of devices for this domain. */
       xml = virDomainGetXMLDesc(dom, 0);
       if (!xml) {
@@ -714,11 +1905,24 @@ static int refresh_lists(void) {
 
       xpath_ctx = xmlXPathNewContext(xml_doc);
 
+      if (lv_domain_get_tag(xpath_ctx, name, tag) < 0) {
+        ERROR(PLUGIN_NAME " plugin: lv_domain_get_tag failed.");
+        goto cont;
+      }
+
+      if (!lv_instance_include_domain(inst, name, tag))
+        goto cont;
+
+      if (add_domain(state, dom) < 0) {
+        ERROR(PLUGIN_NAME " plugin: malloc failed.");
+        goto cont;
+      }
+
       /* Block devices. */
-      char *bd_xmlpath = "/domain/devices/disk/target[@dev]";
+      const char *bd_xmlpath = "/domain/devices/disk/target[@dev]";
       if (blockdevice_format == source)
         bd_xmlpath = "/domain/devices/disk/source[@dev]";
-      xpath_obj = xmlXPathEval((xmlChar *)bd_xmlpath, xpath_ctx);
+      xpath_obj = xmlXPathEval((const xmlChar *)bd_xmlpath, xpath_ctx);
 
       if (xpath_obj == NULL || xpath_obj->type != XPATH_NODESET ||
           xpath_obj->nodesetval == NULL)
@@ -739,7 +1943,7 @@ static int refresh_lists(void) {
             ignore_device_match(il_block_devices, name, path) != 0)
           goto cont2;
 
-        add_block_device(dom, path);
+        add_block_device(state, dom, path);
       cont2:
         if (path)
           xmlFree(path);
@@ -785,7 +1989,7 @@ static int refresh_lists(void) {
              ignore_device_match(il_interface_devices, name, address) != 0))
           goto cont3;
 
-        add_interface_device(dom, path, address, j + 1);
+        add_interface_device(state, dom, path, address, j + 1);
       cont3:
         if (path)
           xmlFree(path);
@@ -803,60 +2007,74 @@ static int refresh_lists(void) {
       sfree(xml);
     }
 
+#ifdef HAVE_LIST_ALL_DOMAINS
+    sfree(domains);
+#else
     sfree(domids);
+#endif
   }
 
+  DEBUG(PLUGIN_NAME " plugin#%s: refreshing"
+                    " domains=%i block_devices=%i iface_devices=%i",
+        inst->tag, state->nr_domains, state->nr_block_devices,
+        state->nr_interface_devices);
+
   return 0;
 }
 
-static void free_domains(void) {
-  if (domains) {
-    for (int i = 0; i < nr_domains; ++i)
-      virDomainFree(domains[i]);
-    sfree(domains);
+static void free_domains(struct lv_read_state *state) {
+  if (state->domains) {
+    for (int i = 0; i < state->nr_domains; ++i)
+      virDomainFree(state->domains[i].ptr);
+    sfree(state->domains);
   }
-  domains = NULL;
-  nr_domains = 0;
+  state->domains = NULL;
+  state->nr_domains = 0;
 }
 
-static int add_domain(virDomainPtr dom) {
-  virDomainPtr *new_ptr;
-  int new_size = sizeof(domains[0]) * (nr_domains + 1);
+static int add_domain(struct lv_read_state *state, virDomainPtr dom) {
+  domain_t *new_ptr;
+  int new_size = sizeof(state->domains[0]) * (state->nr_domains + 1);
 
-  if (domains)
-    new_ptr = realloc(domains, new_size);
+  if (state->domains)
+    new_ptr = realloc(state->domains, new_size);
   else
     new_ptr = malloc(new_size);
 
   if (new_ptr == NULL)
     return -1;
 
-  domains = new_ptr;
-  domains[nr_domains] = dom;
-  return nr_domains++;
+  state->domains = new_ptr;
+  state->domains[state->nr_domains].ptr = dom;
+  memset(&state->domains[state->nr_domains].info, 0,
+         sizeof(state->domains[state->nr_domains].info));
+
+  return state->nr_domains++;
 }
 
-static void free_block_devices(void) {
-  if (block_devices) {
-    for (int i = 0; i < nr_block_devices; ++i)
-      sfree(block_devices[i].path);
-    sfree(block_devices);
+static void free_block_devices(struct lv_read_state *state) {
+  if (state->block_devices) {
+    for (int i = 0; i < state->nr_block_devices; ++i)
+      sfree(state->block_devices[i].path);
+    sfree(state->block_devices);
   }
-  block_devices = NULL;
-  nr_block_devices = 0;
+  state->block_devices = NULL;
+  state->nr_block_devices = 0;
 }
 
-static int add_block_device(virDomainPtr dom, const char *path) {
+static int add_block_device(struct lv_read_state *state, virDomainPtr dom,
+                            const char *path) {
   struct block_device *new_ptr;
-  int new_size = sizeof(block_devices[0]) * (nr_block_devices + 1);
+  int new_size =
+      sizeof(state->block_devices[0]) * (state->nr_block_devices + 1);
   char *path_copy;
 
   path_copy = strdup(path);
   if (!path_copy)
     return -1;
 
-  if (block_devices)
-    new_ptr = realloc(block_devices, new_size);
+  if (state->block_devices)
+    new_ptr = realloc(state->block_devices, new_size);
   else
     new_ptr = malloc(new_size);
 
@@ -864,29 +2082,31 @@ static int add_block_device(virDomainPtr dom, const char *path) {
     sfree(path_copy);
     return -1;
   }
-  block_devices = new_ptr;
-  block_devices[nr_block_devices].dom = dom;
-  block_devices[nr_block_devices].path = path_copy;
-  return nr_block_devices++;
+  state->block_devices = new_ptr;
+  state->block_devices[state->nr_block_devices].dom = dom;
+  state->block_devices[state->nr_block_devices].path = path_copy;
+  return state->nr_block_devices++;
 }
 
-static void free_interface_devices(void) {
-  if (interface_devices) {
-    for (int i = 0; i < nr_interface_devices; ++i) {
-      sfree(interface_devices[i].path);
-      sfree(interface_devices[i].address);
-      sfree(interface_devices[i].number);
+static void free_interface_devices(struct lv_read_state *state) {
+  if (state->interface_devices) {
+    for (int i = 0; i < state->nr_interface_devices; ++i) {
+      sfree(state->interface_devices[i].path);
+      sfree(state->interface_devices[i].address);
+      sfree(state->interface_devices[i].number);
     }
-    sfree(interface_devices);
+    sfree(state->interface_devices);
   }
-  interface_devices = NULL;
-  nr_interface_devices = 0;
+  state->interface_devices = NULL;
+  state->nr_interface_devices = 0;
 }
 
-static int add_interface_device(virDomainPtr dom, const char *path,
-                                const char *address, unsigned int number) {
+static int add_interface_device(struct lv_read_state *state, virDomainPtr dom,
+                                const char *path, const char *address,
+                                unsigned int number) {
   struct interface_device *new_ptr;
-  int new_size = sizeof(interface_devices[0]) * (nr_interface_devices + 1);
+  int new_size =
+      sizeof(state->interface_devices[0]) * (state->nr_interface_devices + 1);
   char *path_copy, *address_copy, number_string[15];
 
   if ((path == NULL) || (address == NULL))
@@ -904,8 +2124,8 @@ static int add_interface_device(virDomainPtr dom, const char *path,
 
   snprintf(number_string, sizeof(number_string), "interface-%u", number);
 
-  if (interface_devices)
-    new_ptr = realloc(interface_devices, new_size);
+  if (state->interface_devices)
+    new_ptr = realloc(state->interface_devices, new_size);
   else
     new_ptr = malloc(new_size);
 
@@ -914,12 +2134,13 @@ static int add_interface_device(virDomainPtr dom, const char *path,
     sfree(address_copy);
     return -1;
   }
-  interface_devices = new_ptr;
-  interface_devices[nr_interface_devices].dom = dom;
-  interface_devices[nr_interface_devices].path = path_copy;
-  interface_devices[nr_interface_devices].address = address_copy;
-  interface_devices[nr_interface_devices].number = strdup(number_string);
-  return nr_interface_devices++;
+  state->interface_devices = new_ptr;
+  state->interface_devices[state->nr_interface_devices].dom = dom;
+  state->interface_devices[state->nr_interface_devices].path = path_copy;
+  state->interface_devices[state->nr_interface_devices].address = address_copy;
+  state->interface_devices[state->nr_interface_devices].number =
+      strdup(number_string);
+  return state->nr_interface_devices++;
 }
 
 static int ignore_device_match(ignorelist_t *il, const char *domname,
@@ -930,7 +2151,7 @@ static int ignore_device_match(ignorelist_t *il, const char *domname,
   if ((domname == NULL) || (devpath == NULL))
     return 0;
 
-  n = sizeof(char) * (strlen(domname) + strlen(devpath) + 2);
+  n = strlen(domname) + strlen(devpath) + 2;
   name = malloc(n);
   if (name == NULL) {
     ERROR(PLUGIN_NAME " plugin: malloc failed.");
@@ -943,13 +2164,11 @@ static int ignore_device_match(ignorelist_t *il, const char *domname,
 }
 
 static int lv_shutdown(void) {
-  free_block_devices();
-  free_interface_devices();
-  free_domains();
+  for (int i = 0; i < nr_instances; ++i) {
+    lv_fini_instance(i);
+  }
 
-  if (conn != NULL)
-    virConnectClose(conn);
-  conn = NULL;
+  lv_disconnect();
 
   ignorelist_free(il_domains);
   il_domains = NULL;
@@ -964,10 +2183,5 @@ static int lv_shutdown(void) {
 void module_register(void) {
   plugin_register_config(PLUGIN_NAME, lv_config, config_keys, NR_CONFIG_KEYS);
   plugin_register_init(PLUGIN_NAME, lv_init);
-  plugin_register_read(PLUGIN_NAME, lv_read);
   plugin_register_shutdown(PLUGIN_NAME, lv_shutdown);
 }
-
-/*
- * vim: shiftwidth=4 tabstop=8 softtabstop=4 expandtab fdm=marker
- */
diff --git a/src/virt_test.c b/src/virt_test.c
new file mode 100644 (file)
index 0000000..cb3cc25
--- /dev/null
@@ -0,0 +1,207 @@
+/**
+ * collectd - src/virt_test.c
+ * Copyright (C) 2016 Francesco Romani <fromani at redhat.com>
+ * Based on
+ * collectd - src/ceph_test.c
+ * Copyright (C) 2015      Florian octo Forster
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; only version 2 of the License is applicable.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Florian octo Forster <octo at collectd.org>
+ **/
+
+#include "virt.c" /* sic */
+#include "testing.h"
+
+#include <unistd.h>
+
+static const char minimal_xml[] =
+    ""
+    "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+    "<domain type=\"kvm\" xmlns:ovirt=\"http://ovirt.org/vm/tune/1.0\">"
+    "  <metadata/>"
+    "</domain>";
+
+static const char minimal_metadata_xml[] =
+    ""
+    "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+    "<domain type=\"kvm\" xmlns:ovirt=\"http://ovirt.org/vm/tune/1.0\">"
+    "  <metadata>"
+    "    <ovirtmap:tag "
+    "xmlns:ovirtmap=\"http://ovirt.org/ovirtmap/tag/1.0\">virt-0</ovirtmap:tag>"
+    "  </metadata>"
+    "</domain>";
+
+struct xml_state {
+  xmlDocPtr xml_doc;
+  xmlXPathContextPtr xpath_ctx;
+  xmlXPathObjectPtr xpath_obj;
+  char tag[PARTITION_TAG_MAX_LEN];
+};
+
+static int init_state(struct xml_state *st, const char *xml) {
+  memset(st, 0, sizeof(*st));
+
+  st->xml_doc = xmlReadDoc((const xmlChar *)xml, NULL, NULL, XML_PARSE_NONET);
+  if (st->xml_doc == NULL) {
+    return -1;
+  }
+  st->xpath_ctx = xmlXPathNewContext(st->xml_doc);
+  if (st->xpath_ctx == NULL) {
+    return -1;
+  }
+  return 0;
+}
+
+static void fini_state(struct xml_state *st) {
+  if (st->xpath_ctx) {
+    xmlXPathFreeContext(st->xpath_ctx);
+    st->xpath_ctx = NULL;
+  }
+  if (st->xml_doc) {
+    xmlFreeDoc(st->xml_doc);
+    st->xml_doc = NULL;
+  }
+}
+
+#define TAG "virt-0"
+
+DEF_TEST(lv_domain_get_tag_no_metadata_xml) {
+  int err;
+  struct xml_state st;
+  err = init_state(&st, minimal_xml);
+  EXPECT_EQ_INT(0, err);
+
+  err = lv_domain_get_tag(st.xpath_ctx, "test", st.tag);
+
+  EXPECT_EQ_INT(0, err);
+  EXPECT_EQ_STR("", st.tag);
+
+  fini_state(&st);
+  return 0;
+}
+
+DEF_TEST(lv_domain_get_tag_valid_xml) {
+  int err;
+  struct xml_state st;
+  err = init_state(&st, minimal_metadata_xml);
+  EXPECT_EQ_INT(0, err);
+
+  err = lv_domain_get_tag(st.xpath_ctx, "test", st.tag);
+
+  EXPECT_EQ_INT(0, err);
+  EXPECT_EQ_STR(TAG, st.tag);
+
+  return 0;
+}
+
+DEF_TEST(lv_default_instance_include_domain_without_tag) {
+  struct lv_read_instance *inst = NULL;
+  int ret;
+
+  ret = lv_init_instance(0, lv_read);
+  inst = &(lv_read_user_data[0].inst);
+  EXPECT_EQ_STR("virt-0", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "");
+  EXPECT_EQ_INT(1, ret);
+
+  lv_fini_instance(0);
+  return 0;
+}
+
+DEF_TEST(lv_regular_instance_skip_domain_without_tag) {
+  struct lv_read_instance *inst = NULL;
+  int ret;
+
+  ret = lv_init_instance(1, lv_read);
+  inst = &(lv_read_user_data[1].inst);
+  EXPECT_EQ_STR("virt-1", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "");
+  EXPECT_EQ_INT(0, ret);
+
+  lv_fini_instance(0);
+  return 0;
+}
+
+DEF_TEST(lv_include_domain_matching_tags) {
+  struct lv_read_instance *inst = NULL;
+  int ret;
+
+  ret = lv_init_instance(0, lv_read);
+  inst = &(lv_read_user_data[0].inst);
+  EXPECT_EQ_STR("virt-0", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "virt-0");
+  EXPECT_EQ_INT(1, ret);
+
+  ret = lv_init_instance(1, lv_read);
+  inst = &(lv_read_user_data[1].inst);
+  EXPECT_EQ_STR("virt-1", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "virt-1");
+  EXPECT_EQ_INT(1, ret);
+
+  lv_fini_instance(0);
+  lv_fini_instance(1);
+  return 0;
+}
+
+DEF_TEST(lv_default_instance_include_domain_with_unknown_tag) {
+  struct lv_read_instance *inst = NULL;
+  int ret;
+
+  ret = lv_init_instance(0, lv_read);
+  inst = &(lv_read_user_data[0].inst);
+  EXPECT_EQ_STR("virt-0", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "unknownFormat-tag");
+  EXPECT_EQ_INT(1, ret);
+
+  lv_fini_instance(0);
+  return 0;
+}
+
+DEF_TEST(lv_regular_instance_skip_domain_with_unknown_tag) {
+  struct lv_read_instance *inst = NULL;
+  int ret;
+
+  ret = lv_init_instance(1, lv_read);
+  inst = &(lv_read_user_data[1].inst);
+  EXPECT_EQ_STR("virt-1", inst->tag);
+
+  ret = lv_instance_include_domain(inst, "testing", "unknownFormat-tag");
+  EXPECT_EQ_INT(0, ret);
+
+  lv_fini_instance(0);
+  return 0;
+}
+#undef TAG
+
+int main(void) {
+  RUN_TEST(lv_domain_get_tag_no_metadata_xml);
+  RUN_TEST(lv_domain_get_tag_valid_xml);
+
+  RUN_TEST(lv_default_instance_include_domain_without_tag);
+  RUN_TEST(lv_regular_instance_skip_domain_without_tag);
+  RUN_TEST(lv_include_domain_matching_tags);
+  RUN_TEST(lv_default_instance_include_domain_with_unknown_tag);
+  RUN_TEST(lv_regular_instance_skip_domain_with_unknown_tag);
+
+  END_TEST;
+}
+
+/* vim: set sw=2 sts=2 et : */
index cd9e7d2..ffe1826 100644 (file)
@@ -79,10 +79,10 @@ static int vmem_config(const char *key, const char *value) {
     else
       verbose_output = 0;
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* int vmem_config */
 
 static int vmem_read(void) {
@@ -107,7 +107,7 @@ static int vmem_read(void) {
     char errbuf[1024];
     ERROR("vmem plugin: fopen (/proc/vmstat) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -253,12 +253,10 @@ static int vmem_read(void) {
     submit_two(NULL, "vmpage_io", "swap", pswpin, pswpout);
 #endif /* KERNEL_LINUX */
 
-  return (0);
+  return 0;
 } /* int vmem_read */
 
 void module_register(void) {
   plugin_register_config("vmem", vmem_config, config_keys, config_keys_num);
   plugin_register_read("vmem", vmem_read);
 } /* void module_register */
-
-/* vim: set sw=2 sts=2 ts=8 : */
index c5a7fb3..a2ca0de 100644 (file)
@@ -49,7 +49,7 @@ static int vserver_init(void) {
    * What's the right thing to do, if there is no getpagesize ()? */
   pagesize = getpagesize();
 
-  return (0);
+  return 0;
 } /* static void vserver_init(void) */
 
 static void traffic_submit(const char *plugin_instance,
@@ -114,8 +114,8 @@ static derive_t vserver_get_sock_bytes(const char *s) {
 
   status = parse_value(s, &v, DS_TYPE_DERIVE);
   if (status != 0)
-    return (-1);
-  return (v.derive);
+    return -1;
+  return v.derive;
 }
 
 static int vserver_read(void) {
@@ -127,7 +127,7 @@ static int vserver_read(void) {
     char errbuf[1024];
     ERROR("vserver plugin: fopen (%s): %s", PROCDIR,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   while (42) {
@@ -154,7 +154,7 @@ static int vserver_read(void) {
       ERROR("vserver plugin: failed to read directory %s: %s", PROCDIR,
             sstrerror(errno, errbuf, sizeof(errbuf)));
       closedir(proc);
-      return (-1);
+      return -1;
     }
 
     if (dent->d_name[0] == '.')
@@ -314,12 +314,10 @@ static int vserver_read(void) {
 
   closedir(proc);
 
-  return (0);
+  return 0;
 } /* int vserver_read */
 
 void module_register(void) {
   plugin_register_init("vserver", vserver_init);
   plugin_register_read("vserver", vserver_read);
 } /* void module_register(void) */
-
-/* vim: set ts=4 sw=4 noexpandtab : */
index ae77ded..5552be6 100644 (file)
@@ -47,7 +47,7 @@ static double wireless_dbm_to_watt (double dbm)
 
        watt = pow (10.0, (dbm / 10.0)) / 1000.0;
 
-       return (watt);
+       return watt;
 }
 #endif
 
@@ -69,7 +69,7 @@ static void wireless_submit(const char *plugin_instance, const char *type,
 static double wireless_percent_to_power(double quality) {
   assert((quality >= 0.0) && (quality <= 100.0));
 
-  return ((quality * (POWER_MAX - POWER_MIN)) + POWER_MIN);
+  return (quality * (POWER_MAX - POWER_MIN)) + POWER_MIN;
 } /* double wireless_percent_to_power */
 
 static int wireless_read(void) {
@@ -92,7 +92,7 @@ static int wireless_read(void) {
   if ((fh = fopen(WIRELESS_PROC_FILE, "r")) == NULL) {
     char errbuf[1024];
     WARNING("wireless: fopen: %s", sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   devices_found = 0;
@@ -151,10 +151,10 @@ static int wireless_read(void) {
   /* If no wireless devices are present return an error, so the plugin
    * code delays our read function. */
   if (devices_found == 0)
-    return (-1);
+    return -1;
 #endif /* KERNEL_LINUX */
 
-  return (0);
+  return 0;
 } /* int wireless_read */
 
 void module_register(void) {
index b85ab47..206cdc2 100644 (file)
@@ -151,7 +151,7 @@ static int wg_send_buffer(struct wg_callback *cb) {
   ssize_t status;
 
   if (cb->sock_fd < 0)
-    return (-1);
+    return -1;
 
   status = swrite(cb->sock_fd, cb->send_buf, strlen(cb->send_buf));
   if (status != 0) {
@@ -166,10 +166,10 @@ static int wg_send_buffer(struct wg_callback *cb) {
     close(cb->sock_fd);
     cb->sock_fd = -1;
 
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 }
 
 /* NOTE: You must hold cb->send_lock when calling this function! */
@@ -186,18 +186,18 @@ static int wg_flush_nolock(cdtime_t timeout, struct wg_callback *cb) {
 
     now = cdtime();
     if ((cb->send_buf_init_time + timeout) > now)
-      return (0);
+      return 0;
   }
 
   if (cb->send_buf_fill == 0) {
     cb->send_buf_init_time = cdtime();
-    return (0);
+    return 0;
   }
 
   status = wg_send_buffer(cb);
   wg_reset_buffer(cb);
 
-  return (status);
+  return status;
 }
 
 static int wg_callback_init(struct wg_callback *cb) {
@@ -208,13 +208,13 @@ static int wg_callback_init(struct wg_callback *cb) {
   char connerr[1024] = "";
 
   if (cb->sock_fd > 0)
-    return (0);
+    return 0;
 
   /* Don't try to reconnect too often. By default, one reconnection attempt
    * is made per second. */
   now = cdtime();
   if ((now - cb->last_connect_time) < WG_MIN_RECONNECT_INTERVAL)
-    return (EAGAIN);
+    return EAGAIN;
   cb->last_connect_time = now;
 
   struct addrinfo ai_hints = {.ai_family = AF_UNSPEC,
@@ -229,7 +229,7 @@ static int wg_callback_init(struct wg_callback *cb) {
   if (status != 0) {
     ERROR("write_graphite plugin: getaddrinfo (%s, %s, %s) failed: %s",
           cb->node, cb->service, cb->protocol, gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   assert(ai_list != NULL);
@@ -270,7 +270,7 @@ static int wg_callback_init(struct wg_callback *cb) {
                "write_graphite plugin: Connecting to %s:%s via %s failed. "
                "The last error was: %s",
                cb->node, cb->service, cb->protocol, connerr);
-    return (-1);
+    return -1;
   } else {
     c_release(LOG_INFO, &cb->init_complaint,
               "write_graphite plugin: Successfully connected to %s:%s via %s.",
@@ -285,7 +285,7 @@ static int wg_callback_init(struct wg_callback *cb) {
   else
     cb->reconnect_interval_reached = 0;
 
-  return (0);
+  return 0;
 }
 
 static void wg_callback_free(void *data) {
@@ -324,7 +324,7 @@ static int wg_flush(cdtime_t timeout,
   int status;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   cb = user_data->data;
 
@@ -335,14 +335,14 @@ static int wg_flush(cdtime_t timeout,
     if (status != 0) {
       /* An error message has already been printed. */
       pthread_mutex_unlock(&cb->send_lock);
-      return (-1);
+      return -1;
     }
   }
 
   status = wg_flush_nolock(timeout, cb);
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (status);
+  return status;
 }
 
 static int wg_send_message(char const *message, struct wg_callback *cb) {
@@ -360,7 +360,7 @@ static int wg_send_message(char const *message, struct wg_callback *cb) {
     if (status != 0) {
       /* An error message has already been printed. */
       pthread_mutex_unlock(&cb->send_lock);
-      return (-1);
+      return -1;
     }
   }
 
@@ -368,7 +368,7 @@ static int wg_send_message(char const *message, struct wg_callback *cb) {
     status = wg_flush_nolock(/* timeout = */ 0, cb);
     if (status != 0) {
       pthread_mutex_unlock(&cb->send_lock);
-      return (status);
+      return status;
     }
   }
 
@@ -389,7 +389,7 @@ static int wg_send_message(char const *message, struct wg_callback *cb) {
 
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (0);
+  return 0;
 }
 
 static int wg_write_messages(const data_set_t *ds, const value_list_t *vl,
@@ -406,14 +406,14 @@ static int wg_write_messages(const data_set_t *ds, const value_list_t *vl,
   status = format_graphite(buffer, sizeof(buffer), ds, vl, cb->prefix,
                            cb->postfix, cb->escape_char, cb->format_flags);
   if (status != 0) /* error message has been printed already. */
-    return (status);
+    return status;
 
   /* Send the message to graphite */
   status = wg_send_message(buffer, cb);
   if (status != 0) /* error message has been printed already. */
-    return (status);
+    return status;
 
-  return (0);
+  return 0;
 } /* int wg_write_messages */
 
 static int wg_write(const data_set_t *ds, const value_list_t *vl,
@@ -422,13 +422,13 @@ static int wg_write(const data_set_t *ds, const value_list_t *vl,
   int status;
 
   if (user_data == NULL)
-    return (EINVAL);
+    return EINVAL;
 
   cb = user_data->data;
 
   status = wg_write_messages(ds, vl, cb);
 
-  return (status);
+  return status;
 }
 
 static int config_set_char(char *dest, oconfig_item_t *ci) {
@@ -437,12 +437,12 @@ static int config_set_char(char *dest, oconfig_item_t *ci) {
 
   status = cf_util_get_string_buffer(ci, buffer, sizeof(buffer));
   if (status != 0)
-    return (status);
+    return status;
 
   if (buffer[0] == 0) {
     ERROR("write_graphite plugin: Cannot use an empty string for the "
           "\"EscapeCharacter\" option.");
-    return (-1);
+    return -1;
   }
 
   if (buffer[1] != 0) {
@@ -453,7 +453,7 @@ static int config_set_char(char *dest, oconfig_item_t *ci) {
 
   *dest = buffer[0];
 
-  return (0);
+  return 0;
 }
 
 static int wg_config_node(oconfig_item_t *ci) {
@@ -464,7 +464,7 @@ static int wg_config_node(oconfig_item_t *ci) {
   cb = calloc(1, sizeof(*cb));
   if (cb == NULL) {
     ERROR("write_graphite plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   cb->sock_fd = -1;
   cb->name = NULL;
@@ -485,7 +485,7 @@ static int wg_config_node(oconfig_item_t *ci) {
     status = cf_util_get_string(ci, &cb->name);
     if (status != 0) {
       wg_callback_free(cb);
-      return (status);
+      return status;
     }
   }
 
@@ -540,7 +540,7 @@ static int wg_config_node(oconfig_item_t *ci) {
 
   if (status != 0) {
     wg_callback_free(cb);
-    return (status);
+    return status;
   }
 
   /* FIXME: Legacy configuration syntax. */
@@ -558,7 +558,7 @@ static int wg_config_node(oconfig_item_t *ci) {
 
   plugin_register_flush(callback_name, wg_flush, &(user_data_t){.data = cb});
 
-  return (0);
+  return 0;
 }
 
 static int wg_config(oconfig_item_t *ci) {
@@ -577,11 +577,9 @@ static int wg_config(oconfig_item_t *ci) {
     }
   }
 
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
   plugin_register_complex_config("write_graphite", wg_config);
 }
-
-/* vim: set sw=4 ts=4 sts=4 tw=78 et : */
index c1b3f0b..d5c91d9 100644 (file)
@@ -78,9 +78,14 @@ struct wh_callback_s {
   cdtime_t send_buffer_init_time;
 
   pthread_mutex_t send_lock;
+
+  int data_ttl;
 };
 typedef struct wh_callback_s wh_callback_t;
 
+static char **http_attrs;
+static size_t http_attrs_num;
+
 static void wh_log_http_error(wh_callback_t *cb) {
   if (!cb->log_http_error)
     return;
@@ -124,18 +129,18 @@ static int wh_post_nolock(wh_callback_t *cb, char const *data) /* {{{ */
           "status %i: %s",
           status, cb->curl_errbuf);
   }
-  return (status);
+  return status;
 } /* }}} wh_post_nolock */
 
 static int wh_callback_init(wh_callback_t *cb) /* {{{ */
 {
   if (cb->curl != NULL)
-    return (0);
+    return 0;
 
   cb->curl = curl_easy_init();
   if (cb->curl == NULL) {
     ERROR("curl plugin: curl_easy_init failed.");
-    return (-1);
+    return -1;
   }
 
   if (cb->low_speed_limit > 0 && cb->low_speed_time > 0) {
@@ -182,7 +187,7 @@ static int wh_callback_init(wh_callback_t *cb) /* {{{ */
     cb->credentials = malloc(credentials_size);
     if (cb->credentials == NULL) {
       ERROR("curl plugin: malloc failed.");
-      return (-1);
+      return -1;
     }
 
     ssnprintf(cb->credentials, credentials_size, "%s:%s", cb->user,
@@ -210,7 +215,7 @@ static int wh_callback_init(wh_callback_t *cb) /* {{{ */
 
   wh_reset_buffer(cb);
 
-  return (0);
+  return 0;
 } /* }}} int wh_callback_init */
 
 static int wh_flush_nolock(cdtime_t timeout, wh_callback_t *cb) /* {{{ */
@@ -227,13 +232,13 @@ static int wh_flush_nolock(cdtime_t timeout, wh_callback_t *cb) /* {{{ */
 
     now = cdtime();
     if ((cb->send_buffer_init_time + timeout) > now)
-      return (0);
+      return 0;
   }
 
   if (cb->format == WH_FORMAT_COMMAND) {
     if (cb->send_buffer_fill == 0) {
       cb->send_buffer_init_time = cdtime();
-      return (0);
+      return 0;
     }
 
     status = wh_post_nolock(cb, cb->send_buffer);
@@ -241,7 +246,7 @@ static int wh_flush_nolock(cdtime_t timeout, wh_callback_t *cb) /* {{{ */
   } else if (cb->format == WH_FORMAT_JSON || cb->format == WH_FORMAT_KAIROSDB) {
     if (cb->send_buffer_fill <= 2) {
       cb->send_buffer_init_time = cdtime();
-      return (0);
+      return 0;
     }
 
     status = format_json_finalize(cb->send_buffer, &cb->send_buffer_fill,
@@ -250,7 +255,7 @@ static int wh_flush_nolock(cdtime_t timeout, wh_callback_t *cb) /* {{{ */
       ERROR("write_http: wh_flush_nolock: "
             "format_json_finalize failed.");
       wh_reset_buffer(cb);
-      return (status);
+      return status;
     }
 
     status = wh_post_nolock(cb, cb->send_buffer);
@@ -259,10 +264,10 @@ static int wh_flush_nolock(cdtime_t timeout, wh_callback_t *cb) /* {{{ */
     ERROR("write_http: wh_flush_nolock: "
           "Unknown format: %i",
           cb->format);
-    return (-1);
+    return -1;
   }
 
-  return (status);
+  return status;
 } /* }}} wh_flush_nolock */
 
 static int wh_flush(cdtime_t timeout, /* {{{ */
@@ -272,7 +277,7 @@ static int wh_flush(cdtime_t timeout, /* {{{ */
   int status;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   cb = user_data->data;
 
@@ -281,13 +286,13 @@ static int wh_flush(cdtime_t timeout, /* {{{ */
   if (wh_callback_init(cb) != 0) {
     ERROR("write_http plugin: wh_callback_init failed.");
     pthread_mutex_unlock(&cb->send_lock);
-    return (-1);
+    return -1;
   }
 
   status = wh_flush_nolock(timeout, cb);
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (status);
+  return status;
 } /* }}} int wh_flush */
 
 static void wh_callback_free(void *data) /* {{{ */
@@ -351,7 +356,7 @@ static int wh_write_command(const data_set_t *ds,
   status = FORMAT_VL(key, sizeof(key), vl);
   if (status != 0) {
     ERROR("write_http plugin: error with format_name");
-    return (status);
+    return status;
   }
   escape_string(key, sizeof(key));
 
@@ -361,7 +366,7 @@ static int wh_write_command(const data_set_t *ds,
   if (status != 0) {
     ERROR("write_http plugin: error with "
           "wh_value_list_to_string");
-    return (status);
+    return status;
   }
 
   command_len = (size_t)ssnprintf(command, sizeof(command),
@@ -371,21 +376,21 @@ static int wh_write_command(const data_set_t *ds,
     ERROR("write_http plugin: Command buffer too small: "
           "Need %zu bytes.",
           command_len + 1);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_lock(&cb->send_lock);
   if (wh_callback_init(cb) != 0) {
     ERROR("write_http plugin: wh_callback_init failed.");
     pthread_mutex_unlock(&cb->send_lock);
-    return (-1);
+    return -1;
   }
 
   if (command_len >= cb->send_buffer_free) {
     status = wh_flush_nolock(/* timeout = */ 0, cb);
     if (status != 0) {
       pthread_mutex_unlock(&cb->send_lock);
-      return (status);
+      return status;
     }
   }
   assert(command_len < cb->send_buffer_free);
@@ -407,7 +412,7 @@ static int wh_write_command(const data_set_t *ds,
   /* Check if we have enough space for this command. */
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (0);
+  return 0;
 } /* }}} int wh_write_command */
 
 static int wh_write_json(const data_set_t *ds, const value_list_t *vl, /* {{{ */
@@ -418,7 +423,7 @@ static int wh_write_json(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   if (wh_callback_init(cb) != 0) {
     ERROR("write_http plugin: wh_callback_init failed.");
     pthread_mutex_unlock(&cb->send_lock);
-    return (-1);
+    return -1;
   }
 
   status =
@@ -429,7 +434,7 @@ static int wh_write_json(const data_set_t *ds, const value_list_t *vl, /* {{{ */
     if (status != 0) {
       wh_reset_buffer(cb);
       pthread_mutex_unlock(&cb->send_lock);
-      return (status);
+      return status;
     }
 
     status =
@@ -438,7 +443,7 @@ static int wh_write_json(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   }
   if (status != 0) {
     pthread_mutex_unlock(&cb->send_lock);
-    return (status);
+    return status;
   }
 
   DEBUG("write_http plugin: <%s> buffer %zu/%zu (%g%%)", cb->location,
@@ -449,7 +454,7 @@ static int wh_write_json(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   /* Check if we have enough space for this command. */
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (0);
+  return 0;
 } /* }}} int wh_write_json */
 
 static int wh_write_kairosdb(const data_set_t *ds,
@@ -464,28 +469,30 @@ static int wh_write_kairosdb(const data_set_t *ds,
     if (status != 0) {
       ERROR("write_http plugin: wh_callback_init failed.");
       pthread_mutex_unlock(&cb->send_lock);
-      return (-1);
+      return -1;
     }
   }
 
-  status = format_kairosdb_value_list(cb->send_buffer, &cb->send_buffer_fill,
-                                      &cb->send_buffer_free, ds, vl,
-                                      cb->store_rates);
+  status = format_kairosdb_value_list(
+      cb->send_buffer, &cb->send_buffer_fill, &cb->send_buffer_free, ds, vl,
+      cb->store_rates, (char const *const *)http_attrs, http_attrs_num,
+      cb->data_ttl);
   if (status == -ENOMEM) {
     status = wh_flush_nolock(/* timeout = */ 0, cb);
     if (status != 0) {
       wh_reset_buffer(cb);
       pthread_mutex_unlock(&cb->send_lock);
-      return (status);
+      return status;
     }
 
-    status = format_kairosdb_value_list(cb->send_buffer, &cb->send_buffer_fill,
-                                        &cb->send_buffer_free, ds, vl,
-                                        cb->store_rates);
+    status = format_kairosdb_value_list(
+        cb->send_buffer, &cb->send_buffer_fill, &cb->send_buffer_free, ds, vl,
+        cb->store_rates, (char const *const *)http_attrs, http_attrs_num,
+        cb->data_ttl);
   }
   if (status != 0) {
     pthread_mutex_unlock(&cb->send_lock);
-    return (status);
+    return status;
   }
 
   DEBUG("write_http plugin: <%s> buffer %zu/%zu (%g%%)", cb->location,
@@ -496,7 +503,7 @@ static int wh_write_kairosdb(const data_set_t *ds,
   /* Check if we have enough space for this command. */
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (0);
+  return 0;
 } /* }}} int wh_write_kairosdb */
 
 static int wh_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
@@ -505,7 +512,7 @@ static int wh_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
   int status;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   cb = user_data->data;
   assert(cb->send_metrics);
@@ -521,7 +528,7 @@ static int wh_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */
     status = wh_write_command(ds, vl, cb);
     break;
   }
-  return (status);
+  return status;
 } /* }}} int wh_write */
 
 static int wh_notify(notification_t const *n, user_data_t *ud) /* {{{ */
@@ -531,7 +538,7 @@ static int wh_notify(notification_t const *n, user_data_t *ud) /* {{{ */
   int status;
 
   if ((ud == NULL) || (ud->data == NULL))
-    return (EINVAL);
+    return EINVAL;
 
   cb = ud->data;
   assert(cb->send_notifications);
@@ -546,13 +553,13 @@ static int wh_notify(notification_t const *n, user_data_t *ud) /* {{{ */
   if (wh_callback_init(cb) != 0) {
     ERROR("write_http plugin: wh_callback_init failed.");
     pthread_mutex_unlock(&cb->send_lock);
-    return (-1);
+    return -1;
   }
 
   status = wh_post_nolock(cb, alert);
   pthread_mutex_unlock(&cb->send_lock);
 
-  return (status);
+  return status;
 } /* }}} int wh_notify */
 
 static int config_set_format(wh_callback_t *cb, /* {{{ */
@@ -563,7 +570,7 @@ static int config_set_format(wh_callback_t *cb, /* {{{ */
     WARNING("write_http plugin: The `%s' config option "
             "needs exactly one string argument.",
             ci->key);
-    return (-1);
+    return -1;
   }
 
   string = ci->values[0].value.string;
@@ -575,10 +582,10 @@ static int config_set_format(wh_callback_t *cb, /* {{{ */
     cb->format = WH_FORMAT_KAIROSDB;
   else {
     ERROR("write_http plugin: Invalid format string: %s", string);
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int config_set_format */
 
 static int wh_config_append_string(const char *name,
@@ -587,16 +594,16 @@ static int wh_config_append_string(const char *name,
   struct curl_slist *temp = NULL;
   if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) {
     WARNING("write_http plugin: `%s' needs exactly one string argument.", name);
-    return (-1);
+    return -1;
   }
 
   temp = curl_slist_append(*dest, ci->values[0].value.string);
   if (temp == NULL)
-    return (-1);
+    return -1;
 
   *dest = temp;
 
-  return (0);
+  return 0;
 } /* }}} int wh_config_append_string */
 
 static int wh_config_node(oconfig_item_t *ci) /* {{{ */
@@ -609,7 +616,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
   cb = calloc(1, sizeof(*cb));
   if (cb == NULL) {
     ERROR("write_http plugin: calloc failed.");
-    return (-1);
+    return -1;
   }
   cb->verify_peer = 1;
   cb->verify_host = 1;
@@ -621,6 +628,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
   cb->headers = NULL;
   cb->send_metrics = 1;
   cb->send_notifications = 0;
+  cb->data_ttl = 0;
 
   pthread_mutex_init(&cb->send_lock, /* attr = */ NULL);
 
@@ -703,7 +711,36 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
       status = cf_util_get_boolean(child, &cb->log_http_error);
     else if (strcasecmp("Header", child->key) == 0)
       status = wh_config_append_string("Header", &cb->headers, child);
-    else {
+    else if (strcasecmp("Attribute", child->key) == 0) {
+      char *key = NULL;
+      char *val = NULL;
+
+      if (child->values_num != 2) {
+        WARNING("write_http plugin: Attribute need both a key and a value.");
+        break;
+      }
+      if (child->values[0].type != OCONFIG_TYPE_STRING ||
+          child->values[1].type != OCONFIG_TYPE_STRING) {
+        WARNING("write_http plugin: Attribute needs string arguments.");
+        break;
+      }
+      if ((key = strdup(child->values[0].value.string)) == NULL) {
+        WARNING("cannot allocate memory for attribute key.");
+        break;
+      }
+      if ((val = strdup(child->values[1].value.string)) == NULL) {
+        WARNING("cannot allocate memory for attribute value.");
+        sfree(key);
+        break;
+      }
+      strarray_add(&http_attrs, &http_attrs_num, key);
+      strarray_add(&http_attrs, &http_attrs_num, val);
+      DEBUG("write_http plugin: got attribute: %s => %s", key, val);
+      sfree(key);
+      sfree(val);
+    } else if (strcasecmp("TTL", child->key) == 0) {
+      status = cf_util_get_int(child, &cb->data_ttl);
+    } else {
       ERROR("write_http plugin: Invalid configuration "
             "option: %s.",
             child->key);
@@ -716,13 +753,13 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
 
   if (status != 0) {
     wh_callback_free(cb);
-    return (status);
+    return status;
   }
 
   if (cb->location == NULL) {
     ERROR("write_http plugin: no URL defined for instance '%s'", cb->name);
     wh_callback_free(cb);
-    return (-1);
+    return -1;
   }
 
   if (!cb->send_metrics && !cb->send_notifications) {
@@ -730,7 +767,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
           "are enabled for \"%s\".",
           cb->name);
     wh_callback_free(cb);
-    return (-1);
+    return -1;
   }
 
   if (cb->low_speed_limit > 0)
@@ -749,7 +786,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
   if (cb->send_buffer == NULL) {
     ERROR("write_http plugin: malloc(%zu) failed.", cb->send_buffer_size);
     wh_callback_free(cb);
-    return (-1);
+    return -1;
   }
   /* Nulls the buffer and sets ..._free and ..._fill. */
   wh_reset_buffer(cb);
@@ -774,7 +811,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
     user_data.free_func = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int wh_config_node */
 
 static int wh_config(oconfig_item_t *ci) /* {{{ */
@@ -796,7 +833,7 @@ static int wh_config(oconfig_item_t *ci) /* {{{ */
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int wh_config */
 
 static int wh_init(void) /* {{{ */
@@ -804,7 +841,7 @@ 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);
+  return 0;
 } /* }}} int wh_init */
 
 void module_register(void) /* {{{ */
@@ -812,5 +849,3 @@ 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 : */
index 306d92c..ca400ac 100644 (file)
@@ -113,12 +113,12 @@ static int kafka_handle(struct kafka_topic_context *ctx) /* {{{ */
   rd_kafka_topic_conf_t *topic_conf;
 
   if (ctx->kafka != NULL && ctx->topic != NULL)
-    return (0);
+    return 0;
 
   if (ctx->kafka == NULL) {
     if ((conf = rd_kafka_conf_dup(ctx->kafka_conf)) == NULL) {
       ERROR("write_kafka plugin: cannot duplicate kafka config");
-      return (1);
+      return 1;
     }
 
     if ((ctx->kafka = rd_kafka_new(RD_KAFKA_PRODUCER, conf, errbuf,
@@ -158,7 +158,7 @@ static int kafka_handle(struct kafka_topic_context *ctx) /* {{{ */
          rd_kafka_topic_name(ctx->topic));
   }
 
-  return (0);
+  return 0;
 
 } /* }}} int kafka_handle */
 
@@ -481,7 +481,7 @@ static int kafka_config(oconfig_item_t *ci) /* {{{ */
   }
   if (conf != NULL)
     rd_kafka_conf_destroy(conf);
-  return (0);
+  return 0;
 errout:
   if (conf != NULL)
     rd_kafka_conf_destroy(conf);
index 2d34b21..fdc99ef 100644 (file)
@@ -54,11 +54,11 @@ static int wl_write_graphite(const data_set_t *ds, const value_list_t *vl) {
 
   status = format_graphite(buffer, sizeof(buffer), ds, vl, NULL, NULL, '_', 0);
   if (status != 0) /* error message has been printed already. */
-    return (status);
+    return status;
 
   INFO("write_log values:\n%s", buffer);
 
-  return (0);
+  return 0;
 } /* int wl_write_graphite */
 
 static int wl_write_json(const data_set_t *ds, const value_list_t *vl) {
@@ -78,7 +78,7 @@ static int wl_write_json(const data_set_t *ds, const value_list_t *vl) {
 
   INFO("write_log values:\n%s", buffer);
 
-  return (0);
+  return 0;
 } /* int wl_write_json */
 
 static int wl_write(const data_set_t *ds, const value_list_t *vl,
@@ -91,7 +91,7 @@ static int wl_write(const data_set_t *ds, const value_list_t *vl,
     status = wl_write_json(ds, vl);
   }
 
-  return (status);
+  return status;
 }
 
 static int wl_config(oconfig_item_t *ci) /* {{{ */
@@ -119,16 +119,16 @@ static int wl_config(oconfig_item_t *ci) /* {{{ */
       else {
         ERROR("write_log plugin: Unknown format `%s' for option `%s'.", str,
               child->key);
-        return (-EINVAL);
+        return -EINVAL;
       }
     } else {
       ERROR("write_log plugin: Invalid configuration option: `%s'.",
             child->key);
-      return (-EINVAL);
+      return -EINVAL;
     }
   }
 
-  return (0);
+  return 0;
 } /* }}} int wl_config */
 
 void module_register(void) {
@@ -136,5 +136,3 @@ void module_register(void) {
   /* If config is supplied, the global wl_format will be set. */
   plugin_register_write("write_log", wl_write, NULL);
 }
-
-/* vim: set sw=4 ts=4 sts=4 tw=78 et : */
index e175e1f..e90900e 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2010-2013  Florian Forster
  * Copyright (C) 2010       Akkarit Sangpetch
  * Copyright (C) 2012       Chris Lundquist
+ * Copyright (C) 2017       Saikrishna Arcot
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -26,6 +27,7 @@
  *   Florian Forster <octo at collectd.org>
  *   Akkarit Sangpetch <asangpet at andrew.cmu.edu>
  *   Chris Lundquist <clundquist at bluebox.net>
+ *   Saikrishna Arcot <saiarcot895 at gmail.com>
  **/
 
 #include "collectd.h"
 #include "plugin.h"
 #include "utils_cache.h"
 
-#if HAVE_STDINT_H
-#define MONGO_HAVE_STDINT 1
-#else
-#define MONGO_USE_LONG_LONG_INT 1
-#endif
-#include <mongo.h>
-
-#if (MONGO_MAJOR == 0) && (MONGO_MINOR < 8)
-#define bson_alloc() bson_create()
-#define bson_dealloc(b) bson_dispose(b)
-#endif
+#include <mongoc.h>
 
 struct wm_node_s {
   char name[DATA_MAX_NAME_LEN];
@@ -59,8 +51,10 @@ struct wm_node_s {
   char *passwd;
 
   _Bool store_rates;
+  _Bool connected;
 
-  mongo conn[1];
+  mongoc_client_t *client;
+  mongoc_database_t *database;
   pthread_mutex_t lock;
 };
 typedef struct wm_node_s wm_node_t;
@@ -68,170 +62,222 @@ typedef struct wm_node_s wm_node_t;
 /*
  * Functions
  */
-static bson *wm_create_bson(const data_set_t *ds, /* {{{ */
-                            const value_list_t *vl, _Bool store_rates) {
-  bson *ret;
+static bson_t *wm_create_bson(const data_set_t *ds, /* {{{ */
+                              const value_list_t *vl, _Bool store_rates) {
+  bson_t *ret;
+  bson_t subarray;
   gauge_t *rates;
 
-  ret = bson_alloc(); /* matched by bson_dealloc() */
-  if (ret == NULL) {
-    ERROR("write_mongodb plugin: bson_create failed.");
-    return (NULL);
+  ret = bson_new();
+  if (!ret) {
+    ERROR("write_mongodb plugin: bson_new failed.");
+    return NULL;
   }
 
   if (store_rates) {
     rates = uc_get_rate(ds, vl);
     if (rates == NULL) {
       ERROR("write_mongodb plugin: uc_get_rate() failed.");
-      return (NULL);
+      bson_destroy(ret);
+      return NULL;
     }
   } else {
     rates = NULL;
   }
 
-  bson_init(ret); /* matched by bson_destroy() */
-  bson_append_date(ret, "time", (bson_date_t)CDTIME_T_TO_MS(vl->time));
-  bson_append_string(ret, "host", vl->host);
-  bson_append_string(ret, "plugin", vl->plugin);
-  bson_append_string(ret, "plugin_instance", vl->plugin_instance);
-  bson_append_string(ret, "type", vl->type);
-  bson_append_string(ret, "type_instance", vl->type_instance);
+  BSON_APPEND_DATE_TIME(ret, "timestamp", CDTIME_T_TO_MS(vl->time));
+  BSON_APPEND_UTF8(ret, "host", vl->host);
+  BSON_APPEND_UTF8(ret, "plugin", vl->plugin);
+  BSON_APPEND_UTF8(ret, "plugin_instance", vl->plugin_instance);
+  BSON_APPEND_UTF8(ret, "type", vl->type);
+  BSON_APPEND_UTF8(ret, "type_instance", vl->type_instance);
 
-  bson_append_start_array(ret, "values"); /* {{{ */
+  BSON_APPEND_ARRAY_BEGIN(ret, "values", &subarray); /* {{{ */
   for (int i = 0; i < ds->ds_num; i++) {
     char key[16];
 
     ssnprintf(key, sizeof(key), "%i", i);
 
     if (ds->ds[i].type == DS_TYPE_GAUGE)
-      bson_append_double(ret, key, vl->values[i].gauge);
+      BSON_APPEND_DOUBLE(&subarray, key, vl->values[i].gauge);
     else if (store_rates)
-      bson_append_double(ret, key, (double)rates[i]);
+      BSON_APPEND_DOUBLE(&subarray, key, (double)rates[i]);
     else if (ds->ds[i].type == DS_TYPE_COUNTER)
-      bson_append_long(ret, key, vl->values[i].counter);
+      BSON_APPEND_INT64(&subarray, key, vl->values[i].counter);
     else if (ds->ds[i].type == DS_TYPE_DERIVE)
-      bson_append_long(ret, key, vl->values[i].derive);
+      BSON_APPEND_INT64(&subarray, key, vl->values[i].derive);
     else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
-      bson_append_long(ret, key, vl->values[i].absolute);
-    else
-      assert(23 == 42);
+      BSON_APPEND_INT64(&subarray, key, vl->values[i].absolute);
+    else {
+      ERROR("write_mongodb plugin: Unknown ds_type %d for index %d",
+            ds->ds[i].type, i);
+      bson_destroy(ret);
+      return NULL;
+    }
   }
-  bson_append_finish_array(ret); /* }}} values */
+  bson_append_array_end(ret, &subarray); /* }}} values */
 
-  bson_append_start_array(ret, "dstypes"); /* {{{ */
+  BSON_APPEND_ARRAY_BEGIN(ret, "dstypes", &subarray); /* {{{ */
   for (int i = 0; i < ds->ds_num; i++) {
     char key[16];
 
     ssnprintf(key, sizeof(key), "%i", i);
 
     if (store_rates)
-      bson_append_string(ret, key, "gauge");
+      BSON_APPEND_UTF8(&subarray, key, "gauge");
     else
-      bson_append_string(ret, key, DS_TYPE_TO_STRING(ds->ds[i].type));
+      BSON_APPEND_UTF8(&subarray, key, DS_TYPE_TO_STRING(ds->ds[i].type));
   }
-  bson_append_finish_array(ret); /* }}} dstypes */
+  bson_append_array_end(ret, &subarray); /* }}} dstypes */
 
-  bson_append_start_array(ret, "dsnames"); /* {{{ */
+  BSON_APPEND_ARRAY_BEGIN(ret, "dsnames", &subarray); /* {{{ */
   for (int i = 0; i < ds->ds_num; i++) {
     char key[16];
 
     ssnprintf(key, sizeof(key), "%i", i);
-    bson_append_string(ret, key, ds->ds[i].name);
+    BSON_APPEND_UTF8(&subarray, key, ds->ds[i].name);
   }
-  bson_append_finish_array(ret); /* }}} dsnames */
-
-  bson_finish(ret);
+  bson_append_array_end(ret, &subarray); /* }}} dsnames */
 
   sfree(rates);
-  return (ret);
+
+  size_t error_location;
+  if (!bson_validate(ret, BSON_VALIDATE_UTF8, &error_location)) {
+    ERROR("write_mongodb plugin: Error in generated BSON document "
+          "at byte %zu",
+          error_location);
+    bson_destroy(ret);
+    return NULL;
+  }
+
+  return ret;
 } /* }}} bson *wm_create_bson */
 
+static int wm_initialize(wm_node_t *node) /* {{{ */
+{
+  char *uri;
+
+  if (node->connected)
+    return 0;
+
+  INFO("write_mongodb plugin: Connecting to [%s]:%d", node->host, node->port);
+
+  if ((node->db != NULL) && (node->user != NULL) && (node->passwd != NULL)) {
+    uri = ssnprintf_alloc("mongodb://%s:%s@%s:%d/?authSource=%s", node->user,
+                          node->passwd, node->host, node->port, node->db);
+    if (uri == NULL) {
+      ERROR("write_mongodb plugin: Not enough memory to assemble "
+            "authentication string.");
+      mongoc_client_destroy(node->client);
+      node->client = NULL;
+      node->connected = 0;
+      return -1;
+    }
+
+    node->client = mongoc_client_new(uri);
+    if (!node->client) {
+      ERROR("write_mongodb plugin: Authenticating to [%s]:%d for database "
+            "\"%s\" as user \"%s\" failed.",
+            node->host, node->port, node->db, node->user);
+      node->connected = 0;
+      sfree(uri);
+      return -1;
+    }
+  } else {
+    uri = ssnprintf_alloc("mongodb://%s:%d", node->host, node->port);
+    if (uri == NULL) {
+      ERROR("write_mongodb plugin: Not enough memory to assemble "
+            "authentication string.");
+      mongoc_client_destroy(node->client);
+      node->client = NULL;
+      node->connected = 0;
+      return -1;
+    }
+
+    node->client = mongoc_client_new(uri);
+    if (!node->client) {
+      ERROR("write_mongodb plugin: Connecting to [%s]:%d failed.", node->host,
+            node->port);
+      node->connected = 0;
+      sfree(uri);
+      return -1;
+    }
+    sfree(uri);
+  }
+
+  node->database = mongoc_client_get_database(node->client, "collectd");
+  if (!node->database) {
+    ERROR("write_mongodb plugin: error creating/getting database");
+    mongoc_client_destroy(node->client);
+    node->client = NULL;
+    node->connected = 0;
+    return -1;
+  }
+
+  node->connected = 1;
+  return 0;
+} /* }}} int wm_initialize */
+
 static int wm_write(const data_set_t *ds, /* {{{ */
                     const value_list_t *vl, user_data_t *ud) {
   wm_node_t *node = ud->data;
-  char collection_name[512];
-  bson *bson_record;
+  mongoc_collection_t *collection = NULL;
+  bson_t *bson_record;
+  bson_error_t error;
   int status;
 
-  ssnprintf(collection_name, sizeof(collection_name), "collectd.%s",
-            vl->plugin);
-
   bson_record = wm_create_bson(ds, vl, node->store_rates);
-  if (bson_record == NULL)
-    return (ENOMEM);
+  if (!bson_record) {
+    ERROR("write_mongodb plugin: error making insert bson");
+    return -1;
+  }
 
   pthread_mutex_lock(&node->lock);
-
-  if (!mongo_is_connected(node->conn)) {
-    INFO("write_mongodb plugin: Connecting to [%s]:%i",
-         (node->host != NULL) ? node->host : "localhost",
-         (node->port != 0) ? node->port : MONGO_DEFAULT_PORT);
-    status = mongo_connect(node->conn, node->host, node->port);
-    if (status != MONGO_OK) {
-      ERROR("write_mongodb plugin: Connecting to [%s]:%i failed.",
-            (node->host != NULL) ? node->host : "localhost",
-            (node->port != 0) ? node->port : MONGO_DEFAULT_PORT);
-      mongo_destroy(node->conn);
-      pthread_mutex_unlock(&node->lock);
-      return (-1);
-    }
-
-    if ((node->db != NULL) && (node->user != NULL) && (node->passwd != NULL)) {
-      status = mongo_cmd_authenticate(node->conn, node->db, node->user,
-                                      node->passwd);
-      if (status != MONGO_OK) {
-        ERROR("write_mongodb plugin: Authenticating to [%s]%i for database "
-              "\"%s\" as user \"%s\" failed.",
-              (node->host != NULL) ? node->host : "localhost",
-              (node->port != 0) ? node->port : MONGO_DEFAULT_PORT, node->db,
-              node->user);
-        mongo_destroy(node->conn);
-        pthread_mutex_unlock(&node->lock);
-        return (-1);
-      }
-    }
-
-    if (node->timeout > 0) {
-      status = mongo_set_op_timeout(node->conn, node->timeout);
-      if (status != MONGO_OK) {
-        WARNING("write_mongodb plugin: mongo_set_op_timeout(%i) failed: %s",
-                node->timeout, node->conn->errstr);
-      }
-    }
+  if (wm_initialize(node) < 0) {
+    ERROR("write_mongodb plugin: error making connection to server");
+    pthread_mutex_unlock(&node->lock);
+    bson_destroy(bson_record);
+    return -1;
   }
 
-  /* Assert if the connection has been established */
-  assert(mongo_is_connected(node->conn));
-
-#if MONGO_MINOR >= 6
-  /* There was an API change in 0.6.0 as linked below */
-  /* https://github.com/mongodb/mongo-c-driver/blob/master/HISTORY.md */
-  status = mongo_insert(node->conn, collection_name, bson_record, NULL);
-#else
-  status = mongo_insert(node->conn, collection_name, bson_record);
-#endif
-
-  if (status != MONGO_OK) {
-    ERROR("write_mongodb plugin: error inserting record: %d", node->conn->err);
-    if (node->conn->err != MONGO_BSON_INVALID)
-      ERROR("write_mongodb plugin: %s", node->conn->errstr);
-    else
-      ERROR("write_mongodb plugin: Invalid BSON structure, error = %#x",
-            (unsigned int)bson_record->err);
+  collection =
+      mongoc_client_get_collection(node->client, "collectd", vl->plugin);
+  if (!collection) {
+    ERROR("write_mongodb plugin: error creating/getting collection");
+    mongoc_database_destroy(node->database);
+    mongoc_client_destroy(node->client);
+    node->database = NULL;
+    node->client = NULL;
+    node->connected = 0;
+    pthread_mutex_unlock(&node->lock);
+    bson_destroy(bson_record);
+    return -1;
+  }
 
-    /* Disconnect except on data errors. */
-    if ((node->conn->err != MONGO_BSON_INVALID) &&
-        (node->conn->err != MONGO_BSON_NOT_FINISHED))
-      mongo_destroy(node->conn);
+  status = mongoc_collection_insert(collection, MONGOC_INSERT_NONE, bson_record,
+                                    NULL, &error);
+
+  if (!status) {
+    ERROR("write_mongodb plugin: error inserting record: %s", error.message);
+    mongoc_database_destroy(node->database);
+    mongoc_client_destroy(node->client);
+    node->database = NULL;
+    node->client = NULL;
+    node->connected = 0;
+    pthread_mutex_unlock(&node->lock);
+    bson_destroy(bson_record);
+    mongoc_collection_destroy(collection);
+    return -1;
   }
 
+  /* free our resource as not to leak memory */
+  mongoc_collection_destroy(collection);
+
   pthread_mutex_unlock(&node->lock);
 
-  /* free our resource as not to leak memory */
-  bson_destroy(bson_record); /* matches bson_init() */
-  bson_dealloc(bson_record); /* matches bson_alloc() */
+  bson_destroy(bson_record);
 
-  return (0);
+  return 0;
 } /* }}} int wm_write */
 
 static void wm_config_free(void *ptr) /* {{{ */
@@ -241,8 +287,11 @@ static void wm_config_free(void *ptr) /* {{{ */
   if (node == NULL)
     return;
 
-  if (mongo_is_connected(node->conn))
-    mongo_destroy(node->conn);
+  mongoc_database_destroy(node->database);
+  mongoc_client_destroy(node->client);
+  node->database = NULL;
+  node->client = NULL;
+  node->connected = 0;
 
   sfree(node->host);
   sfree(node);
@@ -255,17 +304,23 @@ static int wm_config_node(oconfig_item_t *ci) /* {{{ */
 
   node = calloc(1, sizeof(*node));
   if (node == NULL)
-    return (ENOMEM);
-  mongo_init(node->conn);
-  node->host = NULL;
+    return ENOMEM;
+  mongoc_init();
+  node->host = strdup("localhost");
+  if (node->host == NULL) {
+    sfree(node);
+    return ENOMEM;
+  }
+  node->port = MONGOC_DEFAULT_PORT;
   node->store_rates = 1;
   pthread_mutex_init(&node->lock, /* attr = */ NULL);
 
   status = cf_util_get_string_buffer(ci, node->name, sizeof(node->name));
 
   if (status != 0) {
+    sfree(node->host);
     sfree(node);
-    return (status);
+    return status;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -315,10 +370,11 @@ static int wm_config_node(oconfig_item_t *ci) /* {{{ */
 
     ssnprintf(cb_name, sizeof(cb_name), "write_mongodb/%s", node->name);
 
-    status = plugin_register_write(
-        cb_name, wm_write, &(user_data_t){
-                               .data = node, .free_func = wm_config_free,
-                           });
+    status =
+        plugin_register_write(cb_name, wm_write,
+                              &(user_data_t){
+                                  .data = node, .free_func = wm_config_free,
+                              });
     INFO("write_mongodb plugin: registered write plugin %s %d", cb_name,
          status);
   }
@@ -326,7 +382,7 @@ static int wm_config_node(oconfig_item_t *ci) /* {{{ */
   if (status != 0)
     wm_config_free(node);
 
-  return (status);
+  return status;
 } /* }}} int wm_config_node */
 
 static int wm_config(oconfig_item_t *ci) /* {{{ */
@@ -342,11 +398,9 @@ static int wm_config(oconfig_item_t *ci) /* {{{ */
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int wm_config */
 
 void module_register(void) {
   plugin_register_complex_config("write_mongodb", wm_config);
 }
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index de1c389..5264998 100644 (file)
@@ -599,8 +599,8 @@ static int metric_family_update(Io__Prometheus__Client__MetricFamily *fam,
   if (m == NULL)
     return -1;
 
-  return metric_update(m, vl->values[ds_index], ds->ds[ds_index].type, vl->time,
-                       vl->interval);
+  return metric_update(m, vl->values[ds_index], ds->ds[ds_index].type,
+                       vl->time, vl->interval);
 }
 
 /* metric_family_destroy frees the memory used by a metric family. */
@@ -875,5 +875,3 @@ void module_register() {
                           /* user data = */ NULL);
   plugin_register_shutdown("write_prometheus", prom_shutdown);
 }
-
-/* vim: set sw=2 sts=2 et fdm=marker : */
index 0a5c5df..f7215b5 100644 (file)
@@ -69,7 +69,7 @@ static int wr_write(const data_set_t *ds, /* {{{ */
 
   status = FORMAT_VL(ident, sizeof(ident), vl);
   if (status != 0)
-    return (status);
+    return status;
   ssnprintf(key, sizeof(key), "%s%s",
             (node->prefix != NULL) ? node->prefix : REDIS_DEFAULT_PREFIX,
             ident);
@@ -79,7 +79,7 @@ static int wr_write(const data_set_t *ds, /* {{{ */
   value_ptr = &value[0];
   status = format_values(value_ptr, value_size, ds, vl, node->store_rates);
   if (status != 0)
-    return (status);
+    return status;
 
   pthread_mutex_lock(&node->lock);
 
@@ -92,14 +92,14 @@ static int wr_write(const data_set_t *ds, /* {{{ */
             (node->host != NULL) ? node->host : "localhost",
             (node->port != 0) ? node->port : 6379);
       pthread_mutex_unlock(&node->lock);
-      return (-1);
+      return -1;
     } else if (node->conn->err) {
       ERROR(
           "write_redis plugin: Connecting to host \"%s\" (port %i) failed: %s",
           (node->host != NULL) ? node->host : "localhost",
           (node->port != 0) ? node->port : 6379, node->conn->errstr);
       pthread_mutex_unlock(&node->lock);
-      return (-1);
+      return -1;
     }
 
     rr = redisCommand(node->conn, "SELECT %d", node->database);
@@ -140,7 +140,7 @@ static int wr_write(const data_set_t *ds, /* {{{ */
 
   pthread_mutex_unlock(&node->lock);
 
-  return (0);
+  return 0;
 } /* }}} int wr_write */
 
 static void wr_config_free(void *ptr) /* {{{ */
@@ -167,7 +167,7 @@ static int wr_config_node(oconfig_item_t *ci) /* {{{ */
 
   node = calloc(1, sizeof(*node));
   if (node == NULL)
-    return (ENOMEM);
+    return ENOMEM;
   node->host = NULL;
   node->port = 0;
   node->timeout.tv_sec = 0;
@@ -182,7 +182,7 @@ static int wr_config_node(oconfig_item_t *ci) /* {{{ */
   status = cf_util_get_string_buffer(ci, node->name, sizeof(node->name));
   if (status != 0) {
     sfree(node);
-    return (status);
+    return status;
   }
 
   for (int i = 0; i < ci->children_num; i++) {
@@ -230,7 +230,7 @@ static int wr_config_node(oconfig_item_t *ci) /* {{{ */
   if (status != 0)
     wr_config_free(node);
 
-  return (status);
+  return status;
 } /* }}} int wr_config_node */
 
 static int wr_config(oconfig_item_t *ci) /* {{{ */
@@ -246,11 +246,9 @@ static int wr_config(oconfig_item_t *ci) /* {{{ */
               child->key);
   }
 
-  return (0);
+  return 0;
 } /* }}} int wr_config */
 
 void module_register(void) {
   plugin_register_complex_config("write_redis", wr_config);
 }
-
-/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */
index 3835a3d..5bd0cf4 100644 (file)
@@ -125,12 +125,12 @@ static int wrr_connect(struct riemann_host *host) /* {{{ */
 static int wrr_disconnect(struct riemann_host *host) /* {{{ */
 {
   if (!host->client)
-    return (0);
+    return 0;
 
   riemann_client_free(host->client);
   host->client = NULL;
 
-  return (0);
+  return 0;
 } /* }}} int wrr_disconnect */
 
 /**
@@ -214,6 +214,11 @@ wrr_notification_to_message(struct riemann_host *host, /* {{{ */
       RIEMANN_EVENT_FIELD_SERVICE, &service_buffer[1],
       RIEMANN_EVENT_FIELD_NONE);
 
+#if RCC_VERSION_NUMBER >= 0x010A00
+  riemann_event_set(event, RIEMANN_EVENT_FIELD_TIME_MICROS,
+                    (int64_t)CDTIME_T_TO_US(n->time));
+#endif
+
   if (n->host[0] != 0)
     riemann_event_string_attribute_add(event, "host", n->host);
   if (n->plugin[0] != 0)
@@ -259,13 +264,13 @@ wrr_notification_to_message(struct riemann_host *host, /* {{{ */
   if (msg == NULL) {
     ERROR("write_riemann plugin: riemann_message_create_with_events() failed.");
     riemann_event_free(event);
-    return (NULL);
+    return NULL;
   }
 
   DEBUG("write_riemann plugin: Successfully created message for notification: "
         "host = \"%s\", service = \"%s\", state = \"%s\"",
         event->host, event->service, event->state);
-  return (msg);
+  return msg;
 } /* }}} riemann_message_t *wrr_notification_to_message */
 
 static riemann_event_t *
@@ -280,7 +285,7 @@ wrr_value_to_event(struct riemann_host const *host, /* {{{ */
   event = riemann_event_new();
   if (event == NULL) {
     ERROR("write_riemann plugin: riemann_event_new() failed.");
-    return (NULL);
+    return NULL;
   }
 
   format_name(name_buffer, sizeof(name_buffer),
@@ -310,6 +315,11 @@ wrr_value_to_event(struct riemann_host const *host, /* {{{ */
       vl->type, "ds_name", ds->ds[index].name, NULL,
       RIEMANN_EVENT_FIELD_SERVICE, service_buffer, RIEMANN_EVENT_FIELD_NONE);
 
+#if RCC_VERSION_NUMBER >= 0x010A00
+  riemann_event_set(event, RIEMANN_EVENT_FIELD_TIME_MICROS,
+                    (int64_t)CDTIME_T_TO_US(vl->time));
+#endif
+
   if (host->check_thresholds) {
     const char *state = NULL;
 
@@ -388,7 +398,7 @@ wrr_value_to_event(struct riemann_host const *host, /* {{{ */
   DEBUG("write_riemann plugin: Successfully created message for metric: "
         "host = \"%s\", service = \"%s\"",
         event->host, event->service);
-  return (event);
+  return event;
 } /* }}} riemann_event_t *wrr_value_to_event */
 
 static riemann_message_t *
@@ -403,7 +413,7 @@ wrr_value_list_to_message(struct riemann_host const *host, /* {{{ */
   msg = riemann_message_new();
   if (msg == NULL) {
     ERROR("write_riemann plugin: riemann_message_new failed.");
-    return (NULL);
+    return NULL;
   }
 
   if (host->store_rates) {
@@ -411,7 +421,7 @@ wrr_value_list_to_message(struct riemann_host const *host, /* {{{ */
     if (rates == NULL) {
       ERROR("write_riemann plugin: uc_get_rate failed.");
       riemann_message_free(msg);
-      return (NULL);
+      return NULL;
     }
   }
 
@@ -422,13 +432,13 @@ wrr_value_list_to_message(struct riemann_host const *host, /* {{{ */
     if (event == NULL) {
       riemann_message_free(msg);
       sfree(rates);
-      return (NULL);
+      return NULL;
     }
     riemann_message_append_events(msg, event, NULL);
   }
 
   sfree(rates);
-  return (msg);
+  return msg;
 } /* }}} riemann_message_t *wrr_value_list_to_message */
 
 /*
@@ -459,7 +469,7 @@ static int wrr_batch_flush(cdtime_t timeout,
   int status;
 
   if (user_data == NULL)
-    return (-EINVAL);
+    return -EINVAL;
 
   host = user_data->data;
   pthread_mutex_lock(&host->lock);
@@ -539,7 +549,7 @@ static int wrr_notification(const notification_t *n, user_data_t *ud) /* {{{ */
    */
   msg = wrr_notification_to_message(host, n);
   if (msg == NULL)
-    return (-1);
+    return -1;
 
   status = wrr_send(host, msg);
   if (status != 0)
@@ -552,7 +562,7 @@ static int wrr_notification(const notification_t *n, user_data_t *ud) /* {{{ */
               "write_riemann plugin: riemann_client_send succeeded");
 
   riemann_message_free(msg);
-  return (status);
+  return status;
 } /* }}} int wrr_notification */
 
 static int wrr_write(const data_set_t *ds, /* {{{ */
@@ -575,7 +585,7 @@ static int wrr_write(const data_set_t *ds, /* {{{ */
   } else {
     msg = wrr_value_list_to_message(host, ds, vl, statuses);
     if (msg == NULL)
-      return (-1);
+      return -1;
 
     status = wrr_send(host, msg);
 
@@ -827,7 +837,7 @@ static int wrr_config_node(oconfig_item_t *ci) /* {{{ */
      * holding a reference. */
     pthread_mutex_unlock(&host->lock);
     wrr_free(host);
-    return (-1);
+    return -1;
   }
 
   host->reference_count--;
@@ -853,21 +863,21 @@ static int wrr_config(oconfig_item_t *ci) /* {{{ */
 
       if (child->values_num != 2) {
         WARNING("riemann attributes need both a key and a value.");
-        return (-1);
+        return -1;
       }
       if (child->values[0].type != OCONFIG_TYPE_STRING ||
           child->values[1].type != OCONFIG_TYPE_STRING) {
         WARNING("riemann attribute needs string arguments.");
-        return (-1);
+        return -1;
       }
       if ((key = strdup(child->values[0].value.string)) == NULL) {
         WARNING("cannot allocate memory for attribute key.");
-        return (-1);
+        return -1;
       }
       if ((val = strdup(child->values[1].value.string)) == NULL) {
         WARNING("cannot allocate memory for attribute value.");
         sfree(key);
-        return (-1);
+        return -1;
       }
       strarray_add(&riemann_attrs, &riemann_attrs_num, key);
       strarray_add(&riemann_attrs, &riemann_attrs_num, val);
@@ -889,11 +899,9 @@ static int wrr_config(oconfig_item_t *ci) /* {{{ */
               child->key);
     }
   }
-  return (0);
+  return 0;
 } /* }}} int wrr_config */
 
 void module_register(void) {
   plugin_register_complex_config("write_riemann", wrr_config);
 }
-
-/* vim: set sw=8 sts=8 ts=8 noet : */
index 452c291..35f3814 100644 (file)
@@ -34,8 +34,6 @@
 #include "utils_threshold.h"
 #include "write_riemann_threshold.h"
 
-#include <ltdl.h>
-
 /*
  * Threshold management
  * ====================
@@ -65,7 +63,7 @@ static int ut_check_one_data_source(
   if (ds != NULL) {
     ds_name = ds->ds[ds_index].name;
     if ((th->data_source[0] != 0) && (strcmp(ds_name, th->data_source) != 0))
-      return (STATE_OKAY);
+      return STATE_OKAY;
   }
 
   if ((th->flags & UT_FLAG_INVERT) != 0) {
@@ -83,7 +81,7 @@ static int ut_check_one_data_source(
            ((th->failure_min + th->hysteresis) < values[ds_index])) ||
           (!isnan(th->failure_max) &&
            ((th->failure_max - th->hysteresis) > values[ds_index])))
-        return (STATE_OKAY);
+        return STATE_OKAY;
       else
         is_failure++;
     case STATE_WARNING:
@@ -91,7 +89,7 @@ static int ut_check_one_data_source(
            ((th->warning_min + th->hysteresis) < values[ds_index])) ||
           (!isnan(th->warning_max) &&
            ((th->warning_max - th->hysteresis) > values[ds_index])))
-        return (STATE_OKAY);
+        return STATE_OKAY;
       else
         is_warning++;
     }
@@ -106,12 +104,12 @@ static int ut_check_one_data_source(
   }
 
   if (is_failure != 0)
-    return (STATE_ERROR);
+    return STATE_ERROR;
 
   if (is_warning != 0)
-    return (STATE_WARNING);
+    return STATE_WARNING;
 
-  return (STATE_OKAY);
+  return STATE_OKAY;
 } /* }}} int ut_check_one_data_source */
 
 /*
@@ -172,7 +170,7 @@ static int ut_check_one_threshold(const data_set_t *ds, const value_list_t *vl,
     }
   } /* for (ds->ds_num) */
 
-  return (ret);
+  return ret;
 } /* }}} int ut_check_one_threshold */
 
 /*
@@ -202,20 +200,20 @@ int write_riemann_threshold_check(const data_set_t *ds, const value_list_t *vl,
   th = threshold_search(vl);
   pthread_mutex_unlock(&threshold_lock);
   if (th == NULL)
-    return (0);
+    return 0;
 
   DEBUG("ut_check_threshold: Found matching threshold(s)");
 
   values = uc_get_rate(ds, vl);
   if (values == NULL)
-    return (0);
+    return 0;
 
   while (th != NULL) {
     status = ut_check_one_threshold(ds, vl, th, values, statuses);
     if (status < 0) {
       ERROR("ut_check_threshold: ut_check_one_threshold failed.");
       sfree(values);
-      return (-1);
+      return -1;
     }
 
     th = th->next;
@@ -223,7 +221,5 @@ int write_riemann_threshold_check(const data_set_t *ds, const value_list_t *vl,
 
   sfree(values);
 
-  return (0);
+  return 0;
 } /* }}} int ut_check_threshold */
-
-/* vim: set sw=2 ts=8 sts=2 tw=78 et fdm=marker : */
index 72ed6bc..56acb63 100644 (file)
@@ -132,7 +132,7 @@ static int add_str_to_list(struct str_list *strs,
     ERROR("write_sensu plugin: Unable to alloc memory");
     return -1;
   }
-  strs->strs = realloc(strs->strs, sizeof(char *) * (strs->nb_strs + 1));
+  strs->strs = realloc(strs->strs, strs->nb_strs + 1);
   if (strs->strs == NULL) {
     strs->strs = old_strs_ptr;
     free(newstr);
@@ -231,7 +231,7 @@ static char *build_json_str_list(const char *tag,
   char *ret_str = NULL;
   char *temp_str;
   if (list->nb_strs == 0) {
-    ret_str = malloc(sizeof(char));
+    ret_str = malloc(1);
     if (ret_str == NULL) {
       ERROR("write_sensu plugin: Unable to alloc memory");
       return NULL;
@@ -278,7 +278,7 @@ static int sensu_format_name2(char *ret, int ret_len, const char *hostname,
   do {                                                                         \
     size_t l = strlen(str);                                                    \
     if (l >= buffer_size)                                                      \
-      return (ENOBUFS);                                                        \
+      return ENOBUFS;                                                          \
     memcpy(buffer, (str), l);                                                  \
     buffer += l;                                                               \
     buffer_size -= l;                                                          \
@@ -304,7 +304,7 @@ static int sensu_format_name2(char *ret, int ret_len, const char *hostname,
   buffer[0] = 0;
 
 #undef APPEND
-  return (0);
+  return 0;
 } /* int sensu_format_name2 */
 
 static void in_place_replace_sensu_name_reserved(char *orig_name) /* {{{ */
@@ -1248,5 +1248,3 @@ static int sensu_config(oconfig_item_t *ci) /* {{{ */
 void module_register(void) {
   plugin_register_complex_config("write_sensu", sensu_config);
 }
-
-/* vim: set sw=8 sts=8 ts=8 noet : */
index 0c87c47..1a1cd64 100644 (file)
@@ -45,8 +45,8 @@
 
 #include "common.h"
 #include "plugin.h"
-
 #include "utils_cache.h"
+#include "utils_random.h"
 
 #include <netdb.h>
 
@@ -71,6 +71,8 @@
  * Private variables
  */
 struct wt_callback {
+  struct addrinfo *ai;
+  cdtime_t ai_last_update;
   int sock_fd;
 
   char *node;
@@ -86,8 +88,15 @@ struct wt_callback {
   cdtime_t send_buf_init_time;
 
   pthread_mutex_t send_lock;
+
+  _Bool connect_failed_log_enabled;
+  int connect_dns_failed_attempts_remaining;
+  cdtime_t next_random_ttl;
 };
 
+static cdtime_t resolve_interval = 0;
+static cdtime_t resolve_jitter = 0;
+
 /*
  * Functions
  */
@@ -144,9 +153,16 @@ static int wt_flush_nolock(cdtime_t timeout, struct wt_callback *cb) {
   return status;
 }
 
+static cdtime_t new_random_ttl() {
+  if (resolve_jitter == 0)
+    return 0;
+
+  return (cdtime_t)cdrand_range(0, (long)resolve_jitter);
+}
+
 static int wt_callback_init(struct wt_callback *cb) {
-  struct addrinfo *ai_list;
   int status;
+  cdtime_t now;
 
   const char *node = cb->node ? cb->node : WT_DEFAULT_NODE;
   const char *service = cb->service ? cb->service : WT_DEFAULT_SERVICE;
@@ -154,28 +170,68 @@ static int wt_callback_init(struct wt_callback *cb) {
   if (cb->sock_fd > 0)
     return 0;
 
-  struct addrinfo ai_hints = {.ai_family = AF_UNSPEC,
-                              .ai_flags = AI_ADDRCONFIG,
-                              .ai_socktype = SOCK_STREAM};
+  now = cdtime();
+  if (cb->ai) {
+    /* When we are here, we still have the IP in cache.
+     * If we have remaining attempts without calling the DNS, we update the
+     * last_update date so we keep the info until next time.
+     * If there is no more attempts, we need to flush the cache.
+     */
+
+    if ((cb->ai_last_update + resolve_interval + cb->next_random_ttl) < now) {
+      cb->next_random_ttl = new_random_ttl();
+      if (cb->connect_dns_failed_attempts_remaining > 0) {
+        /* Warning : this is run under send_lock mutex.
+         * This is why we do not use another mutex here.
+         * */
+        cb->ai_last_update = now;
+        cb->connect_dns_failed_attempts_remaining--;
+      } else {
+        freeaddrinfo(cb->ai);
+        cb->ai = NULL;
+      }
+    }
+  }
 
-  status = getaddrinfo(node, service, &ai_hints, &ai_list);
-  if (status != 0) {
-    ERROR("write_tsdb plugin: getaddrinfo (%s, %s) failed: %s", node, service,
-          gai_strerror(status));
-    return -1;
+  if (cb->ai == NULL) {
+    if ((cb->ai_last_update + resolve_interval + cb->next_random_ttl) >= now) {
+      DEBUG("write_tsdb plugin: too many getaddrinfo(%s, %s) failures", node,
+            service);
+      return -1;
+    }
+    cb->ai_last_update = now;
+    cb->next_random_ttl = new_random_ttl();
+
+    struct addrinfo ai_hints = {
+        .ai_family = AF_UNSPEC,
+        .ai_flags = AI_ADDRCONFIG,
+        .ai_socktype = SOCK_STREAM,
+    };
+
+    status = getaddrinfo(node, service, &ai_hints, &cb->ai);
+    if (status != 0) {
+      if (cb->ai) {
+        freeaddrinfo(cb->ai);
+        cb->ai = NULL;
+      }
+      if (cb->connect_failed_log_enabled) {
+        ERROR("write_tsdb plugin: getaddrinfo(%s, %s) failed: %s", node,
+              service, gai_strerror(status));
+        cb->connect_failed_log_enabled = 0;
+      }
+      return -1;
+    }
   }
 
-  assert(ai_list != NULL);
-  for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
-       ai_ptr = ai_ptr->ai_next) {
-    cb->sock_fd =
-        socket(ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol);
+  assert(cb->ai != NULL);
+  for (struct addrinfo *ai = cb->ai; ai != NULL; ai = ai->ai_next) {
+    cb->sock_fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
     if (cb->sock_fd < 0)
       continue;
 
     set_sock_opts(cb->sock_fd);
 
-    status = connect(cb->sock_fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen);
+    status = connect(cb->sock_fd, ai->ai_addr, ai->ai_addrlen);
     if (status != 0) {
       close(cb->sock_fd);
       cb->sock_fd = -1;
@@ -185,8 +241,6 @@ static int wt_callback_init(struct wt_callback *cb) {
     break;
   }
 
-  freeaddrinfo(ai_list);
-
   if (cb->sock_fd < 0) {
     char errbuf[1024];
     ERROR("write_tsdb plugin: Connecting to %s:%s failed. "
@@ -195,6 +249,12 @@ static int wt_callback_init(struct wt_callback *cb) {
     return -1;
   }
 
+  if (0 == cb->connect_failed_log_enabled) {
+    WARNING("write_tsdb plugin: Connecting to %s:%s succeeded.", node, service);
+    cb->connect_failed_log_enabled = 1;
+  }
+  cb->connect_dns_failed_attempts_remaining = 1;
+
   wt_reset_buffer(cb);
 
   return 0;
@@ -522,10 +582,8 @@ static int wt_config_tsd(oconfig_item_t *ci) {
     return -1;
   }
   cb->sock_fd = -1;
-  cb->node = NULL;
-  cb->service = NULL;
-  cb->host_tags = NULL;
-  cb->store_rates = 0;
+  cb->connect_failed_log_enabled = 1;
+  cb->next_random_ttl = new_random_ttl();
 
   pthread_mutex_init(&cb->send_lock, NULL);
 
@@ -564,11 +622,18 @@ static int wt_config_tsd(oconfig_item_t *ci) {
 }
 
 static int wt_config(oconfig_item_t *ci) {
+  if ((resolve_interval == 0) && (resolve_jitter == 0))
+    resolve_interval = resolve_jitter = plugin_get_interval();
+
   for (int i = 0; i < ci->children_num; i++) {
     oconfig_item_t *child = ci->children + i;
 
     if (strcasecmp("Node", child->key) == 0)
       wt_config_tsd(child);
+    else if (strcasecmp("ResolveInterval", child->key) == 0)
+      cf_util_get_cdtime(child, &resolve_interval);
+    else if (strcasecmp("ResolveJitter", child->key) == 0)
+      cf_util_get_cdtime(child, &resolve_jitter);
     else {
       ERROR("write_tsdb plugin: Invalid configuration "
             "option: %s.",
@@ -582,5 +647,3 @@ static int wt_config(oconfig_item_t *ci) {
 void module_register(void) {
   plugin_register_complex_config("write_tsdb", wt_config);
 }
-
-/* vim: set sw=4 ts=4 sts=4 tw=78 et : */
index 01904b2..bf17864 100644 (file)
@@ -51,7 +51,7 @@ static int xencpu_init(void) {
   xc_handle = xc_interface_open(XC_INTERFACE_INIT_ARGS);
   if (!xc_handle) {
     ERROR("xencpu: xc_interface_open() failed");
-    return (-1);
+    return -1;
   }
 
   xc_physinfo_t *physinfo;
@@ -60,14 +60,14 @@ static int xencpu_init(void) {
   if (physinfo == NULL) {
     ERROR("xencpu plugin: calloc() for physinfo failed.");
     xc_interface_close(xc_handle);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   if (xc_physinfo(xc_handle, physinfo) < 0) {
     ERROR("xencpu plugin: xc_physinfo() failed");
     xc_interface_close(xc_handle);
     free(physinfo);
-    return (-1);
+    return -1;
   }
 
   num_cpus = physinfo->nr_cpus;
@@ -79,7 +79,7 @@ static int xencpu_init(void) {
   if (cpu_info == NULL) {
     ERROR("xencpu plugin: calloc() for num_cpus failed.");
     xc_interface_close(xc_handle);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
   cpu_states = calloc(num_cpus, sizeof(value_to_rate_state_t));
@@ -87,10 +87,10 @@ static int xencpu_init(void) {
     ERROR("xencpu plugin: calloc() for cpu_states failed.");
     xc_interface_close(xc_handle);
     free(cpu_info);
-    return (ENOMEM);
+    return ENOMEM;
   }
 
-  return (0);
+  return 0;
 } /* static int xencpu_init */
 
 static int xencpu_shutdown(void) {
@@ -126,7 +126,7 @@ static int xencpu_read(void) {
   if (rc < 0) {
     ERROR("xencpu: xc_getcpuinfo() Failed: %d %s\n", rc,
           xc_strerror(xc_handle, errno));
-    return (-1);
+    return -1;
   }
 
   int status;
@@ -140,7 +140,7 @@ static int xencpu_read(void) {
     }
   }
 
-  return (0);
+  return 0;
 } /* static int xencpu_read */
 
 void module_register(void) {
index 87e3564..3e3a3c3 100644 (file)
@@ -50,23 +50,19 @@ static int cxmms_read(void) {
   gint nch;
 
   if (!xmms_remote_is_running(xmms_session))
-    return (0);
+    return 0;
 
   xmms_remote_get_info(xmms_session, &rate, &freq, &nch);
 
   if ((freq == 0) || (nch == 0))
-    return (-1);
+    return -1;
 
   cxmms_submit("bitrate", rate);
   cxmms_submit("frequency", freq);
 
-  return (0);
+  return 0;
 } /* int read */
 
 void module_register(void) {
   plugin_register_read("xmms", cxmms_read);
 } /* void module_register */
-
-/*
- * vim: shiftwidth=2:softtabstop=2:textwidth=78
- */
index af5130a..cf858f8 100644 (file)
@@ -75,12 +75,11 @@ static long long get_zfs_value(kstat_t *ksp, const char *key) {
 
   e = llist_search(ksp, key);
   if (e == NULL) {
-    ERROR("zfs_arc plugin: `llist_search` failed for key: '%s'.", key);
-    return (-1);
+    return -1;
   }
 
   v = e->value;
-  return ((long long)v->derive);
+  return (long long)v->derive;
 }
 
 static void free_zfs_values(kstat_t *ksp) {
@@ -100,7 +99,7 @@ extern kstat_ctl_t *kc;
 
 static long long get_zfs_value(kstat_t *ksp, char *name) {
 
-  return (get_kstat_value(ksp, name));
+  return get_kstat_value(ksp, name);
 }
 #elif defined(KERNEL_FREEBSD)
 #include <sys/sysctl.h>
@@ -123,9 +122,9 @@ static long long get_zfs_value(kstat_t *dummy __attribute__((unused)),
   rv = sysctlbyname(buffer, (void *)&value, &valuelen,
                     /* new value = */ NULL, /* new length = */ (size_t)0);
   if (rv == 0)
-    return (value);
+    return value;
 
-  return (-1);
+  return -1;
 }
 #endif
 
@@ -152,26 +151,26 @@ static int za_read_derive(kstat_t *ksp, const char *kstat_value,
                           const char *type, const char *type_instance) {
   long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
-    return (-1);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    return -1;
   }
 
   za_submit(type, type_instance, &(value_t){.derive = (derive_t)tmp},
             /* values_num = */ 1);
-  return (0);
+  return 0;
 }
 
 static int za_read_gauge(kstat_t *ksp, const char *kstat_value,
                          const char *type, const char *type_instance) {
   long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
-    return (-1);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    return -1;
   }
 
   za_submit(type, type_instance, &(value_t){.gauge = (gauge_t)tmp},
             /* values_num = */ 1);
-  return (0);
+  return 0;
 }
 
 static void za_submit_ratio(const char *type_instance, gauge_t hits,
@@ -202,14 +201,29 @@ static int za_read(void) {
     char errbuf[1024];
     ERROR("zfs_arc plugin: Opening \"%s\" failed: %s", ZOL_ARCSTATS_FILE,
           sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (-1);
+    return -1;
   }
 
   ksp = llist_create();
   if (ksp == NULL) {
     ERROR("zfs_arc plugin: `llist_create' failed.");
     fclose(fh);
-    return (-1);
+    return -1;
+  }
+
+  // Ignore the first two lines because they contain information about
+  // the rest of the file.
+  // See kstat_seq_show_headers module/spl/spl-kstat.c of the spl kernel
+  // module.
+  if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+    ERROR("zfs_arc plugin: \"%s\" does not contain a single line.", ZOL_ARCSTATS_FILE);
+    fclose(fh);
+    return -1;
+  }
+  if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+    ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.", ZOL_ARCSTATS_FILE);
+    fclose(fh);
+    return -1;
   }
 
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
@@ -234,7 +248,7 @@ static int za_read(void) {
   get_kstat(&ksp, "zfs", 0, "arcstats");
   if (ksp == NULL) {
     ERROR("zfs_arc plugin: Cannot find zfs:0:arcstats kstat.");
-    return (-1);
+    return -1;
   }
 #endif
 
@@ -317,7 +331,7 @@ static int za_read(void) {
   free_zfs_values(ksp);
 #endif
 
-  return (0);
+  return 0;
 } /* int za_read */
 
 static int za_init(void) /* {{{ */
@@ -327,11 +341,11 @@ static int za_init(void) /* {{{ */
    * went fine. */
   if (kc == NULL) {
     ERROR("zfs_arc plugin: kstat chain control structure not available.");
-    return (-1);
+    return -1;
   }
 #endif
 
-  return (0);
+  return 0;
 } /* }}} int za_init */
 
 void module_register(void) {
index 5b7bd00..3cd0534 100644 (file)
@@ -51,10 +51,10 @@ typedef struct zone_stats {
 
 static int zone_compare(const void *a, const void *b) {
   if (*(const zoneid_t *)a == *(const zoneid_t *)b)
-    return (0);
+    return 0;
   if (*(const zoneid_t *)a < *(const zoneid_t *)b)
-    return (-1);
-  return (1);
+    return -1;
+  return 1;
 }
 
 static int zone_read_procfile(char const *pidstr, char const *name, void *buf,
@@ -64,7 +64,7 @@ static int zone_read_procfile(char const *pidstr, char const *name, void *buf,
   char procfile[MAX_PROCFS_PATH];
   (void)snprintf(procfile, sizeof(procfile), "/proc/%s/%s", pidstr, name);
   if ((fd = open(procfile, O_RDONLY)) == -1) {
-    return (1);
+    return 1;
   }
 
   if (sread(fd, buf, bufsize) != 0) {
@@ -72,11 +72,11 @@ static int zone_read_procfile(char const *pidstr, char const *name, void *buf,
     ERROR("zone plugin: Reading \"%s\" failed: %s", procfile,
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(fd);
-    return (1);
+    return 1;
   }
 
   close(fd);
-  return (0);
+  return 0;
 }
 
 static int zone_submit_value(char *zone, gauge_t value) {
@@ -91,7 +91,7 @@ static int zone_submit_value(char *zone, gauge_t value) {
   sstrncpy(vl.type, "percent", sizeof(vl.type));
   sstrncpy(vl.type_instance, zone, sizeof(vl.type_instance));
 
-  return (plugin_dispatch_values(&vl));
+  return plugin_dispatch_values(&vl);
 }
 
 static zone_stats_t *zone_find_stats(c_avl_tree_t *tree, zoneid_t zoneid) {
@@ -101,20 +101,20 @@ static zone_stats_t *zone_find_stats(c_avl_tree_t *tree, zoneid_t zoneid) {
   if (c_avl_get(tree, (void **)&zoneid, (void **)&ret)) {
     if (!(ret = malloc(sizeof(*ret)))) {
       WARNING("zone plugin: no memory");
-      return (NULL);
+      return NULL;
     }
     if (!(key = malloc(sizeof(*key)))) {
       WARNING("zone plugin: no memory");
       free(ret);
-      return (NULL);
+      return NULL;
     }
     *key = zoneid;
     if (c_avl_insert(tree, key, ret)) {
       WARNING("zone plugin: error inserting into tree");
-      return (NULL);
+      return NULL;
     }
   }
-  return (ret);
+  return ret;
 }
 
 static void zone_submit_values(c_avl_tree_t *tree) {
@@ -143,7 +143,7 @@ static c_avl_tree_t *zone_scandir(DIR *procdir) {
 
   if (!(tree = c_avl_create(zone_compare))) {
     WARNING("zone plugin: Failed to create tree");
-    return (NULL);
+    return NULL;
   }
 
   rewinddir(procdir);
@@ -165,7 +165,7 @@ static c_avl_tree_t *zone_scandir(DIR *procdir) {
       stats->pctmem += psinfo.pr_pctmem;
     }
   }
-  return (tree);
+  return tree;
 }
 
 static int zone_read(void) {
@@ -174,16 +174,16 @@ static int zone_read(void) {
 
   if ((procdir = opendir("/proc")) == NULL) {
     ERROR("zone plugin: cannot open /proc directory\n");
-    return (-1);
+    return -1;
   }
 
   tree = zone_scandir(procdir);
   closedir(procdir);
   if (tree == NULL) {
-    return (-1);
+    return -1;
   }
   zone_submit_values(tree); /* this also frees tree */
-  return (0);
+  return 0;
 }
 
 void module_register(void) {
index a42b04c..0b2507d 100644 (file)
@@ -103,7 +103,7 @@ static int zookeeper_connect(void) {
     INFO("getaddrinfo failed: %s",
          (status == EAI_SYSTEM) ? sstrerror(errno, errbuf, sizeof(errbuf))
                                 : gai_strerror(status));
-    return (-1);
+    return -1;
   }
 
   for (struct addrinfo *ai = ai_list; ai != NULL; ai = ai->ai_next) {
@@ -129,7 +129,7 @@ static int zookeeper_connect(void) {
   }
 
   freeaddrinfo(ai_list);
-  return (sk);
+  return sk;
 } /* int zookeeper_connect */
 
 static int zookeeper_query(char *buffer, size_t buffer_size) {
@@ -139,7 +139,7 @@ static int zookeeper_query(char *buffer, size_t buffer_size) {
   sk = zookeeper_connect();
   if (sk < 0) {
     ERROR("zookeeper: Could not connect to daemon");
-    return (-1);
+    return -1;
   }
 
   status = (int)swrite(sk, "mntr\r\n", strlen("mntr\r\n"));
@@ -148,7 +148,7 @@ static int zookeeper_query(char *buffer, size_t buffer_size) {
     ERROR("zookeeper: write(2) failed: %s",
           sstrerror(errno, errbuf, sizeof(errbuf)));
     close(sk);
-    return (-1);
+    return -1;
   }
 
   memset(buffer, 0, buffer_size);
@@ -164,7 +164,7 @@ static int zookeeper_query(char *buffer, size_t buffer_size) {
       ERROR("zookeeper: Error reading from socket: %s",
             sstrerror(errno, errbuf, sizeof(errbuf)));
       close(sk);
-      return (-1);
+      return -1;
     }
 
     buffer_fill += (size_t)status;
@@ -177,7 +177,7 @@ static int zookeeper_query(char *buffer, size_t buffer_size) {
   }
 
   close(sk);
-  return (status);
+  return status;
 } /* int zookeeper_query */
 
 static int zookeeper_read(void) {
@@ -188,7 +188,7 @@ static int zookeeper_read(void) {
   char *fields[2];
 
   if (zookeeper_query(buf, sizeof(buf)) < 0) {
-    return (-1);
+    return -1;
   }
 
   ptr = buf;
@@ -238,7 +238,7 @@ static int zookeeper_read(void) {
     }
   }
 
-  return (0);
+  return 0;
 } /* zookeeper_read */
 
 void module_register(void) {