On 01/13/2015 10:35 AM, Zhu Guihua wrote:
Hi Luyao,
Hi Guihua,
On Mon, 2015-01-12 at 09:38 +0800, lhuang wrote:
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 <lhuang@xxxxxxxxxx>
---
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)))
Are you sure the above line could pass the compilation?
The first parameter of virJSONValueObjectCreate() should be
'struct virJSONValue **'.
Regards,
Zhu
Oh, my god! thanks your pointing out :)
Maybe this will work? I cannot test it now ,i will double check these
code this night
+ const char *type = NULL;
+ virJSONValuePtr props;
+
+ if (!(props = virJSONValueNewObject()))
+ goto cleanup;
+
+ switch ((virDomainRNGBackend) rng->backend) {
+ case VIR_DOMAIN_RNG_BACKEND_RANDOM:
+ type = "rng-random";
+ if ((virJSONValueObjectCreate(&props, "s:filename",
rng->source.file, NULL)) < 0)
+ goto cleanup;
+ break;
+
+ 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 ((virJSONValueObjectCreate(&props, "s:chardev", chrID,
NULL)) < 0)
+ goto cleanup;
+ break;
+ 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@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list
Thanks,
Luyao
--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list