diff options
author | John Snow <jsnow@redhat.com> | 2021-09-22 20:49:30 -0400 |
---|---|---|
committer | John Snow <jsnow@redhat.com> | 2021-10-12 12:22:11 -0400 |
commit | 514d00df5f44f220d0b97cc71323275067d3e60e (patch) | |
tree | 92c31e0578fa5cf69793fb9b5db2870f9233786a /python/qemu/machine/machine.py | |
parent | d911accf0a88070120f7cc71c065fb797484d9b7 (diff) | |
download | qemu-514d00df5f44f220d0b97cc71323275067d3e60e.zip qemu-514d00df5f44f220d0b97cc71323275067d3e60e.tar.gz qemu-514d00df5f44f220d0b97cc71323275067d3e60e.tar.bz2 |
python/qmp: add send_fd_scm directly to QEMUMonitorProtocol
It turns out you can do this directly from Python ... and because of
this, you don't need to worry about setting the inheritability of the
fds or spawning another process.
Doing this is helpful because it allows QEMUMonitorProtocol to keep its
file descriptor and socket object as private implementation
details. /that/ is helpful in turn because it allows me to write a
compatible, alternative implementation.
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 20210923004938.3999963-10-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
Diffstat (limited to 'python/qemu/machine/machine.py')
-rw-r--r-- | python/qemu/machine/machine.py | 44 |
1 files changed, 9 insertions, 35 deletions
diff --git a/python/qemu/machine/machine.py b/python/qemu/machine/machine.py index ae945ca..1c6532a 100644 --- a/python/qemu/machine/machine.py +++ b/python/qemu/machine/machine.py @@ -213,48 +213,22 @@ class QEMUMachine: def send_fd_scm(self, fd: Optional[int] = None, file_path: Optional[str] = None) -> int: """ - Send an fd or file_path to socket_scm_helper. + Send an fd or file_path to the remote via SCM_RIGHTS. - Exactly one of fd and file_path must be given. - If it is file_path, the helper will open that file and pass its own fd. + Exactly one of fd and file_path must be given. If it is + file_path, the file will be opened read-only and the new file + descriptor will be sent to the remote. """ - # In iotest.py, the qmp should always use unix socket. - assert self._qmp.is_scm_available() - if self._socket_scm_helper is None: - raise QEMUMachineError("No path to socket_scm_helper set") - if not os.path.exists(self._socket_scm_helper): - raise QEMUMachineError("%s does not exist" % - self._socket_scm_helper) - - # This did not exist before 3.4, but since then it is - # mandatory for our purpose - if hasattr(os, 'set_inheritable'): - os.set_inheritable(self._qmp.get_sock_fd(), True) - if fd is not None: - os.set_inheritable(fd, True) - - fd_param = ["%s" % self._socket_scm_helper, - "%d" % self._qmp.get_sock_fd()] - if file_path is not None: assert fd is None - fd_param.append(file_path) + with open(file_path, "rb") as passfile: + fd = passfile.fileno() + self._qmp.send_fd_scm(fd) else: assert fd is not None - fd_param.append(str(fd)) - - proc = subprocess.run( - fd_param, - stdin=subprocess.DEVNULL, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - check=False, - close_fds=False, - ) - if proc.stdout: - LOG.debug(proc.stdout) + self._qmp.send_fd_scm(fd) - return proc.returncode + return 0 @staticmethod def _remove_if_exists(path: str) -> None: |