diff --git a/src/args.rs b/src/args.rs index 6233350..b991512 100644 --- a/src/args.rs +++ b/src/args.rs @@ -103,6 +103,10 @@ pub struct Args { /// Daemonize for unix family or run as Windows service #[arg(long)] pub daemonize: bool, + + /// Exit immediately when fatal error occurs, useful for running as a service + #[arg(long)] + pub exit_on_fatal_error: bool, } fn validate_tun(p: &str) -> Result { @@ -144,6 +148,7 @@ impl Default for Args { verbosity: ArgVerbosity::Info, virtual_dns_pool: IpCidr::from_str("198.18.0.0/15").unwrap(), daemonize: false, + exit_on_fatal_error: false, } } } diff --git a/src/lib.rs b/src/lib.rs index 46cdec9..4e500c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -248,6 +248,9 @@ where IpStackStream::Tcp(tcp) => { if TASK_COUNT.load(Relaxed) > MAX_SESSIONS { log::warn!("Too many sessions that over {MAX_SESSIONS}, dropping new session"); + if args.exit_on_fatal_error { + break; + } continue; } log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1); @@ -271,6 +274,9 @@ where IpStackStream::Udp(udp) => { if TASK_COUNT.load(Relaxed) > MAX_SESSIONS { log::warn!("Too many sessions that over {MAX_SESSIONS}, dropping new session"); + if args.exit_on_fatal_error { + break; + } continue; } log::trace!("Session count {}", TASK_COUNT.fetch_add(1, Relaxed) + 1);