Merge branch 'collectd-5.5'
authorFlorian Forster <octo@collectd.org>
Sat, 5 Dec 2015 21:06:46 +0000 (22:06 +0100)
committerFlorian Forster <octo@collectd.org>
Sat, 5 Dec 2015 21:06:46 +0000 (22:06 +0100)
14 files changed:
1  2 
configure.ac
src/bind.c
src/curl_xml.c
src/daemon/utils_cache.c
src/libcollectdclient/client.c
src/madwifi.c
src/statsd.c
src/unixsock.c
src/varnish.c
src/write_riemann.c
src/write_sensu.c
src/write_tsdb.c
src/zfs_arc.c
src/zookeeper.c

diff --combined configure.ac
@@@ -2065,6 -2065,12 +2065,6 @@@ the
        AC_CHECK_LIB(gcrypt, gcry_md_hash_buffer,
                [with_libgcrypt="yes"],
                [with_libgcrypt="no (symbol gcry_md_hash_buffer not found)"])
 -
 -      if test "$with_libgcrypt" != "no"; then
 -              m4_ifdef([AM_PATH_LIBGCRYPT],[AM_PATH_LIBGCRYPT(1:1.2.0,,with_libgcrypt="no (version 1.2.0+ required)")])
 -              GCRYPT_CPPFLAGS="$LIBGCRYPT_CPPFLAGS $LIBGCRYPT_CFLAGS"
 -              GCRYPT_LIBS="$LIBGCRYPT_LIBS"
 -      fi
  fi
  
  CPPFLAGS="$SAVE_CPPFLAGS"
@@@ -2227,7 -2233,7 +2227,7 @@@ the
                fi
  
                AC_MSG_CHECKING([for libjvm.so])
-               TMPVAR=`find -L "$with_java_home" -name libjvm.so -type f -exec 'dirname' '{}' ';' 2>/dev/null | head -n 1`
+               TMPVAR=`find -L "$with_java_home" -type f -name libjvm.so -o -name libjvm.dylib -exec 'dirname' '{}' ';' 2>/dev/null | head -n 1`
                if test "x$TMPVAR" != "x"
                then
                        AC_MSG_RESULT([found in $TMPVAR])
  AM_CONDITIONAL(BUILD_WITH_LIBMONGOC, test "x$with_libmongoc" = "xyes")
  # }}}
  
 +# --with-libmosquitto {{{
 +with_libmosquitto_cppflags=""
 +with_libmosquitto_libs="-lmosquitto"
 +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_libs="-L$withval/lib -lmosquitto"
 +              with_libmosquitto="yes"
 +      else
 +              with_libmosquitto="$withval"
 +      fi
 +],
 +[
 +      with_libmosquitto="yes"
 +])
 +if test "x$with_libmosquitto" = "xyes"
 +then
 +      SAVE_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"
 +      SAVE_CPPFLAGS="$CPPFLAGS"
 +      LDFLAGS="$with_libmosquitto_libs"
 +      CPPFLAGS="$with_libmosquitto_cppflags"
 +
 +      AC_CHECK_LIB(mosquitto, mosquitto_connect, [with_libmosquitto="yes"], [with_libmosquitto="no (libmosquitto not found)"])
 +
 +      LDFLAGS="$SAVE_LDFLAGS"
 +      CPPFLAGS="$SAVE_CPPFLAGS"
 +fi
 +if test "x$with_libmosquitto" = "xyes"
 +then
 +      BUILD_WITH_LIBMOSQUITTO_CPPFLAGS="$with_libmosquitto_cppflags"
 +      BUILD_WITH_LIBMOSQUITTO_LIBS="$with_libmosquitto_libs"
 +      AC_SUBST(BUILD_WITH_LIBMOSQUITTO_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBMOSQUITTO_LIBS)
 +fi
 +# }}}
 +
  # --with-libmysql {{{
  with_mysql_config="mysql_config"
  with_mysql_cflags=""
@@@ -5251,7 -5210,6 +5251,7 @@@ collectd features:]
  AC_COLLECTD([debug],     [enable],  [feature], [debugging])
  AC_COLLECTD([daemon],    [disable], [feature], [daemon mode])
  AC_COLLECTD([getifaddrs],[enable],  [feature], [getifaddrs under Linux])
 +AC_COLLECTD([werror],    [disable], [feature], [building with -Werror])
  
  dependency_warning="no"
  dependency_error="no"
@@@ -5302,7 -5260,6 +5302,7 @@@ plugin_vmem="no
  plugin_vserver="no"
  plugin_wireless="no"
  plugin_zfs_arc="no"
 +plugin_zone="no"
  plugin_zookeeper="no"
  
  # Linux
  
  if test "x$ac_system" = "xFreeBSD"
  then
 +      plugin_disk="yes"
        plugin_zfs_arc="yes"
  fi
  
