diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 10:59:46 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-29 10:59:46 +0200 |
commit | 8cbe738a47fd8434d4d7626cf8586929c920a498 (patch) | |
tree | c04ecad781932466d5437fb58aba9e54142cba20 | |
parent | fdc4a6fd491850a3074bf78b9350f50a22468be3 (diff) |
errorlessly stop ppp session functions when terminated for any reason
-rw-r--r-- | src/main.rs | 15 | ||||
-rw-r--r-- | src/state.rs | 2 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index 032c710..7e4546a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use std::fs::File; -use std::io::{BufReader, BufWriter, Write}; +use std::io::{BufRead, BufReader, BufWriter, Write}; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -220,7 +220,11 @@ fn session(interface: &str, remote_mac: MacAddr, session_id: u16) -> Result<()> let ppp_state = ppp_state.lock().expect("ppp state mutex is poisoned"); match *ppp_state { Ppp::Synchronize => {} + Ppp::Auth => {} Ppp::Active => {} + Ppp::Terminated => { + break; + } Ppp::Err => { return Err(recv_sess .join() @@ -232,15 +236,24 @@ fn session(interface: &str, remote_mac: MacAddr, session_id: u16) -> Result<()> thread::sleep(PPPOE_XMIT_INTERVAL); } + + Ok(()) } fn recv_session(ctl: File, _ppp: File, state: Arc<Mutex<Ppp>>) -> Result<()> { let mut ctl_r = BufReader::with_capacity(1500, ctl); loop { + if !ctl_r.fill_buf().map(|b| !b.is_empty())? { + *state.lock().expect("ppp state mutex is poisoned") = Ppp::Terminated; + break; + } + let mut pkt = PppPkt::default(); pkt.deserialize(&mut ctl_r)?; println!(" <- ppp lcp {:?}", pkt); } + + Ok(()) } diff --git a/src/state.rs b/src/state.rs index 6771f12..7cd8bec 100644 --- a/src/state.rs +++ b/src/state.rs @@ -17,7 +17,9 @@ impl Default for Pppoe { #[derive(Clone, Debug, Eq, PartialEq)] pub enum Ppp { Synchronize, + Auth, Active, + Terminated, Err, } |