From cc53be8cf89533c4d12fc86f04f52d00ab3fe18b Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Tue, 24 Sep 2019 22:37:25 +0200 Subject: [PATCH] Better error messages --- src/main.rs | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 102c40e..21f77dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -315,16 +315,37 @@ async fn udp_acceptor( } } -async fn start(globals: Arc, runtime: Arc) -> Result<(), Error> { - for listen_addr in &globals.listen_addrs { - let tcp_listener = TcpListener::bind(&listen_addr).await?; - let udp_socket = std::net::UdpSocket::bind(&listen_addr)?; - runtime.spawn(tcp_acceptor(globals.clone(), tcp_listener).map(|_| {})); - runtime.spawn(udp_acceptor(globals.clone(), udp_socket).map(|_| {})); +async fn start( + globals: Arc, + runtime: Arc, + listeners: Vec<(TcpListener, std::net::UdpSocket)>, +) -> Result<(), Error> { + for listener in listeners { + runtime.spawn(tcp_acceptor(globals.clone(), listener.0).map(|_| {})); + runtime.spawn(udp_acceptor(globals.clone(), listener.1).map(|_| {})); } Ok(()) } +fn bind_listeners( + listen_addrs: &[SocketAddr], + runtime: Arc, +) -> Result, Error> { + let mut sockets = Vec::with_capacity(listen_addrs.len()); + for listen_addr in listen_addrs { + let tcp_listener = match runtime.block_on(TcpListener::bind(&listen_addr)) { + Ok(tcp_listener) => tcp_listener, + Err(e) => bail!(format_err!("{}/TCP: {}", listen_addr, e)), + }; + let udp_socket = match std::net::UdpSocket::bind(&listen_addr) { + Ok(udp_socket) => udp_socket, + Err(e) => bail!(format_err!("{}/UDP: {}", listen_addr, e)), + }; + sockets.push((tcp_listener, udp_socket)) + } + Ok(sockets) +} + fn privdrop(config: &Config) -> Result<(), Error> { let mut pd = PrivDrop::default(); if let Some(user) = &config.user { @@ -405,12 +426,19 @@ fn main() -> Result<(), Error> { }; let external_addr = SocketAddr::new(config.external_addr, 0); - privdrop(&config)?; - let mut runtime_builder = tokio::runtime::Builder::new(); runtime_builder.name_prefix("encrypted-dns-"); let runtime = Arc::new(runtime_builder.build()?); + let listen_addrs: Vec<_> = config.listen_addrs.iter().map(|x| x.local).collect(); + let listeners = bind_listeners(&listen_addrs, runtime.clone()) + .map_err(|e| { + error!("Unable to listen to the requested IPs and ports: [{}]", e); + std::process::exit(1); + }) + .unwrap(); + privdrop(&config)?; + let key_cache_capacity = config.dnscrypt.key_cache_capacity; let cache_capacity = config.cache_capacity; let state_file = &config.state_file; @@ -502,7 +530,7 @@ fn main() -> Result<(), Error> { ))), provider_name, provider_kp, - listen_addrs: config.listen_addrs.iter().map(|x| x.local).collect(), + listen_addrs, upstream_addr: config.upstream_addr, tls_upstream_addr: config.tls.upstream_addr, external_addr, @@ -527,7 +555,7 @@ fn main() -> Result<(), Error> { updater.update(); } runtime.spawn( - start(globals, runtime.clone()) + start(globals, runtime.clone(), listeners) .map_err(|e| { error!("Unable to start the service: [{}]", e); std::process::exit(1);