diff options
Diffstat (limited to 'src/interface.rs')
-rw-r--r-- | src/interface.rs | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/src/interface.rs b/src/interface.rs index 0020736..fcdb470 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -1,24 +1,22 @@ +use super::protocol::{ClientboundPacket, ServerboundPacket}; +use crate::handle_packet; +use log::{debug, error, info, warn}; use std::io; use std::io::{BufRead, BufReader, ErrorKind, Write}; use std::os::unix::net::{UnixListener, UnixStream}; use std::thread; -use super::protocol::{ClientboundPacket, ServerboundPacket}; -use crossbeam_channel::Sender; -use log::{debug, error, info, warn}; - -pub fn network_loop(s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket>)>) { +pub fn network_loop() { let listener = UnixListener::bind("/run/user/1000/calendar").unwrap(); let mut id_counter = 0; loop { let (stream, addr) = listener.accept().unwrap(); - let s = s.clone(); let id = id_counter; id_counter += 1; thread::spawn(move || { info!("client connected: {:?}", addr); - if let Err(err) = handle_connection(id, stream.try_clone().unwrap(), s.clone()) { + if let Err(err) = handle_connection(id, stream.try_clone().unwrap()) { warn!("client dropped: {:?} ({})", addr, err); } else { info!("client dropped: {:?}", addr); @@ -27,11 +25,7 @@ pub fn network_loop(s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket> } } -fn handle_connection( - id: u32, - mut stream: UnixStream, - s: Sender<(u32, ServerboundPacket, Sender<ClientboundPacket>)>, -) -> io::Result<()> { +fn handle_connection(id: u32, mut stream: UnixStream) -> io::Result<()> { let mut reader = BufReader::new(stream.try_clone()?); let (responder, responses) = crossbeam_channel::unbounded(); responder @@ -52,22 +46,23 @@ fn handle_connection( } } }); - let mut buf = String::new(); - loop { - if reader.read_line(&mut buf)? == 0 { - break Ok(()); - }; - match serde_json::from_str::<ServerboundPacket>(buf.as_str()) { - Ok(packet) => { - debug!("{id} <- {packet:?}"); - s.send((id, packet, responder.clone())) - .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?; + { + let mut buf = String::new(); + loop { + if reader.read_line(&mut buf)? == 0 { + break Ok(()); + }; + match serde_json::from_str::<ServerboundPacket>(buf.as_str()) { + Ok(packet) => { + debug!("{id} <- {packet:?}"); + handle_packet(id, packet, responder.clone()); + } + Err(err) => responder + .send(ClientboundPacket::Error(format!("{}", &err))) + .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?, } - Err(err) => responder - .send(ClientboundPacket::Error(format!("{}", &err))) - .map_err(|_| io::Error::from(ErrorKind::InvalidInput))?, - } - buf.clear(); + buf.clear(); + } } } |