aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2020-10-06 19:58:13 -0400
committerJohn Snow <jsnow@redhat.com>2020-10-20 09:37:57 -0400
commitaf0db8825400ea8c79fd77ed4ba6fb6699bd0855 (patch)
tree857b181b35bdbab790f8c94d3563838e4c5f9c31
parente35c13826768cf4224b4f9c6884b08f3a7ed887e (diff)
python/qemu/console_socket.py: avoid encoding to/from string
We can work directly in bytes instead of translating back and forth to string, which removes the question of which encodings to use. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-17-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
-rw-r--r--python/qemu/console_socket.py20
1 files changed, 5 insertions, 15 deletions
diff --git a/python/qemu/console_socket.py b/python/qemu/console_socket.py
index 57e6eee017..f060d79e06 100644
--- a/python/qemu/console_socket.py
+++ b/python/qemu/console_socket.py
@@ -34,12 +34,12 @@ class ConsoleSocket(socket.socket):
drain: bool = False):
self._recv_timeout_sec = 300.0
self._sleep_time = 0.5
- self._buffer: Deque[str] = deque()
+ self._buffer: Deque[int] = deque()
socket.socket.__init__(self, socket.AF_UNIX, socket.SOCK_STREAM)
self.connect(address)
self._logfile = None
if file:
- self._logfile = open(file, "w")
+ self._logfile = open(file, "bw")
self._open = True
self._drain_thread = None
if drain:
@@ -83,15 +83,10 @@ class ConsoleSocket(socket.socket):
def _drain_socket(self) -> None:
"""process arriving characters into in memory _buffer"""
data = socket.socket.recv(self, 1)
- # latin1 is needed since there are some chars
- # we are receiving that cannot be encoded to utf-8
- # such as 0xe2, 0x80, 0xA6.
- string = data.decode("latin1")
if self._logfile:
- self._logfile.write("{}".format(string))
+ self._logfile.write(data)
self._logfile.flush()
- for c in string:
- self._buffer.extend(c)
+ self._buffer.extend(data)
def recv(self, bufsize: int = 1, flags: int = 0) -> bytes:
"""Return chars from in memory buffer.
@@ -107,12 +102,7 @@ class ConsoleSocket(socket.socket):
elapsed_sec = time.time() - start_time
if elapsed_sec > self._recv_timeout_sec:
raise socket.timeout
- chars = ''.join([self._buffer.popleft() for i in range(bufsize)])
- # We choose to use latin1 to remain consistent with
- # handle_read() and give back the same data as the user would
- # receive if they were reading directly from the
- # socket w/o our intervention.
- return chars.encode("latin1")
+ return bytes((self._buffer.popleft() for i in range(bufsize)))
def setblocking(self, value: bool) -> None:
"""When not draining we pass thru to the socket,