qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 04/17] python/aqmp: add send_fd_scm


From: Eric Blake
Subject: Re: [PATCH v2 04/17] python/aqmp: add send_fd_scm
Date: Thu, 7 Oct 2021 09:52:14 -0500
User-agent: NeoMutt/20210205-818-e2615c

On Wed, Sep 22, 2021 at 08:49:25PM -0400, John Snow wrote:
> The single space is indeed required to successfully transmit the file
> descriptor to QEMU.

Sending fds requires a payload of at least one byte, but I don't think
that qemu cares which byte.  Thus, while your choice of space is fine,
the commit message may be a bit misleading at implying it must be
space.

> 
> Python 3.11 removes support for calling sendmsg directly from a
> transport's socket. There is no other interface for doing this, our use
> case is, I suspect, "quite unique".
> 
> As far as I can tell, this is safe to do -- send_fd_scm is a synchronous
> function and we can be guaranteed that the async coroutines will *not* be
> running when it is invoked. In testing, it works correctly.
> 
> I investigated quite thoroughly the possibility of creating my own
> asyncio Transport (The class that ultimately manages the raw socket
> object) so that I could manage the socket myself, but this is so wildly
> invasive and unportable I scrapped the idea. It would involve a lot of
> copy-pasting of various python utilities and classes just to re-create
> the same infrastructure, and for extremely little benefit. Nah.
> 
> Just boldly void the warranty instead, while I try to follow up on
> https://bugs.python.org/issue43232

Bummer that we have to do that, but at least you are documenting the
problems and pursuing a remedy upstream.

> 
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
>  python/qemu/aqmp/qmp_client.py | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/python/qemu/aqmp/qmp_client.py b/python/qemu/aqmp/qmp_client.py
> index d2ad7459f9f..f987da02eb0 100644
> --- a/python/qemu/aqmp/qmp_client.py
> +++ b/python/qemu/aqmp/qmp_client.py
> @@ -9,6 +9,8 @@
>  
>  import asyncio
>  import logging
> +import socket
> +import struct
>  from typing import (
>      Dict,
>      List,
> @@ -624,3 +626,23 @@ async def execute(self, cmd: str,
>          """
>          msg = self.make_execute_msg(cmd, arguments, oob=oob)
>          return await self.execute_msg(msg)
> +
> +    @upper_half
> +    @require(Runstate.RUNNING)
> +    def send_fd_scm(self, fd: int) -> None:
> +        """
> +        Send a file descriptor to the remote via SCM_RIGHTS.
> +        """
> +        assert self._writer is not None
> +        sock = self._writer.transport.get_extra_info('socket')
> +
> +        if sock.family != socket.AF_UNIX:
> +            raise AQMPError("Sending file descriptors requires a UNIX 
> socket.")
> +
> +        # Void the warranty sticker.
> +        # Access to sendmsg in asyncio is scheduled for removal in Python 
> 3.11.
> +        sock = sock._sock  # pylint: disable=protected-access
> +        sock.sendmsg(
> +            [b' '],
> +            [(socket.SOL_SOCKET, socket.SCM_RIGHTS, struct.pack('@i', fd))]
> +        )

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org




reply via email to

[Prev in Thread] Current Thread [Next in Thread]