
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@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))) 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@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Thanks, Luyao