[libvirt] [PATCH v2 07/12] qemu: add a functions for attach a rng object in json monitor

lhuang lhuang at redhat.com
Tue Jan 13 04:05:00 UTC 2015


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 at 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 at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list

Thanks,
Luyao
>




More information about the libvir-list mailing list