diff options
author | Yorhel <git@yorhel.nl> | 2016-09-04 13:23:55 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2016-09-04 13:23:55 +0200 |
commit | 72813e1af8aaeef36a22592b83204dcbb48afdd9 (patch) | |
tree | 3c6dbf93891b4310bfdc240f0828917173d109c4 /src/listener.rs | |
parent | 8578695be143045453cad83436f395cd09873435 (diff) |
Add generic event loop + bind+listen handling code
Diffstat (limited to 'src/listener.rs')
-rw-r--r-- | src/listener.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/listener.rs b/src/listener.rs new file mode 100644 index 0000000..e6683f3 --- /dev/null +++ b/src/listener.rs @@ -0,0 +1,49 @@ +use mio::{Ready,Token,Event}; +use mio::tcp::TcpListener; +use std::net::SocketAddr; +use std::io::Result; +use config::Config; +use eventloop::{Machine,Context,EventLoop}; + + +struct Listener { + sock: TcpListener, + io: Token +} + + +impl Listener { + fn new(addr: &SocketAddr) -> Result<Listener> { + trace!("Binding {}", addr); + let sock = try!(TcpListener::bind(addr)); + Ok(Listener { + sock: sock, + io: Token(0) + }) + } +} + + +impl Machine for Listener { + fn init(&mut self, ctx: &mut Context) { + self.io = ctx.assign(); + ctx.register(&self.sock, self.io, Ready::readable()); + info!("Listening on {}", self.sock.local_addr().unwrap()); + } + + fn handle(&mut self, _: &mut Context, _: Event) { + let(_, addr) = self.sock.accept().unwrap(); // TODO: ERROR HANDLING! + debug!("New connection from {}", addr); + } +} + + +pub fn setup(ev: &mut EventLoop, cfg: &Config) -> Result<()> { + for itf in &cfg.itf { + for addr in &itf.addr { + let lst = try!(Listener::new(&addr)); + ev.spawn(Box::new(lst)); + } + } + Ok(()) +} |