#!/usr/bin/env python3 import json import os import socket import struct def string(value): data = value.encode() if isinstance(value, str) else value return struct.pack(' self.msize: raise ValueError('request exceeds negotiated message size') self.socket.sendall(packet) size, answer, received_tag = struct.unpack(' count: raise OSError('invalid 9P read length') return reply[4:] def read(self, path): fid = self.open(path) try: data = bytearray() while chunk := self.read_fid(fid, len(data)): data.extend(chunk) return bytes(data) finally: self.close(fid) def screen(self): return json.loads(self.read('/self/screen')) def write(self, path, data, truncate=False): fid = self.open(path, 1 | (16 if truncate else 0)) try: offset = 0 while offset < len(data): chunk = data[offset:offset + self.msize - 23] reply = self.rpc(118, struct.pack(' len(data): raise OSError('invalid 9P directory entry') length = struct.unpack_from(' size + 2: raise OSError('invalid directory name length') names.append(data[offset + 43:offset + 43 + length].decode()) offset += size + 2 return names