@@ -18,7 +18,7 @@ use lightning_invoice::{utils, Currency, Invoice};
18
18
use std:: env;
19
19
use std:: io;
20
20
use std:: io:: { BufRead , Write } ;
21
- use std:: net:: { SocketAddr , TcpStream } ;
21
+ use std:: net:: { SocketAddr , ToSocketAddrs } ;
22
22
use std:: ops:: Deref ;
23
23
use std:: path:: Path ;
24
24
use std:: str:: FromStr ;
@@ -151,6 +151,7 @@ pub(crate) async fn poll_for_user_input(
151
151
peer_manager. clone ( ) ,
152
152
event_notifier. clone ( ) ,
153
153
)
154
+ . await
154
155
. is_err ( )
155
156
{
156
157
print ! ( "> " ) ;
@@ -300,6 +301,7 @@ pub(crate) async fn poll_for_user_input(
300
301
peer_manager. clone ( ) ,
301
302
event_notifier. clone ( ) ,
302
303
)
304
+ . await
303
305
. is_ok ( )
304
306
{
305
307
println ! ( "SUCCESS: connected to peer {}" , pubkey) ;
@@ -452,7 +454,7 @@ fn list_payments(inbound_payments: PaymentInfoStorage, outbound_payments: Paymen
452
454
println ! ( "]" ) ;
453
455
}
454
456
455
- pub ( crate ) fn connect_peer_if_necessary (
457
+ pub ( crate ) async fn connect_peer_if_necessary (
456
458
pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
457
459
event_notifier : mpsc:: Sender < ( ) > ,
458
460
) -> Result < ( ) , ( ) > {
@@ -461,24 +463,36 @@ pub(crate) fn connect_peer_if_necessary(
461
463
return Ok ( ( ) ) ;
462
464
}
463
465
}
464
- match TcpStream :: connect_timeout ( & peer_addr, Duration :: from_secs ( 10 ) ) {
465
- Ok ( stream) => {
466
- let peer_mgr = peer_manager. clone ( ) ;
467
- let event_ntfns = event_notifier. clone ( ) ;
468
- tokio:: spawn ( async move {
469
- lightning_net_tokio:: setup_outbound ( peer_mgr, event_ntfns, pubkey, stream) . await ;
470
- } ) ;
466
+ match lightning_net_tokio:: connect_outbound (
467
+ Arc :: clone ( & peer_manager) ,
468
+ event_notifier,
469
+ pubkey,
470
+ peer_addr,
471
+ )
472
+ . await
473
+ {
474
+ Some ( conn_closed_fut) => {
475
+ let mut closed_fut_box = Box :: pin ( conn_closed_fut) ;
471
476
let mut peer_connected = false ;
472
477
while !peer_connected {
478
+ match futures:: poll!( & mut closed_fut_box) {
479
+ std:: task:: Poll :: Ready ( _) => {
480
+ println ! ( "ERROR: Peer disconnected before we finished the handshake" ) ;
481
+ return Err ( ( ) ) ;
482
+ }
483
+ std:: task:: Poll :: Pending => { }
484
+ }
473
485
for node_pubkey in peer_manager. get_peer_node_ids ( ) {
474
486
if node_pubkey == pubkey {
475
487
peer_connected = true ;
476
488
}
477
489
}
490
+ // Avoid blocking the tokio context by sleeping a bit
491
+ tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ;
478
492
}
479
493
}
480
- Err ( e ) => {
481
- println ! ( "ERROR: failed to connect to peer: {:?}" , e ) ;
494
+ None => {
495
+ println ! ( "ERROR: failed to connect to peer" ) ;
482
496
return Err ( ( ) ) ;
483
497
}
484
498
}
@@ -625,12 +639,12 @@ pub(crate) fn parse_peer_info(
625
639
return Err ( std:: io:: Error :: new (
626
640
std:: io:: ErrorKind :: Other ,
627
641
"ERROR: incorrectly formatted peer
628
- info. Should be formatted as: `pubkey@host:port`",
642
+ info. Should be formatted as: `pubkey@host:port`",
629
643
) ) ;
630
644
}
631
645
632
- let peer_addr: Result < SocketAddr , _ > = peer_addr_str. unwrap ( ) . parse ( ) ;
633
- if peer_addr. is_err ( ) {
646
+ let peer_addr = peer_addr_str. unwrap ( ) . to_socket_addrs ( ) . map ( | mut r| r . next ( ) ) ;
647
+ if peer_addr. is_err ( ) || peer_addr . as_ref ( ) . unwrap ( ) . is_none ( ) {
634
648
return Err ( std:: io:: Error :: new (
635
649
std:: io:: ErrorKind :: Other ,
636
650
"ERROR: couldn't parse pubkey@host:port into a socket address" ,
@@ -645,5 +659,5 @@ pub(crate) fn parse_peer_info(
645
659
) ) ;
646
660
}
647
661
648
- Ok ( ( pubkey. unwrap ( ) , peer_addr. unwrap ( ) ) )
662
+ Ok ( ( pubkey. unwrap ( ) , peer_addr. unwrap ( ) . unwrap ( ) ) )
649
663
}
0 commit comments