Merge branch 'collectd-4.10' into collectd-5.1
authorFlorian Forster <octo@collectd.org>
Sun, 3 Feb 2013 10:36:37 +0000 (11:36 +0100)
committerFlorian Forster <octo@collectd.org>
Sun, 3 Feb 2013 10:36:37 +0000 (11:36 +0100)
Conflicts:
src/curl_json.c

1  2 
src/apache.c
src/bind.c
src/cpu.c
src/curl.c
src/curl_json.c
src/logfile.c
src/nginx.c
src/write_http.c

diff --combined src/apache.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/apache.c
 - * Copyright (C) 2006-2009  Florian octo Forster
 + * Copyright (C) 2006-2010  Florian octo Forster
   * Copyright (C) 2007       Florent EppO Monbillard
   * Copyright (C) 2009       Amit Gupta
   *
@@@ -144,8 -144,6 +144,8 @@@ static size_t apache_header_callback (v
                st->server_type = APACHE;
        else if (strstr (buf, "lighttpd") != NULL)
                st->server_type = LIGHTTPD;
 +      else if (strstr (buf, "IBM_HTTP_Server") != NULL)
 +              st->server_type = APACHE;
        else
        {
                const char *hdr = buf;
@@@ -335,22 -333,57 +335,22 @@@ static int config (oconfig_item_t *ci
  {
        int status = 0;
        int i;
 -      oconfig_item_t *lci = NULL; /* legacy config */
  
        for (i = 0; i < ci->children_num; i++)
        {
                oconfig_item_t *child = ci->children + i;
  
 -              if (strcasecmp ("Instance", child->key) == 0 && child->children_num > 0)
 +              if (strcasecmp ("Instance", child->key) == 0)
                        config_add (child);
                else
 -              {
 -                      /* legacy mode - convert to <Instance ...> config */
 -                      if (lci == NULL)
 -                      {
 -                              lci = malloc (sizeof(*lci));
 -                              if (lci == NULL)
 -                              {
 -                                      ERROR ("apache plugin: malloc failed.");
 -                                      return (-1);
 -                              }
 -                              memset (lci, '\0', sizeof (*lci));
 -                      }
 -
 -                      lci->children_num++;
 -                      lci->children =
 -                              realloc (lci->children,
 -                                       lci->children_num * sizeof (*child));
 -                      if (lci->children == NULL)
 -                      {
 -                              ERROR ("apache plugin: realloc failed.");
 -                              return (-1);
 -                      }
 -                      memcpy (&lci->children[lci->children_num-1], child, sizeof (*child));
 -              }
 +                      WARNING ("apache plugin: The configuration option "
 +                                      "\"%s\" is not allowed here. Did you "
 +                                      "forget to add an <Instance /> block "
 +                                      "around the configuration?",
 +                                      child->key);
        } /* for (ci->children) */
  
 -      if (lci)
 -      {
 -              /* create a <Instance ""> entry */
 -              lci->key = "Instance";
 -              lci->values_num = 1;
 -              lci->values = (oconfig_value_t *) malloc (lci->values_num * sizeof (oconfig_value_t));
 -              lci->values[0].type = OCONFIG_TYPE_STRING;
 -              lci->values[0].value.string = "";
 -
 -              status = config_add (lci);
 -              sfree (lci->values);
 -              sfree (lci->children);
 -              sfree (lci);
 -      }
 -
 -      return status;
 +      return (status);
  } /* int config */
  
  /* initialize curl for each host */
@@@ -373,7 -406,7 +373,7 @@@ static int init_host (apache_t *st) /* 
                return (-1);
        }
  
-       curl_easy_setopt (st->curl, CURLOPT_NOSIGNAL, 1);
+       curl_easy_setopt (st->curl, CURLOPT_NOSIGNAL, 1L);
        curl_easy_setopt (st->curl, CURLOPT_WRITEFUNCTION, apache_curl_callback);
        curl_easy_setopt (st->curl, CURLOPT_WRITEDATA, st);
  
                        st->server_type = APACHE;
                else if (strcasecmp(st->server, "lighttpd") == 0)
                        st->server_type = LIGHTTPD;
 +              else if (strcasecmp(st->server, "ibm_http_server") == 0)
 +                      st->server_type = APACHE;
                else
                        WARNING ("apache plugin: Unknown `Server' setting: %s",
                                        st->server);
        }
  
        curl_easy_setopt (st->curl, CURLOPT_URL, st->url);
-       curl_easy_setopt (st->curl, CURLOPT_FOLLOWLOCATION, 1);
+       curl_easy_setopt (st->curl, CURLOPT_FOLLOWLOCATION, 1L);
  
        if (st->verify_peer != 0)
        {
-               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 1);
+               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 1L);
        }
        else
        {
-               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 0);
+               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 0L);
        }
  
        if (st->verify_host != 0)
        {
-               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 2);
+               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 2L);
        }
        else
        {
-               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 0);
+               curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 0L);
        }
  
        if (st->cacert != NULL)
@@@ -477,13 -508,13 +477,13 @@@ static void submit_value (const char *t
        plugin_dispatch_values (&vl);
  } /* void submit_value */
  
 -static void submit_counter (const char *type, const char *type_instance,
 -              counter_t c, apache_t *st)
 +static void submit_derive (const char *type, const char *type_instance,
 +              derive_t c, apache_t *st)
  {
        value_t v;
 -      v.counter = c;
 +      v.derive = c;
        submit_value (type, type_instance, v, st);
 -} /* void submit_counter */
 +} /* void submit_derive */
  
  static void submit_gauge (const char *type, const char *type_instance,
                gauge_t g, apache_t *st)
@@@ -645,11 -676,11 +645,11 @@@ static int apache_read_host (user_data_
                {
                        if ((strcmp (fields[0], "Total") == 0)
                                        && (strcmp (fields[1], "Accesses:") == 0))
 -                              submit_counter ("apache_requests", "",
 +                              submit_derive ("apache_requests", "",
                                                atoll (fields[2]), st);
                        else if ((strcmp (fields[0], "Total") == 0)
                                        && (strcmp (fields[1], "kBytes:") == 0))
 -                              submit_counter ("apache_bytes", "",
 +                              submit_derive ("apache_bytes", "",
                                                1024LL * atoll (fields[2]), st);
                }
                else if (fields_num == 2)
diff --combined src/bind.c
@@@ -1,7 -1,7 +1,7 @@@
  /**
   * collectd - src/bind.c
 - * Copyright (C) 2009  Bruno Prémont
 - * Copyright (C) 2009  Florian Forster
 + * Copyright (C) 2009       Bruno Prémont
 + * Copyright (C) 2009,2010  Florian 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
   *
   * Authors:
   *   Bruno Prémont <bonbons at linux-vserver.org>
 - *   Florian Forster <octo at verplant.org>
 + *   Florian Forster <octo at collectd.org>
   **/
  
  #include "config.h"
  
 -#ifndef _XOPEN_SOURCE
 -# define _XOPEN_SOURCE 600 /* glibc2 needs this for strptime */
 -#endif
 +#if STRPTIME_NEEDS_STANDARDS
 +# 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
 +#endif /* STRPTIME_NEEDS_STANDARDS */
  
  #include "collectd.h"
  #include "common.h"
@@@ -98,10 -90,6 +98,10 @@@ struct list_info_ptr_
  };
  typedef struct list_info_ptr_s list_info_ptr_t;
  
 +/* FIXME: Enabled by default for backwards compatibility. */
 +/* TODO: Remove time parsing code. */
 +static _Bool config_parse_time = 1;
 +
  static char *url                   = NULL;
  static int global_opcodes          = 1;
  static int global_qtypes           = 1;
@@@ -253,8 -241,7 +253,8 @@@ static void submit (time_t ts, const ch
  
    vl.values = values;
    vl.values_len = 1;
 -  vl.time = ts;
 +  if (config_parse_time)
 +    vl.time = TIME_T_TO_CDTIME_T (ts);
    sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "bind", sizeof(vl.plugin));
    if (plugin_instance) {
@@@ -350,31 -337,36 +350,31 @@@ static int bind_xml_list_callback (cons
    return (0);
  } /* }}} int bind_xml_list_callback */
  
 -static int bind_xml_read_counter (xmlDoc *doc, xmlNode *node, /* {{{ */
 -    counter_t *ret_value)
 +static int bind_xml_read_derive (xmlDoc *doc, xmlNode *node, /* {{{ */
 +    derive_t *ret_value)
  {
 -  char *str_ptr, *end_ptr;
 -  long long int value;
 +  char *str_ptr;
 +  value_t value;
 +  int status;
  
    str_ptr = (char *) xmlNodeListGetString (doc, node->xmlChildrenNode, 1);
    if (str_ptr == NULL)
    {
 -    ERROR ("bind plugin: bind_xml_read_counter: xmlNodeListGetString failed.");
 +    ERROR ("bind plugin: bind_xml_read_derive: xmlNodeListGetString failed.");
      return (-1);
    }
  
 -  errno = 0;
 -  value = strtoll (str_ptr, &end_ptr, 10);
 -  xmlFree(str_ptr);
 -  if (str_ptr == end_ptr || errno)
 +  status = parse_value (str_ptr, &value, DS_TYPE_DERIVE);
 +  if (status != 0)
    {
 -    if (errno && (value < 0))
 -      ERROR ("bind plugin: bind_xml_read_counter: strtoll failed with underflow.");
 -    else if (errno && (value > 0))
 -      ERROR ("bind plugin: bind_xml_read_counter: strtoll failed with overflow.");
 -    else
 -      ERROR ("bind plugin: bind_xml_read_counter: strtoll failed.");
 +    ERROR ("bind plugin: Parsing string \"%s\" to derive value failed.",
 +        str_ptr);
      return (-1);
    }
  
 -  *ret_value = value;
 +  *ret_value = value.derive;
    return (0);
 -} /* }}} int bind_xml_read_counter */
 +} /* }}} int bind_xml_read_derive */
  
  static int bind_xml_read_gauge (xmlDoc *doc, xmlNode *node, /* {{{ */
      gauge_t *ret_value)
@@@ -535,7 -527,7 +535,7 @@@ static int bind_parse_generic_name_valu
        if (ds_type == DS_TYPE_GAUGE)
          status = bind_xml_read_gauge (doc, counter, &value.gauge);
        else
 -        status = bind_xml_read_counter (doc, counter, &value.counter);
 +        status = bind_xml_read_derive (doc, counter, &value.derive);
        if (status != 0)
          continue;
  
@@@ -608,7 -600,7 +608,7 @@@ static int bind_parse_generic_value_lis
        if (ds_type == DS_TYPE_GAUGE)
          status = bind_xml_read_gauge (doc, child, &value.gauge);
        else
 -        status = bind_xml_read_counter (doc, child, &value.counter);
 +        status = bind_xml_read_derive (doc, child, &value.derive);
        if (status != 0)
          continue;
  
@@@ -1369,8 -1361,6 +1369,8 @@@ static int bind_config (oconfig_item_t 
        bind_config_set_bool ("MemoryStats", &global_memory_stats, child);
      else if (strcasecmp ("View", child->key) == 0)
        bind_config_add_view (child);
 +    else if (strcasecmp ("ParseTime", child->key) == 0)
 +      cf_util_get_boolean (child, &config_parse_time);
      else
      {
        WARNING ("bind plugin: Unknown configuration option "
@@@ -1393,12 -1383,12 +1393,12 @@@ static int bind_init (void) /* {{{ *
      return (-1);
    }
  
-   curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
+   curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, bind_curl_callback);
    curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
    curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, bind_curl_error);
    curl_easy_setopt (curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
-   curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+   curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
  
    return (0);
  } /* }}} int bind_init */
diff --combined src/cpu.c
+++ b/src/cpu.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/cpu.c
 - * Copyright (C) 2005-2009  Florian octo Forster
 + * Copyright (C) 2005-2010  Florian octo Forster
   * Copyright (C) 2008       Oleg King
   * Copyright (C) 2009       Simon Kuhnle
   * Copyright (C) 2009       Manuel Sanmartin
@@@ -163,7 -163,7 +163,7 @@@ static int init (void
        DEBUG ("host_processors returned %i %s", (int) cpu_list_len, cpu_list_len == 1 ? "processor" : "processors");
        INFO ("cpu plugin: Found %i processor%s.", (int) cpu_list_len, cpu_list_len == 1 ? "" : "s");
  
 -      cpu_temp_retry_max = 86400 / interval_g;
 +      cpu_temp_retry_max = 86400 / CDTIME_T_TO_TIME_T (interval_g);
  /* #endif PROCESSOR_CPU_LOAD_INFO */
  
  #elif defined(HAVE_LIBKSTAT)
        return (0);
  } /* int init */
  
 -static void submit (int cpu_num, const char *type_instance, counter_t value)
 +static void submit (int cpu_num, const char *type_instance, derive_t value)
  {
        value_t values[1];
        value_list_t vl = VALUE_LIST_INIT;
  
 -      values[0].counter = value;
 +      values[0].derive = value;
  
        vl.values = values;
        vl.values_len = 1;
@@@ -298,10 -298,10 +298,10 @@@ static int cpu_read (void
                        continue;
                }
  
 -              submit (cpu, "user", (counter_t) cpu_info.cpu_ticks[CPU_STATE_USER]);
 -              submit (cpu, "nice", (counter_t) cpu_info.cpu_ticks[CPU_STATE_NICE]);
 -              submit (cpu, "system", (counter_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]);
 -              submit (cpu, "idle", (counter_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]);
 +              submit (cpu, "user", (derive_t) cpu_info.cpu_ticks[CPU_STATE_USER]);
 +              submit (cpu, "nice", (derive_t) cpu_info.cpu_ticks[CPU_STATE_NICE]);
 +              submit (cpu, "system", (derive_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM]);
 +              submit (cpu, "idle", (derive_t) cpu_info.cpu_ticks[CPU_STATE_IDLE]);
  #endif /* PROCESSOR_CPU_LOAD_INFO */
  #if PROCESSOR_TEMPERATURE
                /*
  
                cpu_temp_retry_counter = 0;
                cpu_temp_retry_step    = 1;
-               DEBUG ("cpu_temp = %i", (int) cpu_temp);
  #endif /* PROCESSOR_TEMPERATURE */
        }
  /* #endif PROCESSOR_CPU_LOAD_INFO */
  
  #elif defined(KERNEL_LINUX)
        int cpu;
 -      counter_t user, nice, syst, idle;
 -      counter_t wait, intr, sitr; /* sitr == soft interrupt */
 +      derive_t user, nice, syst, idle;
 +      derive_t wait, intr, sitr; /* sitr == soft interrupt */
        FILE *fh;
        char buf[1024];
  
  
  #elif defined(HAVE_LIBKSTAT)
        int cpu;
 -      counter_t user, syst, idle, wait;
 +      derive_t user, syst, idle, wait;
        static cpu_stat_t cs;
  
        if (kc == NULL)
                if (kstat_read (kc, ksp[cpu], &cs) == -1)
                        continue; /* error message? */
  
 -              idle = (counter_t) cs.cpu_sysinfo.cpu[CPU_IDLE];
 -              user = (counter_t) cs.cpu_sysinfo.cpu[CPU_USER];
 -              syst = (counter_t) cs.cpu_sysinfo.cpu[CPU_KERNEL];
 -              wait = (counter_t) cs.cpu_sysinfo.cpu[CPU_WAIT];
 +              idle = (derive_t) cs.cpu_sysinfo.cpu[CPU_IDLE];
 +              user = (derive_t) cs.cpu_sysinfo.cpu[CPU_USER];
 +              syst = (derive_t) cs.cpu_sysinfo.cpu[CPU_KERNEL];
 +              wait = (derive_t) cs.cpu_sysinfo.cpu[CPU_WAIT];
  
                submit (ksp[cpu]->ks_instance, "user", user);
                submit (ksp[cpu]->ks_instance, "system", syst);
                return (-1);
        }
  
 -      submit (0, "idle",   (counter_t) cs->idle);
 -      submit (0, "nice",   (counter_t) cs->nice);
 -      submit (0, "swap",   (counter_t) cs->swap);
 -      submit (0, "system", (counter_t) cs->kernel);
 -      submit (0, "user",   (counter_t) cs->user);
 -      submit (0, "wait",   (counter_t) cs->iowait);
 +      submit (0, "idle",   (derive_t) cs->idle);
 +      submit (0, "nice",   (derive_t) cs->nice);
 +      submit (0, "swap",   (derive_t) cs->swap);
 +      submit (0, "system", (derive_t) cs->kernel);
 +      submit (0, "user",   (derive_t) cs->user);
 +      submit (0, "wait",   (derive_t) cs->iowait);
  /* #endif HAVE_LIBSTATGRAB */
  
  #elif defined(HAVE_PERFSTAT)
  
        for (i = 0; i < cpus; i++) 
        {
 -              submit (i, "idle",   (counter_t) perfcpu[i].idle);
 -              submit (i, "system", (counter_t) perfcpu[i].sys);
 -              submit (i, "user",   (counter_t) perfcpu[i].user);
 -              submit (i, "wait",   (counter_t) perfcpu[i].wait);
 +              submit (i, "idle",   (derive_t) perfcpu[i].idle);
 +              submit (i, "system", (derive_t) perfcpu[i].sys);
 +              submit (i, "user",   (derive_t) perfcpu[i].user);
 +              submit (i, "wait",   (derive_t) perfcpu[i].wait);
        }
  #endif /* HAVE_PERFSTAT */
  
diff --combined src/curl.c
@@@ -370,14 -370,14 +370,14 @@@ static int cc_page_init_curl (web_page_
      return (-1);
    }
  
-   curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1);
+   curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback);
    curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp);
    curl_easy_setopt (wp->curl, CURLOPT_USERAGENT,
        PACKAGE_NAME"/"PACKAGE_VERSION);
    curl_easy_setopt (wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf);
    curl_easy_setopt (wp->curl, CURLOPT_URL, wp->url);
-   curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1);
+   curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1L);
  
    if (wp->user != NULL)
    {
      curl_easy_setopt (wp->curl, CURLOPT_USERPWD, wp->credentials);
    }
  
-   curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, wp->verify_peer);
+   curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, (long) wp->verify_peer);
    curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYHOST,
