X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl_xml.c;h=3ffb71c559c77d3f00d5f8027880646be0f7c2be;hb=0657d95eaa686d64efe6bbccda346ebd6467bd0b;hp=c0ab6fdbed7721374ccbff5e180dce6e897a7690;hpb=f2389f97fbec15f49dcd1d9b06b3b6bbd0837e8a;p=collectd.git diff --git a/src/curl_xml.c b/src/curl_xml.c index c0ab6fdb..3ffb71c5 100644 --- a/src/curl_xml.c +++ b/src/curl_xml.c @@ -81,6 +81,7 @@ struct cx_s /* {{{ */ _Bool verify_host; char *cacert; char *post_body; + int timeout; struct curl_slist *headers; cx_namespace_t *namespaces; @@ -342,6 +343,7 @@ static int cx_handle_single_value_xpath (xmlXPathContextPtr xpath_ctx, /* {{{ */ /* free up object */ xmlXPathFreeObject (values_node_obj); + sfree (node_value); /* We have reached here which means that * we have got something to work */ @@ -386,7 +388,7 @@ static int cx_handle_instance_xpath (xmlXPathContextPtr xpath_ctx, /* {{{ */ /* If the base xpath returns more than one block, the result is assumed to be * a table. The `Instance' option is not optional in this case. Check for the * condition and inform the user. */ - if (is_table) + if (is_table && (xpath->instance == NULL)) { WARNING ("curl_xml plugin: " "Base-XPath %s is a table (more than one result was returned), " @@ -439,8 +441,12 @@ static int cx_handle_instance_xpath (xmlXPathContextPtr xpath_ctx, /* {{{ */ if (xpath->instance_prefix != NULL) { if (instance_node != NULL) + { + char *node_value = (char *) xmlNodeGetContent(instance_node->nodeTab[0]); ssnprintf (vl->type_instance, sizeof (vl->type_instance),"%s%s", - xpath->instance_prefix, (char *) xmlNodeGetContent(instance_node->nodeTab[0])); + xpath->instance_prefix, node_value); + sfree (node_value); + } else sstrncpy (vl->type_instance, xpath->instance_prefix, sizeof (vl->type_instance)); @@ -450,8 +456,11 @@ static int cx_handle_instance_xpath (xmlXPathContextPtr xpath_ctx, /* {{{ */ /* If instance_prefix and instance_node are NULL, then * don't set the type_instance */ if (instance_node != NULL) - sstrncpy (vl->type_instance, (char *) xmlNodeGetContent(instance_node->nodeTab[0]), - sizeof (vl->type_instance)); + { + char *node_value = (char *) xmlNodeGetContent(instance_node->nodeTab[0]); + sstrncpy (vl->type_instance, node_value, sizeof (vl->type_instance)); + sfree (node_value); + } } /* Free `instance_node_obj' this late, because `instance_node' points to @@ -689,17 +698,18 @@ static int cx_config_add_values (const char *name, cx_xpath_t *xpath, /* {{{ */ sstrncpy (xpath->values[i].path, ci->values[i].value.string, sizeof (xpath->values[i].path)); } - return (0); + return (0); } /* }}} cx_config_add_values */ -static int cx_config_add_xpath (cx_t *db, /* {{{ */ - oconfig_item_t *ci) +static int cx_config_add_xpath (cx_t *db, oconfig_item_t *ci) /* {{{ */ { cx_xpath_t *xpath; + char *name; + llentry_t *le; int status; int i; - xpath = (cx_xpath_t *) malloc (sizeof (*xpath)); + xpath = malloc (sizeof (*xpath)); if (xpath == NULL) { ERROR ("curl_xml plugin: malloc failed."); @@ -710,15 +720,16 @@ static int cx_config_add_xpath (cx_t *db, /* {{{ */ status = cf_util_get_string (ci, &xpath->path); if (status != 0) { - sfree (xpath); + cx_xpath_free (xpath); return (status); } /* error out if xpath->path is an empty string */ - if (*xpath->path == 0) + if (strlen (xpath->path) == 0) { ERROR ("curl_xml plugin: invalid xpath. " "xpath value can't be an empty string"); + cx_xpath_free (xpath); return (-1); } @@ -745,45 +756,49 @@ static int cx_config_add_xpath (cx_t *db, /* {{{ */ break; } /* for (i = 0; i < ci->children_num; i++) */ - if (status == 0 && xpath->type == NULL) + if (status != 0) + { + cx_xpath_free (xpath); + return status; + } + + if (xpath->type == NULL) { WARNING ("curl_xml plugin: `Type' missing in `xpath' block."); - status = -1; + cx_xpath_free (xpath); + return -1; } - if (status == 0) + if (db->list == NULL) { - char *name; - llentry_t *le; - + db->list = llist_create(); if (db->list == NULL) { - db->list = llist_create(); - if (db->list == NULL) - { - ERROR ("curl_xml plugin: list creation failed."); - return (-1); - } - } - - name = strdup(xpath->path); - if (name == NULL) - { - ERROR ("curl_xml plugin: strdup failed."); - return (-1); - } - - le = llentry_create (name, xpath); - if (le == NULL) - { - ERROR ("curl_xml plugin: llentry_create failed."); + ERROR ("curl_xml plugin: list creation failed."); + cx_xpath_free (xpath); return (-1); } + } - llist_append (db->list, le); + name = strdup (xpath->path); + if (name == NULL) + { + ERROR ("curl_xml plugin: strdup failed."); + cx_xpath_free (xpath); + return (-1); } - return (status); + le = llentry_create (name, xpath); + if (le == NULL) + { + ERROR ("curl_xml plugin: llentry_create failed."); + cx_xpath_free (xpath); + sfree (name); + return (-1); + } + + llist_append (db->list, le); + return (0); } /* }}} int cx_config_add_xpath */ static int cx_config_add_namespace (cx_t *db, /* {{{ */ @@ -842,6 +857,8 @@ static int cx_init_curl (cx_t *db) /* {{{ */ curl_easy_setopt (db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT); curl_easy_setopt (db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf); curl_easy_setopt (db->curl, CURLOPT_URL, db->url); + curl_easy_setopt (db->curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt (db->curl, CURLOPT_MAXREDIRS, 50L); if (db->user != NULL) { @@ -882,6 +899,14 @@ static int cx_init_curl (cx_t *db) /* {{{ */ if (db->post_body != NULL) curl_easy_setopt (db->curl, CURLOPT_POSTFIELDS, db->post_body); +#ifdef HAVE_CURLOPT_TIMEOUT_MS + if (db->timeout >= 0) + curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, (long) db->timeout); + else + curl_easy_setopt (db->curl, CURLOPT_TIMEOUT_MS, + CDTIME_T_TO_MS(plugin_get_interval())); +#endif + return (0); } /* }}} int cx_init_curl */ @@ -907,6 +932,8 @@ static int cx_config_add_url (oconfig_item_t *ci) /* {{{ */ } memset (db, 0, sizeof (*db)); + db->timeout = -1; + if (strcasecmp ("URL", ci->key) == 0) { status = cf_util_get_string (ci, &db->url); @@ -920,6 +947,7 @@ static int cx_config_add_url (oconfig_item_t *ci) /* {{{ */ { ERROR ("curl_xml plugin: cx_config: " "Invalid key: %s", ci->key); + cx_free (db); return (-1); } @@ -952,6 +980,8 @@ static int cx_config_add_url (oconfig_item_t *ci) /* {{{ */ status = cf_util_get_string (child, &db->post_body); else if (strcasecmp ("Namespace", child->key) == 0) status = cx_config_add_namespace (db, child); + else if (strcasecmp ("Timeout", child->key) == 0) + status = cf_util_get_int (child, &db->timeout); else { WARNING ("curl_xml plugin: Option `%s' not allowed here.", child->key);