diff options
author | John Snow <jsnow@redhat.com> | 2020-10-06 19:58:13 -0400 |
---|---|---|
committer | John Snow <jsnow@redhat.com> | 2020-10-20 09:37:57 -0400 |
commit | af0db8825400ea8c79fd77ed4ba6fb6699bd0855 (patch) | |
tree | 857b181b35bdbab790f8c94d3563838e4c5f9c31 /python | |
parent | e35c13826768cf4224b4f9c6884b08f3a7ed887e (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>
Diffstat (limited to 'python')
-rw-r--r-- | python/qemu/console_socket.py | 20 |
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, |