-       wp->verify_host ? 2 : 0);
+       wp->verify_host ? 2L : 0L);
    if (wp->cacert != NULL)
      curl_easy_setopt (wp->curl, CURLOPT_CAINFO, wp->cacert);
  
@@@ -578,6 -578,7 +578,6 @@@ static void cc_submit (const web_page_
  
    vl.values = values;
    vl.values_len = 1;
 -  vl.time = time (NULL);
    sstrncpy (vl.host, hostname_g, sizeof (vl.host));
    sstrncpy (vl.plugin, "curl", sizeof (vl.plugin));
    sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance));
@@@ -596,6 -597,7 +596,6 @@@ static void cc_submit_response_time (co
  
    vl.values = values;
    vl.values_len = 1;
 -  vl.time = time (NULL);
    sstrncpy (vl.host, hostname_g, sizeof (vl.host));
    sstrncpy (vl.plugin, "curl", sizeof (vl.plugin));
    sstrncpy (vl.plugin_instance, wp->instance, sizeof (vl.plugin_instance));
diff --combined src/curl_json.c
@@@ -40,7 -40,7 +40,7 @@@
  
  #define CJ_DEFAULT_HOST "localhost"
  #define CJ_KEY_MAGIC 0x43484b59UL /* CHKY */
 -#define CJ_IS_KEY(key) (key)->magic == CJ_KEY_MAGIC
 +#define CJ_IS_KEY(key) ((key)->magic == CJ_KEY_MAGIC)
  #define CJ_ANY "*"
  #define COUCH_MIN(x,y) ((x) < (y) ? (x) : (y))
  
@@@ -64,8 -64,8 +64,8 @@@ struct cj_s /* {{{ *
    char *user;
    char *pass;
    char *credentials;
 -  int   verify_peer;
 -  int   verify_host;
 +  _Bool verify_peer;
 +  _Bool verify_host;
    char *cacert;
  
    CURL *curl;
@@@ -111,7 -111,7 +111,7 @@@ static size_t cj_curl_callback (void *b
    if (db == NULL)
      return (0);
  
 -  status = yajl_parse(db->yajl, (unsigned char *)buf, len);
 +  status = yajl_parse(db->yajl, (unsigned char *) buf, len);
    if (status == yajl_status_ok)
    {
  #if HAVE_YAJL_V2
    if (status != yajl_status_ok)
    {
      unsigned char *msg =
 -      yajl_get_error(db->yajl, 1, (unsigned char *)buf, len);
 +      yajl_get_error(db->yajl, /* verbose = */ 1,
 +          /* 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 */
@@@ -185,21 -184,41 +185,21 @@@ static int cj_cb_number (void *ctx
  
    cj_t *db = (cj_t *)ctx;
    cj_key_t *key = db->state[db->depth].key;
 -  char *endptr;
    value_t vt;
    int type;
 +  int status;
  
 -  if (key == NULL)
 +  if ((key == NULL) || !CJ_IS_KEY (key))
      return (CJ_CB_CONTINUE);
  
    memcpy (buffer, number, number_len);
    buffer[sizeof (buffer) - 1] = 0;
  
    type = cj_get_type (key);
 -  if (type < 0)
 -    return (CJ_CB_CONTINUE);
 -
 -  endptr = NULL;
 -  errno = 0;
 -
 -  if (type == DS_TYPE_COUNTER)
 -    vt.counter = (counter_t) strtoull (buffer, &endptr, /* base = */ 0);
 -  else if (type == DS_TYPE_GAUGE)
 -    vt.gauge = (gauge_t) strtod (buffer, &endptr);
 -  else if (type == DS_TYPE_DERIVE)
 -    vt.derive = (derive_t) strtoll (buffer, &endptr, /* base = */ 0);
 -  else if (type == DS_TYPE_ABSOLUTE)
 -    vt.absolute = (absolute_t) strtoull (buffer, &endptr, /* base = */ 0);
 -  else
 -  {
 -    ERROR ("curl_json plugin: Unknown data source type: \"%s\"", key->type);
 -    return (CJ_CB_ABORT);
 -  }
 -
 -  if ((endptr == &buffer[0]) || (errno != 0))
 +  status = parse_value (buffer, &vt, type);
 +  if (status != 0)
    {
 -    NOTICE ("curl_json plugin: Overflow while parsing number. "
 -        "Ignoring this value.");
 +    NOTICE ("curl_json plugin: Unable to parse number: \"%s\"", buffer);
      return (CJ_CB_CONTINUE);
    }
  
@@@ -239,26 -258,34 +239,26 @@@ static int cj_cb_string (void *ctx, con
      yajl_len_t len)
  {
    cj_t *db = (cj_t *)ctx;
 -  c_avl_tree_t *tree;
 -  char *ptr;
 -
 -  if (db->depth != 1) /* e.g. _all_dbs */
 -    return (CJ_CB_CONTINUE);
 +  char str[len + 1];
  
 -  cj_cb_map_key (ctx, val, len); /* same logic */
 +  /* Create a null-terminated version of the string. */
 +  memcpy (str, val, len);
 +  str[len] = 0;
  
 -  tree = db->state[db->depth].tree;
 +  /* No configuration for this string -> simply return. */
 +  if (db->state[db->depth].key == NULL)
 +    return (CJ_CB_CONTINUE);
  
 -  if ((tree != NULL) && (ptr = rindex (db->url, '/')))
 +  if (!CJ_IS_KEY (db->state[db->depth].key))
    {
 -    char url[PATH_MAX];
 -    CURL *curl;
 -
 -    /* url =~ s,[^/]+$,$name, */
 -    len = (ptr - db->url) + 1;
 -    ptr = url;
 -    sstrncpy (ptr, db->url, sizeof (url));
 -    sstrncpy (ptr + len, db->state[db->depth].name, sizeof (url) - len);
 -
 -    curl = curl_easy_duphandle (db->curl);
 -    curl_easy_setopt (curl, CURLOPT_URL, url);
 -    cj_curl_perform (db, curl);
 -    curl_easy_cleanup (curl);
 +    NOTICE ("curl_json plugin: Found string \"%s\", but the configuration "
 +        "expects a map here.", str);
 +    return (CJ_CB_CONTINUE);
    }
 -  return (CJ_CB_CONTINUE);
 -}
 +
 +  /* Handle the string as if it was a number. */
 +  return (cj_cb_number (ctx, (const char *) val, len));
 +} /* int cj_cb_string */
  
  static int cj_cb_start (void *ctx)
  {
@@@ -380,6 -407,37 +380,6 @@@ static void cj_free (void *arg) /* {{{ 
  
  /* Configuration handling functions {{{ */
  
 -static int cj_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 ("curl_json plugin: `%s' needs exactly one string argument.", name);
 -    return (-1);
 -  }
 -
 -  sfree (*dest);
 -  *dest = strdup (ci->values[0].value.string);
 -  if (*dest == NULL)
 -    return (-1);
 -
 -  return (0);
 -} /* }}} int cj_config_add_string */
 -
 -static int cj_config_set_boolean (const char *name, int *dest, /* {{{ */
 -                                       oconfig_item_t *ci)
 -{
 -  if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN))
 -  {
 -    WARNING ("curl_json plugin: `%s' needs exactly one boolean argument.", name);
 -    return (-1);
 -  }
 -
 -  *dest = ci->values[0].value.boolean ? 1 : 0;
 -
 -  return (0);
 -} /* }}} int cj_config_set_boolean */
 -
  static c_avl_tree_t *cj_avl_create(void)
  {
    return c_avl_create ((int (*) (const void *, const void *)) strcmp);
@@@ -411,7 -469,7 +411,7 @@@ static int cj_config_add_key (cj_t *db
  
    if (strcasecmp ("Key", ci->key) == 0)
    {
 -    status = cj_config_add_string ("Key", &key->path, ci);
 +    status = cf_util_get_string (ci, &key->path);
      if (status != 0)
      {
        sfree (key);
      oconfig_item_t *child = ci->children + i;
  
      if (strcasecmp ("Type", child->key) == 0)
 -      status = cj_config_add_string ("Type", &key->type, child);
 +      status = cf_util_get_string (child, &key->type);
      else if (strcasecmp ("Instance", child->key) == 0)
 -      status = cj_config_add_string ("Instance", &key->instance, child);
 +      status = cf_util_get_string (child, &key->instance);
      else
      {
        WARNING ("curl_json plugin: Option `%s' not allowed here.", child->key);
@@@ -521,7 -579,7 +521,7 @@@ static int cj_init_curl (cj_t *db) /* {
      return (-1);
    }
  
-   curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1);
+   curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (db->curl, CURLOPT_WRITEFUNCTION, cj_curl_callback);
    curl_easy_setopt (db->curl, CURLOPT_WRITEDATA, db);
    curl_easy_setopt (db->curl, CURLOPT_USERAGENT,
      curl_easy_setopt (db->curl, CURLOPT_USERPWD, db->credentials);
    }
  
-   curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (int) db->verify_peer);
+   curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (long) db->verify_peer);
    curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYHOST,
-                     (int) (db->verify_host ? 2 : 0));
+                     db->verify_host ? 2L : 0L);
    if (db->cacert != NULL)
      curl_easy_setopt (db->curl, CURLOPT_CAINFO, db->cacert);
  
@@@ -582,7 -640,7 +582,7 @@@ static int cj_config_add_url (oconfig_i
  
    if (strcasecmp ("URL", ci->key) == 0)
    {
 -    status = cj_config_add_string ("URL", &db->url, ci);
 +    status = cf_util_get_string (ci, &db->url);
      if (status != 0)
      {
        sfree (db);
      oconfig_item_t *child = ci->children + i;
  
      if (strcasecmp ("Instance", child->key) == 0)
 -      status = cj_config_add_string ("Instance", &db->instance, child);
 +      status = cf_util_get_string (child, &db->instance);
      else if (strcasecmp ("Host", child->key) == 0)
 -      status = cj_config_add_string ("Host", &db->host, child);
 +      status = cf_util_get_string (child, &db->host);
      else if (strcasecmp ("User", child->key) == 0)
 -      status = cj_config_add_string ("User", &db->user, child);
 +      status = cf_util_get_string (child, &db->user);
      else if (strcasecmp ("Password", child->key) == 0)
 -      status = cj_config_add_string ("Password", &db->pass, child);
 +      status = cf_util_get_string (child, &db->pass);
      else if (strcasecmp ("VerifyPeer", child->key) == 0)
 -      status = cj_config_set_boolean ("VerifyPeer", &db->verify_peer, child);
 +      status = cf_util_get_boolean (child, &db->verify_peer);
      else if (strcasecmp ("VerifyHost", child->key) == 0)
 -      status = cj_config_set_boolean ("VerifyHost", &db->verify_host, child);
 +      status = cf_util_get_boolean (child, &db->verify_host);
      else if (strcasecmp ("CACert", child->key) == 0)
 -      status = cj_config_add_string ("CACert", &db->cacert, child);
 +      status = cf_util_get_string (child, &db->cacert);
      else if (strcasecmp ("Key", child->key) == 0)
        status = cj_config_add_key (db, child);
      else
@@@ -766,52 -824,29 +766,52 @@@ static int cj_curl_perform (cj_t *db, C
      return (-1);
    }
  
 -  status = curl_easy_perform (curl);
 +  url = NULL;
 +  curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
  
 -  yajl_free (db->yajl);
 -  db->yajl = yprev;
 +  status = curl_easy_perform (curl);
 +  if (status != 0)
 +  {
 +    ERROR ("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)",
 +           status, db->curl_errbuf, (url != NULL) ? url : "<null>");
 +    yajl_free (db->yajl);
 +    db->yajl = yprev;
 +    return (-1);
 +  }
  
 -  curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url);
    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &rc);
  
    /* The response code is zero if a non-HTTP transport was used. */
    if ((rc != 0) && (rc != 200))
    {
 -    ERROR ("curl_json plugin: curl_easy_perform failed with response code %ld (%s)",
 -           rc, url);
 +    ERROR ("curl_json plugin: curl_easy_perform failed with "
 +        "response code %ld (%s)", rc, url);
 +    yajl_free (db->yajl);
 +    db->yajl = yprev;
      return (-1);
    }
  
 -  if (status != 0)
 +#if HAVE_YAJL_V2
 +    status = yajl_complete_parse(db->yajl);
 +#else
 +    status = yajl_parse_complete(db->yajl);
 +#endif
 +  if (status != yajl_status_ok)
    {
 -    ERROR ("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)",
 -           status, db->curl_errbuf, url);
 +    unsigned char *errmsg;
 +
 +    errmsg = yajl_get_error (db->yajl, /* verbose = */ 0,
 +        /* jsonText = */ NULL, /* jsonTextLen = */ 0);
 +    ERROR ("curl_json plugin: yajl_parse_complete failed: %s",
 +        (char *) errmsg);
 +    yajl_free_error (db->yajl, errmsg);
 +    yajl_free (db->yajl);
 +    db->yajl = yprev;
      return (-1);
    }
  
 +  yajl_free (db->yajl);
 +  db->yajl = yprev;
    return (0);
  } /* }}} int cj_curl_perform */
  
diff --combined src/logfile.c
@@@ -53,8 -53,23 +53,8 @@@ static int config_keys_num = STATIC_ARR
  static int logfile_config (const char *key, const char *value)
  {
        if (0 == strcasecmp (key, "LogLevel")) {
 -              if ((0 == strcasecmp (value, "emerg"))
 -                              || (0 == strcasecmp (value, "alert"))
 -                              || (0 == strcasecmp (value, "crit"))
 -                              || (0 == strcasecmp (value, "err")))
 -                      log_level = LOG_ERR;
 -              else if (0 == strcasecmp (value, "warning"))
 -                      log_level = LOG_WARNING;
 -              else if (0 == strcasecmp (value, "notice"))
 -                      log_level = LOG_NOTICE;
 -              else if (0 == strcasecmp (value, "info"))
 -                      log_level = LOG_INFO;
 -#if COLLECT_DEBUG
 -              else if (0 == strcasecmp (value, "debug"))
 -                      log_level = LOG_DEBUG;
 -#endif /* COLLECT_DEBUG */
 -              else
 -                      return 1;
 +              log_level = parse_log_severity(value);
 +              if (log_level == -1) return 1; /* to keep previous behaviour */
        }
        else if (0 == strcasecmp (key, "File")) {
                sfree (log_file);
        return 0;
  } /* int logfile_config (const char *, const char *) */
  
 -static void logfile_print (const char *msg, int severity, time_t timestamp_time)
 +static void logfile_print (const char *msg, int severity,
 +              cdtime_t timestamp_time)
  {
        FILE *fh;
-       int do_close = 0;
+       _Bool do_close = 0;
        struct tm timestamp_tm;
        char timestamp_str[64];
        char level_str[16] = "";
  
        if (print_timestamp)
        {
 -              localtime_r (&timestamp_time, &timestamp_tm);
 +              time_t tt = CDTIME_T_TO_TIME_T (timestamp_time);
 +              localtime_r (&tt, &timestamp_tm);
  
                strftime (timestamp_str, sizeof (timestamp_str), "%Y-%m-%d %H:%M:%S",
                                &timestamp_tm);
                else
                        fprintf (fh, "%s%s\n", level_str, msg);
  
-               if (do_close != 0)
+               if (do_close) {
                        fclose (fh);
+               } else {
+                       fflush(fh);
+               }
        }
  
        pthread_mutex_unlock (&file_lock);
@@@ -166,7 -182,7 +169,7 @@@ static void logfile_log (int severity, 
        if (severity > log_level)
                return;
  
 -      logfile_print (msg, severity, time (NULL));
 +      logfile_print (msg, severity, cdtime ());
  } /* void logfile_log (int, const char *) */
  
  static int logfile_notification (const notification_t *n,
        buf[sizeof (buf) - 1] = '\0';
  
        logfile_print (buf, LOG_INFO,
 -                      (n->time > 0) ? n->time : time (NULL));
 +                      (n->time != 0) ? n->time : cdtime ());
  
        return (0);
  } /* int logfile_notification */
diff --combined src/nginx.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/nginx.c
 - * Copyright (C) 2006,2007  Florian octo Forster
 + * Copyright (C) 2006-2010  Florian octo Forster
   * Copyright (C) 2008       Sebastian Harl
   *
   * This program is free software; you can redistribute it and/or modify it
@@@ -18,7 -18,7 +18,7 @@@
   * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
   *
   * Authors:
 - *   Florian octo Forster <octo at verplant.org>
 + *   Florian octo Forster <octo at collectd.org>
   *   Sebastian Harl <sh at tokkee.org>
   **/
  
@@@ -38,9 -38,10 +38,9 @@@ static char *cacert      = NULL
  
  static CURL *curl = NULL;
  
 -#define ABUFFER_SIZE 16384
 -static char nginx_buffer[ABUFFER_SIZE];
 -static int  nginx_buffer_len = 0;
 -static char nginx_curl_error[CURL_ERROR_SIZE];
 +static char   nginx_buffer[16384];
 +static size_t nginx_buffer_len = 0;
 +static char   nginx_curl_error[CURL_ERROR_SIZE];
  
  static const char *config_keys[] =
  {
@@@ -58,19 -59,17 +58,19 @@@ static size_t nginx_curl_callback (voi
  {
    size_t len = size * nmemb;
  
 -  if ((nginx_buffer_len + len) >= ABUFFER_SIZE)
 +  /* Check if the data fits into the memory. If not, truncate it. */
 +  if ((nginx_buffer_len + len) >= sizeof (nginx_buffer))
    {
 -    len = (ABUFFER_SIZE - 1) - nginx_buffer_len;
 +    assert (sizeof (nginx_buffer) > nginx_buffer_len);
 +    len = (sizeof (nginx_buffer) - 1) - nginx_buffer_len;
    }
  
    if (len <= 0)
      return (len);
  
 -  memcpy (nginx_buffer + nginx_buffer_len, (char *) buf, len);
 +  memcpy (&nginx_buffer[nginx_buffer_len], buf, len);
    nginx_buffer_len += len;
 -  nginx_buffer[nginx_buffer_len] = '\0';
 +  nginx_buffer[nginx_buffer_len] = 0;
  
    return (len);
  }
@@@ -120,7 -119,7 +120,7 @@@ static int init (void
      return (-1);
    }
  
-   curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
+   curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, nginx_curl_callback);
    curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
    curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, nginx_curl_error);
      curl_easy_setopt (curl, CURLOPT_URL, url);
    }
  
-   curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+   curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
  
    if ((verify_peer == NULL) || IS_TRUE (verify_peer))
    {
-     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1);
+     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L);
    }
    else
    {
-     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
+     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L);
    }
  
    if ((verify_host == NULL) || IS_TRUE (verify_host))
    {
-     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2);
+     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2L);
    }
    else
    {
-     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
+     curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L);
    }
  
    if (cacert != NULL)
