char *user;
char *pass;
char *credentials;
- _Bool digest;
- _Bool verify_peer;
- _Bool verify_host;
+ bool digest;
+ bool verify_peer;
+ bool verify_host;
char *cacert;
char *post_body;
int timeout;
while (le != NULL) {
llentry_t *le_next = le->next;
+ /* this also frees xpath->path used for le->key */
cx_xpath_free(le->value);
le = le_next;
}
llist_destroy(list);
-} /* }}} void cx_list_free */
+} /* }}} void cx_xpath_list_free */
static void cx_free(void *arg) /* {{{ */
{
}
if (ds->ds_num != xpath->values_len) {
- WARNING("curl_xml plugin: DataSet `%s' requires %zu values, but config "
- "talks about %zu",
+ WARNING("curl_xml plugin: DataSet `%s' requires %" PRIsz
+ " values, but config talks about %" PRIsz,
xpath->type, ds->ds_num, xpath->values_len);
return -1;
}
return -1;
} /* }}} cx_if_not_text_node */
+/*
+ * Returned value should be freed with xmlFree().
+ */
static char *cx_get_text_node_value(xmlXPathContextPtr xpath_ctx, /* {{{ */
char *expr, const char *from_option) {
xmlXPathObjectPtr values_node_obj = cx_evaluate_xpath(xpath_ctx, expr);
if (tmp_size == 0) {
WARNING("curl_xml plugin: "
- "relative xpath expression \"%s\" %sdoesn't match "
+ "relative xpath expression \"%s\" from '%s' doesn't match "
"any of the nodes.",
- expr, (from_option == NULL) ? "" : from_option);
+ expr, from_option);
xmlXPathFreeObject(values_node_obj);
return NULL;
}
if (tmp_size > 1) {
WARNING("curl_xml plugin: "
- "relative xpath expression \"%s\" %sis expected to return "
+ "relative xpath expression \"%s\" from '%s' is expected to return "
"only one text node. Skipping the node.",
- expr, (from_option == NULL) ? "" : from_option);
+ expr, from_option);
xmlXPathFreeObject(values_node_obj);
return NULL;
}
/* ignoring the element if other than textnode/attribute*/
if (cx_if_not_text_node(values_node->nodeTab[0])) {
WARNING("curl_xml plugin: "
- "relative xpath expression \"%s\" %sis expected to return "
+ "relative xpath expression \"%s\" from '%s' is expected to return "
"only text/attribute node which is not the case. "
"Skipping the node.",
- expr, (from_option == NULL) ? "" : from_option);
+ expr, from_option);
xmlXPathFreeObject(values_node_obj);
return NULL;
}
value_list_t *vl, int index) {
char *node_value = cx_get_text_node_value(
- xpath_ctx, xpath->values[index].path, "from 'ValuesFrom' ");
+ xpath_ctx, xpath->values[index].path, "ValuesFrom");
if (node_value == NULL)
return -1;
/* endptr = */ NULL);
}
- sfree(node_value);
+ xmlFree(node_value);
/* We have reached here which means that
* we have got something to work */
/* Handle type instance */
if (xpath->instance != NULL) {
- char *node_value = cx_get_text_node_value(xpath_ctx, xpath->instance,
- "from 'InstanceFrom' ");
+ char *node_value =
+ cx_get_text_node_value(xpath_ctx, xpath->instance, "InstanceFrom");
if (node_value == NULL)
return -1;
else
sstrncpy(vl->type_instance, node_value, sizeof(vl->type_instance));
- sfree(node_value);
+ xmlFree(node_value);
} else if (xpath->instance_prefix != NULL)
sstrncpy(vl->type_instance, xpath->instance_prefix,
sizeof(vl->type_instance));
/* Handle plugin instance */
if (xpath->plugin_instance_from != NULL) {
char *node_value = cx_get_text_node_value(
- xpath_ctx, xpath->plugin_instance_from, "from 'PluginInstanceFrom' ");
+ xpath_ctx, xpath->plugin_instance_from, "PluginInstanceFrom");
if (node_value == NULL)
return -1;
sstrncpy(vl->plugin_instance, node_value, sizeof(vl->plugin_instance));
- sfree(node_value);
+ xmlFree(node_value);
}
return 0;
"since the base xpath expression \"%s\" "
"returned multiple results. Skipping the xpath block...",
xpath->path);
+ xmlXPathFreeObject(base_node_obj);
return -1;
}
return status;
}
+ cdtime_t interval = 0;
+
/* Fill the `cx_t' structure.. */
for (int i = 0; i < ci->children_num; i++) {
oconfig_item_t *child = ci->children + i;
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("Interval", child->key) == 0)
+ status = cf_util_get_cdtime(child, &interval);
else if (strcasecmp("Timeout", child->key) == 0)
status = cf_util_get_int(child, &db->timeout);
else if (strcasecmp("Statistics", child->key) == 0) {
char *cb_name = ssnprintf_alloc("curl_xml-%s-%s", db->instance, db->url);
plugin_register_complex_read(/* group = */ "curl_xml", cb_name, cx_read,
- /* interval = */ 0,
+ /* interval = */ interval,
&(user_data_t){
.data = db, .free_func = cx_free,
});