On 01/10/2015 11:29 AM, Luyao Huang wrote:
We need a new function to build a RNG device object.

Signed-off-by: Luyao Huang <lhu...@redhat.com>
---
  src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
  src/qemu/qemu_monitor_json.h |  5 +++++
  2 files changed, 51 insertions(+)

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index e567aa7..598b15d 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -6166,6 +6166,52 @@ qemuMonitorJSONDetachCharDev(qemuMonitorPtr mon,
      return ret;
  }
+int
+qemuMonitorJSONAttachRNGDev(qemuMonitorPtr mon,
+                            const char *chrID,
+                            const char *objID,
+                            virDomainRNGDefPtr rng)
+{
+    const char *type = NULL;
+    virJSONValuePtr props = NULL;
+
+    switch ((virDomainRNGBackend) rng->backend) {
+    case VIR_DOMAIN_RNG_BACKEND_RANDOM:
+        type = "rng-random";
+        if (!(props = virJSONValueObjectCreate("s:filename", rng->source.file, 
NULL)))
+            goto cleanup;
+        break;
+
+    case VIR_DOMAIN_RNG_BACKEND_EGD:
+        if (!chrID) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("miss chardev id"));
+            goto cleanup;
+        }
+        /*chrID + 4 and objID + 3 pointing to the basic alias name of chrID.*/
+        if (!objID || STRNEQ(chrID + 4, objID + 3)) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("chardev id '%s' basic alias name is different from 
'%s'",
+                           chrID, objID));
+            goto cleanup;
+        }

I made a big mistake here, I found a better way :

+    case VIR_DOMAIN_RNG_BACKEND_EGD:
+        if (STRNEQ_NULLABLE(strstr(chrID, "rng"), strstr(objID, "rng"))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("chardev id '%s' basic alias name is different from '%s'",
+                           chrID, objID));
+            goto cleanup;
+        }
+        type = "rng-egd";
+        if (!(props = virJSONValueObjectCreate("s:chardev", chrID, NULL)))
+            goto cleanup;
+        break;
+

i remove the check of chrID, because this should be done in the function which call qemuMonitorJSONAttachRNGDev.
+        type = "rng-egd";
+        if (!(props = virJSONValueObjectCreate("s:chardev", chrID, NULL)))
+            goto cleanup;
+        break;
+
+    case VIR_DOMAIN_RNG_BACKEND_LAST:
+        /*shouldn't happen*/
+        goto cleanup;
+    }
+
+    return qemuMonitorJSONAddObject(mon, type, objID, props);
+
+ cleanup:
+    virJSONValueFree(props);
+    return -1;
+}
+
int
  qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 222f11e..66c519d 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -459,6 +459,11 @@ int qemuMonitorJSONAttachCharDev(qemuMonitorPtr mon,
                                   virDomainChrSourceDefPtr chr);
  int qemuMonitorJSONDetachCharDev(qemuMonitorPtr mon,
                                   const char *chrID);
+int qemuMonitorJSONAttachRNGDev(qemuMonitorPtr mon,
+                                const char *chrID,
+                                const char *objID,
+                                virDomainRNGDefPtr rng);
+
int qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
                                      char ***aliases);

Luyao

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to