@@@ -179,7 -178,7 +179,7 @@@ static void submit (char *type, char *i
    if (strcmp (type, "nginx_connections") == 0)
      values[0].gauge = value;
    else if (strcmp (type, "nginx_requests") == 0)
 -    values[0].counter = value;
 +    values[0].derive = value;
    else
      return;
  
diff --combined src/write_http.c
@@@ -61,7 -61,7 +61,7 @@@ struct wh_callback_
          char   send_buffer[4096];
          size_t send_buffer_free;
          size_t send_buffer_fill;
 -        time_t send_buffer_init_time;
 +        cdtime_t send_buffer_init_time;
  
          pthread_mutex_t send_lock;
  };
@@@ -72,7 -72,7 +72,7 @@@ static void wh_reset_buffer (wh_callbac
          memset (cb->send_buffer, 0, sizeof (cb->send_buffer));
          cb->send_buffer_free = sizeof (cb->send_buffer);
          cb->send_buffer_fill = 0;
 -        cb->send_buffer_init_time = time (NULL);
 +        cb->send_buffer_init_time = cdtime ();
  
          if (cb->format == WH_FORMAT_JSON)
          {
@@@ -111,7 -111,7 +111,7 @@@ static int wh_callback_init (wh_callbac
                  return (-1);
          }
  
-         curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1);
+         curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
          curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
  
          headers = NULL;
                  curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
          }
  
