From a636bf27a51f2ed6f079a91b862835d3708202d3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 16 Aug 2021 00:36:28 +0100 Subject: [PATCH] slip: make checkn out fallible Signed-off-by: Ian Jackson --- src/bin/client.rs | 2 +- src/slip.rs | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 14d81ce..d114ace 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -282,7 +282,7 @@ async fn run_client( let addr = ip_packet_addr::(header)?; if addr != ic.link.client.0 { throw!(PE::Dst(addr)) } Ok(()) - }, |o| rx_queue.push(o), + }, |o| Ok({ rx_queue.push(o) }), |e| error!("{} #{}: rx discarding: {}", &ic, req_num, e)) { Ok(()) => reporter.lock().success(), diff --git a/src/slip.rs b/src/slip.rs index 3903636..a382392 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -36,7 +36,7 @@ pub fn checkn( mut out: OUT, mut error_handler: EH ) where AC: Fn(&[u8]) -> Result<(), PacketError> + Copy, - OUT: FnMut(Box<[u8]>), + OUT: FnMut(Box<[u8]>) -> Result<(), PacketError>, EH: FnMut(PacketError), { // eprintln!("before: {:?}", DumpHex(data)); @@ -44,10 +44,15 @@ pub fn checkn( let mut ok = false; let mut err = false; for packet in data.split(|&c| c == SLIP_END) { - match check1(mime, mtu, packet, addr_chk) { - Err(PacketError::Empty) => { } + match (||{ + let packet = check1(mime, mtu, packet, addr_chk); + if matches!(packet, Err(PacketError::Empty)) { return Ok::<_,PE>(()) } + out(packet?)?; + ok = true; + Ok::<_,PE>(()) + })() { + Ok(()) => { }, Err(e) => { err=true; error_handler(e); }, - Ok(packet) => { ok=true; out(packet); }, } } // eprintln!(" after: {:?}", DumpHex(data)); -- 2.30.2