@@@ -5402,7 -5358,6 +5402,7 @@@ the
        plugin_processes="yes"
        plugin_uptime="yes"
        plugin_zfs_arc="yes"
 +      plugin_zone="yes"
  fi
  
  if test "x$with_devinfo$with_kstat" = "xyesyes"
@@@ -5698,7 -5653,6 +5698,7 @@@ AC_PLUGIN([memcached],   [yes]
  AC_PLUGIN([memory],      [$plugin_memory],     [Memory usage])
  AC_PLUGIN([mic],         [$with_mic],          [Intel Many Integrated Core stats])
  AC_PLUGIN([modbus],      [$with_libmodbus],    [Modbus plugin])
 +AC_PLUGIN([mqtt],        [$with_libmosquitto], [MQTT output plugin])
  AC_PLUGIN([multimeter],  [$plugin_multimeter], [Read multimeter values])
  AC_PLUGIN([mysql],       [$with_libmysql],     [MySQL statistics])
  AC_PLUGIN([netapp],      [$with_libnetapp],    [NetApp plugin])
@@@ -5708,7 -5662,6 +5708,7 @@@ AC_PLUGIN([nfs],         [$plugin_nfs]
  AC_PLUGIN([nginx],       [$with_libcurl],      [nginx statistics])
  AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
  AC_PLUGIN([notify_email], [$with_libesmtp],    [Email notifier])
 +AC_PLUGIN([notify_nagios], [yes],              [Nagios notification plugin])
  AC_PLUGIN([ntpd],        [yes],                [NTPd statistics])
  AC_PLUGIN([numa],        [$plugin_numa],       [NUMA virtual memory statistics])
  AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
@@@ -5775,7 -5728,6 +5775,7 @@@ AC_PLUGIN([write_sensu], [yes]
  AC_PLUGIN([write_tsdb],  [yes],                [TSDB output plugin])
  AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
  AC_PLUGIN([zfs_arc],     [$plugin_zfs_arc],    [ZFS ARC statistics])
 +AC_PLUGIN([zone],        [$plugin_zone],       [Solaris container statistics])
  AC_PLUGIN([zookeeper],   [yes],              [Zookeeper statistics])
  
  dnl Default configuration file
@@@ -5927,13 -5879,6 +5927,13 @@@ AC_SUBST(LCC_VERSION_STRING
  
  AC_CONFIG_FILES(src/libcollectdclient/collectd/lcc_features.h)
  
 +AM_CFLAGS="-Wall"
 +if test "x$enable_werror" != "xno"
 +then
 +        AM_CFLAGS="$AM_CFLAGS -Werror"
 +fi
 +AC_SUBST([AM_CFLAGS])
 +
  AC_CONFIG_FILES([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_OUTPUT
  
  cat <<EOF;
  
  Configuration:
 +  Build:
 +    Platform  . . . . . . $ac_system
 +    CC  . . . . . . . . . $CC
 +    CFLAGS  . . . . . . . $AM_CFLAGS $CFLAGS
 +    CPP . . . . . . . . . $CPP
 +    CPPFLAGS  . . . . . . $CPPFLAGS
 +    LD  . . . . . . . . . $LD
 +    LDFLAGS . . . . . . . $LDFLAGS
 +    YACC  . . . . . . . . $YACC
 +    YFLAGS  . . . . . . . $YFLAGS
 +
    Libraries:
      intel mic . . . . . . $with_mic
      libaquaero5 . . . . . $with_libaquaero5
      libmnl  . . . . . . . $with_libmnl
      libmodbus . . . . . . $with_libmodbus
      libmongoc . . . . . . $with_libmongoc
 +    libmosquitto  . . . . $with_libmosquitto
      libmysql  . . . . . . $with_libmysql
      libnetapp . . . . . . $with_libnetapp
      libnetsnmp  . . . . . $with_libnetsnmp
      memory  . . . . . . . $enable_memory
      mic . . . . . . . . . $enable_mic
      modbus  . . . . . . . $enable_modbus
 +    mqtt  . . . . . . . . $enable_mqtt
      multimeter  . . . . . $enable_multimeter
      mysql . . . . . . . . $enable_mysql
      netapp  . . . . . . . $enable_netapp
      nginx . . . . . . . . $enable_nginx
      notify_desktop  . . . $enable_notify_desktop
      notify_email  . . . . $enable_notify_email
 +    notify_nagios . . . . $enable_notify_nagios
      ntpd  . . . . . . . . $enable_ntpd
      numa  . . . . . . . . $enable_numa
      nut . . . . . . . . . $enable_nut
      write_tsdb  . . . . . $enable_write_tsdb
      xmms  . . . . . . . . $enable_xmms
      zfs_arc . . . . . . . $enable_zfs_arc
 +    zone  . . . . . . . . $enable_zone
      zookeeper . . . . . . $enable_zookeeper
  
  EOF
diff --combined src/bind.c
@@@ -1709,6 -1709,7 +1709,7 @@@ static int bind_config (oconfig_item_t 
          return (-1);
        }
  
+       sfree (url);
        url = strdup (child->values[0].value.string);
      } else if (strcasecmp ("OpCodes", child->key) == 0)
        bind_config_set_bool ("OpCodes", &global_opcodes, child);
@@@ -1759,7 -1760,7 +1760,7 @@@ static int bind_init (void) /* {{{ *
    curl_easy_setopt (curl, CURLOPT_MAXREDIRS, 50L);
  #ifdef HAVE_CURLOPT_TIMEOUT_MS
    curl_easy_setopt (curl, CURLOPT_TIMEOUT_MS, (timeout >= 0) ?
 -      (long) timeout : CDTIME_T_TO_MS(plugin_get_interval()));
 +      (long) timeout : (long) CDTIME_T_TO_MS(plugin_get_interval()));
  #endif
  
  
diff --combined src/curl_xml.c
@@@ -50,7 -50,7 +50,7 @@@ struct cx_xpath_s /* {{{ *
    char *path;
    char *type;
    cx_values_t *values;
 -  int values_len;
 +  size_t values_len;
    char *instance_prefix;
    char *instance;
    int is_table;
@@@ -240,7 -240,7 +240,7 @@@ static int cx_check_type (const data_se
  
    if (ds->ds_num != xpath->values_len)
    {
 -    WARNING ("curl_xml plugin: DataSet `%s' requires %i values, but config talks about %i",
 +    WARNING ("curl_xml plugin: DataSet `%s' requires %zu values, but config talks about %zu",
          xpath->type, ds->ds_num, xpath->values_len);
      return (-1);
    }
@@@ -356,7 -356,7 +356,7 @@@ static int cx_handle_all_value_xpaths (
  {
    value_t values[xpath->values_len];
    int status;
 -  int i;
 +  size_t i;
  
    assert (xpath->values_len > 0);
    assert (xpath->values_len == vl->values_len);
@@@ -689,7 -689,7 +689,7 @@@ static int cx_config_add_values (const 
    xpath->values = (cx_values_t *) malloc (sizeof (cx_values_t) * ci->values_num);
    if (xpath->values == NULL)
      return (-1);
 -  xpath->values_len = ci->values_num;
 +  xpath->values_len = (size_t) ci->values_num;
  
    /* populate cx_values_t structure */
    for (i = 0; i < ci->values_num; i++)
      sstrncpy (xpath->values[i].path, ci->values[i].value.string, sizeof (xpath->values[i].path));
    }
  
-   return (0); 
+   return (0);
  } /* }}} cx_config_add_values */
  
  static int cx_config_add_xpath (cx_t *db, /* {{{ */
    {
      ERROR ("curl_xml plugin: invalid xpath. "
             "xpath value can't be an empty string");
+     sfree (xpath);
      return (-1);
    }
  
        if (db->list == NULL)
        {
          ERROR ("curl_xml plugin: list creation failed.");
+         sfree (xpath->path);
+         sfree (xpath);
          return (-1);
        }
      }
      if (name == NULL)
      {
          ERROR ("curl_xml plugin: strdup failed.");
+         sfree (xpath->path);
+         sfree (xpath);
          return (-1);
      }
  
      if (le == NULL)
      {
        ERROR ("curl_xml plugin: llentry_create failed.");
+       sfree (xpath->path);
+       sfree (xpath);
        return (-1);
      }
  
@@@ -897,7 -904,8 +904,7 @@@ static int cx_init_curl (cx_t *db) /* {
    if (db->timeout >= 0)
      curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) db->timeout);
    else
 -    curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS,
 -       CDTIME_T_TO_MS(plugin_get_interval()));
 +    curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) CDTIME_T_TO_MS(plugin_get_interval()));
  #endif
  
    return (0);
@@@ -1015,7 -1023,7 +1022,7 @@@ static int cx_config_add_url (oconfig_i
  
      cb_name = ssnprintf_alloc ("curl_xml-%s-%s", db->instance, db->url);
      plugin_register_complex_read (/* group = */ "curl_xml", cb_name, cx_read,
 -                                  /* interval = */ NULL, &ud);
 +                                  /* interval = */ 0, &ud);
      sfree (cb_name);
    }
    else
