@@ -21,20 +21,22 @@ use std::sync::Arc;
2121use std:: time:: Duration ;
2222use std:: { io, thread} ;
2323
24- pub fn listen < F , G , H > (
24+ pub fn listen < F , G , H , K > (
2525 context_id : u32 ,
2626 stop_state : Arc < StopState > ,
2727 tor_config : Option < TorConfig > ,
2828 listen_addr : Option < SocketAddr > , // Port in needed in not internal tor will be used
2929 onion_expanded_key : Option < [ u8 ; 64 ] > ,
3030 started_service_callback : Option < F > ,
3131 failed_service_callback : Option < G > ,
32+ service_status_callback : Option < K > ,
3233 handle_new_peer_callback : H ,
3334) -> Result < ( ) , Error >
3435where
3536 F : Fn ( Option < String > ) ,
3637 G : Fn ( & Error ) -> bool , // return true if want to exit on falure
3738 H : Fn ( TcpDataStream , Option < PeerAddr > ) ,
39+ K : Fn ( bool ) + Send + ' static + std:: marker:: Sync , // return true if want to exit on falure
3840{
3941 let tor_config = tor_config. unwrap_or ( TorConfig :: no_tor_config ( ) ) ;
4042
@@ -49,10 +51,11 @@ where
4951 onion_expanded_key,
5052 started_service_callback,
5153 failed_service_callback,
54+ service_status_callback,
5255 handle_new_peer_callback,
5356 )
5457 } else {
55- // Listening on extended Tor, listening on sockets
58+ // Listening on external Tor, listening on sockets
5659 let onion_address = tor_config. onion_address . clone ( ) . ok_or ( Error :: ConfigError (
5760 "For tor external config, internal onion address is not specified." . into ( ) ,
5861 ) ) ?;
6770 Some ( onion_address) ,
6871 started_service_callback,
6972 failed_service_callback,
73+ service_status_callback,
7074 handle_new_peer_callback,
7175 )
7276 }
@@ -79,23 +83,26 @@ where
7983 None ,
8084 started_service_callback,
8185 failed_service_callback,
86+ service_status_callback,
8287 handle_new_peer_callback,
8388 )
8489 }
8590}
8691
87- fn listen_onion_service < F , G , H > (
92+ fn listen_onion_service < F , G , H , K > (
8893 context_id : u32 ,
8994 stop_state : Arc < StopState > ,
9095 onion_expanded_key : Option < [ u8 ; 64 ] > ,
9196 started_service_callback : Option < F > ,
9297 failed_service_callback : Option < G > ,
98+ service_status_callback : Option < K > ,
9399 handle_new_peer_callback : H ,
94100) -> Result < ( ) , Error >
95101where
96102 F : Fn ( Option < String > ) ,
97103 G : Fn ( & Error ) -> bool , // return true if want to exit on falure
98104 H : Fn ( TcpDataStream , Option < PeerAddr > ) ,
105+ K : Fn ( bool ) + Send + ' static + std:: marker:: Sync , // return true if want to exit on falure
99106{
100107 info ! ( "Starting TOR (Arti) service..." ) ;
101108
@@ -110,36 +117,45 @@ where
110117 "mwc-node" ,
111118 started_service_callback,
112119 failed_service_callback,
120+ service_status_callback,
113121 handle_new_peer_callback,
114122 )
115123}
116124
117125/// Starts a new TCP server and listen to incoming connections. This is a
118126/// blocking call until the TCP server stops.
119- fn listen_socket < F , G , H > (
127+ fn listen_socket < F , G , H , K > (
120128 stop_state : Arc < StopState > ,
121129 host : IpAddr ,
122130 port : u16 ,
123131 onion_service_address : Option < String > ,
124132 started_service_callback : Option < F > ,
125133 failed_service_callback : Option < G > ,
134+ service_status_callback : Option < K > ,
126135 handle_new_peer_callback : H ,
127136) -> Result < ( ) , Error >
128137where
129138 F : Fn ( Option < String > ) ,
130139 G : Fn ( & Error ) -> bool , // return true if want to exit on falure
131140 H : Fn ( TcpDataStream , Option < PeerAddr > ) ,
141+ K : Fn ( bool ) + Send + ' static + std:: marker:: Sync , // return true if want to exit on falure
132142{
133143 // start TCP listener and handle incoming connections
134144 let addr = SocketAddr :: new ( host, port) ;
135145 let listener = match run_global_async_block ( async { TcpListener :: bind ( addr) . await } ) {
136146 Ok ( listener) => {
147+ if let Some ( f) = service_status_callback. as_ref ( ) {
148+ f ( true )
149+ }
137150 if let Some ( started_service_callback) = started_service_callback {
138151 started_service_callback ( onion_service_address) ;
139152 }
140153 listener
141154 }
142155 Err ( e) => {
156+ if let Some ( f) = service_status_callback. as_ref ( ) {
157+ f ( false )
158+ }
143159 let err = Error :: TorProcess ( format ! (
144160 "Unable to start listening on {}:{}, {}" ,
145161 host, port, e
@@ -215,5 +231,9 @@ where
215231 }
216232 thread:: sleep ( Duration :: from_millis ( 5 ) ) ;
217233 }
234+ if let Some ( f) = service_status_callback. as_ref ( ) {
235+ f ( false )
236+ }
237+
218238 Ok ( ( ) )
219239}
0 commit comments