chiark / gitweb /
slip: Make addr check be able to return a value
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 Aug 2021 23:39:48 +0000 (00:39 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 15 Aug 2021 23:39:48 +0000 (00:39 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/client.rs
src/slip.rs

index d114acec37c319df7c980eff666159b50736cf10..2642e22760386e0858b2a58291d991fa32358785 100644 (file)
@@ -234,7 +234,7 @@ async fn run_client<C:HCC>(
             if saddr != ic.link.client.0 { throw!(PE::Src(saddr)) }
             Ok(())
           }) {
-            Ok(data) => tx_queue.push_back(TxQueued {
+            Ok((data, ())) => tx_queue.push_back(TxQueued {
               data,
               expires: Instant::now() + ic.max_queue_time
             }),
@@ -282,7 +282,7 @@ async fn run_client<C:HCC>(
               let addr = ip_packet_addr::<true>(header)?;
               if addr != ic.link.client.0 { throw!(PE::Dst(addr)) }
               Ok(())
-            }, |o| Ok({ rx_queue.push(o) }),
+            }, |o| Ok({ rx_queue.push(o); }),
                |e| error!("{} #{}: rx discarding: {}", &ic, req_num, e))
             {
               Ok(()) => reporter.lock().success(),
index a38239254df59350d42a8691e4cd33ffbe2453cb..1282bf3bc1c45734d00e4c45e07fab063991b099 100644 (file)
@@ -45,9 +45,10 @@ pub fn checkn<AC, EH, OUT, M: SlipMime+Copy>(
   let mut err = false;
   for packet in data.split(|&c| c == SLIP_END) {
     match (||{
-      let packet = check1(mime, mtu, packet, addr_chk);
-      if matches!(packet, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
-      out(packet?)?;
+      let checked = check1(mime, mtu, packet, addr_chk);
+      if matches!(checked, Err(PacketError::Empty)) { return Ok::<_,PE>(()) }
+      let (packet, _acr) = checked?;
+      out(packet)?;
       ok = true;
       Ok::<_,PE>(())
     })() {
@@ -60,13 +61,13 @@ pub fn checkn<AC, EH, OUT, M: SlipMime+Copy>(
 }
 
 #[throws(PacketError)]
-pub fn check1<AC, M: SlipMime>(
+pub fn check1<AC, M: SlipMime, ACR>(
   _mime: M,
   mtu: u32,
   packet: &[u8],
   addr_chk: AC,
-) -> Box<[u8]>
-where AC: Fn(&[u8]) -> Result<(), PacketError>,
+) -> (Box<[u8]>, ACR)
+where AC: Fn(&[u8]) -> Result<ACR, PacketError>,
 {
   if packet.len() == 0 {
     throw!(PacketError::Empty)
@@ -112,9 +113,9 @@ where AC: Fn(&[u8]) -> Result<(), PacketError>,
     throw!(PacketError::MTU { len: decoded_len, mtu });
   }
 
-  addr_chk(&header)?;
+  let acr = addr_chk(&header)?;
 
-  packet
+  (packet, acr)
 }
 
 pub type Frame = Vec<u8>;