diff options
Diffstat (limited to 'src/server/mod.rs')
| -rw-r--r-- | src/server/mod.rs | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs index a38e194..54a936c 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -114,12 +114,19 @@ impl Server { println!("serving..."); let acceptor = Server::build_acceptor(&self.config); + let mut listeners = Vec::new(); for addr in &self.config.addrs { + let listener = match TcpListener::bind(addr) { + Ok(listener) => listener, + Err(_) => { + println!("failed listening on: {}", addr); + return; + } + }; + listeners.push(listener); println!("listening on: {}", addr); } - let listener = TcpListener::bind(&self.config.addrs[..]).unwrap(); - if self.config.user.is_root() { panic!("refusing to run as root"); } @@ -140,21 +147,42 @@ impl Server { } }; - for stream in listener.incoming() { - println!("new connection"); - match stream { - Ok(stream) => { - let acceptor = acceptor.clone(); - let config = self.config.clone(); - thread::spawn(move || { - let stream = acceptor.accept(stream).unwrap(); - handler::handle_request(&config, stream); - println!("closing connection"); - }); - } + let mut threads = Vec::new(); + for listener in listeners { + let config = self.config.clone(); + let acceptor = acceptor.clone(); + let t = thread::spawn(move || listener_loop(config, listener, acceptor)); + threads.push(t); + } + + for t in threads { + match t.join() { + Ok(_) => { + println!("failure! one listening thread exited"); + }, Err(_) => { - println!("connection failed"); - } + println!("failure! one listening thread exited"); + }, + }; + } + } +} + +fn listener_loop(config: ServerConfig, listener: TcpListener, acceptor: std::sync::Arc<SslAcceptor>) { + for stream in listener.incoming() { + println!("new connection"); + match stream { + Ok(stream) => { + let acceptor = acceptor.clone(); + let config = config.clone(); + thread::spawn(move || { + let stream = acceptor.accept(stream).unwrap(); + handler::handle_request(&config, stream); + println!("closing connection"); + }); + } + Err(_) => { + println!("connection failed"); } } } |
