X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fcurl_json.c;h=edfaf00ea97606a78f4a47c9a6b140f7352e4f82;hp=dedfed05af376021f6d775b0b6453e31f6f28490;hb=48efd3deb4c9139fd060ff3d289896e9031bcc7c;hpb=338db8de5f2cc289641f5f947f0fa1ef4070c3f2 diff --git a/src/curl_json.c b/src/curl_json.c index dedfed05..edfaf00e 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -23,11 +23,11 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" -#include "utils_avltree.h" +#include "utils/avltree/avltree.h" +#include "utils/common/common.h" +#include "utils/curl_stats/curl_stats.h" #include "utils_complain.h" -#include "utils_curl_stats.h" #include #include @@ -88,6 +88,7 @@ struct cj_s /* {{{ */ char *sock; char *url; + int address_family; char *user; char *pass; char *credentials; @@ -236,7 +237,7 @@ static int cj_cb_number(void *ctx, const char *number, yajl_len_t number_len) { /* Create a null-terminated version of the string. */ char buffer[number_len + 1]; memcpy(buffer, number, number_len); - buffer[sizeof(buffer) - 1] = 0; + buffer[sizeof(buffer) - 1] = '\0'; if (db->state[db->depth].entry == NULL || db->state[db->depth].entry->type != KEY) { @@ -272,7 +273,7 @@ static int cj_cb_map_key(void *ctx, unsigned char const *in_name, char name[in_name_len + 1]; memmove(name, in_name, in_name_len); - name[sizeof(name) - 1] = 0; + name[sizeof(name) - 1] = '\0'; if (cj_load_key(ctx, name) != 0) return CJ_CB_ABORT; @@ -582,6 +583,7 @@ static int cj_init_curl(cj_t *db) /* {{{ */ curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf); curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L); + curl_easy_setopt(db->curl, CURLOPT_IPRESOLVE, db->address_family); if (db->user != NULL) { #ifdef HAVE_CURLOPT_USERNAME @@ -649,6 +651,7 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */ } db->timeout = -1; + db->address_family = CURL_IPRESOLVE_WHATEVER; if (strcasecmp("URL", ci->key) == 0) status = cf_util_get_string(ci, &db->url); @@ -702,6 +705,31 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */ db->stats = curl_stats_from_config(child); if (db->stats == NULL) status = -1; + } else if (db->url && strcasecmp("AddressFamily", child->key) == 0) { + char *af = NULL; + status = cf_util_get_string(child, &af); + if (status != 0 || af == NULL) { + WARNING("curl_json plugin: Cannot parse value of `%s' for URL `%s'.", + child->key, db->url); + } else if (strcasecmp("any", af) == 0) { + db->address_family = CURL_IPRESOLVE_WHATEVER; + } else if (strcasecmp("ipv4", af) == 0) { + db->address_family = CURL_IPRESOLVE_V4; + } else if (strcasecmp("ipv6", af) == 0) { + /* If curl supports ipv6, use it. If not, log a warning and + * fall back to default - don't set status to non-zero. + */ + curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW); + if (curl_info->features & CURL_VERSION_IPV6) + db->address_family = CURL_IPRESOLVE_V6; + else + WARNING("curl_json plugin: IPv6 not supported by this libCURL. " + "Using fallback `any'."); + } else { + WARNING("curl_json plugin: Unsupported value of `%s' for URL `%s'.", + child->key, db->url); + status = -1; + } } else { WARNING("curl_json plugin: Option `%s' not allowed here.", child->key); status = -1; @@ -735,7 +763,8 @@ static int cj_config_add_url(oconfig_item_t *ci) /* {{{ */ plugin_register_complex_read(/* group = */ NULL, cb_name, cj_read, interval, &(user_data_t){ - .data = db, .free_func = cj_free, + .data = db, + .free_func = cj_free, }); sfree(cb_name); } else {