aboutsummaryrefslogtreecommitdiffstats
path: root/mumd
diff options
context:
space:
mode:
authorEskil Queseth <eskilq@kth.se>2020-10-15 22:09:57 +0200
committerEskil Queseth <eskilq@kth.se>2020-10-15 22:09:57 +0200
commitcfc0ab78a893d6a16d2eedfef290c9e1496a23e1 (patch)
tree0ed06065cb937af22ad48a14d49dd1b0035a90b2 /mumd
parent01b3c75420ec5bf9083dbcf643d3c6087d4f2ce7 (diff)
downloadmum-cfc0ab78a893d6a16d2eedfef290c9e1496a23e1.tar.gz
add basic error messaging on mumd
Diffstat (limited to 'mumd')
-rw-r--r--mumd/src/command.rs6
-rw-r--r--mumd/src/main.rs8
-rw-r--r--mumd/src/state.rs31
3 files changed, 29 insertions, 16 deletions
diff --git a/mumd/src/command.rs b/mumd/src/command.rs
index 9adf7d8..6314870 100644
--- a/mumd/src/command.rs
+++ b/mumd/src/command.rs
@@ -8,7 +8,7 @@ use tokio::sync::mpsc;
pub async fn handle(
state: Arc<Mutex<State>>,
- mut command_receiver: mpsc::UnboundedReceiver<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>,
+ mut command_receiver: mpsc::UnboundedReceiver<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>,
) {
debug!("Begin listening for commands");
loop {
@@ -16,13 +16,17 @@ pub async fn handle(
let command = command_receiver.recv().await.unwrap();
debug!("Received command {:?}", command.0);
let mut state = state.lock().unwrap();
+ debug!("Got mutex lock");
let (wait_for_connected, command_response) = state.handle_command(command.0).await;
if wait_for_connected {
let mut watcher = state.phase_receiver();
drop(state);
+ debug!("Waiting to be connected");
while !matches!(watcher.recv().await.unwrap(), StatePhase::Connected) {}
}
+ debug!("Sending response");
command.1.send(command_response).unwrap();
+ debug!("Sent response");
}
//TODO err if not connected
//while let Some(command) = command_receiver.recv().await {
diff --git a/mumd/src/main.rs b/mumd/src/main.rs
index 8639c35..7ab3c61 100644
--- a/mumd/src/main.rs
+++ b/mumd/src/main.rs
@@ -27,7 +27,7 @@ async fn main() {
// For simplicity we don't deal with re-syncing, real applications would have to.
let (crypt_state_sender, crypt_state_receiver) = mpsc::channel::<ClientCryptState>(1); // crypt state should always be consumed before sending a new one
let (packet_sender, packet_receiver) = mpsc::unbounded_channel::<ControlPacket<Serverbound>>();
- let (command_sender, command_receiver) = mpsc::unbounded_channel::<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>();
+ let (command_sender, command_receiver) = mpsc::unbounded_channel::<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>();
let (connection_info_sender, connection_info_receiver) =
watch::channel::<Option<ConnectionInfo>>(None);
@@ -62,16 +62,16 @@ async fn main() {
}
fn receive_oneshot_commands(
- command_sender: mpsc::UnboundedSender<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>,
+ command_sender: mpsc::UnboundedSender<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>,
) {
loop {
// create listener
- let (server, server_name): (IpcOneShotServer<(Command, IpcSender<Result<Option<CommandResponse>, ()>>)>, String) = IpcOneShotServer::new().unwrap();
+ let (server, server_name): (IpcOneShotServer<(Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)>, String) = IpcOneShotServer::new().unwrap();
fs::write("/var/tmp/mumd-oneshot", &server_name).unwrap();
debug!("Listening for command at {}...", server_name);
// receive command and response channel
- let (_, conn): (_, (Command, IpcSender<Result<Option<CommandResponse>, ()>>)) = server.accept().unwrap();
+ let (_, conn): (_, (Command, IpcSender<mumlib::error::Result<Option<CommandResponse>>>)) = server.accept().unwrap();
debug!("Sending command {:?} to command handler", conn.0);
command_sender.send(conn).unwrap();
}
diff --git a/mumd/src/state.rs b/mumd/src/state.rs
index 0fd814c..0b3663d 100644
--- a/mumd/src/state.rs
+++ b/mumd/src/state.rs
@@ -9,6 +9,7 @@ use mumlib::command::{Command, CommandResponse};
use mumlib::state::Server;
use std::net::ToSocketAddrs;
use tokio::sync::{mpsc, watch};
+use mumlib::error::Error;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum StatePhase {
@@ -50,12 +51,17 @@ impl State {
pub async fn handle_command(
&mut self,
command: Command,
- ) -> (bool, Result<Option<CommandResponse>, ()>) {
+ ) -> (bool, mumlib::error::Result<Option<CommandResponse>>) {
match command {
Command::ChannelJoin { channel_id } => {
if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
warn!("Not connected");
- return (false, Err(()));
+ return (false, Err(Error::DisconnectedError));
+ }
+ if let Some(server) = &self.server {
+ if !server.channels().contains_key(&channel_id) {
+ return (false, Err(Error::InvalidChannelIdError));
+ }
}
let mut msg = msgs::UserState::new();
msg.set_session(self.session_id.unwrap());
@@ -66,7 +72,7 @@ impl State {
Command::ChannelList => {
if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
warn!("Not connected");
- return (false, Err(()));
+ return (false, Err(Error::DisconnectedError));
}
(
false,
@@ -83,7 +89,7 @@ impl State {
} => {
if !matches!(*self.phase_receiver().borrow(), StatePhase::Disconnected) {
warn!("Tried to connect to a server while already connected");
- return (false, Err(()));
+ return (false, Err(Error::AlreadyConnectedError));
}
self.server = Some(Server::new());
self.username = Some(username);
@@ -91,11 +97,14 @@ impl State {
.0
.broadcast(StatePhase::Connecting)
.unwrap();
- let socket_addr = (host.as_ref(), port)
- .to_socket_addrs()
- .expect("Failed to parse server address")
- .next()
- .expect("Failed to resolve server address");
+
+ let socket_addr = match (host.as_ref(), port).to_socket_addrs().map(|mut e| e.next()) {
+ Ok(Some(v)) => v,
+ _ => {
+ warn!("Error parsing server addr");
+ return (false, Err(Error::InvalidServerAddrError));
+ }
+ };
self.connection_info_sender
.broadcast(Some(ConnectionInfo::new(
socket_addr,
@@ -108,13 +117,13 @@ impl State {
Command::Status => {
if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) {
warn!("Not connected");
- return (false, Err(()));
+ return (false, Err(Error::DisconnectedError));
}
(
false,
Ok(Some(CommandResponse::Status {
username: self.username.clone(),
- server_state: self.server.clone().unwrap(),
+ server_state: self.server.clone().unwrap(), //guaranteed not to panic because if we are connected, server is guaranteed to be Some
})),
)
}