X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcurl_xml.c;h=20048d0ed76c89a63cc334572718a9eb71f248ac;hb=a1679b7aac30698dbe758c466018b593469608cb;hp=4e4c6f99adaaa822a1c32543b7b019d7d91a8db8;hpb=42b8d7550d029ed9aef6f25e3eb2009c1f18b144;p=collectd.git diff --git a/src/curl_xml.c b/src/curl_xml.c index 4e4c6f99..20048d0e 100644 --- a/src/curl_xml.c +++ b/src/curl_xml.c @@ -54,6 +54,7 @@ struct cx_xpath_s /* {{{ */ size_t values_len; char *instance_prefix; char *instance; + char *plugin_instance_from; int is_table; unsigned long magic; }; @@ -71,6 +72,7 @@ typedef struct cx_namespace_s cx_namespace_t; struct cx_s /* {{{ */ { char *instance; + char *plugin_name; char *host; char *url; @@ -111,11 +113,11 @@ static size_t cx_curl_callback(void *buf, /* {{{ */ if (db == NULL) { ERROR("curl_xml plugin: cx_curl_callback: " "user_data pointer is NULL."); - return (0); + return 0; } if (len == 0) - return (len); + return len; if ((db->buffer_fill + len) >= db->buffer_size) { char *temp; @@ -123,7 +125,7 @@ static size_t cx_curl_callback(void *buf, /* {{{ */ temp = realloc(db->buffer, db->buffer_fill + len + 1); if (temp == NULL) { ERROR("curl_xml plugin: realloc failed."); - return (0); + return 0; } db->buffer = temp; db->buffer_size = db->buffer_fill + len + 1; @@ -133,7 +135,7 @@ static size_t cx_curl_callback(void *buf, /* {{{ */ db->buffer_fill += len; db->buffer[db->buffer_fill] = 0; - return (len); + return len; } /* }}} size_t cx_curl_callback */ static void cx_xpath_free(cx_xpath_t *xpath) /* {{{ */ @@ -144,6 +146,7 @@ static void cx_xpath_free(cx_xpath_t *xpath) /* {{{ */ sfree(xpath->path); sfree(xpath->type); sfree(xpath->instance_prefix); + sfree(xpath->plugin_instance_from); sfree(xpath->instance); sfree(xpath->values); sfree(xpath); @@ -188,6 +191,7 @@ static void cx_free(void *arg) /* {{{ */ sfree(db->buffer); sfree(db->instance); + sfree(db->plugin_name); sfree(db->host); sfree(db->url); @@ -208,7 +212,7 @@ static void cx_free(void *arg) /* {{{ */ sfree(db); } /* }}} void cx_free */ -static const char *cx_host(cx_t *db) /* {{{ */ +static const char *cx_host(const cx_t *db) /* {{{ */ { if (db->host == NULL) return hostname_g; @@ -221,33 +225,33 @@ static int cx_config_append_string(const char *name, struct curl_slist *temp = NULL; if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("curl_xml plugin: `%s' needs exactly one string argument.", name); - return (-1); + return -1; } temp = curl_slist_append(*dest, ci->values[0].value.string); if (temp == NULL) - return (-1); + return -1; *dest = temp; - return (0); + return 0; } /* }}} int cx_config_append_string */ static int cx_check_type(const data_set_t *ds, cx_xpath_t *xpath) /* {{{ */ { if (!ds) { WARNING("curl_xml plugin: DataSet `%s' not defined.", xpath->type); - return (-1); + return -1; } if (ds->ds_num != xpath->values_len) { WARNING("curl_xml plugin: DataSet `%s' requires %zu values, but config " "talks about %zu", xpath->type, ds->ds_num, xpath->values_len); - return (-1); + return -1; } - return (0); + return 0; } /* }}} cx_check_type */ static xmlXPathObjectPtr @@ -271,7 +275,7 @@ static int cx_if_not_text_node(xmlNodePtr node) /* {{{ */ { if (node->type == XML_TEXT_NODE || node->type == XML_ATTRIBUTE_NODE || node->type == XML_ELEMENT_NODE) - return (0); + return 0; WARNING("curl_xml plugin: " "Node \"%s\" doesn't seem to be a text node. Skipping...", @@ -290,7 +294,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ values_node_obj = cx_evaluate_xpath(xpath_ctx, BAD_CAST xpath->values[index].path); if (values_node_obj == NULL) - return (-1); /* Error already logged. */ + return -1; /* Error already logged. */ values_node = values_node_obj->nodesetval; tmp_size = (values_node) ? values_node->nodeNr : 0; @@ -301,7 +305,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "Skipping...", xpath->values[index].path); xmlXPathFreeObject(values_node_obj); - return (-1); + return -1; } if (tmp_size > 1) { @@ -310,7 +314,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "only one node. Skipping...", xpath->values[index].path); xmlXPathFreeObject(values_node_obj); - return (-1); + return -1; } /* ignoring the element if other than textnode/attribute*/ @@ -320,7 +324,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "only text/attribute node which is not the case. Skipping...", xpath->values[index].path); xmlXPathFreeObject(values_node_obj); - return (-1); + return -1; } node_value = (char *)xmlNodeGetContent(values_node->nodeTab[0]); @@ -351,7 +355,7 @@ static int cx_handle_single_value_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ /* We have reached here which means that * we have got something to work */ - return (0); + return 0; } /* }}} int cx_handle_single_value_xpath */ static int cx_handle_all_value_xpaths(xmlXPathContextPtr xpath_ctx, /* {{{ */ @@ -368,41 +372,30 @@ static int cx_handle_all_value_xpaths(xmlXPathContextPtr xpath_ctx, /* {{{ */ for (size_t i = 0; i < xpath->values_len; i++) { status = cx_handle_single_value_xpath(xpath_ctx, xpath, ds, vl, i); if (status != 0) - return (-1); /* An error has been printed. */ - } /* for (i = 0; i < xpath->values_len; i++) */ + return -1; /* An error has been printed. */ + } /* for (i = 0; i < xpath->values_len; i++) */ plugin_dispatch_values(vl); vl->values = NULL; - return (0); + return 0; } /* }}} int cx_handle_all_value_xpaths */ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ - cx_xpath_t *xpath, value_list_t *vl, - _Bool is_table) { + cx_xpath_t *xpath, value_list_t *vl) { + xmlXPathObjectPtr instance_node_obj = NULL; xmlNodeSetPtr instance_node = NULL; memset(vl->type_instance, 0, sizeof(vl->type_instance)); - /* 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 && (xpath->instance == NULL)) { - WARNING("curl_xml plugin: " - "Base-XPath %s is a table (more than one result was returned), " - "but no instance-XPath has been defined.", - xpath->path); - return (-1); - } - /* instance has to be an xpath expression */ if (xpath->instance != NULL) { int tmp_size; instance_node_obj = cx_evaluate_xpath(xpath_ctx, BAD_CAST xpath->instance); if (instance_node_obj == NULL) - return (-1); /* error is logged already */ + return -1; /* error is logged already */ instance_node = instance_node_obj->nodesetval; tmp_size = (instance_node) ? instance_node->nodeNr : 0; @@ -414,7 +407,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "any of the nodes. Skipping the node.", xpath->instance); xmlXPathFreeObject(instance_node_obj); - return (-1); + return -1; } if (tmp_size > 1) { @@ -423,7 +416,7 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "to return only one text node. Skipping the node.", xpath->instance); xmlXPathFreeObject(instance_node_obj); - return (-1); + return -1; } /* ignoring the element if other than textnode/attribute */ @@ -434,15 +427,15 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ "which is not the case. Skipping the node.", xpath->instance); xmlXPathFreeObject(instance_node_obj); - return (-1); + return -1; } } /* if (xpath->instance != NULL) */ 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, node_value); + snprintf(vl->type_instance, sizeof(vl->type_instance), "%s%s", + xpath->instance_prefix, node_value); sfree(node_value); } else sstrncpy(vl->type_instance, xpath->instance_prefix, @@ -461,11 +454,66 @@ static int cx_handle_instance_xpath(xmlXPathContextPtr xpath_ctx, /* {{{ */ * somewhere inside this structure. */ xmlXPathFreeObject(instance_node_obj); - return (0); + /* Part 2, handle PluginInstanceFrom */ + instance_node_obj = NULL; + instance_node = NULL; + + /* plugin_instance_from has to be an xpath expression */ + if (xpath->plugin_instance_from != NULL) { + int tmp_size; + + instance_node_obj = cx_evaluate_xpath(xpath_ctx, + BAD_CAST xpath->plugin_instance_from); + if (instance_node_obj == NULL) + return -1; /* error is already logged */ + + instance_node = instance_node_obj->nodesetval; + tmp_size = (instance_node) ? instance_node->nodeNr : 0; + + if (tmp_size <= 0) { + WARNING("curl_xml plugin: " + "relative xpath expression for 'PluginInstanceFrom' \"%s\" " + "doesn't match any of the nodes. Skipping the node.", + xpath->plugin_instance_from); + xmlXPathFreeObject(instance_node_obj); + return -1; + } + + if (tmp_size > 1) { + WARNING("curl_xml plugin: " + "relative xpath expression for 'PluginInstanceFrom' \"%s\" " + "is expected to return only one text node. Skipping the node.", + xpath->plugin_instance_from); + xmlXPathFreeObject(instance_node_obj); + return -1; + } + + /* ignoring the element if other than textnode/attribute */ + if (cx_if_not_text_node(instance_node->nodeTab[0])) { + WARNING("curl_xml plugin: " + "relative xpath expression \"%s\" is expected to return only " + "text node which is not the case. Skipping the node.", + xpath->plugin_instance_from); + xmlXPathFreeObject(instance_node_obj); + return -1; + } + + if (instance_node != NULL) { + char *node_value = (char *)xmlNodeGetContent(instance_node->nodeTab[0]); + sstrncpy (vl->plugin_instance, node_value, sizeof(vl->plugin_instance)); + sfree(node_value); + } + + /* Free `instance_node_obj' this late, because `instance_node' points to + * somewhere inside this structure. */ + xmlXPathFreeObject(instance_node_obj); + } /* if (xpath->plugin_instance_from != NULL) */ + + return 0; } /* }}} int cx_handle_instance_xpath */ -static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */ - char const *host, xmlXPathContextPtr xpath_ctx, +static int cx_handle_base_xpath(const cx_t *db, /* {{{ */ + xmlXPathContextPtr xpath_ctx, const data_set_t *ds, char *base_xpath, cx_xpath_t *xpath) { int total_nodes; @@ -492,11 +540,12 @@ static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */ } /* If base_xpath returned multiple results, then */ - /* Instance in the xpath block is required */ - if (total_nodes > 1 && xpath->instance == NULL) { + /* InstanceFrom or PluginInstanceFrom in the xpath block is required */ + if (total_nodes > 1 && xpath->instance == NULL + && xpath->plugin_instance_from == NULL) { ERROR("curl_xml plugin: " - "InstanceFrom is must in xpath block since the base xpath expression " - "\"%s\" " + "InstanceFrom or PluginInstanceFrom is must in xpath block " + "since the base xpath expression \"%s\" " "returned multiple results. Skipping the xpath block...", base_xpath); return -1; @@ -505,18 +554,19 @@ static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */ /* set the values for the value_list */ vl.values_len = ds->ds_num; sstrncpy(vl.type, xpath->type, sizeof(vl.type)); - sstrncpy(vl.plugin, "curl_xml", sizeof(vl.plugin)); - sstrncpy(vl.host, host, sizeof(vl.host)); - if (plugin_instance != NULL) - sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance)); + sstrncpy(vl.plugin, (db->plugin_name != NULL) ? db->plugin_name : "curl_xml", + sizeof(vl.plugin)); + sstrncpy(vl.host, cx_host(db), sizeof(vl.host)); for (int i = 0; i < total_nodes; i++) { int status; xpath_ctx->node = base_nodes->nodeTab[i]; - status = cx_handle_instance_xpath(xpath_ctx, xpath, &vl, - /* is_table = */ (total_nodes > 1)); + if (db->instance != NULL) + sstrncpy (vl.plugin_instance, db->instance, sizeof (vl.plugin_instance)); + + status = cx_handle_instance_xpath(xpath_ctx, xpath, &vl); if (status != 0) continue; /* An error has already been reported. */ @@ -528,7 +578,7 @@ static int cx_handle_base_xpath(char const *plugin_instance, /* {{{ */ /* free up the allocated memory */ xmlXPathFreeObject(base_node_obj); - return (0); + return 0; } /* }}} cx_handle_base_xpath */ static int cx_handle_parsed_xml(xmlDocPtr doc, /* {{{ */ @@ -545,8 +595,7 @@ static int cx_handle_parsed_xml(xmlDocPtr doc, /* {{{ */ ds = plugin_get_ds(xpath->type); if ((cx_check_type(ds, xpath) == 0) && - (cx_handle_base_xpath(db->instance, cx_host(db), xpath_ctx, ds, le->key, - xpath) == 0)) + (cx_handle_base_xpath(db, xpath_ctx, ds, le->key, xpath) == 0)) status = 0; /* we got atleast one success */ le = le->next; @@ -565,14 +614,14 @@ static int cx_parse_stats_xml(xmlChar *xml, cx_t *db) /* {{{ */ doc = xmlParseDoc(xml); if (doc == NULL) { ERROR("curl_xml plugin: Failed to parse the xml document - %s", xml); - return (-1); + return -1; } xpath_ctx = xmlXPathNewContext(doc); if (xpath_ctx == NULL) { ERROR("curl_xml plugin: Failed to create the xml context"); xmlFreeDoc(doc); - return (-1); + return -1; } for (size_t i = 0; i < db->namespaces_num; i++) { @@ -585,7 +634,7 @@ static int cx_parse_stats_xml(xmlChar *xml, cx_t *db) /* {{{ */ ns->prefix, ns->url); xmlXPathFreeContext(xpath_ctx); xmlFreeDoc(doc); - return (status); + return status; } } @@ -602,14 +651,16 @@ static int cx_curl_perform(cx_t *db, CURL *curl) /* {{{ */ long rc; char *ptr; char *url; - url = db->url; db->buffer_fill = 0; + + curl_easy_setopt(db->curl, CURLOPT_URL, db->url); + status = curl_easy_perform(curl); if (status != CURLE_OK) { ERROR("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)", - status, db->curl_errbuf, url); - return (-1); + status, db->curl_errbuf, db->url); + return -1; } if (db->stats != NULL) curl_stats_dispatch(db->stats, db->curl, cx_host(db), "curl_xml", @@ -623,7 +674,7 @@ static int cx_curl_perform(cx_t *db, CURL *curl) /* {{{ */ ERROR( "curl_xml plugin: curl_easy_perform failed with response code %ld (%s)", rc, url); - return (-1); + return -1; } ptr = db->buffer; @@ -640,7 +691,7 @@ static int cx_read(user_data_t *ud) /* {{{ */ if ((ud == NULL) || (ud->data == NULL)) { ERROR("curl_xml plugin: cx_read: Invalid user data."); - return (-1); + return -1; } db = (cx_t *)ud->data; @@ -654,13 +705,13 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */ oconfig_item_t *ci) { if (ci->values_num < 1) { WARNING("curl_xml plugin: `ValuesFrom' needs at least one argument."); - return (-1); + return -1; } for (int i = 0; i < ci->values_num; i++) if (ci->values[i].type != OCONFIG_TYPE_STRING) { WARNING("curl_xml plugin: `ValuesFrom' needs only string argument."); - return (-1); + return -1; } sfree(xpath->values); @@ -668,7 +719,7 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */ xpath->values_len = 0; xpath->values = malloc(sizeof(cx_values_t) * ci->values_num); if (xpath->values == NULL) - return (-1); + return -1; xpath->values_len = (size_t)ci->values_num; /* populate cx_values_t structure */ @@ -678,7 +729,7 @@ static int cx_config_add_values(const char *name, cx_xpath_t *xpath, /* {{{ */ 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) /* {{{ */ @@ -691,13 +742,13 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ xpath = calloc(1, sizeof(*xpath)); if (xpath == NULL) { ERROR("curl_xml plugin: calloc failed."); - return (-1); + return -1; } status = cf_util_get_string(ci, &xpath->path); if (status != 0) { cx_xpath_free(xpath); - return (status); + return status; } /* error out if xpath->path is an empty string */ @@ -705,7 +756,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ ERROR("curl_xml plugin: invalid xpath. " "xpath value can't be an empty string"); cx_xpath_free(xpath); - return (-1); + return -1; } status = 0; @@ -718,6 +769,8 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ status = cf_util_get_string(child, &xpath->instance_prefix); else if (strcasecmp("InstanceFrom", child->key) == 0) status = cf_util_get_string(child, &xpath->instance); + else if (strcasecmp("PluginInstanceFrom", child->key) == 0) + status = cf_util_get_string(child, &xpath->plugin_instance_from); else if (strcasecmp("ValuesFrom", child->key) == 0) status = cx_config_add_values("ValuesFrom", xpath, child); else { @@ -745,7 +798,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ if (db->list == NULL) { ERROR("curl_xml plugin: list creation failed."); cx_xpath_free(xpath); - return (-1); + return -1; } } @@ -753,7 +806,7 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ if (name == NULL) { ERROR("curl_xml plugin: strdup failed."); cx_xpath_free(xpath); - return (-1); + return -1; } le = llentry_create(name, xpath); @@ -761,11 +814,11 @@ static int cx_config_add_xpath(cx_t *db, oconfig_item_t *ci) /* {{{ */ ERROR("curl_xml plugin: llentry_create failed."); cx_xpath_free(xpath); sfree(name); - return (-1); + return -1; } llist_append(db->list, le); - return (0); + return 0; } /* }}} int cx_config_add_xpath */ static int cx_config_add_namespace(cx_t *db, /* {{{ */ @@ -776,14 +829,14 @@ static int cx_config_add_namespace(cx_t *db, /* {{{ */ (ci->values[1].type != OCONFIG_TYPE_STRING)) { WARNING("curl_xml plugin: The `Namespace' option " "needs exactly two string arguments."); - return (EINVAL); + return EINVAL; } ns = realloc(db->namespaces, sizeof(*db->namespaces) * (db->namespaces_num + 1)); if (ns == NULL) { ERROR("curl_xml plugin: realloc failed."); - return (ENOMEM); + return ENOMEM; } db->namespaces = ns; ns = db->namespaces + db->namespaces_num; @@ -796,11 +849,11 @@ static int cx_config_add_namespace(cx_t *db, /* {{{ */ sfree(ns->prefix); sfree(ns->url); ERROR("curl_xml plugin: strdup failed."); - return (ENOMEM); + return ENOMEM; } db->namespaces_num++; - return (0); + return 0; } /* }}} int cx_config_add_namespace */ /* Initialize db->curl */ @@ -809,7 +862,7 @@ static int cx_init_curl(cx_t *db) /* {{{ */ db->curl = curl_easy_init(); if (db->curl == NULL) { ERROR("curl_xml plugin: curl_easy_init failed."); - return (-1); + return -1; } curl_easy_setopt(db->curl, CURLOPT_NOSIGNAL, 1L); @@ -817,7 +870,6 @@ static int cx_init_curl(cx_t *db) /* {{{ */ curl_easy_setopt(db->curl, CURLOPT_WRITEDATA, 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); @@ -836,11 +888,11 @@ static int cx_init_curl(cx_t *db) /* {{{ */ db->credentials = malloc(credentials_size); if (db->credentials == NULL) { ERROR("curl_xml plugin: malloc failed."); - return (-1); + return -1; } - ssnprintf(db->credentials, credentials_size, "%s:%s", db->user, - (db->pass == NULL) ? "" : db->pass); + snprintf(db->credentials, credentials_size, "%s:%s", db->user, + (db->pass == NULL) ? "" : db->pass); curl_easy_setopt(db->curl, CURLOPT_USERPWD, db->credentials); #endif @@ -865,7 +917,7 @@ static int cx_init_curl(cx_t *db) /* {{{ */ (long)CDTIME_T_TO_MS(plugin_get_interval())); #endif - return (0); + return 0; } /* }}} int cx_init_curl */ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */ @@ -876,13 +928,13 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */ if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING)) { WARNING("curl_xml plugin: The `URL' block " "needs exactly one string argument."); - return (-1); + return -1; } db = calloc(1, sizeof(*db)); if (db == NULL) { ERROR("curl_xml plugin: calloc failed."); - return (-1); + return -1; } db->timeout = -1; @@ -891,14 +943,14 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */ status = cf_util_get_string(ci, &db->url); if (status != 0) { sfree(db); - return (status); + return status; } } else { ERROR("curl_xml plugin: cx_config: " "Invalid key: %s", ci->key); cx_free(db); - return (-1); + return -1; } /* Fill the `cx_t' structure.. */ @@ -907,6 +959,8 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */ if (strcasecmp("Instance", child->key) == 0) status = cf_util_get_string(child, &db->instance); + else if (strcasecmp("Plugin", child->key) == 0) + status = cf_util_get_string(child, &db->plugin_name); else if (strcasecmp("Host", child->key) == 0) status = cf_util_get_string(child, &db->host); else if (strcasecmp("User", child->key) == 0) @@ -974,10 +1028,10 @@ static int cx_config_add_url(oconfig_item_t *ci) /* {{{ */ sfree(cb_name); } else { cx_free(db); - return (-1); + return -1; } - return (0); + return 0; } /* }}} int cx_config_add_url */ /* }}} End of configuration handling functions */ @@ -1008,10 +1062,10 @@ static int cx_config(oconfig_item_t *ci) /* {{{ */ if ((success == 0) && (errors > 0)) { ERROR("curl_xml plugin: All statements failed."); - return (-1); + return -1; } - return (0); + return 0; } /* }}} int cx_config */ static int cx_init(void) /* {{{ */ @@ -1019,12 +1073,10 @@ static int cx_init(void) /* {{{ */ /* Call this while collectd is still single-threaded to avoid * initialization issues in libgcrypt. */ curl_global_init(CURL_GLOBAL_SSL); - return (0); + return 0; } /* }}} int cx_init */ void module_register(void) { plugin_register_complex_config("curl_xml", cx_config); plugin_register_init("curl_xml", cx_init); } /* void module_register */ - -/* vim: set sw=2 sts=2 et fdm=marker : */