aboutsummaryrefslogtreecommitdiff
path: root/src/interface.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface.rs')
-rw-r--r--src/interface.rs49
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();
+ }
}
}