Repetitive patterns should be factored. The sign of a good factorization is a change that kills 5x more lines than it adds :) * src/conf/domain_conf.c (virDomainDeviceDefParse) (virDomainSnapshotDefParseString): Use new convenience macros. * src/conf/storage_conf.c (virStoragePoolDefParseSourceString): Likewise. * src/cpu/cpu.c (cpuCompareXML, cpuBaselineXML): Likewise. * src/esx/esx_vi.c (esxVI_Context_Execute): Likewise. * src/qemu/qemu_migration.c (qemuMigrationCookieXMLParseStr): Likewise. * src/security/virt-aa-helper.c (caps_mockup): Likewise. * src/test/test_driver.c (testOpenFromFile): Likewise. * tests/cputest.c (cpuTestLoadXML, cpuTestLoadMultiXML): Likewise. * tools/virsh.c (cmdFreecell, makeCloneXML, cmdVNCDisplay) (cmdTTYConsole, cmdDetachInterface, cmdDetachDisk) (cmdSnapshotCreate, cmdSnapshotCreateAs, cmdSnapshotCurrent) (cmdSnapshotList, cmdSnapshotParent): Likewise. --- src/conf/domain_conf.c | 20 +-------- src/conf/storage_conf.c | 8 +--- src/cpu/cpu.c | 18 +------- src/esx/esx_vi.c | 13 +----- src/qemu/qemu_migration.c | 9 +---- src/security/virt-aa-helper.c | 12 +----- src/test/test_driver.c | 13 +----- tests/cputest.c | 9 +--- tools/virsh.c | 84 ++++++---------------------------------- 9 files changed, 30 insertions(+), 156 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index ce1f3c5..0a2c9eb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -5385,17 +5385,10 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps, xmlXPathContextPtr ctxt = NULL; virDomainDeviceDefPtr dev = NULL; - if (!(xml = virXMLParseString(xmlStr, "device.xml"))) { + if (!(xml = virXMLParseStringCtxt(xmlStr, "device.xml", &ctxt))) { goto error; } - node = xmlDocGetRootElement(xml); - - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); - goto error; - } - ctxt->node = xmlDocGetRootElement(xml); + node = ctxt->node; if (VIR_ALLOC(dev) < 0) { virReportOOMError(); @@ -10968,23 +10961,16 @@ virDomainSnapshotDefPtr virDomainSnapshotDefParseString(const char *xmlStr, char *creation = NULL, *state = NULL; struct timeval tv; - xml = virXMLParse(NULL, xmlStr, "domainsnapshot.xml"); + xml = virXMLParseCtxt(NULL, xmlStr, "domainsnapshot.xml", &ctxt); if (!xml) { return NULL; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - virReportOOMError(); - goto cleanup; - } - if (VIR_ALLOC(def) < 0) { virReportOOMError(); goto cleanup; } - ctxt->node = xmlDocGetRootElement(xml); if (!xmlStrEqual(ctxt->node->name, BAD_CAST "domainsnapshot")) { virDomainReportError(VIR_ERR_XML_ERROR, "%s", _("domainsnapshot")); goto cleanup; diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 995f9a6..8d14e87 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -505,13 +505,7 @@ virStoragePoolDefParseSourceString(const char *srcSpec, xmlXPathContextPtr xpath_ctxt = NULL; virStoragePoolSourcePtr def = NULL, ret = NULL; - if (!(doc = virXMLParseString(srcSpec, "srcSpec.xml"))) { - goto cleanup; - } - - xpath_ctxt = xmlXPathNewContext(doc); - if (xpath_ctxt == NULL) { - virReportOOMError(); + if (!(doc = virXMLParseStringCtxt(srcSpec, "srcSpec.xml", &xpath_ctxt))) { goto cleanup; } diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 16e0709..b47f078 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1,7 +1,7 @@ /* * cpu.c: internal functions for CPU manipulation * - * Copyright (C) 2009--2010 Red Hat, Inc. + * Copyright (C) 2009-2011 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -76,16 +76,9 @@ cpuCompareXML(virCPUDefPtr host, VIR_DEBUG("host=%p, xml=%s", host, NULLSTR(xml)); - if (!(doc = virXMLParseString(xml, "cpu.xml"))) + if (!(doc = virXMLParseStringCtxt(xml, "cpu.xml", &ctxt))) goto cleanup; - if ((ctxt = xmlXPathNewContext(doc)) == NULL) { - virReportOOMError(); - goto cleanup; - } - - ctxt->node = xmlDocGetRootElement(doc); - cpu = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO); if (cpu == NULL) goto cleanup; @@ -311,14 +304,9 @@ cpuBaselineXML(const char **xmlCPUs, goto no_memory; for (i = 0; i < ncpus; i++) { - if (!(doc = virXMLParseString(xmlCPUs[i], "cpu.xml"))) + if (!(doc = virXMLParseStringCtxt(xmlCPUs[i], "cpu.xml", &ctxt))) goto error; - if ((ctxt = xmlXPathNewContext(doc)) == NULL) - goto no_memory; - - ctxt->node = xmlDocGetRootElement(doc); - cpus[i] = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_HOST); if (cpus[i] == NULL) goto error; diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index c82094b..5c8d79e 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -910,21 +910,14 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, (*response)->content = virBufferContentAndReset(&buffer); if ((*response)->responseCode == 500 || (*response)->responseCode == 200) { - (*response)->document = virXMLParseString((*response)->content, - "esx.xml"); + (*response)->document = virXMLParseStringCtxt((*response)->content, + "esx.xml", + &xpathContext); if ((*response)->document == NULL) { goto cleanup; } - xpathContext = xmlXPathNewContext((*response)->document); - - if (xpathContext == NULL) { - ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", - _("Could not create XPath context")); - goto cleanup; - } - xmlXPathRegisterNs(xpathContext, BAD_CAST "soapenv", BAD_CAST "http://schemas.xmlsoap.org/soap/envelope/"); xmlXPathRegisterNs(xpathContext, BAD_CAST "vim", BAD_CAST "urn:vim25"); diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 5510493..a84faf6 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -602,16 +602,9 @@ qemuMigrationCookieXMLParseStr(qemuMigrationCookiePtr mig, VIR_DEBUG("xml=%s", NULLSTR(xml)); - if (!(doc = virXMLParseString(xml, "qemumigration.xml"))) + if (!(doc = virXMLParseStringCtxt(xml, "qemumigration.xml", &ctxt))) goto cleanup; - if ((ctxt = xmlXPathNewContext(doc)) == NULL) { - virReportOOMError(); - goto cleanup; - } - - ctxt->node = xmlDocGetRootElement(doc); - ret = qemuMigrationCookieXMLParse(mig, ctxt, flags); cleanup: diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 1e2feae..bb577d3 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -640,24 +640,16 @@ caps_mockup(vahControl * ctl, const char *xmlStr) int rc = -1; xmlDocPtr xml = NULL; xmlXPathContextPtr ctxt = NULL; - xmlNodePtr root; - if (!(xml = virXMLParseString(xmlStr, "domain.xml"))) { + if (!(xml = virXMLParseStringCtxt(xmlStr, "domain.xml", &ctxt))) { goto cleanup; } - root = xmlDocGetRootElement(xml); - if (!xmlStrEqual(root->name, BAD_CAST "domain")) { + if (!xmlStrEqual(ctxt->node->name, BAD_CAST "domain")) { vah_error(NULL, 0, _("incorrect root element")); goto cleanup; } - if ((ctxt = xmlXPathNewContext(xml)) == NULL) { - vah_error(ctl, 0, _("could not allocate memory")); - goto cleanup; - } - ctxt->node = root; - /* Quick sanity check for some required elements */ if (verify_xpath_context(ctxt) != 0) goto cleanup; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index fb14b10..544fd7e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -742,7 +742,6 @@ static int testOpenFromFile(virConnectPtr conn, long l; char *str; xmlDocPtr xml = NULL; - xmlNodePtr root = NULL; xmlNodePtr *domains = NULL, *networks = NULL, *ifaces = NULL, *pools = NULL, *devs = NULL; xmlXPathContextPtr ctxt = NULL; @@ -771,24 +770,16 @@ static int testOpenFromFile(virConnectPtr conn, if (!(privconn->caps = testBuildCapabilities(conn))) goto error; - if (!(xml = virXMLParseFile(file))) { + if (!(xml = virXMLParseFileCtxt(file, &ctxt))) { goto error; } - root = xmlDocGetRootElement(xml); - if ((root == NULL) || (!xmlStrEqual(root->name, BAD_CAST "node"))) { + if (!xmlStrEqual(ctxt->node->name, BAD_CAST "node")) { testError(VIR_ERR_XML_ERROR, "%s", _("Root element is not 'node'")); goto error; } - ctxt = xmlXPathNewContext(xml); - if (ctxt == NULL) { - testError(VIR_ERR_INTERNAL_ERROR, "%s", - _("creating xpath context")); - goto error; - } - privconn->nextDomID = 1; privconn->numCells = 0; if ((privconn->path = strdup(file)) == NULL) { diff --git a/tests/cputest.c b/tests/cputest.c index 4dcf1aa..b5272c1 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -96,11 +96,9 @@ cpuTestLoadXML(const char *arch, const char *name) if (virAsprintf(&xml, "%s/cputestdata/%s-%s.xml", abs_srcdir, arch, name) < 0) goto cleanup; - if (!(doc = virXMLParseFile(xml)) || - !(ctxt = xmlXPathNewContext(doc))) + if (!(doc = virXMLParseFileCtxt(xml, &ctxt))) goto cleanup; - ctxt->node = xmlDocGetRootElement(doc); cpu = virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO); cleanup: @@ -127,12 +125,9 @@ cpuTestLoadMultiXML(const char *arch, if (virAsprintf(&xml, "%s/cputestdata/%s-%s.xml", abs_srcdir, arch, name) < 0) goto cleanup; - if (!(doc = virXMLParseFile(xml)) || - !(ctxt = xmlXPathNewContext(doc))) + if (!(doc = virXMLParseFileCtxt(xml, &ctxt))) goto error; - ctxt->node = xmlDocGetRootElement(doc); - n = virXPathNodeSet("/cpuTest/cpu", ctxt, &nodes); if (n <= 0 || !(cpus = calloc(n, sizeof(virCPUDefPtr)))) goto error; diff --git a/tools/virsh.c b/tools/virsh.c index c43de4c..1c67150 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -67,6 +67,8 @@ static char *progname; #define VSH_PROMPT_RW "virsh # " #define VSH_PROMPT_RO "virsh > " +#define VIR_FROM_THIS VIR_FROM_NONE + #define GETTIMEOFDAY(T) gettimeofday(T, NULL) #define DIFF_MSEC(T, U) \ ((((int) ((T)->tv_sec - (U)->tv_sec)) * 1000000.0 + \ @@ -2901,16 +2903,11 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd) goto cleanup; } - xml = xmlReadDoc((const xmlChar *) cap_xml, "node.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); - + xml = virXMLParseStringCtxt(cap_xml, "node.xml", &ctxt); if (!xml) { vshError(ctl, "%s", _("unable to get node capabilities")); goto cleanup; } - - ctxt = xmlXPathNewContext(xml); nodes_cnt = virXPathNodeSet("/capabilities/host/topology/cells/cell", ctxt, &nodes); @@ -8404,13 +8401,9 @@ makeCloneXML(const char *origxml, const char *newname) { xmlChar *newxml = NULL; int size; - doc = xmlReadDoc((const xmlChar *) origxml, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | XML_PARSE_NOWARNING); + doc = virXMLParseStringCtxt(origxml, "domain.xml", &ctxt); if (!doc) goto cleanup; - ctxt = xmlXPathNewContext(doc); - if (!ctxt) - goto cleanup; obj = xmlXPathEval(BAD_CAST "/volume/name", ctxt); if ((obj == NULL) || (obj->nodesetval == NULL) || @@ -10199,15 +10192,10 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domain.xml", &ctxt); VIR_FREE(doc); if (!xml) goto cleanup; - ctxt = xmlXPathNewContext(xml); - if (!ctxt) - goto cleanup; obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt); if ((obj == NULL) || (obj->type != XPATH_STRING) || @@ -10272,15 +10260,10 @@ cmdTTYConsole(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domain.xml", &ctxt); VIR_FREE(doc); if (!xml) goto cleanup; - ctxt = xmlXPathNewContext(xml); - if (!ctxt) - goto cleanup; obj = xmlXPathEval(BAD_CAST "string(/domain/devices/console/@tty)", ctxt); if ((obj == NULL) || (obj->type != XPATH_STRING) || @@ -10664,19 +10647,12 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domain.xml", &ctxt); VIR_FREE(doc); if (!xml) { vshError(ctl, "%s", _("Failed to get interface information")); goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (!ctxt) { - vshError(ctl, "%s", _("Failed to get interface information")); - goto cleanup; - } snprintf(buf, sizeof(buf), "/domain/devices/interface[@type='%s']", type); obj = xmlXPathEval(BAD_CAST buf, ctxt); @@ -11138,19 +11114,12 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domain.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domain.xml", &ctxt); VIR_FREE(doc); if (!xml) { vshError(ctl, "%s", _("Failed to get disk information")); goto cleanup; } - ctxt = xmlXPathNewContext(xml); - if (!ctxt) { - vshError(ctl, "%s", _("Failed to get disk information")); - goto cleanup; - } obj = xmlXPathEval(BAD_CAST "/domain/devices/disk", ctxt); if ((obj == NULL) || (obj->type != XPATH_NODESET) || @@ -11865,14 +11834,9 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domainsnapshot.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt); if (!xml) goto cleanup; - ctxt = xmlXPathNewContext(xml); - if (!ctxt) - goto cleanup; name = virXPathString("string(/domainsnapshot/name)", ctxt); if (!name) { @@ -11974,14 +11938,9 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd) if (!doc) goto cleanup; - xml = xmlReadDoc((const xmlChar *) doc, "domainsnapshot.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt); if (!xml) goto cleanup; - ctxt = xmlXPathNewContext(xml); - if (!ctxt) - goto cleanup; parsed_name = virXPathString("string(/domainsnapshot/name)", ctxt); if (!parsed_name) { @@ -12056,16 +12015,9 @@ cmdSnapshotCurrent(vshControl *ctl, const vshCmd *cmd) xmlDocPtr xmldoc = NULL; xmlXPathContextPtr ctxt = NULL; - xmldoc = xmlReadDoc((const xmlChar *) xml, "domainsnapshot.xml", - NULL, XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xmldoc = virXMLParseStringCtxt(xml, "domainsnapshot.xml", &ctxt); if (!xmldoc) goto cleanup; - ctxt = xmlXPathNewContext(xmldoc); - if (!ctxt) { - xmlFreeDoc(xmldoc); - goto cleanup; - } name = virXPathString("string(/domainsnapshot/name)", ctxt); xmlXPathFreeContext(ctxt); @@ -12165,14 +12117,9 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd) if (!doc) continue; - xml = xmlReadDoc((const xmlChar *) doc, "domainsnapshot.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt); if (!xml) continue; - ctxt = xmlXPathNewContext(xml); - if (!ctxt) - continue; state = virXPathString("string(/domainsnapshot/state)", ctxt); if (state == NULL) @@ -12312,14 +12259,9 @@ cmdSnapshotParent(vshControl *ctl, const vshCmd *cmd) if (!xml) goto cleanup; - xmldoc = xmlReadDoc((const xmlChar *) xml, "domainsnapshot.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOWARNING); + xmldoc = virXMLParseStringCtxt(xml, "domainsnapshot.xml", &ctxt); if (!xmldoc) goto cleanup; - ctxt = xmlXPathNewContext(xmldoc); - if (!ctxt) - goto cleanup; parent = virXPathString("string(/domainsnapshot/parent/name)", ctxt); if (!parent) -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list