diff --combined src/daemon/utils_cache.c
@@@ -37,7 -37,7 +37,7 @@@
  typedef struct cache_entry_s
  {
        char name[6 * DATA_MAX_NAME_LEN];
 -      int        values_num;
 +      size_t     values_num;
        gauge_t   *values_gauge;
        value_t   *values_raw;
        /* Time contained in the package
@@@ -79,7 -79,7 +79,7 @@@ static int cache_compare (const cache_e
    return (strcmp (a->name, b->name));
  } /* int cache_compare */
  
 -static cache_entry_t *cache_alloc (int values_num)
 +static cache_entry_t *cache_alloc (size_t values_num)
  {
    cache_entry_t *ce;
  
@@@ -128,7 -128,7 +128,7 @@@ static void cache_free (cache_entry_t *
  
  static void uc_check_range (const data_set_t *ds, cache_entry_t *ce)
  {
 -  int i;
 +  size_t i;
  
    for (i = 0; i < ds->ds_num; i++)
    {
  static int uc_insert (const data_set_t *ds, const value_list_t *vl,
      const char *key)
  {
 -  int i;
    char *key_copy;
    cache_entry_t *ce;
 +  size_t i;
  
    /* `cache_lock' has been locked by `uc_update' */
  
    if (ce == NULL)
    {
      sfree (key_copy);
 -    ERROR ("uc_insert: cache_alloc (%i) failed.", ds->ds_num);
 +    ERROR ("uc_insert: cache_alloc (%zu) failed.", ds->ds_num);
      return (-1);
    }
  
            / CDTIME_T_TO_DOUBLE (vl->interval);
        ce->values_raw[i].absolute = vl->values[i].absolute;
        break;
-       
        default:
        /* This shouldn't happen. */
        ERROR ("uc_insert: Don't know how to handle data source type %i.",
            ds->ds[i].type);
        sfree (key_copy);
+       cache_free (ce);
        return (-1);
      } /* switch (ds->ds[i].type) */
    } /* for (i) */
@@@ -374,7 -375,7 +375,7 @@@ int uc_update (const data_set_t *ds, co
    char name[6 * DATA_MAX_NAME_LEN];
    cache_entry_t *ce = NULL;
    int status;
 -  int i;
 +  size_t i;
  
    if (FORMAT_VL (name, sizeof (name), vl) != 0)
    {
      {
        case DS_TYPE_COUNTER:
        {
 -        counter_t diff;
 -
 -        /* check if the counter has wrapped around */
 -        if (vl->values[i].counter < ce->values_raw[i].counter)
 -        {
 -          if (ce->values_raw[i].counter <= 4294967295U)
 -            diff = (4294967295U - ce->values_raw[i].counter)
 -              + vl->values[i].counter;
 -          else
 -            diff = (18446744073709551615ULL - ce->values_raw[i].counter)
 -              + vl->values[i].counter;
 -        }
 -        else /* counter has NOT wrapped around */
 -        {
 -          diff = vl->values[i].counter - ce->values_raw[i].counter;
 -        }
 -
 +        counter_t diff = counter_diff (ce->values_raw[i].counter, vl->values[i].counter);
          ce->values_gauge[i] = ((double) diff)
            / (CDTIME_T_TO_DOUBLE (vl->time - ce->last_time));
          ce->values_raw[i].counter = vl->values[i].counter;
  
        case DS_TYPE_DERIVE:
        {
 -        derive_t diff;
 -
 -        diff = vl->values[i].derive - ce->values_raw[i].derive;
 +        derive_t diff = vl->values[i].derive - ce->values_raw[i].derive;
  
          ce->values_gauge[i] = ((double) diff)
            / (CDTIME_T_TO_DOUBLE (vl->time - ce->last_time));
        return (-1);
      } /* switch (ds->ds[i].type) */
  
 -    DEBUG ("uc_update: %s: ds[%i] = %lf", name, i, ce->values_gauge[i]);
 +    DEBUG ("uc_update: %s: ds[%zu] = %lf", name, i, ce->values_gauge[i]);
    } /* for (i) */
  
    /* Update the history if it exists. */
@@@ -548,7 -567,7 +549,7 @@@ gauge_t *uc_get_rate (const data_set_t 
     * values are returned. */
    if (ret_num != (size_t) ds->ds_num)
    {
 -    ERROR ("utils_cache: uc_get_rate: ds[%s] has %i values, "
 +    ERROR ("utils_cache: uc_get_rate: ds[%s] has %zu values, "
        "but uc_get_rate_by_name returned %zu.",
        ds->type, ds->ds_num, ret_num);
      sfree (ret);
@@@ -287,7 -287,7 +287,7 @@@ static int lcc_receive (lcc_connection_
     * beginning of the message. */
    ptr = NULL;
    errno = 0;
 -  res.status = strtol (buffer, &ptr, 0);
 +  res.status = (int) strtol (buffer, &ptr, 0);
    if ((errno != 0) || (ptr == &buffer[0]))
    {
      lcc_set_errno (c, errno);
@@@ -526,9 -526,11 +526,11 @@@ static int lcc_open_netsocket (lcc_conn
    if (status != 0)
    {
      lcc_set_errno (c, status);
+     freeaddrinfo (ai_res);
      return (-1);
    }
  
+   freeaddrinfo (ai_res);
    return (0);
  } /* }}} int lcc_open_netsocket */
  
diff --combined src/madwifi.c
@@@ -96,6 -96,7 +96,6 @@@
  
  #include <dirent.h>
  #include <sys/ioctl.h>
 -#include <sys/socket.h>
  
  #if !KERNEL_LINUX
  # error "No applicable input method."
@@@ -367,14 -368,14 +367,14 @@@ static int init_state = 0
  static inline int item_watched(int i)
  {
        assert (i >= 0);
 -      assert (i < ((STATIC_ARRAY_SIZE (watch_items) + 1) * 32));
 +      assert (((size_t) i) < ((STATIC_ARRAY_SIZE (watch_items) + 1) * 32));
        return watch_items[i / 32] & FLAG (i);
  }
  
  static inline int item_summed(int i)
  {
        assert (i >= 0);
 -      assert (i < ((STATIC_ARRAY_SIZE (misc_items) + 1) * 32));
 +      assert (((size_t) i) < ((STATIC_ARRAY_SIZE (misc_items) + 1) * 32));
        return misc_items[i / 32] & FLAG (i);
  }
  
@@@ -419,8 -420,8 +419,8 @@@ static int watchitem_find (const char *
  
  static int madwifi_real_init (void)
  {
 -      int max = STATIC_ARRAY_SIZE (specs);
 -      int i;
 +      size_t max = STATIC_ARRAY_SIZE (specs);
 +      size_t i;
  
        for (i = 0; i < STATIC_ARRAY_SIZE (bounds); i++)
                bounds[i] = 0;
@@@ -617,7 -618,7 +617,7 @@@ process_stat_struct (int which, const v
        int i;
  
        assert (which >= 1);
 -      assert (which < STATIC_ARRAY_SIZE (bounds));
 +      assert (((size_t) which) < STATIC_ARRAY_SIZE (bounds));
  
        for (i = bounds[which - 1]; i < bounds[which]; i++)
        {
@@@ -753,8 -754,7 +753,8 @@@ process_stations (int sk, const char *d
        uint8_t buf[24*1024];
        struct iwreq iwr;
        uint8_t *cp;
 -      int len, nodes;
 +      int nodes;
 +      size_t len;
        int status;
  
        memset (&iwr, 0, sizeof (iwr));
@@@ -821,15 -821,16 +821,16 @@@ check_devname (const char *dev
  
        if (dev[0] == '.')
                return 0;
-       
        ssnprintf (buf, sizeof (buf), "/sys/class/net/%s/device/driver", dev);
-       buf[sizeof (buf) - 1] = 0;
+       buf[sizeof (buf) - 1] = '\0';
  
-       memset (buf2, 0, sizeof (buf2));
        i = readlink (buf, buf2, sizeof (buf2) - 1);
        if (i < 0)
                return 0;
  
+       buf2[i] = '\0';
        if (strstr (buf2, "/drivers/ath_") == NULL)
                return 0;
        return 1;
diff --combined src/statsd.c
@@@ -35,6 -35,7 +35,6 @@@
  #include <pthread.h>
  
  #include <sys/types.h>
 -#include <sys/socket.h>
  #include <netdb.h>
  #include <poll.h>
  
@@@ -64,7 -65,6 +64,7 @@@ struct statsd_metric_
  {
    metric_type_t type;
    double value;
 +  derive_t counter;
    latency_counter_t *latency;
    c_avl_tree_t *set;
    unsigned long updates_num;
@@@ -89,7 -89,6 +89,7 @@@ static _Bool conf_delete_sets     = 0
  static double *conf_timer_percentile = NULL;
  static size_t  conf_timer_percentile_num = 0;
  
 +static _Bool conf_counter_sum     = 0;
  static _Bool conf_timer_lower     = 0;
  static _Bool conf_timer_upper     = 0;
  static _Bool conf_timer_sum       = 0;
@@@ -263,8 -262,6 +263,8 @@@ static int statsd_handle_counter (char 
    if (status != 0)
      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));
  } /* }}} int statsd_handle_counter */
@@@ -565,6 -562,7 +565,7 @@@ static int statsd_network_init (struct 
      if (tmp == NULL)
      {
        ERROR ("statsd plugin: realloc failed.");
+       close (fd);
        continue;
      }
      fds = tmp;
@@@ -688,8 -686,6 +689,8 @@@ static int statsd_config (oconfig_item_
        cf_util_get_boolean (child, &conf_delete_gauges);
      else if (strcasecmp ("DeleteSets", child->key) == 0)
        cf_util_get_boolean (child, &conf_delete_sets);
 +    else if (strcasecmp ("CounterSum", child->key) == 0)
 +      cf_util_get_boolean (child, &conf_counter_sum);
      else if (strcasecmp ("TimerLower", child->key) == 0)
        cf_util_get_boolean (child, &conf_timer_lower);
      else if (strcasecmp ("TimerUpper", child->key) == 0)
@@@ -760,7 -756,8 +761,7 @@@ static int statsd_metric_clear_set_unsa
  } /* }}} int statsd_metric_clear_set_unsafe */
  
  /* Must hold metrics_lock when calling this function. */
 -static int statsd_metric_submit_unsafe (char const *name, /* {{{ */
 -    statsd_metric_t const *metric)
 +static int statsd_metric_submit_unsafe (char const *name, statsd_metric_t *metric) /* {{{ */
  {
    value_t values[1];
    value_list_t vl = VALUE_LIST_INIT;
        values[0].gauge = (gauge_t) c_avl_size (metric->set);
    }
    else { /* STATSD_COUNTER */
 -      /*
 -       * Expand a single value to two metrics:
 -       *
 -       * - The absolute counter, as a gauge
 -       * - A derived rate for this counter
 -       */
 -      values[0].derive = (derive_t) metric->value;
 -      plugin_dispatch_values(&vl);
 -
 -      sstrncpy(vl.type, "gauge", sizeof (vl.type));
 -      values[0].gauge = (gauge_t) metric->value;
 +    gauge_t delta = nearbyint (metric->value);
 +
 +    /* Etsy's statsd writes counters as two metrics: a rate and the change since
 +     * the last write. Since collectd does not reset its DERIVE metrics to zero,
 +     * this makes little sense, but we're dispatching a "count" metric here
 +     * anyway - if requested by the user - for compatibility reasons. */
 +    if (conf_counter_sum)
 +    {
 +      sstrncpy (vl.type, "count", sizeof (vl.type));
 +      values[0].gauge = delta;
 +      plugin_dispatch_values (&vl);
 +
 +      /* restore vl.type */
 +      sstrncpy (vl.type, "derive", sizeof (vl.type));
 +    }
 +
 +    /* Rather than resetting value to zero, subtract delta so we correctly keep
 +     * track of residuals. */
 +    metric->value   -= delta;
 +    metric->counter += (derive_t) delta;
 +
 +    values[0].derive = metric->counter;
    }
  
    return (plugin_dispatch_values (&vl));
diff --combined src/unixsock.c
@@@ -39,6 -39,7 +39,6 @@@
  /* Folks without pthread will need to disable this plugin. */
  #include <pthread.h>
  
 -#include <sys/socket.h>
  #include <sys/stat.h>
  #include <sys/un.h>
  
@@@ -127,7 -128,16 +127,16 @@@ static int us_open_socket (void
                return (-1);
        }
  
-       chmod (sa.sun_path, sock_perms);
+       status = chmod (sa.sun_path, sock_perms);
+       if (status == -1)
+       {
+               char errbuf[1024];
+               ERROR ("unixsock plugin: chmod failed: %s",
+                               sstrerror (errno, errbuf, sizeof (errbuf)));
+               close (sock_fd);
+               sock_fd = -1;
+               return (-1);
+       }
  
        status = listen (sock_fd, 8);
        if (status != 0)
diff --combined src/varnish.c
@@@ -793,7 -793,6 +793,7 @@@ static int varnish_read (user_data_t *u
  {
        struct VSM_data *vd;
        const c_varnish_stats_t *stats;
 +      _Bool ok;
  
        user_config_t *conf;
  
        }
  
  #if HAVE_VARNISH_V3
 -      if (VSC_Open (vd, /* diag = */ 1))
 +      ok = (VSC_Open (vd, /* diag = */ 1) == 0);
  #else /* if HAVE_VARNISH_V4 */
 -      if (VSM_Open (vd))
 +      ok = (VSM_Open (vd) == 0);
  #endif
 +      if (!ok)
        {
                VSM_Delete (vd);
                ERROR ("varnish plugin: Unable to open connection.");
@@@ -959,7 -957,7 +959,7 @@@ static int varnish_init (void) /* {{{ *
        plugin_register_complex_read (/* group = */ "varnish",
                        /* name      = */ "varnish/localhost",
                        /* callback  = */ varnish_read,
 -                      /* interval  = */ NULL,
 +                      /* interval  = */ 0,
                        /* user data = */ &ud);
  
        return (0);
@@@ -1002,6 -1000,7 +1002,7 @@@ static int varnish_config_instance (con
        {
                WARNING ("Varnish plugin: \"Instance\" blocks accept only "
                                "one argument.");
+               sfree (conf);
                return (EINVAL);
        }
  
                WARNING ("Varnish plugin: No metric has been configured for "
                                "instance \"%s\". Disabling this instance.",
                                (conf->instance == NULL) ? "localhost" : conf->instance);
+               sfree (conf);
                return (EINVAL);
        }
  
        plugin_register_complex_read (/* group = */ "varnish",
                        /* name      = */ callback_name,
                        /* callback  = */ varnish_read,
 -                      /* interval  = */ NULL,
 +                      /* interval  = */ 0,
                        /* user data = */ &ud);
  
        have_instance = 1;
diff --combined src/write_riemann.c
@@@ -33,6 -33,7 +33,6 @@@
  #include "utils_cache.h"
  #include "riemann.pb-c.h"
  
 -#include <sys/socket.h>
  #include <arpa/inet.h>
  #include <errno.h>
  #include <netdb.h>
@@@ -364,7 -365,7 +364,7 @@@ static Msg *riemann_notification_to_pro
        char service_buffer[6 * DATA_MAX_NAME_LEN];
        char const *severity;
        notification_meta_t *meta;
 -      int i;
 +      size_t i;
  
        msg = malloc (sizeof (*msg));
        if (msg == NULL)
@@@ -473,7 -474,7 +473,7 @@@ static Event *riemann_value_to_protobuf
        char name_buffer[5 * DATA_MAX_NAME_LEN];
        char service_buffer[6 * DATA_MAX_NAME_LEN];
        double ttl;
 -      int i;
 +      size_t i;
  
        event = malloc (sizeof (*event));
        if (event == NULL)
@@@ -618,7 -619,7 +618,7 @@@ static Msg *riemann_value_list_to_proto
        msg__init (msg);
  
        /* Set up events. First, the list of pointers. */
 -      msg->n_events = (size_t) vl->values_len;
 +      msg->n_events = vl->values_len;
        msg->events = calloc (msg->n_events, sizeof (*msg->events));
        if (msg->events == NULL)
        {
@@@ -743,8 -744,8 +743,8 @@@ static int riemann_batch_add_value_lis
  
        len = msg__get_packed_size(host->batch_msg);
      ret = 0;
 -    if (len >= host->batch_max) {
 -        ret = riemann_batch_flush_nolock(0, host);
 +    if ((host->batch_max < 0) || (((size_t) host->batch_max) <= len)) {
 +          ret = riemann_batch_flush_nolock(0, host);
      }
  
      pthread_mutex_unlock(&host->lock);
@@@ -777,35 -778,35 +777,35 @@@ static int riemann_notification(const n
  } /* }}} int riemann_notification */
  
  static int riemann_write(const data_set_t *ds, /* {{{ */
 -            const value_list_t *vl,
 -            user_data_t *ud)
 +              const value_list_t *vl,
 +              user_data_t *ud)
  {
        int                      status = 0;
        int                      statuses[vl->values_len];
        struct riemann_host     *host = ud->data;
 -      Msg                     *msg;
 -
 -      if (host->check_thresholds)
 -              write_riemann_threshold_check(ds, vl, statuses);
 -
 -    if (host->use_tcp == 1 && host->batch_mode) {
 -
 -        riemann_batch_add_value_list (host, ds, vl, statuses);
  
 +      if (host->check_thresholds) {
 +              status = write_riemann_threshold_check(ds, vl, statuses);
 +              if (status != 0)
 +                      return status;
 +      } else {
 +              memset (statuses, 0, sizeof (statuses));
 +      }
  
 -    } else {
 +      if (host->use_tcp == 1 && host->batch_mode) {
 +              riemann_batch_add_value_list (host, ds, vl, statuses);
 +      } else {
 +              Msg *msg = riemann_value_list_to_protobuf (host, ds, vl, statuses);
 +              if (msg == NULL)
 +                      return (-1);
  
 -        msg = riemann_value_list_to_protobuf (host, ds, vl, statuses);
 -        if (msg == NULL)
 -            return (-1);
 +              status = riemann_send (host, msg);
 +              if (status != 0)
 +                      ERROR ("write_riemann plugin: riemann_send failed with status %i", status);
  
 -        status = riemann_send (host, msg);
 -        if (status != 0)
 -            ERROR ("write_riemann plugin: riemann_send failed with status %i",
 -                   status);
 +              riemann_msg_protobuf_free (msg);
 +      }
  
 -        riemann_msg_protobuf_free (msg);
 -    }
        return status;
  } /* }}} int riemann_write */
  
@@@ -1050,6 -1051,7 +1050,7 @@@ static int riemann_config(oconfig_item_
                        }
                        if ((val = strdup(child->values[1].value.string)) == NULL) {
                                WARNING("cannot allocate memory for attribute value.");
+                               sfree (key);
                                return (-1);
                        }
                        strarray_add(&riemann_attrs, &riemann_attrs_num, key);
diff --combined src/write_sensu.c
@@@ -29,6 -29,7 +29,6 @@@
  #include "common.h"
  #include "configfile.h"
  #include "utils_cache.h"
 -#include <sys/socket.h>
  #include <arpa/inet.h>
  #include <errno.h>
  #include <netdb.h>
@@@ -328,7 -329,7 +328,7 @@@ static char *sensu_value_to_json(struc
  {
        char name_buffer[5 * DATA_MAX_NAME_LEN];
        char service_buffer[6 * DATA_MAX_NAME_LEN];
 -      int i;
 +      size_t i;
        char *ret_str;
        char *temp_str;
        char *value_str;
@@@ -640,7 -641,7 +640,7 @@@ static char *sensu_notification_to_json
        char *ret_str;
        char *temp_str;
        int status;
 -      int i;
 +      size_t i;
        int res;
        // add the severity/status
        switch (n->severity) {
        char *handlers_str = build_json_str_list("handlers", &(host->notification_handlers));
        if (handlers_str == NULL) {
                ERROR("write_sensu plugin: Unable to alloc memory");
+               free(ret_str);
                return NULL;
        }
        // incorporate the handlers
                char *msg = replace_json_reserved(n->message);
                if (msg == NULL) {
                        ERROR("write_sensu plugin: Unable to alloc memory");
+                       free(ret_str);
                        return NULL;
                }
                res = asprintf(&temp_str, "%s, \"output\": \"%s - %s\"", ret_str, severity, msg);
@@@ -882,7 -885,7 +884,7 @@@ static int sensu_write(const data_set_
        int statuses[vl->values_len];
        struct sensu_host       *host = ud->data;
        gauge_t *rates = NULL;
 -      int i;
 +      size_t i;
        char *msg;
  
        pthread_mutex_lock(&host->lock);
                        return -1;
                }
        }
 -      for (i = 0; i < (size_t) vl->values_len; i++) {
 +      for (i = 0; i < vl->values_len; i++) {
                msg = sensu_value_to_json(host, ds, vl, (int) i, rates, statuses[i]);
                if (msg == NULL) {
                        sfree(rates);
diff --combined src/write_tsdb.c
@@@ -49,6 -49,7 +49,6 @@@
  #include "utils_cache.h"
  
  #include <pthread.h>
 -#include <sys/socket.h>
  #include <netdb.h>
  
  #ifndef WT_DEFAULT_NODE
@@@ -211,7 -212,6 +211,6 @@@ static int wt_callback_init(struct wt_c
          ERROR("write_tsdb plugin: Connecting to %s:%s failed. "
                "The last error was: %s", node, service,
                sstrerror (errno, errbuf, sizeof(errbuf)));
-         close(cb->sock_fd);
          return -1;
      }
  
@@@ -410,7 -410,7 +409,7 @@@ static int wt_send_message (const char
                              const char* host, meta_data_t *md)
  {
      int status;
 -    int message_len;
 +    size_t message_len;
      char *temp = NULL;
      char *tags = "";
      char message[1024];
          }
      }
  
 -    message_len = ssnprintf (message,
 +    status = ssnprintf (message,
                               sizeof(message),
                               "put %s %.0f %s fqdn=%s %s %s\r\n",
                               key,
                               host,
                               tags,
                               host_tags);
 -
      sfree(temp);
 +    if (status < 0)
 +        return -1;
 +    message_len = (size_t) status;
  
      if (message_len >= sizeof(message)) {
          ERROR("write_tsdb plugin: message buffer too small: "
 -              "Need %d bytes.", message_len + 1);
 +              "Need %zu bytes.", message_len + 1);
          return -1;
      }
  
@@@ -507,8 -505,7 +506,8 @@@ static int wt_write_messages(const data
      char key[10*DATA_MAX_NAME_LEN];
      char values[512];
  
 -    int status, i;
 +    int status;
 +    size_t i;
  
      if (0 != strcmp(ds->type, vl->type))
      {
diff --combined src/zfs_arc.c
@@@ -208,6 -208,11 +208,11 @@@ static int za_read (void
                {
                        llentry_t *e;
                        llvalues = malloc(sizeof(long long int) * i);
+                       if (llvalues == NULL)
+                       {
+                               ERROR ("zfs_arc plugin: `malloc' failed.");
+                               return (-1);
+                       }
                        int j = 0;
  
                        pnl = file_contents;
  
        /* Sizes */
        za_read_gauge (ksp, "size",    "cache_size", "arc");
 +      za_read_gauge (ksp, "c",    "cache_size", "c");
 +      za_read_gauge (ksp, "c_min",    "cache_size", "c_min");
 +      za_read_gauge (ksp, "c_max",    "cache_size", "c_max");
  
        /* The "l2_size" value has disappeared from Solaris some time in
         * early 2013, and has only reappeared recently in Solaris 11.2.
diff --combined src/zookeeper.c
@@@ -29,6 -29,7 +29,6 @@@
  #include "plugin.h"
  
  #include <netdb.h>
 -#include <sys/socket.h>
  #include <sys/un.h>
  #include <netinet/in.h>
  #include <netinet/tcp.h>
@@@ -198,11 -199,6 +198,6 @@@ static int zookeeper_query (char *buffe
                }
  
                buffer_fill += (size_t) status;
-               if (status == 0)
-               {
-                       /* done reading from the socket */
-                       break;
-               }
        } /* while (recv) */
  
        status = 0;