@@ -19,11 +19,12 @@ mod cli_config;
1919mod motd;
2020
2121use std:: fs:: { File , OpenOptions } ;
22- use std:: io:: { Error , ErrorKind , Read , Write } ;
22+ use std:: io:: { ErrorKind , Read , Write } ;
2323use std:: net:: { IpAddr , SocketAddr } ;
2424#[ cfg( unix) ]
2525use std:: os:: unix:: fs:: OpenOptionsExt ;
2626
27+ use failure:: Error ;
2728use futures:: sync:: mpsc;
2829use futures:: { future, Future , Sink , Stream } ;
2930use futures:: future:: Either ;
@@ -167,7 +168,7 @@ fn run_tcp(cli_config: &CliConfig, dht_sk: SecretKey, tcp_onion: TcpOnion) -> im
167168 // If TCP address is not specified don't start TCP server and only drop
168169 // all onion packets from DHT server
169170 let tcp_onion_future = tcp_onion. rx
170- . map_err ( |( ) | Error :: from ( ErrorKind :: UnexpectedEof ) )
171+ . map_err ( |( ) | unreachable ! ( "rx can't fail" ) )
171172 . for_each ( |_| future:: ok ( ( ) ) ) ;
172173 return Either :: A ( tcp_onion_future)
173174 }
@@ -181,14 +182,15 @@ fn run_tcp(cli_config: &CliConfig, dht_sk: SecretKey, tcp_onion: TcpOnion) -> im
181182 let dht_sk = dht_sk. clone ( ) ;
182183 let listener = TcpListener :: bind ( & addr) . expect ( "Failed to bind TCP listener" ) ;
183184 tcp_server_c. run ( listener, dht_sk)
185+ . map_err ( Error :: from)
184186 } ) ;
185187
186188 let tcp_server_future = future:: select_all ( tcp_server_futures)
187189 . map ( |_| ( ) )
188190 . map_err ( |( e, _, _) | e) ;
189191
190192 let tcp_onion_future = tcp_onion. rx
191- . map_err ( |( ) | Error :: from ( ErrorKind :: UnexpectedEof ) )
193+ . map_err ( |( ) | unreachable ! ( "rx can't fail" ) )
192194 . for_each ( move |( onion_response, addr) |
193195 tcp_server. handle_udp_onion_response ( addr. ip ( ) , addr. port ( ) , onion_response) . or_else ( |err| {
194196 warn ! ( "Failed to handle UDP onion response: {:?}" , err) ;
@@ -210,7 +212,7 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
210212 // If UDP address is not specified don't start DHT server and only drop
211213 // all onion packets from TCP server
212214 let udp_onion_future = udp_onion. rx
213- . map_err ( |( ) | Error :: from ( ErrorKind :: UnexpectedEof ) )
215+ . map_err ( |( ) | unreachable ! ( "rx can't fail" ) )
214216 . for_each ( |_| future:: ok ( ( ) ) ) ;
215217 return Either :: A ( udp_onion_future)
216218 } ;
@@ -222,9 +224,11 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
222224 let ( tx, rx) = mpsc:: unbounded ( ) ;
223225
224226 let lan_discovery_future = if cli_config. lan_discovery_enabled {
225- LanDiscoverySender :: new ( tx. clone ( ) , dht_pk, udp_addr. is_ipv6 ( ) ) . run ( )
227+ Either :: A ( LanDiscoverySender :: new ( tx. clone ( ) , dht_pk, udp_addr. is_ipv6 ( ) )
228+ . run ( )
229+ . map_err ( Error :: from) )
226230 } else {
227- Box :: new ( future:: empty ( ) )
231+ Either :: B ( future:: empty ( ) )
228232 } ;
229233
230234 let mut server = UdpServer :: new ( tx, dht_pk, dht_sk. clone ( ) ) ;
@@ -236,7 +240,7 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
236240
237241 let server_c = server. clone ( ) ;
238242 let udp_onion_future = udp_onion. rx
239- . map_err ( |( ) | Error :: from ( ErrorKind :: UnexpectedEof ) )
243+ . map_err ( |( ) | unreachable ! ( "rx can't fail" ) )
240244 . for_each ( move |( onion_request, addr) |
241245 server_c. handle_tcp_onion_request ( onion_request, addr) . or_else ( |err| {
242246 warn ! ( "Failed to handle TCP onion request: {:?}" , err) ;
@@ -255,7 +259,7 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
255259 // The server task asynchronously iterates over and processes each
256260 // incoming packet.
257261 let server_c = server. clone ( ) ;
258- let network_reader = stream. then ( future:: ok) . filter ( |event| // TODO: use filter_map from futures 0.2 to avoid next `expect`
262+ let network_reader = stream. then ( future:: ok) . filter ( |event|
259263 match event {
260264 Ok ( _) => true ,
261265 Err ( ref e) => {
@@ -264,18 +268,16 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
264268 e. as_fail ( ) . downcast_ref :: < DecodeError > ( ) . is_none ( )
265269 }
266270 }
267- ) . then ( |event : Result < _ , ( ) > |
268- event. expect ( "always ok" )
269- ) . for_each ( move |( packet, addr) | {
271+ ) . and_then ( |event| event) . for_each ( move |( packet, addr) | {
270272 trace ! ( "Received packet {:?}" , packet) ;
271273 server_c. handle_packet ( packet, addr) . or_else ( |err| {
272274 error ! ( "Failed to handle packet: {:?}" , err) ;
273275 future:: ok ( ( ) )
274276 } )
275- } ) . map_err ( |e| Error :: new ( ErrorKind :: Other , e . compat ( ) ) ) ;
277+ } ) ;
276278
277279 let network_writer = rx
278- . map_err ( |( ) | Error :: new ( ErrorKind :: Other , "rx error " ) )
280+ . map_err ( |( ) | unreachable ! ( "rx can't fail " ) )
279281 // filter out IPv6 packets if node is running in IPv4 mode
280282 . filter ( move |& ( ref _packet, addr) | !( udp_addr. is_ipv4 ( ) && addr. is_ipv6 ( ) ) )
281283 . fold ( sink, move |sink, ( packet, mut addr) | {
@@ -285,7 +287,7 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
285287 }
286288 }
287289 trace ! ( "Sending packet {:?} to {:?}" , packet, addr) ;
288- sink. send ( ( packet, addr) ) . map_err ( |e| Error :: new ( ErrorKind :: Other , e . compat ( ) ) )
290+ sink. send ( ( packet, addr) )
289291 } )
290292 // drop sink when rx stream is exhausted
291293 . map ( |_sink| ( ) ) ;
@@ -294,7 +296,7 @@ fn run_udp(cli_config: &CliConfig, dht_pk: PublicKey, dht_sk: &SecretKey, udp_on
294296
295297 Either :: B ( network_reader
296298 . select ( network_writer) . map ( |_| ( ) ) . map_err ( |( e, _) | e)
297- . select ( server. run ( ) ) . map ( |_| ( ) ) . map_err ( |( e, _) | e)
299+ . select ( server. run ( ) . map_err ( Error :: from ) ) . map ( |_| ( ) ) . map_err ( |( e, _) | e)
298300 . select ( lan_discovery_future) . map ( |_| ( ) ) . map_err ( |( e, _) | e)
299301 . join ( udp_onion_future) . map ( |_| ( ) ) )
300302}
0 commit comments