X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl_json.c;h=a4afa02e4c70da022e4ad8487d6208f9205a9fff;hb=96e0f2341bace029acefe0a88bab96ae326c0ff5;hp=19efc5d6fd54f0f119ff1ef0bfcec9d445a7b541;hpb=32e0d9078b73eeb889b9a1e62be72ded48d33d7d;p=collectd.git diff --git a/src/curl_json.c b/src/curl_json.c index 19efc5d6..a4afa02e 100644 --- a/src/curl_json.c +++ b/src/curl_json.c @@ -48,10 +48,10 @@ struct cj_key_s; typedef struct cj_key_s cj_key_t; struct cj_key_s /* {{{ */ { + unsigned long magic; char *path; char *type; char *instance; - unsigned long magic; }; /* }}} */ @@ -67,6 +67,8 @@ struct cj_s /* {{{ */ _Bool verify_peer; _Bool verify_host; char *cacert; + struct curl_slist *headers; + char *post_body; CURL *curl; char curl_errbuf[CURL_ERROR_SIZE]; @@ -367,6 +369,8 @@ static void cj_free (void *arg) /* {{{ */ sfree (db->pass); sfree (db->credentials); sfree (db->cacert); + sfree (db->post_body); + curl_slist_free_all (db->headers); sfree (db); } /* }}} void cj_free */ @@ -378,6 +382,22 @@ static c_avl_tree_t *cj_avl_create(void) return c_avl_create ((int (*) (const void *, const void *)) strcmp); } +static int cj_config_append_string (const char *name, struct curl_slist **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); + } + + *dest = curl_slist_append(*dest, ci->values[0].value.string); + if (*dest == NULL) + return (-1); + + return (0); +} /* }}} int cj_config_append_string */ + static int cj_config_add_key (cj_t *db, /* {{{ */ oconfig_item_t *ci) { @@ -480,6 +500,7 @@ static int cj_config_add_key (cj_t *db, /* {{{ */ len = ptr-name; if (len == 0) break; + len = COUCH_MIN(len, sizeof (ent)-1); sstrncpy (ent, name, len+1); if (c_avl_get (tree, ent, (void *) &value) != 0) @@ -547,6 +568,10 @@ static int cj_init_curl (cj_t *db) /* {{{ */ db->verify_host ? 2L : 0L); if (db->cacert != NULL) curl_easy_setopt (db->curl, CURLOPT_CAINFO, db->cacert); + if (db->headers != NULL) + curl_easy_setopt (db->curl, CURLOPT_HTTPHEADER, db->headers); + if (db->post_body != NULL) + curl_easy_setopt (db->curl, CURLOPT_POSTFIELDS, db->post_body); return (0); } /* }}} int cj_init_curl */ @@ -608,6 +633,10 @@ static int cj_config_add_url (oconfig_item_t *ci) /* {{{ */ status = cf_util_get_boolean (child, &db->verify_host); else if (strcasecmp ("CACert", child->key) == 0) status = cf_util_get_string (child, &db->cacert); + else if (strcasecmp ("Header", child->key) == 0) + status = cj_config_append_string ("Header", &db->headers, child); + else if (strcasecmp ("Post", child->key) == 0) + status = cf_util_get_string (child, &db->post_body); else if (strcasecmp ("Key", child->key) == 0) status = cj_config_add_key (db, child); else @@ -828,9 +857,18 @@ static int cj_read (user_data_t *ud) /* {{{ */ return cj_curl_perform (db, db->curl); } /* }}} int cj_read */ +static int cj_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 cj_init */ + void module_register (void) { plugin_register_complex_config ("curl_json", cj_config); + plugin_register_init ("curl_json", cj_init); } /* void module_register */ /* vim: set sw=2 sts=2 et fdm=marker : */