summaryrefslogtreecommitdiff
path: root/src/server/mod.rs
diff options
context:
space:
mode:
authorJan Wolff <janw@mailbox.org>2020-05-26 07:36:53 +0200
committerJan Wolff <janw@mailbox.org>2020-05-26 07:36:53 +0200
commit361aa9a5d76e08aa6b369e1d072fe20a9fd468e1 (patch)
tree1055aa375250dc761c12ae7a9c0725515323a9ed /src/server/mod.rs
parent2ffc8ff0ccb0bfad7d69104cbc00b167589c780b (diff)
correctly spawn multiple tcp listeners for each address
Diffstat (limited to 'src/server/mod.rs')
-rw-r--r--src/server/mod.rs60
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");
}
}
}