use std::{ io::{BufReader, BufWriter, Read, Write}, net::TcpStream, }; use syscall_lib::{ProgramMemory, Syscall}; use crate::syscall_exec; pub struct Host { stream: TcpStream, reader: BufReader, writer: BufWriter, // memory: ProgramMemory, } impl Host { pub fn new() -> Result { let stream = TcpStream::connect("localhost:1234")?; let reader = BufReader::new(stream.try_clone()?); let writer = BufWriter::new(stream.try_clone()?); Ok(Host { stream, reader, writer, // memory: ProgramMemory::new(), }) } pub fn execute(&mut self, syscall: &Syscall) -> isize { let bytes = syscall.encode(); self.writer .write_all(&u32::to_be_bytes(bytes.len() as u32)) .unwrap(); self.writer.write_all(&bytes).unwrap(); self.writer.flush().unwrap(); println!("{:?} -> ", syscall); // let response = syscall_exec::execute_syscall(syscall); let mut response = [0u8; 8]; self.reader.read_exact(&mut response).unwrap(); let response = isize::from_be_bytes(response); println!("{:?}", response); response } }