[libvirt] [PATCH 5/7] Use sendmsg() on QEMU monitor socket

Daniel P. Berrange berrange at redhat.com
Mon Jul 27 21:11:09 UTC 2009


On Wed, Jul 22, 2009 at 10:57:34PM +0100, Mark McLoughlin wrote:
> Switch from using write() to using sendmsg() on QEMU's monitor socket
> so that we can add support for SCM_RIGHTS.
> 
> * src/qemu_driver.c: add sendmsg() based qemudMonitorSendUnix() and use
>   it when the monitor fd is a unix socket
> ---
>  src/qemu_driver.c |   37 +++++++++++++++++++++++++++++++++++--
>  1 files changed, 35 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index 7d4de9e..e6e6786 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -2013,6 +2013,30 @@ qemuMonitorDiscardPendingData(virDomainObjPtr vm) {
>  }
>  
>  static int
> +qemudMonitorSendUnix(const virDomainObjPtr vm,
> +                     const char *cmd,
> +                     size_t cmdlen)
> +{
> +    struct msghdr msg;
> +    struct iovec iov[1];
> +    ssize_t ret;
> +
> +    memset(&msg, 0, sizeof(msg));
> +
> +    iov[0].iov_base = (void *)cmd;
> +    iov[0].iov_len = cmdlen;
> +
> +    msg.msg_iov = iov;
> +    msg.msg_iovlen = 1;
> +
> +    do {
> +        ret = sendmsg(vm->monitor, &msg, 0);
> +    } while (ret < 0 && errno == EINTR);
> +
> +    return ret == cmdlen ? 0 : -1;
> +}
> +
> +static int
>  qemudMonitorSend(const virDomainObjPtr vm,
>                   const char *cmd)
>  {
> @@ -2025,8 +2049,17 @@ qemudMonitorSend(const virDomainObjPtr vm,
>  
>      len = strlen(full);
>  
> -    if (safewrite(vm->monitor, full, len) != len)
> -        goto out;
> +    switch (vm->monitor_chr->type) {
> +    case VIR_DOMAIN_CHR_TYPE_UNIX:
> +        if (qemudMonitorSendUnix(vm, full, len) < 0)
> +            goto out;
> +        break;
> +    default:
> +    case VIR_DOMAIN_CHR_TYPE_PTY:
> +        if (safewrite(vm->monitor, full, len) != len)
> +            goto out;
> +        break;
> +    }

Oooooh, of course this is why you added the allocation instead of 
doing two safewrite() calls. In which case, ACK to this & previous
patch

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list