def read_full(engine: Engine): try: fd = engine.read_int() len_ = engine.read_int() buf = os_.read(fd, len_) engine.write_int(0) engine.write_memory(buf) except OSError as e: engine.write_int(map_errno(int(str(e)), errno, Flags))
def read_buffered(engine: Engine): try: fd = engine.read_int() len_ = engine.read_int() cur = os_.lseek(fd, 0, os_.SEEK_CUR) end = os_.lseek(fd, 0, os_.SEEK_END) available = end - cur read_len = min(available, len_) buf = os_.read(fd, read_len) engine.write_int(0) engine.write_memory(buf) except OSError as e: engine.write_int(map_errno(int(str(e)), errno, Flags))
def invoke(self, engine: Engine, macro_expansion: MacroExpansion): engine.write_int(len(self.argv)) data = b'\0'.join(arg.encode() for arg in self.argv) + b'\0' res = engine.write_memory(data) if res != len(data): print( "***metal.serial***: Couldn't write all of argv, buffer size was {}" .format(res), file=sys.stderr)
engine = Engine(input=p.stdout, output=p.stdin, serial_info=serial_info) assert engine.init_marker.file.endswith('write.c') assert engine.init_marker.line == 25 engine.write_byte(b'0') assert engine.read_byte() == b'9' engine.write_int(22) assert engine.read_int() == 44 assert engine.write_string("str") == 3 assert engine.read_string() == "tr" engine.write_int(11) assert engine.read_int() == 33 assert engine.write_string("overflow") == 6 assert engine.read_string() == "erfl" engine.write_int(4) assert engine.read_int() == 16 assert engine.write_memory(b'\x00\x01\x02\x03\x04') == 4 assert engine.read_memory() == b'\x03\x02\x01\x00' assert engine.write_memory(b'1234567890') == 4 assert engine.read_memory() == b'1234' assert engine.run() == 123