[Libvirt-cim] [PATCH 14/20] Add parse_unknown_device()

John Ferlan jferlan at redhat.com
Fri Nov 15 00:24:03 UTC 2013


From: Xu Wang <cngesaint at gmail.com>

Signed-off-by: Xu Wang <gesaint at linux.vnet.ibm.com>
---
 libxkutil/device_parsing.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++
 libxkutil/device_parsing.h |  7 +++++
 src/svpc_types.h           |  1 +
 3 files changed, 83 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index 5a012bc..a6a6cfe 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -101,6 +101,15 @@ static void cleanup_others(struct others *others)
         }
 }
 
+static void cleanup_unknown_device(struct unknown_device *dev)
+{
+    if (dev == NULL)
+            return;
+
+    free(dev->name);
+    cleanup_others(dev->others);
+}
+
 static void cleanup_disk_device(struct disk_device *dev)
 {
         if (dev == NULL)
@@ -371,6 +380,8 @@ void cleanup_virt_device(struct virt_device *dev)
                 cleanup_input_device(&dev->dev.input);
         else if (dev->type == CIM_RES_TYPE_CONSOLE)
                 cleanup_console_device(&dev->dev.console);
+        else if (dev->type == CIM_RES_TYPE_UNKDEV)
+                cleanup_unknown_device(&dev->dev.unknown);
 
         free(dev->id);
 
@@ -2152,6 +2163,70 @@ static int parse_input_device(xmlNode *node, struct virt_device **vdevs)
         return 0;
 }
 
+static int parse_unknown_device(xmlNode *node, struct virt_device **vdevs)
+{
+        struct virt_device *vdev = NULL;
+        struct unknown_device *udev = NULL;
+        xmlNode *child = NULL;
+
+        CU_DEBUG("Enter parse_unknown_device().");
+
+        vdev = calloc(1, sizeof(*vdev));
+        if (vdev == NULL) {
+                CU_DEBUG("calloc failed.");
+                goto err;
+        }
+
+        udev = &(vdev->dev.unknown);
+
+        for (child = node->children; child != NULL; child = child->next) {
+                /* Skip all items parsed in other parse_*() functions.
+                 * Everything here is just to be compatible with old versions.
+                 * Here may need some improvement in the future.
+                 */
+                if (XSTREQ(child->name, "disk") ||
+                    XSTREQ(child->name, "filesystem") ||
+                    XSTREQ(child->name, "interface") ||
+                    XSTREQ(child->name, "emulator") ||
+                    XSTREQ(child->name, "graphics") ||
+                    XSTREQ(child->name, "console") ||
+                    XSTREQ(child->name, "serial") ||
+                    XSTREQ(child->name, "input")) {
+                        /* Just skip them and do nothing */
+                } else {
+                        udev->others = parse_data_to_others(udev->others,
+                                                            child,
+                                                            0,
+                                                            BAD_CAST "devices");
+                }
+        }
+
+        if (udev->others == NULL) {
+                CU_DEBUG("no others.");
+                /* Should this really be an error? or success that
+                 * we didn't find something unknown?!!
+                 */
+                goto err;
+        }
+
+        vdev->type = CIM_RES_TYPE_UNKDEV;
+
+        udev->name = strdup("unknown");
+        if (udev->name == NULL) {
+                CU_DEBUG("Failed to strdup unknown name");
+                goto err;
+        }
+
+        *vdevs = vdev;
+
+        return 1;
+err:
+        cleanup_unknown_device(udev);
+        free(vdev);
+
+        return 0;
+}
+
 static bool resize_devlist(struct virt_device **list, int newsize)
 {
         struct virt_device *_list;
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 275d91f..a4e60ee 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -60,6 +60,12 @@ struct others {
         } status;
 };
 
+/* The structure for saving unknown device */
+struct unknown_device {
+        char *name;
+        struct others *others;
+};
+
 struct vsi_device {
         char *vsi_type;
         char *manager_id;
@@ -201,6 +207,7 @@ struct virt_device {
                 struct graphics_device graphics;
                 struct console_device console;
                 struct input_device input;
+                struct unknown_device unknown;
         } dev;
         char *id;
 };
diff --git a/src/svpc_types.h b/src/svpc_types.h
index 404e428..4928742 100644
--- a/src/svpc_types.h
+++ b/src/svpc_types.h
@@ -33,6 +33,7 @@
 #define CIM_RES_TYPE_GRAPHICS   24
 #define CIM_RES_TYPE_INPUT      13 
 #define CIM_RES_TYPE_UNKNOWN    1000
+#define CIM_RES_TYPE_UNKDEV     1001
 #define CIM_RES_TYPE_IMAGE      32768 
 #define CIM_RES_TYPE_CONSOLE    32769
 #define CIM_RES_TYPE_EMU        32770
-- 
1.8.3.1




More information about the Libvirt-cim mailing list