[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/10] python/aqmp: add send_fd_scm
From: |
John Snow |
Subject: |
[PULL 04/10] python/aqmp: add send_fd_scm |
Date: |
Tue, 12 Oct 2021 17:41:46 -0400 |
Add an implementation for send_fd_scm to the async QMP implementation.
Like socket_scm_helper mentions, a non-empty payload is required for
QEMU to process the ancillary data. A space is most useful because it
does not disturb the parsing of subsequent JSON objects.
A note on "voiding the warranty":
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
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20210923004938.3999963-5-jsnow@redhat.com
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))]
+ )
--
2.31.1
- [PULL 00/10] Python patches, John Snow, 2021/10/12
- [PULL 01/10] python/aqmp: add greeting property to QMPClient, John Snow, 2021/10/12
- [PULL 02/10] python/aqmp: add .empty() method to EventListener, John Snow, 2021/10/12
- [PULL 03/10] python/aqmp: Return cleared events from EventListener.clear(), John Snow, 2021/10/12
- [PULL 04/10] python/aqmp: add send_fd_scm,
John Snow <=
- [PULL 05/10] python/aqmp: Add dict conversion method to Greeting object, John Snow, 2021/10/12
- [PULL 06/10] python/aqmp: Reduce severity of EOFError-caused loop terminations, John Snow, 2021/10/12
- [PULL 07/10] python/aqmp: Disable logging messages by default, John Snow, 2021/10/12
- [PULL 08/10] python/qmp: clear events on get_events() call, John Snow, 2021/10/12
- [PULL 09/10] python/qmp: add send_fd_scm directly to QEMUMonitorProtocol, John Snow, 2021/10/12
- [PULL 10/10] python, iotests: remove socket_scm_helper, John Snow, 2021/10/12
- Re: [PULL 00/10] Python patches, Richard Henderson, 2021/10/12