X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_http.c;h=34ea46d9db140761669a05e5db7248eed991d1f1;hb=96e0f2341bace029acefe0a88bab96ae326c0ff5;hp=bac8e986e64e15cb11bd5ebd2d38d4bb62917ec4;hpb=91ca6eb3c01b7f9bbcfd624dfbfcb8910dc65098;p=collectd.git diff --git a/src/write_http.c b/src/write_http.c index bac8e986..34ea46d9 100644 --- a/src/write_http.c +++ b/src/write_http.c @@ -61,7 +61,7 @@ struct wh_callback_s 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 @@ static void wh_reset_buffer (wh_callback_t *cb) /* {{{ */ 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) { @@ -88,7 +88,7 @@ static int wh_send_buffer (wh_callback_t *cb) /* {{{ */ curl_easy_setopt (cb->curl, CURLOPT_POSTFIELDS, cb->send_buffer); status = curl_easy_perform (cb->curl); - if (status != 0) + if (status != CURLE_OK) { ERROR ("write_http plugin: curl_easy_perform failed with " "status %i: %s", @@ -111,6 +111,7 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ return (-1); } + curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION); headers = NULL; @@ -146,9 +147,9 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ 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); @@ -157,19 +158,21 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */ 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); } @@ -178,7 +181,7 @@ static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */ { if (cb->send_buffer_fill <= 0) { - cb->send_buffer_init_time = time (NULL); + cb->send_buffer_init_time = cdtime (); return (0); } @@ -189,7 +192,7 @@ static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */ { if (cb->send_buffer_fill <= 2) { - cb->send_buffer_init_time = time (NULL); + cb->send_buffer_init_time = cdtime (); return (0); } @@ -218,7 +221,7 @@ static int wh_flush_nolock (int timeout, wh_callback_t *cb) /* {{{ */ 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) { @@ -258,7 +261,7 @@ static void wh_callback_free (void *data) /* {{{ */ cb = data; - wh_flush_nolock (/* timeout = */ -1, cb); + wh_flush_nolock (/* timeout = */ 0, cb); curl_easy_cleanup (cb->curl); sfree (cb->location); @@ -304,8 +307,10 @@ static int wh_write_command (const data_set_t *ds, const value_list_t *vl, /* {{ } 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); @@ -327,7 +332,7 @@ static int wh_write_command (const data_set_t *ds, const value_list_t *vl, /* {{ 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); @@ -379,7 +384,7 @@ static int wh_write_json (const data_set_t *ds, const value_list_t *vl, /* {{{ * 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); @@ -585,9 +590,18 @@ static int wh_config (oconfig_item_t *ci) /* {{{ */ return (0); } /* }}} int wh_config */ +static int wh_init (void) /* {{{ */ +{ + /* Call this while collectd is still single-threaded to avoid + * initialization issues in libgcrypt. */ + curl_global_init (CURL_GLOBAL_SSL); + return (0); +} /* }}} int wh_init */ + void module_register (void) /* {{{ */ { plugin_register_complex_config ("write_http", wh_config); + plugin_register_init ("write_http", wh_init); } /* }}} void module_register */ /* vim: set fdm=marker sw=8 ts=8 tw=78 et : */