aboutsummaryrefslogtreecommitdiff
path: root/src/wire.rs
diff options
context:
space:
mode:
authordiogo464 <[email protected]>2025-10-07 10:34:12 +0100
committerdiogo464 <[email protected]>2025-10-07 10:34:12 +0100
commitc0148cb62800789e94ef41e34bee53e58fac02f2 (patch)
tree8c2c5588cb075b4ef94f6ca81f8f2e3228c1097e /src/wire.rs
parent5bf4135847954bec6b8c90ef2996439783ae8056 (diff)
split some code into modules
Diffstat (limited to 'src/wire.rs')
-rw-r--r--src/wire.rs81
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 @@
1use std::{
2 io::{BufRead, Read, Result, Write},
3 net::Ipv4Addr,
4};
5
6pub fn write<W: Write>(mut writer: W, v: &[u8]) -> Result<()> {
7 writer.write_all(v)
8}
9
10pub fn write_u8<W: Write>(mut writer: W, v: u8) -> Result<()> {
11 writer.write_all(&[v])
12}
13
14pub fn write_u16<W: Write>(mut writer: W, v: u16) -> Result<()> {
15 writer.write_all(&u16::to_be_bytes(v))
16}
17
18pub fn write_u32<W: Write>(mut writer: W, v: u32) -> Result<()> {
19 writer.write_all(&u32::to_be_bytes(v))
20}
21
22pub fn write_ipv4<W: Write>(mut writer: W, v: Ipv4Addr) -> Result<()> {
23 writer.write_all(&v.octets())
24}
25
26pub 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
31pub 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
37pub 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
43pub 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
49pub 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
55pub 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
62pub 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
67pub 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
74pub 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
79pub fn read_ipv4<R: BufRead>(reader: R) -> Result<Ipv4Addr> {
80 Ok(Ipv4Addr::from_octets(read_arr(reader)?))
81}