From 712e4fd208d177624b4e2931555c17873d59948b Mon Sep 17 00:00:00 2001 From: Thomas Gatzweiler Date: Wed, 19 Jul 2017 08:50:06 +0200 Subject: [PATCH] Implement connection threads --- src/public_key/mod.rs | 2 +- src/server.rs | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/public_key/mod.rs b/src/public_key/mod.rs index cc72875..9bbb4d1 100644 --- a/src/public_key/mod.rs +++ b/src/public_key/mod.rs @@ -7,7 +7,7 @@ mod ed25519; pub use self::ed25519::ED25519; -pub trait KeyPair { +pub trait KeyPair: Sync + Send { fn system(&self) -> &'static CryptoSystem; fn has_private(&self) -> bool; diff --git a/src/server.rs b/src/server.rs index 7318de8..e284291 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,6 +1,7 @@ use std::io; use std::net::TcpListener; use std::sync::Arc; +use std::thread; use connection::{Connection, ConnectionType}; use public_key::KeyPair; @@ -25,21 +26,25 @@ impl Server { TcpListener::bind((&*self.config.host, self.config.port))?; loop { - let (mut stream, addr) = listener.accept()?; + let (stream, addr) = listener.accept()?; + let config = self.config.clone(); debug!("Incoming connection from {}", addr); - let mut read_stream = stream.try_clone()?; + thread::spawn(move || { + let mut read_stream = stream.try_clone().unwrap(); - let mut connection = Connection::new( - ConnectionType::Server(self.config.clone()), - Box::new(stream), - ); + let mut connection = Connection::new( + ConnectionType::Server(config), + Box::new(stream), + ); - let result = connection.run(&mut read_stream); - if let Some(error) = result.err() { - println!("sshd: {}", error) - } + let result = connection.run(&mut read_stream); + + if let Some(error) = result.err() { + println!("sshd: {}", error) + } + }); } Ok(())