Re: [PATCH v2 3/6] python/console_socket: accept existing FD in initializer

2023-07-26 Thread Ani Sinha



> On 25-Jul-2023, at 11:33 PM, John Snow  wrote:
> 
> Useful if we want to use ConsoleSocket() for a socket created by
> socketpair().
> 
> Signed-off-by: John Snow 

Reviewed-by: Ani Sinha 

> ---
> python/qemu/machine/console_socket.py | 29 +++
> 1 file changed, 21 insertions(+), 8 deletions(-)
> 
> diff --git a/python/qemu/machine/console_socket.py 
> b/python/qemu/machine/console_socket.py
> index 4e28ba9bb2..0a4e09ffc7 100644
> --- a/python/qemu/machine/console_socket.py
> +++ b/python/qemu/machine/console_socket.py
> @@ -24,19 +24,32 @@ class ConsoleSocket(socket.socket):
> """
> ConsoleSocket represents a socket attached to a char device.
> 
> -Optionally (if drain==True), drains the socket and places the bytes
> -into an in memory buffer for later processing.
> -
> -Optionally a file path can be passed in and we will also
> -dump the characters to this file for debugging purposes.
> +:param address: An AF_UNIX path or address.
> +:param sock_fd: Optionally, an existing socket file descriptor.
> +One of address or sock_fd must be specified.
> +:param file: Optionally, a filename to log to.
> +:param drain: Optionally, drains the socket and places the bytes
> +  into an in memory buffer for later processing.
> """
> -def __init__(self, address: str, file: Optional[str] = None,
> +def __init__(self,
> + address: Optional[str] = None,
> + sock_fd: Optional[int] = None,
> + file: Optional[str] = None,
>  drain: bool = False):
> +if address is None and sock_fd is None:
> +raise ValueError("one of 'address' or 'sock_fd' must be 
> specified")
> +if address is not None and sock_fd is not None:
> +raise ValueError("can't specify both 'address' and 'sock_fd'")
> +
> self._recv_timeout_sec = 300.0
> self._sleep_time = 0.5
> self._buffer: Deque[int] = deque()
> -socket.socket.__init__(self, socket.AF_UNIX, socket.SOCK_STREAM)
> -self.connect(address)
> +if address is not None:
> +socket.socket.__init__(self, socket.AF_UNIX, socket.SOCK_STREAM)
> +self.connect(address)
> +else:
> +assert sock_fd is not None
> +socket.socket.__init__(self, fileno=sock_fd)
> self._logfile = None
> if file:
> # pylint: disable=consider-using-with
> -- 
> 2.41.0
> 




Re: [PATCH v2 3/6] python/console_socket: accept existing FD in initializer

2023-07-25 Thread Daniel P . Berrangé
On Tue, Jul 25, 2023 at 02:03:34PM -0400, John Snow wrote:
> Useful if we want to use ConsoleSocket() for a socket created by
> socketpair().
> 
> Signed-off-by: John Snow 
> ---
>  python/qemu/machine/console_socket.py | 29 +++
>  1 file changed, 21 insertions(+), 8 deletions(-)

Reviewed-by: Daniel P. Berrangé 

With regards,
Daniel
-- 
|: https://berrange.com  -o-https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o-https://fstop138.berrange.com :|
|: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|




[PATCH v2 3/6] python/console_socket: accept existing FD in initializer

2023-07-25 Thread John Snow
Useful if we want to use ConsoleSocket() for a socket created by
socketpair().

Signed-off-by: John Snow 
---
 python/qemu/machine/console_socket.py | 29 +++
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/python/qemu/machine/console_socket.py 
b/python/qemu/machine/console_socket.py
index 4e28ba9bb2..0a4e09ffc7 100644
--- a/python/qemu/machine/console_socket.py
+++ b/python/qemu/machine/console_socket.py
@@ -24,19 +24,32 @@ class ConsoleSocket(socket.socket):
 """
 ConsoleSocket represents a socket attached to a char device.
 
-Optionally (if drain==True), drains the socket and places the bytes
-into an in memory buffer for later processing.
-
-Optionally a file path can be passed in and we will also
-dump the characters to this file for debugging purposes.
+:param address: An AF_UNIX path or address.
+:param sock_fd: Optionally, an existing socket file descriptor.
+One of address or sock_fd must be specified.
+:param file: Optionally, a filename to log to.
+:param drain: Optionally, drains the socket and places the bytes
+  into an in memory buffer for later processing.
 """
-def __init__(self, address: str, file: Optional[str] = None,
+def __init__(self,
+ address: Optional[str] = None,
+ sock_fd: Optional[int] = None,
+ file: Optional[str] = None,
  drain: bool = False):
+if address is None and sock_fd is None:
+raise ValueError("one of 'address' or 'sock_fd' must be specified")
+if address is not None and sock_fd is not None:
+raise ValueError("can't specify both 'address' and 'sock_fd'")
+
 self._recv_timeout_sec = 300.0
 self._sleep_time = 0.5
 self._buffer: Deque[int] = deque()
-socket.socket.__init__(self, socket.AF_UNIX, socket.SOCK_STREAM)
-self.connect(address)
+if address is not None:
+socket.socket.__init__(self, socket.AF_UNIX, socket.SOCK_STREAM)
+self.connect(address)
+else:
+assert sock_fd is not None
+socket.socket.__init__(self, fileno=sock_fd)
 self._logfile = None
 if file:
 # pylint: disable=consider-using-with
-- 
2.41.0