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(())
    }
}