| 12 | message::{self, rcall, MessageData}}; |
| 13 | |
| 14 | fn gopher(host: &str, selector: &str) -> Result<(MemoryHandle, usize), ()> { |
| 15 | let handle = syscalls::open(host, message::O_READ + message::O_WRITE).expect("Couldn't open"); |
| 16 | |
| 17 | let mut path: Vec<u8> = selector |
| 18 | .as_bytes() // Convert to u8 |
| 19 | .to_vec(); |
| 20 | path.extend_from_slice(&[0x0D, 0x0A]); // Append CR LF |
| 21 | |
| 22 | let result = rcall(&handle, |
| 23 | message::WRITE, (path.len() as u64).into(), |
| 24 | syscalls::MemoryHandle::from_u8_slice(path.as_slice()).into(), |
| 25 | None); |
| 26 | |
| 27 | println!("[gopher] Write returned: {:?}", result); |
| 28 | |
| 29 | match rcall(&handle, |
| 30 | message::READ, 0.into(), |
| 31 | 0.into(), |
| 32 | None) { |
| 33 | Ok((message::DATA, |
| 34 | MessageData::Value(length), |
| 35 | MessageData::MemoryHandle(mem_handle))) => { |
| 36 | syscalls::send(&handle, |
| 37 | syscalls::Message::Short( |
| 38 | message::CLOSE, 0, 0)); |
| 39 | return Ok((mem_handle, length as usize)); |
| 40 | } |
| 41 | result => { |
| 42 | println!("[gopher] Read returned: {:?}", result); |
| 43 | _ = syscalls::send(&handle, |
| 44 | syscalls::Message::Short( |
| 45 | message::CLOSE, 0, 0)); |
| 46 | return Err(()); |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | enum Command<'a> { |
| 52 | Quit, |