[libvirt] [PATCH 10/10 V2] qemu:send-key: Implement the driver methods

Eric Blake eblake at redhat.com
Tue Jun 14 19:45:59 UTC 2011


On 06/13/2011 05:06 PM, Daniel P. Berrange wrote:
> On Tue, Jun 07, 2011 at 05:11:17PM +0800, Lai Jiangshan wrote:
>> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
>> ---
>>  src/qemu/qemu_driver.c       |   50 ++++++++++++++++++++++++++++++++++++++++++
>>  src/qemu/qemu_monitor.c      |   27 ++++++++++++++++++++++
>>  src/qemu/qemu_monitor.h      |    6 +++++
>>  src/qemu/qemu_monitor_json.c |   15 ++++++++++++
>>  src/qemu/qemu_monitor_json.h |    5 ++++
>>  src/qemu/qemu_monitor_text.c |   47 +++++++++++++++++++++++++++++++++++++++
>>  src/qemu/qemu_monitor_text.h |    5 ++++
>>  7 files changed, 155 insertions(+), 0 deletions(-)

In addition to Daniel's comments:

>> +
>> +    if (!virDomainObjIsActive(vm)) {
>> +        qemuReportError(VIR_ERR_OPERATION_INVALID,
>> +                        "%s", _("domain is not running"));
>> +        goto cleanup;
>> +    }

This check should be moved down...

>> +
>> +    priv = vm->privateData;
>> +
>> +    if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
>> +        goto cleanup;

...to here, since qemuDomainObjBeginJobWithDriver temporarily drops
locks, and therefore vm could die before you get the lock.

>> +    qemuDomainObjEnterMonitorWithDriver(driver, vm);
>> +    ret = qemuMonitorSendKey(priv->mon, codeset, holdtime, nkeycodes, keycodes);

Yuck.  Let's fix the qemuMonitorSendKey parameter order to match the API
order of keycodes before nkeycodes.

>>  
>> +int qemuMonitorSendKey(qemuMonitorPtr mon,
>> +                       unsigned int codeset,
>> +                       unsigned int holdtime,
>> +                       unsigned int nkeycodes,
>> +                       unsigned int *keycodes)

Fix this API...

>> +{
>> +    int ret;
>> +
>> +    VIR_DEBUG("mon=%p, codeset=%u, holdtime=%u, nkeycodes=%u",
>> +              mon, codeset, holdtime, nkeycodes);
>> +
>> +    if (codeset != LIBVIRT_KEYCODE_XT) {
>> +        qemuReportError(VIR_ERR_NO_SUPPORT,
>> +                        "qemu monitor can not support the codeset: %d",
>> +                        codeset);
>> +        return -1;
>> +    }

Hmm, so your proposed virsh command defaults to --codeset linux, but
right now you only support --codeset xt.  That's kind of mean to the
users.  It would be nice to get the codeset translations going at the
virsh level.

>> +
>> +    if (mon->json)
>> +        ret = qemuMonitorJSONSendKey(mon, holdtime, nkeycodes, keycodes);
>> +    else
>> +        ret = qemuMonitorTextSendKey(mon, holdtime, nkeycodes, keycodes);

...and these callbacks, to do array before length.

>> +++ b/src/qemu/qemu_monitor_text.c
>> @@ -2718,6 +2718,53 @@ fail:
>>      return -1;
>>  }
>>  
>> +int qemuMonitorTextSendKey(qemuMonitorPtr mon,
>> +                           unsigned int holdtime,
>> +                           unsigned int nkeycodes,
>> +                           unsigned int *keycodes)
>> +{
>> +    int i;
>> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
>> +    char *cmd, *reply = NULL;
>> +
>> +    if (nkeycodes > 16 || nkeycodes == 0)

Magic number.  Use VIR_DOMAIN_SEND_KEY_MAX_KEYS from libvirt.h.  Or
don't even bother to check - we already guaranteed that libvirt.c
filtered out invalid calls, so by the time you get here, nkeycodes has
already been validated to be in range.

>> +        return -1;
>> +
>> +    virBufferAddLit(&buf, "sendkey ");
>> +    for (i = 0; i < nkeycodes; i++) {
>> +        if (keycodes[i] > 255) {
>> +            qemuReportError(VIR_ERR_OPERATION_FAILED,
>> +                            _("the %dth keycode is invalid: 0x%02X"),
>> +                            i, keycodes[i]);

Printing %02X with a value that is > 255 will use more than 2 digits, at
which point, you could have just used %X instead of %02X.

Also, "1th" doesn't read well in English, let alone translate well to
other languages.  The error message should probably be:

_("keycode %d is invalid: 0x%X")

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110614/612465d6/attachment-0001.sig>


More information about the libvir-list mailing list