dom, VIR_DOMAIN_METADATA_ELEMENT, namespace, VIR_DOMAIN_AFFECT_CURRENT);
if (metadata_str == NULL) {
return NULL;
- } else {
- char *hostname = NULL;
- xmlDocPtr xml_doc = NULL;
- xmlXPathContextPtr xpath_ctx = NULL;
- xmlXPathObjectPtr xpath_obj = NULL;
- xmlNodePtr xml_node = NULL;
-
- xml_doc = xmlReadDoc((xmlChar *)metadata_str, NULL, NULL, XML_PARSE_NONET);
- if (xml_doc == NULL) {
- ERROR(PLUGIN_NAME " plugin: xmlReadDoc failed to read metadata");
- goto metadata_end;
- }
+ }
- xpath_ctx = xmlXPathNewContext(xml_doc);
- if (xpath_ctx == NULL) {
- ERROR(PLUGIN_NAME " plugin: xmlXPathNewContext(%s) failed for metadata",
- metadata_str);
- goto metadata_end;
- }
- xpath_obj = xmlXPathEval((xmlChar *)xpath_str, xpath_ctx);
- if (xpath_obj == NULL) {
- ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) failed for metadata",
- xpath_str);
- goto metadata_end;
- }
+ char *hostname = NULL;
+ xmlXPathContextPtr xpath_ctx = NULL;
+ xmlXPathObjectPtr xpath_obj = NULL;
+ xmlNodePtr xml_node = NULL;
- if (xpath_obj->type != XPATH_NODESET) {
- ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) unexpected return type %d "
- "(wanted %d) for metadata",
- xpath_str, xpath_obj->type, XPATH_NODESET);
- goto metadata_end;
- }
+ xmlDocPtr xml_doc =
+ xmlReadDoc((xmlChar *)metadata_str, NULL, NULL, XML_PARSE_NONET);
+ if (xml_doc == NULL) {
+ ERROR(PLUGIN_NAME " plugin: xmlReadDoc failed to read metadata");
+ goto metadata_end;
+ }
- // TODO(sileht): We can support || operator by looping on nodes here
- if (xpath_obj->nodesetval == NULL || xpath_obj->nodesetval->nodeNr != 1) {
- WARNING(PLUGIN_NAME " plugin: xmlXPathEval(%s) return nodeset size=%i "
- "expected=1 for metadata",
- xpath_str,
- (xpath_obj->nodesetval == NULL) ? 0
- : xpath_obj->nodesetval->nodeNr);
- goto metadata_end;
- }
+ xpath_ctx = xmlXPathNewContext(xml_doc);
+ if (xpath_ctx == NULL) {
+ ERROR(PLUGIN_NAME " plugin: xmlXPathNewContext(%s) failed for metadata",
+ metadata_str);
+ goto metadata_end;
+ }
+ xpath_obj = xmlXPathEval((xmlChar *)xpath_str, xpath_ctx);
+ if (xpath_obj == NULL) {
+ ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) failed for metadata",
+ xpath_str);
+ goto metadata_end;
+ }
- xml_node = xpath_obj->nodesetval->nodeTab[0];
- if (xml_node->type == XML_TEXT_NODE) {
- hostname = strdup((const char *)xml_node->content);
- } else if (xml_node->type == XML_ATTRIBUTE_NODE) {
- hostname = strdup((const char *)xml_node->children->content);
- } else {
- ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) unsupported node type %d",
- xpath_str, xml_node->type);
- goto metadata_end;
- }
+ if (xpath_obj->type != XPATH_NODESET) {
+ ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) unexpected return type %d "
+ "(wanted %d) for metadata",
+ xpath_str, xpath_obj->type, XPATH_NODESET);
+ goto metadata_end;
+ }
- if (hostname == NULL) {
- ERROR(PLUGIN_NAME " plugin: strdup(%s) hostname failed", xpath_str);
- goto metadata_end;
- }
+ // TODO(sileht): We can support || operator by looping on nodes here
+ if (xpath_obj->nodesetval == NULL || xpath_obj->nodesetval->nodeNr != 1) {
+ WARNING(PLUGIN_NAME " plugin: xmlXPathEval(%s) return nodeset size=%i "
+ "expected=1 for metadata",
+ xpath_str,
+ (xpath_obj->nodesetval == NULL) ? 0
+ : xpath_obj->nodesetval->nodeNr);
+ goto metadata_end;
+ }
+
+ xml_node = xpath_obj->nodesetval->nodeTab[0];
+ if (xml_node->type == XML_TEXT_NODE) {
+ hostname = strdup((const char *)xml_node->content);
+ } else if (xml_node->type == XML_ATTRIBUTE_NODE) {
+ hostname = strdup((const char *)xml_node->children->content);
+ } else {
+ ERROR(PLUGIN_NAME " plugin: xmlXPathEval(%s) unsupported node type %d",
+ xpath_str, xml_node->type);
+ goto metadata_end;
+ }
- metadata_end:
- if (xpath_obj)
- xmlXPathFreeObject(xpath_obj);
- if (xpath_ctx)
- xmlXPathFreeContext(xpath_ctx);
- if (xml_doc)
- xmlFreeDoc(xml_doc);
- sfree(metadata_str);
- return hostname;
+ if (hostname == NULL) {
+ ERROR(PLUGIN_NAME " plugin: strdup(%s) hostname failed", xpath_str);
+ goto metadata_end;
}
+
+metadata_end:
+ if (xpath_obj)
+ xmlXPathFreeObject(xpath_obj);
+ if (xpath_ctx)
+ xmlXPathFreeContext(xpath_ctx);
+ if (xml_doc)
+ xmlFreeDoc(xml_doc);
+ sfree(metadata_str);
+ return hostname;
}
static void init_value_list(value_list_t *vl, virDomainPtr dom) {
submit_notif(dom, severity, msg, "domain_state", NULL);
}
-static int lv_config(const char *key, const char *value) {
- if (virInitialize() != 0)
- return 1;
-
+static int lv_init_ignorelists() {
if (il_domains == NULL)
il_domains = ignorelist_create(1);
if (il_block_devices == NULL)
if (il_interface_devices == NULL)
il_interface_devices = ignorelist_create(1);
+ if (!il_domains || !il_block_devices || !il_interface_devices)
+ return 1;
+
+ return 0;
+}
+
+static int lv_config(const char *key, const char *value) {
+ if (virInitialize() != 0)
+ return 1;
+
+ if (lv_init_ignorelists() != 0)
+ return 1;
+
if (strcasecmp(key, "Connection") == 0) {
char *tmp = strdup(value);
if (tmp == NULL) {
if (virInitialize() != 0)
return -1;
+ /* Init ignorelists if there was no explicit configuration */
+ if (lv_init_ignorelists() != 0)
+ return -1;
+
/* event implementation must be registered before connection is opened */
if (!persistent_notification)
if (register_event_impl() != 0)
/* Fetch each domain and add it to the list, unless ignore. */
for (int i = 0; i < n; ++i) {
- const char *name;
- char *xml = NULL;
- xmlDocPtr xml_doc = NULL;
- xmlXPathContextPtr xpath_ctx = NULL;
- xmlXPathObjectPtr xpath_obj = NULL;
- char tag[PARTITION_TAG_MAX_LEN] = {'\0'};
- virDomainInfo info;
- int status;
#ifdef HAVE_LIST_ALL_DOMAINS
virDomainPtr dom = domains[i];
*/
ERROR(PLUGIN_NAME " plugin: malloc failed.");
virDomainFree(dom);
- goto cont;
+ continue;
}
- name = virDomainGetName(dom);
- if (name == NULL) {
+ const char *domname = virDomainGetName(dom);
+ if (domname == NULL) {
VIRT_ERROR(conn, "virDomainGetName");
- goto cont;
+ continue;
}
- status = virDomainGetInfo(dom, &info);
+ virDomainInfo info;
+ int status = virDomainGetInfo(dom, &info);
if (status != 0) {
ERROR(PLUGIN_NAME " plugin: virDomainGetInfo failed with status %i.",
status);
continue;
}
- if (il_domains && ignorelist_match(il_domains, name) != 0)
- goto cont;
+ if (ignorelist_match(il_domains, domname) != 0)
+ continue;
/* Get a list of devices for this domain. */
- xml = virDomainGetXMLDesc(dom, 0);
+ xmlDocPtr xml_doc = NULL;
+ xmlXPathContextPtr xpath_ctx = NULL;
+ xmlXPathObjectPtr xpath_obj = NULL;
+
+ char *xml = virDomainGetXMLDesc(dom, 0);
if (!xml) {
VIRT_ERROR(conn, "virDomainGetXMLDesc");
goto cont;
xpath_ctx = xmlXPathNewContext(xml_doc);
- if (lv_domain_get_tag(xpath_ctx, name, tag) < 0) {
+ char tag[PARTITION_TAG_MAX_LEN] = {'\0'};
+ if (lv_domain_get_tag(xpath_ctx, domname, tag) < 0) {
ERROR(PLUGIN_NAME " plugin: lv_domain_get_tag failed.");
goto cont;
}
- if (!lv_instance_include_domain(inst, name, tag))
+ if (!lv_instance_include_domain(inst, domname, tag))
goto cont;
/* Block devices. */
goto cont;
for (int j = 0; j < xpath_obj->nodesetval->nodeNr; ++j) {
- xmlNodePtr node;
- char *path = NULL;
-
- node = xpath_obj->nodesetval->nodeTab[j];
+ xmlNodePtr node = xpath_obj->nodesetval->nodeTab[j];
if (!node)
continue;
- path = (char *)xmlGetProp(node, (xmlChar *)"dev");
+
+ char *path = (char *)xmlGetProp(node, (xmlChar *)"dev");
if (!path)
continue;
- if (il_block_devices &&
- ignore_device_match(il_block_devices, name, path) != 0)
- goto cont2;
+ if (ignore_device_match(il_block_devices, domname, path) == 0)
+ add_block_device(state, dom, path);
- add_block_device(state, dom, path);
- cont2:
- if (path)
- xmlFree(path);
+ xmlFree(path);
}
xmlXPathFreeObject(xpath_obj);
for (int j = 0; j < xml_interfaces->nodeNr; ++j) {
char *path = NULL;
char *address = NULL;
- xmlNodePtr xml_interface;
- xml_interface = xml_interfaces->nodeTab[j];
+ xmlNodePtr xml_interface = xml_interfaces->nodeTab[j];
if (!xml_interface)
continue;
}
}
- if (il_interface_devices &&
- (ignore_device_match(il_interface_devices, name, path) != 0 ||
- ignore_device_match(il_interface_devices, name, address) != 0))
- goto cont3;
+ if ((ignore_device_match(il_interface_devices, domname, path) == 0 &&
+ ignore_device_match(il_interface_devices, domname, address) == 0)) {
+ add_interface_device(state, dom, path, address, j + 1);
+ }
- add_interface_device(state, dom, path, address, j + 1);
- cont3:
if (path)
xmlFree(path);
if (address)
static int ignore_device_match(ignorelist_t *il, const char *domname,
const char *devpath) {
- char *name;
- int r;
-
if ((domname == NULL) || (devpath == NULL))
return 0;
size_t n = strlen(domname) + strlen(devpath) + 2;
- name = malloc(n);
+ char *name = malloc(n);
if (name == NULL) {
ERROR(PLUGIN_NAME " plugin: malloc failed.");
return 0;
}
snprintf(name, n, "%s:%s", domname, devpath);
- r = ignorelist_match(il, name);
+ int r = ignorelist_match(il, name);
sfree(name);
return r;
}