1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use std::io; use std::net::TcpListener; use std::sync::Arc; use std::thread; use connection::{Connection, ConnectionType}; use public_key::KeyPair; pub struct ServerConfig { pub host: String, pub port: u16, pub key: Box<KeyPair>, } pub struct Server { config: Arc<ServerConfig>, } impl Server { pub fn with_config(config: ServerConfig) -> Server { Server { config: Arc::new(config) } } pub fn run(&self) -> io::Result<()> { let listener = TcpListener::bind((&*self.config.host, self.config.port))?; loop { let (mut stream, addr) = listener.accept()?; let config = self.config.clone(); debug!("Incoming connection from {}", addr); thread::spawn(move || { let mut connection = Connection::new(ConnectionType::Server(config)); let result = connection.run(&mut stream); if let Some(error) = result.err() { println!("sshd: {}", error) } }); } Ok(()) } }