@@ -282,18 +282,7 @@ impl Node {
282282
283283 /// Launch the bitcoind process from the given `exe` executable with given [Conf] param and create/load the "default" wallet.
284284 pub fn with_conf < S : AsRef < OsStr > > ( exe : S , conf : & Conf ) -> anyhow:: Result < Node > {
285- let tmpdir =
286- conf. tmpdir . clone ( ) . or_else ( || env:: var ( "TEMPDIR_ROOT" ) . map ( PathBuf :: from) . ok ( ) ) ;
287- let work_dir = match ( & tmpdir, & conf. staticdir ) {
288- ( Some ( _) , Some ( _) ) => return Err ( Error :: BothDirsSpecified . into ( ) ) ,
289- ( Some ( tmpdir) , None ) => DataDir :: Temporary ( TempDir :: new_in ( tmpdir) ?) ,
290- ( None , Some ( workdir) ) => {
291- fs:: create_dir_all ( workdir) ?;
292- DataDir :: Persistent ( workdir. to_owned ( ) )
293- }
294- ( None , None ) => DataDir :: Temporary ( TempDir :: new ( ) ?) ,
295- } ;
296-
285+ let work_dir = Self :: init_work_dir ( conf) ?;
297286 let work_dir_path = work_dir. path ( ) ;
298287 if !work_dir_path. exists ( ) {
299288 panic ! ( "work dir does not exist" ) ;
@@ -306,45 +295,9 @@ impl Node {
306295 let rpc_url = format ! ( "http://{}" , rpc_socket) ;
307296 debug ! ( "rpc_url: {}" , rpc_url) ;
308297
309- let ( p2p_args, p2p_socket) = match conf. p2p {
310- P2P :: No => ( vec ! [ "-listen=0" . to_string( ) ] , None ) ,
311- P2P :: Yes => {
312- let p2p_port = get_available_port ( ) ?;
313- let p2p_socket = SocketAddrV4 :: new ( LOCAL_IP , p2p_port) ;
314- let bind_arg = format ! ( "-bind={}" , p2p_socket) ;
315- let args = vec ! [ bind_arg] ;
316- ( args, Some ( p2p_socket) )
317- }
318- P2P :: Connect ( other_node_url, listen) => {
319- let p2p_port = get_available_port ( ) ?;
320- let p2p_socket = SocketAddrV4 :: new ( LOCAL_IP , p2p_port) ;
321- let bind_arg = format ! ( "-bind={}" , p2p_socket) ;
322- let connect = format ! ( "-connect={}" , other_node_url) ;
323- let mut args = vec ! [ bind_arg, connect] ;
324- if listen {
325- args. push ( "-listen=1" . to_string ( ) )
326- }
327- ( args, Some ( p2p_socket) )
328- }
329- } ;
330-
331- let ( zmq_args, zmq_pub_raw_tx_socket, zmq_pub_raw_block_socket) = match conf. enable_zmq {
332- true => {
333- let zmq_pub_raw_tx_port = get_available_port ( ) ?;
334- let zmq_pub_raw_tx_socket = SocketAddrV4 :: new ( LOCAL_IP , zmq_pub_raw_tx_port) ;
335- let zmq_pub_raw_block_port = get_available_port ( ) ?;
336- let zmq_pub_raw_block_socket = SocketAddrV4 :: new ( LOCAL_IP , zmq_pub_raw_block_port) ;
337- let zmqpubrawblock_arg =
338- format ! ( "-zmqpubrawblock=tcp://0.0.0.0:{}" , zmq_pub_raw_block_port) ;
339- let zmqpubrawtx_arg = format ! ( "-zmqpubrawtx=tcp://0.0.0.0:{}" , zmq_pub_raw_tx_port) ;
340- (
341- vec ! [ zmqpubrawtx_arg, zmqpubrawblock_arg] ,
342- Some ( zmq_pub_raw_tx_socket) ,
343- Some ( zmq_pub_raw_block_socket) ,
344- )
345- }
346- false => ( vec ! [ ] , None , None ) ,
347- } ;
298+ let ( p2p_args, p2p_socket) = Self :: p2p_args ( & conf. p2p ) ?;
299+ let ( zmq_args, zmq_pub_raw_tx_socket, zmq_pub_raw_block_socket) =
300+ Self :: zmq_args ( conf. enable_zmq ) ?;
348301
349302 let stdout = if conf. view_stdout { Stdio :: inherit ( ) } else { Stdio :: null ( ) } ;
350303
@@ -459,6 +412,66 @@ impl Node {
459412 } )
460413 }
461414
415+ fn init_work_dir ( conf : & Conf ) -> anyhow:: Result < DataDir > {
416+ let tmpdir =
417+ conf. tmpdir . clone ( ) . or_else ( || env:: var ( "TEMPDIR_ROOT" ) . map ( PathBuf :: from) . ok ( ) ) ;
418+ let work_dir = match ( & tmpdir, & conf. staticdir ) {
419+ ( Some ( _) , Some ( _) ) => return Err ( Error :: BothDirsSpecified . into ( ) ) ,
420+ ( Some ( tmpdir) , None ) => DataDir :: Temporary ( TempDir :: new_in ( tmpdir) ?) ,
421+ ( None , Some ( workdir) ) => {
422+ fs:: create_dir_all ( workdir) ?;
423+ DataDir :: Persistent ( workdir. to_owned ( ) )
424+ }
425+ ( None , None ) => DataDir :: Temporary ( TempDir :: new ( ) ?) ,
426+ } ;
427+ Ok ( work_dir)
428+ }
429+
430+ fn p2p_args ( p2p : & P2P ) -> anyhow:: Result < ( Vec < String > , Option < SocketAddrV4 > ) > {
431+ match p2p {
432+ P2P :: No => Ok ( ( vec ! [ "-listen=0" . to_string( ) ] , None ) ) ,
433+ P2P :: Yes => {
434+ let p2p_port = get_available_port ( ) ?;
435+ let p2p_socket = SocketAddrV4 :: new ( LOCAL_IP , p2p_port) ;
436+ let bind_arg = format ! ( "-bind={}" , p2p_socket) ;
437+ let args = vec ! [ bind_arg] ;
438+ Ok ( ( args, Some ( p2p_socket) ) )
439+ }
440+ P2P :: Connect ( other_node_url, listen) => {
441+ let p2p_port = get_available_port ( ) ?;
442+ let p2p_socket = SocketAddrV4 :: new ( LOCAL_IP , p2p_port) ;
443+ let bind_arg = format ! ( "-bind={}" , p2p_socket) ;
444+ let connect = format ! ( "-connect={}" , other_node_url) ;
445+ let mut args = vec ! [ bind_arg, connect] ;
446+ if * listen {
447+ args. push ( "-listen=1" . to_string ( ) )
448+ }
449+ Ok ( ( args, Some ( p2p_socket) ) )
450+ }
451+ }
452+ }
453+
454+ fn zmq_args (
455+ enable_zmq : bool ,
456+ ) -> anyhow:: Result < ( Vec < String > , Option < SocketAddrV4 > , Option < SocketAddrV4 > ) > {
457+ if enable_zmq {
458+ let zmq_pub_raw_tx_port = get_available_port ( ) ?;
459+ let zmq_pub_raw_tx_socket = SocketAddrV4 :: new ( LOCAL_IP , zmq_pub_raw_tx_port) ;
460+ let zmq_pub_raw_block_port = get_available_port ( ) ?;
461+ let zmq_pub_raw_block_socket = SocketAddrV4 :: new ( LOCAL_IP , zmq_pub_raw_block_port) ;
462+ let zmqpubrawblock_arg =
463+ format ! ( "-zmqpubrawblock=tcp://0.0.0.0:{}" , zmq_pub_raw_block_port) ;
464+ let zmqpubrawtx_arg = format ! ( "-zmqpubrawtx=tcp://0.0.0.0:{}" , zmq_pub_raw_tx_port) ;
465+ Ok ( (
466+ vec ! [ zmqpubrawtx_arg, zmqpubrawblock_arg] ,
467+ Some ( zmq_pub_raw_tx_socket) ,
468+ Some ( zmq_pub_raw_block_socket) ,
469+ ) )
470+ } else {
471+ Ok ( ( vec ! [ ] , None , None ) )
472+ }
473+ }
474+
462475 /// Returns the rpc URL including the schema eg. http://127.0.0.1:44842
463476 pub fn rpc_url ( & self ) -> String { format ! ( "http://{}" , self . params. rpc_socket) }
464477
0 commit comments