Use virXMLNodeGetSubelement to find needed subelements.
In virshUpdateDiskXML this commit removes the code which keeps XML
formatting tidy, but that is not needed for the code to format proper
XMLs.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
tools/virsh-domain.c | 63 +++++---------------------------------------
1 file changed, 7 insertions(+), 56 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index e0776c991f..541a799aaf 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -12641,19 +12641,13 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
static void
virshDiskDropBackingStore(xmlNodePtr disk_node)
{
- xmlNodePtr tmp;
+ xmlNodePtr tmp = virXMLNodeGetSubelement(disk_node, "backingStore");
- for (tmp = disk_node->children; tmp; tmp = tmp->next) {
- if (tmp->type != XML_ELEMENT_NODE)
- continue;
-
- if (virXMLNodeNameEqual(tmp, "backingStore")) {
- xmlUnlinkNode(tmp);
- xmlFreeNode(tmp);
+ if (!tmp)
+ return;
- return;
- }
- }
+ xmlUnlinkNode(tmp);
+ xmlFreeNode(tmp);
}
@@ -12753,10 +12747,7 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
const char *target,
virshUpdateDiskXMLType type)
{
- xmlNodePtr tmp = NULL;
xmlNodePtr source = NULL;
- xmlNodePtr target_node = NULL;
- xmlNodePtr text_node = NULL;
g_autofree char *device_type = NULL;
char *ret = NULL;
g_autofree char *startupPolicy = NULL;
@@ -12773,33 +12764,7 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
return NULL;
}
- /* find the current source subelement */
- for (tmp = disk_node->children; tmp; tmp = tmp->next) {
- /*
- * Save the last text node before the <target/>. The
- * reasoning behind this is that the target node will be
- * present in this case and also has a proper indentation.
- */
- if (!target_node && tmp->type == XML_TEXT_NODE)
- text_node = tmp;
-
- /*
- * We need only element nodes from now on.
- */
- if (tmp->type != XML_ELEMENT_NODE)
- continue;
-
- if (!source && virXMLNodeNameEqual(tmp, "source"))
- source = tmp;
- else if (!target_node && virXMLNodeNameEqual(tmp, "target"))
- target_node = tmp;
-
- /*
- * We've found all we needed.
- */
- if (source && target_node)
- break;
- }
+ source = virXMLNodeGetSubelement(disk_node, "source");
if (type == VIRSH_UPDATE_DISK_XML_EJECT) {
if (!source) {
@@ -12852,21 +12817,7 @@ virshUpdateDiskXML(xmlNodePtr disk_node,
if (startupPolicy)
xmlNewProp(source, BAD_CAST "startupPolicy", BAD_CAST
startupPolicy);
- /*
- * So that the output XML looks nice in case anyone calls
- * 'change-media' with '--print-xml', let's attach the
source
- * before target...
- */
- xmlAddPrevSibling(target_node, source);
-
- /*
- * ... and duplicate the text node doing the indentation just
- * so it's more easily readable. And don't make it fatal.
- */
- if ((tmp = xmlCopyNode(text_node, 0))) {
- if (!xmlAddPrevSibling(target_node, tmp))
- xmlFreeNode(tmp);
- }
+ xmlAddChild(disk_node, source);
}
if (!(ret = virXMLNodeToString(NULL, disk_node))) {
--
2.41.0