#!/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('/screen')) def walk(self, path): names = [part for part in os.fspath(path).split('/') if part] self.fid += 1 fid = self.fid oldfid = 1 try: for start in range(0, max(1, len(names)), 16): part = names[start:start + 16] reply = self.rpc(110, 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