[Libvirt-cim] [PATCH V2 23/48] Fix xml generation algorithm in disk_block_xml()

Xu Wang cngesaint at gmail.com
Mon Oct 28 02:45:52 UTC 2013


Signed-off-by: Xu Wang <gesaint at linux.vnet.ibm.com>
---
 libxkutil/xmlgen.c |  172 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 143 insertions(+), 29 deletions(-)

diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index f5fe4a4..c7dbefb 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -602,49 +602,163 @@ static const char *console_xml(xmlNodePtr root, struct domain *dominfo)
 
 static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
 {
-        xmlNodePtr disk;
-        xmlNodePtr tmp;
+        CU_DEBUG("Enter disk_block_xml()");
 
-        disk = xmlNewChild(root, NULL, BAD_CAST "disk", NULL);
-        if (disk == NULL)
+        dev->others = add_node_to_others(dev->others,
+                                         0,
+                                         "disk",
+                                         NULL,
+                                         TYPE_NODE,
+                                         0,
+                                         "devices");
+
+        if (dev->others == NULL) {
+                CU_DEBUG("Add tag <disk> failed.");
                 return XML_ERROR;
-        xmlNewProp(disk, BAD_CAST "type", BAD_CAST "block");
-        if (dev->device)
-                xmlNewProp(disk, BAD_CAST "device", BAD_CAST dev->device);
+        }
+
+        dev->others = add_node_to_others(dev->others,
+                                         0,
+                                         "type",
+                                         "block",
+                                         TYPE_PROP,
+                                         0,
+                                         "disk");
+
+        if (dev->device) {
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "device",
+                                                 dev->device,
+                                                 TYPE_PROP,
+                                                 0,
+                                                 "disk");
+        }
 
         if (dev->driver) {
-                tmp = xmlNewChild(disk, NULL, BAD_CAST "driver", NULL);
-                if (tmp == NULL)
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "driver",
+                                                 NULL,
+                                                 TYPE_NODE,
+                                                 0,
+                                                 "disk");
+
+                if (dev->others == NULL) {
+                        CU_DEBUG("add tag <driver> failed.");
                         return XML_ERROR;
-                xmlNewProp(tmp, BAD_CAST "name", BAD_CAST dev->driver);
-                if (dev->driver_type)
-                        xmlNewProp(tmp, BAD_CAST "type",
-                                   BAD_CAST dev->driver_type);
-                if (dev->cache)
-                        xmlNewProp(tmp, BAD_CAST "cache", BAD_CAST dev->cache);
+                }
+
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "name",
+                                                 dev->driver,
+                                                 TYPE_PROP,
+                                                 0,
+                                                 "driver");
+
+                if (dev->driver_type) {
+                        dev->others = add_node_to_others(dev->others,
+                                                         0,
+                                                         "type",
+                                                         dev->driver_type,
+                                                         TYPE_PROP,
+                                                         0,
+                                                         "driver");
+                }
+
+                if (dev->cache) {
+                        dev->others = add_node_to_others(dev->others,
+                                                         0,
+                                                         "cache",
+                                                         dev->cache,
+                                                         TYPE_PROP,
+                                                         0,
+                                                         "driver");
+                }
         }
 
         if ((dev->source != NULL) && (!XSTREQ(dev->source, "/dev/null"))) {
-                tmp = xmlNewChild(disk, NULL, BAD_CAST "source", NULL);
-                if (tmp == NULL)
-                       return XML_ERROR;
-                xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST dev->source);
-        }
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "source",
+                                                 NULL,
+                                                 TYPE_NODE,
+                                                 0,
+                                                 "disk");
+
+                if (dev->others == NULL) {
+                        CU_DEBUG("add tag <source> failed.");
+                        return XML_ERROR;
+                }
 
-        tmp = xmlNewChild(disk, NULL, BAD_CAST "target", NULL);
-        if (tmp == NULL)
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "dev",
+                                                 dev->source,
+                                                 TYPE_PROP,
+                                                 0,
+                                                 "source");
+        }
+
+        dev->others = add_node_to_others(dev->others,
+                                         0,
+                                         "target",
+                                         NULL,
+                                         TYPE_NODE,
+                                         0,
+                                         "disk");
+
+        if (dev->others == NULL) {
+                CU_DEBUG("add tag <target> failed.");
                 return XML_ERROR;
-        xmlNewProp(tmp, BAD_CAST "dev", BAD_CAST dev->virtual_dev);
-        if (dev->bus_type)
-                xmlNewProp(tmp, BAD_CAST "bus", BAD_CAST dev->bus_type);
+        }
 
-        if (dev->readonly)
-                xmlNewChild(disk, NULL, BAD_CAST "readonly", NULL);
+        dev->others = add_node_to_others(dev->others,
+                                         0,
+                                         "dev",
+                                         dev->virtual_dev,
+                                         TYPE_PROP,
+                                         0,
+                                         "target");
 
-        if (dev->shareable)
-                xmlNewChild(disk, NULL, BAD_CAST "shareable", NULL);
+        if (dev->bus_type) {
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "bus",
+                                                 dev->bus_type,
+                                                 TYPE_PROP,
+                                                 0,
+                                                 "target");
+        }
 
-        return NULL;
+        if (dev->readonly) {
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "readonly",
+                                                 NULL,
+                                                 TYPE_NODE,
+                                                 0,
+                                                 "disk");
+        }
+
+        if (dev->shareable) {
+                dev->others = add_node_to_others(dev->others,
+                                                 0,
+                                                 "shareable",
+                                                 NULL,
+                                                 TYPE_NODE,
+                                                 0,
+                                                 "disk");
+        }
+
+        dev->others = others_to_xml(root, dev->others, 0, "devices");
+
+        if (check_others_active(dev->others)) {
+                return XML_ERROR;
+        } else {
+                return NULL;
+        }
 }
 
 static const char *disk_file_xml(xmlNodePtr root, struct disk_device *dev)
-- 
1.7.1




More information about the Libvirt-cim mailing list