X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl_json.c;h=19efc5d6fd54f0f119ff1ef0bfcec9d445a7b541;hb=d6021a800b12c89b5a78877af2c5b9abc1a8e609;hp=988ed58df3442459d23ef25b20894df6f82ae21e;hpb=9b967a770f38099336c3652986d93c8b4d610a36;p=collectd.git diff --git a/src/curl_json.c b/src/curl_json.c index 988ed58d..19efc5d6 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -26,6 +26,7 @@ #include "plugin.h" #include "configfile.h" #include "utils_avltree.h" +#include "utils_complain.h" #include #include @@ -110,16 +111,9 @@ static size_t cj_curl_callback (void *buf, /* {{{ */ 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 - status = yajl_complete_parse(db->yajl); -#else - status = yajl_parse_complete(db->yajl); -#endif return (len); - } #if !HAVE_YAJL_V2 else if (status == yajl_status_insufficient_data) return (len); @@ -144,9 +138,31 @@ static int cj_get_type (cj_key_t *key) ds = plugin_get_ds (key->type); if (ds == NULL) - return -1; /* let plugin_write do the complaining */ - else - return ds->ds[0].type; /* XXX support ds->ds_len > 1 */ + { + static char type[DATA_MAX_NAME_LEN] = "!!!invalid!!!"; + + assert (key->type != NULL); + if (strcmp (type, key->type) != 0) + { + ERROR ("curl_json plugin: Unable to look up DS type \"%s\".", + key->type); + sstrncpy (type, key->type, sizeof (type)); + } + + return -1; + } + else if (ds->ds_num > 1) + { + static c_complain_t complaint = C_COMPLAIN_INIT_STATIC; + + c_complain_once (LOG_WARNING, &complaint, + "curl_json plugin: The type \"%s\" has more than one data source. " + "This is currently not supported. I will return the type of the " + "first data source, but this will likely lead to problems later on.", + key->type); + } + + return ds->ds[0].type; } /* yajl callbacks */ @@ -498,7 +514,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, @@ -526,9 +542,9 @@ static int cj_init_curl (cj_t *db) /* {{{ */ 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); @@ -704,8 +720,13 @@ static void cj_submit (cj_t *db, cj_key_t *key, value_t *value) /* {{{ */ host = db->host; if (key->instance == NULL) - ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s", - db->state[db->depth-1].name, db->state[db->depth].name); + { + if ((db->depth == 0) || (strcmp ("", db->state[db->depth-1].name) == 0)) + sstrncpy (vl.type_instance, db->state[db->depth].name, sizeof (vl.type_instance)); + else + ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s", + db->state[db->depth-1].name, db->state[db->depth].name); + } else sstrncpy (vl.type_instance, key->instance, sizeof (vl.type_instance)); @@ -742,7 +763,7 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &url); status = curl_easy_perform (curl); - if (status != 0) + if (status != CURLE_OK) { ERROR ("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)", status, db->curl_errbuf, (url != NULL) ? url : ""); @@ -763,7 +784,11 @@ static int cj_curl_perform (cj_t *db, CURL *curl) /* {{{ */ return (-1); } - status = yajl_parse_complete (db->yajl); +#if HAVE_YAJL_V2 + status = yajl_complete_parse(db->yajl); +#else + status = yajl_parse_complete(db->yajl); +#endif if (status != yajl_status_ok) { unsigned char *errmsg;