-         curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, cb->verify_peer);
+         curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, (long) cb->verify_peer);
          curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYHOST,
-                         cb->verify_host ? 2 : 0);
+                         cb->verify_host ? 2L : 0L);
          if (cb->cacert != NULL)
                  curl_easy_setopt (cb->curl, CURLOPT_CAINFO, cb->cacert);
  
          return (0);
  } /* }}} int wh_callback_init */
  
 -static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */
 +static int wh_flush_nolock (cdtime_t timeout, wh_callback_t *cb) /* {{{ */
  {
          int status;
  
 -        DEBUG ("write_http plugin: wh_flush_nolock: timeout = %i; "
 +        DEBUG ("write_http plugin: wh_flush_nolock: timeout = %.3f; "
                          "send_buffer_fill = %zu;",
 -                        timeout, cb->send_buffer_fill);
 +                        CDTIME_T_TO_DOUBLE (timeout),
 +                        cb->send_buffer_fill);
  
 +        /* timeout == 0  => flush unconditionally */
          if (timeout > 0)
          {
 -                time_t now;
 +                cdtime_t now;
  
 -                now = time (NULL);
 +                now = cdtime ();
                  if ((cb->send_buffer_init_time + timeout) > now)
                          return (0);
          }
          {
                  if (cb->send_buffer_fill <= 0)
                  {
 -                        cb->send_buffer_init_time = time (NULL);
 +                        cb->send_buffer_init_time = cdtime ();
                          return (0);
                  }
  
          {
                  if (cb->send_buffer_fill <= 2)
                  {
 -                        cb->send_buffer_init_time = time (NULL);
 +                        cb->send_buffer_init_time = cdtime ();
                          return (0);
                  }
  
          return (status);
  } /* }}} wh_flush_nolock */
  
 -static int wh_flush (int timeout, /* {{{ */
 +static int wh_flush (cdtime_t timeout, /* {{{ */
                  const char *identifier __attribute__((unused)),
                  user_data_t *user_data)
  {
@@@ -261,7 -259,7 +261,7 @@@ static void wh_callback_free (void *dat
  
          cb = data;
  
 -        wh_flush_nolock (/* timeout = */ -1, cb);
 +        wh_flush_nolock (/* timeout = */ 0, cb);
  
          curl_easy_cleanup (cb->curl);
          sfree (cb->location);
          sfree (cb);
  } /* }}} void wh_callback_free */
  
 -static int wh_value_list_to_string (char *buffer, /* {{{ */
 -                size_t buffer_size,
 -                const data_set_t *ds, const value_list_t *vl,
 -                wh_callback_t *cb)
 -{
 -        size_t offset = 0;
 -        int status;
 -        int i;
 -        gauge_t *rates = NULL;
 -
 -        assert (0 == strcmp (ds->type, vl->type));
 -
 -        memset (buffer, 0, buffer_size);
 -
 -#define BUFFER_ADD(...) do { \
 -        status = ssnprintf (buffer + offset, buffer_size - offset, \
 -                        __VA_ARGS__); \
 -        if (status < 1) \
 -        { \
 -                sfree (rates); \
 -                return (-1); \
 -        } \
 -        else if (((size_t) status) >= (buffer_size - offset)) \
 -        { \
 -                sfree (rates); \
 -                return (-1); \
 -        } \
 -        else \
 -                offset += ((size_t) status); \
 -} while (0)
 -
 -        BUFFER_ADD ("%lu", (unsigned long) vl->time);
 -
 -        for (i = 0; i < ds->ds_num; i++)
 -        {
 -                if (ds->ds[i].type == DS_TYPE_GAUGE)
 -                        BUFFER_ADD (":%f", vl->values[i].gauge);
 -                else if (cb->store_rates)
 -                {
 -                        if (rates == NULL)
 -                                rates = uc_get_rate (ds, vl);
 -                        if (rates == NULL)
 -                        {
 -                                WARNING ("write_http plugin: "
 -                                                "uc_get_rate failed.");
 -                                return (-1);
 -                        }
 -                        BUFFER_ADD (":%g", rates[i]);
 -                }
 -                else if (ds->ds[i].type == DS_TYPE_COUNTER)
 -                        BUFFER_ADD (":%llu", vl->values[i].counter);
 -                else if (ds->ds[i].type == DS_TYPE_DERIVE)
 -                        BUFFER_ADD (":%"PRIi64, vl->values[i].derive);
 -                else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
 -                        BUFFER_ADD (":%"PRIu64, vl->values[i].absolute);
 -                else
 -                {
 -                        ERROR ("write_http plugin: Unknown data source type: %i",
 -                                        ds->ds[i].type);
 -                        sfree (rates);
 -                        return (-1);
 -                }
 -        } /* for ds->ds_num */
 -
 -#undef BUFFER_ADD
 -
 -        sfree (rates);
 -        return (0);
 -} /* }}} int wh_value_list_to_string */
 -
  static int wh_write_command (const data_set_t *ds, const value_list_t *vl, /* {{{ */
                  wh_callback_t *cb)
  {
  
          /* Convert the values to an ASCII representation and put that into
           * `values'. */
 -        status = wh_value_list_to_string (values, sizeof (values), ds, vl, cb);
 +        status = format_values (values, sizeof (values), ds, vl, cb->store_rates);
          if (status != 0) {
                  ERROR ("write_http plugin: error with "
                                  "wh_value_list_to_string");
          }
  
          command_len = (size_t) ssnprintf (command, sizeof (command),
 -                        "PUTVAL %s interval=%i %s\r\n",
 -                        key, vl->interval, values);
 +                        "PUTVAL %s interval=%.3f %s\r\n",
 +                        key,
 +                        CDTIME_T_TO_DOUBLE (vl->interval),
 +                        values);
          if (command_len >= sizeof (command)) {
                  ERROR ("write_http plugin: Command buffer too small: "
                                  "Need %zu bytes.", command_len + 1);
  
          if (command_len >= cb->send_buffer_free)
          {
 -                status = wh_flush_nolock (/* timeout = */ -1, cb);
 +                status = wh_flush_nolock (/* timeout = */ 0, cb);
                  if (status != 0)
                  {
                          pthread_mutex_unlock (&cb->send_lock);
@@@ -384,7 -450,7 +384,7 @@@ static int wh_write_json (const data_se
                          ds, vl, cb->store_rates);
          if (status == (-ENOMEM))
          {
 -                status = wh_flush_nolock (/* timeout = */ -1, cb);
 +                status = wh_flush_nolock (/* timeout = */ 0, cb);
                  if (status != 0)
                  {
                          wh_reset_buffer (cb);