diff options
Diffstat (limited to 'src/wire.rs')
| -rw-r--r-- | src/wire.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/wire.rs b/src/wire.rs new file mode 100644 index 0000000..dda7690 --- /dev/null +++ b/src/wire.rs | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | use std::{ | ||
| 2 | io::{BufRead, Read, Result, Write}, | ||
| 3 | net::Ipv4Addr, | ||
| 4 | }; | ||
| 5 | |||
| 6 | pub fn write<W: Write>(mut writer: W, v: &[u8]) -> Result<()> { | ||
| 7 | writer.write_all(v) | ||
| 8 | } | ||
| 9 | |||
| 10 | pub fn write_u8<W: Write>(mut writer: W, v: u8) -> Result<()> { | ||
| 11 | writer.write_all(&[v]) | ||
| 12 | } | ||
| 13 | |||
| 14 | pub fn write_u16<W: Write>(mut writer: W, v: u16) -> Result<()> { | ||
| 15 | writer.write_all(&u16::to_be_bytes(v)) | ||
| 16 | } | ||
| 17 | |||
| 18 | pub fn write_u32<W: Write>(mut writer: W, v: u32) -> Result<()> { | ||
| 19 | writer.write_all(&u32::to_be_bytes(v)) | ||
| 20 | } | ||
| 21 | |||
| 22 | pub fn write_ipv4<W: Write>(mut writer: W, v: Ipv4Addr) -> Result<()> { | ||
| 23 | writer.write_all(&v.octets()) | ||
| 24 | } | ||
| 25 | |||
| 26 | pub fn write_null_terminated_string<W: Write>(mut writer: W, v: &str) -> Result<()> { | ||
| 27 | writer.write_all(v.as_bytes())?; | ||
| 28 | writer.write_all(&[0u8]) | ||
| 29 | } | ||
| 30 | |||
| 31 | pub fn read_u8<R: Read>(mut reader: R) -> Result<u8> { | ||
| 32 | let mut buf = [0u8; 1]; | ||
| 33 | reader.read_exact(&mut buf)?; | ||
| 34 | Ok(buf[0]) | ||
| 35 | } | ||
| 36 | |||
| 37 | pub fn read_u16<R: Read>(mut reader: R) -> Result<u16> { | ||
| 38 | let mut buf = [0u8; 2]; | ||
| 39 | reader.read_exact(&mut buf)?; | ||
| 40 | Ok(u16::from_be_bytes(buf)) | ||
| 41 | } | ||
| 42 | |||
| 43 | pub fn read_u32<R: Read>(mut reader: R) -> Result<u32> { | ||
| 44 | let mut buf = [0u8; 4]; | ||
| 45 | reader.read_exact(&mut buf)?; | ||
| 46 | Ok(u32::from_be_bytes(buf)) | ||
| 47 | } | ||
| 48 | |||
| 49 | pub fn read_arr<const N: usize, R: Read>(mut reader: R) -> Result<[u8; N]> { | ||
| 50 | let mut buf = [0u8; N]; | ||
| 51 | reader.read_exact(&mut buf)?; | ||
| 52 | Ok(buf) | ||
| 53 | } | ||
| 54 | |||
| 55 | pub fn read_null_terminated_vec<R: BufRead>(mut reader: R) -> Result<Vec<u8>> { | ||
| 56 | let mut buf = Vec::default(); | ||
| 57 | reader.read_until(0, &mut buf)?; | ||
| 58 | buf.pop(); | ||
| 59 | Ok(buf) | ||
| 60 | } | ||
| 61 | |||
| 62 | pub fn read_null_terminated_string<R: BufRead>(reader: R) -> Result<String> { | ||
| 63 | let buf = read_null_terminated_vec(reader)?; | ||
| 64 | Ok(String::from_utf8(buf).unwrap()) | ||
| 65 | } | ||
| 66 | |||
| 67 | pub fn read_len8_prefixed_vec<R: BufRead>(mut reader: R) -> Result<Vec<u8>> { | ||
| 68 | let len = read_u8(&mut reader)?; | ||
| 69 | let mut buf = vec![0u8; len as usize]; | ||
| 70 | reader.read_exact(&mut buf)?; | ||
| 71 | Ok(buf) | ||
| 72 | } | ||
| 73 | |||
| 74 | pub fn read_len8_prefixed_string<R: BufRead>(reader: R) -> Result<String> { | ||
| 75 | let buf = read_len8_prefixed_vec(reader)?; | ||
| 76 | Ok(String::from_utf8(buf).unwrap()) | ||
| 77 | } | ||
| 78 | |||
| 79 | pub fn read_ipv4<R: BufRead>(reader: R) -> Result<Ipv4Addr> { | ||
| 80 | Ok(Ipv4Addr::from_octets(read_arr(reader)?)) | ||
| 81 | } | ||
