@@ -5,7 +5,7 @@ use std::{
55 pin:: Pin ,
66 sync:: {
77 Arc , RwLock ,
8- atomic:: { AtomicUsize , Ordering } ,
8+ atomic:: { AtomicI32 , AtomicUsize , Ordering } ,
99 } ,
1010} ;
1111
@@ -51,6 +51,10 @@ mod post_scans_id;
5151mod tls;
5252use post_scans:: PostScansHandler ;
5353use post_scans_id:: { PostScansId , PostScansIdHandler } ;
54+
55+ use futures:: stream:: StreamExt ;
56+ use signal_hook:: consts:: signal:: * ;
57+ use signal_hook_tokio:: Signals ;
5458use tokio:: net:: TcpListener ;
5559
5660pub trait ExternalError : core:: error:: Error + Send + Sync + ' static { }
@@ -375,8 +379,29 @@ impl RuntimeBuilder<runtime_builder_states::DeleteScanIDSet> {
375379 }
376380}
377381
382+ static RUN : AtomicI32 = AtomicI32 :: new ( 0 ) ;
383+
384+ async fn handle_signals ( mut signals : Signals ) {
385+ while let Some ( signal) = signals. next ( ) . await {
386+ match signal {
387+ SIGHUP => {
388+ tracing:: info!( "Ignoring SIGHUP signal." ) ;
389+ }
390+ SIGTERM | SIGINT | SIGQUIT => {
391+ tracing:: info!( signal, "Exit based on signal." ) ;
392+ RUN . store ( 128 + signal, Ordering :: Relaxed ) ;
393+ }
394+ _ => unreachable ! ( ) ,
395+ }
396+ }
397+ }
398+
378399impl RuntimeBuilder < runtime_builder_states:: End > {
379- pub async fn run_blocking ( self ) -> Result < ( ) , Box < dyn std:: error:: Error + Send + Sync > > {
400+ pub async fn run_blocking ( self ) -> Result < i32 , Box < dyn std:: error:: Error + Send + Sync > > {
401+ let signals = Signals :: new ( [ SIGHUP , SIGTERM , SIGINT , SIGQUIT ] ) ?;
402+ let _handle_guard = signals. handle ( ) ;
403+ tokio:: task:: spawn ( handle_signals ( signals) ) ;
404+
380405 let scanner = Arc :: new ( self . build_scanner ( ) ) ;
381406 let tls_config = match & self . tls {
382407 Some ( x) => Some ( tls:: tls_config ( x) ?) ,
@@ -395,7 +420,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
395420 let config = Arc :: new ( tls_config. config ) ;
396421 let tls_acceptor = tokio_rustls:: TlsAcceptor :: from ( config) ;
397422
398- loop {
423+ while RUN . load ( Ordering :: Relaxed ) == 0 {
399424 let ( tcp_stream, _remote_addr) = incoming. accept ( ) . await ?;
400425 let tls_acceptor = tls_acceptor. clone ( ) ;
401426 let identifier = tls_config. client_identifier . clone ( ) ;
@@ -433,7 +458,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
433458 } else {
434459 use hyper:: server:: conn:: http1:: Builder ;
435460 tracing:: info!( "listening on http://{}" , self . listener_address) ;
436- loop {
461+ while RUN . load ( Ordering :: Relaxed ) == 0 {
437462 let ( tcp_stream, _remote_addr) = incoming. accept ( ) . await ?;
438463 let ctx = scanner. clone ( ) ;
439464 let handlers = handlers. clone ( ) ;
@@ -459,6 +484,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
459484 } ) ;
460485 }
461486 }
487+ Ok ( RUN . load ( Ordering :: Relaxed ) )
462488 }
463489}
464490
0 commit comments