aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mumctl/src/main.rs7
-rw-r--r--mumd/src/command.rs6
-rw-r--r--mumd/src/main.rs8
-rw-r--r--mumd/src/state.rs31
-rw-r--r--mumlib/src/error.rs11
-rw-r--r--mumlib/src/lib.rs1
6 files changed, 44 insertions, 20 deletions
diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs
index 403447f..9bb96a8 100644
--- a/mumctl/src/main.rs
+++ b/mumctl/src/main.rs
@@ -1,4 +1,4 @@
-use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
+use ipc_channel::ipc::{self, IpcSender};
use log::*;
use mumlib::command::{Command, CommandResponse};
use mumlib::setup_logger;
@@ -10,14 +10,13 @@ fn main() {
// MUMCTL
//temp send command and channel to listener
debug!("Creating channel");
- let (tx_client, rx_client): (IpcSender<Result<Option<CommandResponse>, ()>>,
- IpcReceiver<Result<Option<CommandResponse>, ()>>) = ipc::channel().unwrap();
+ let (tx_client, rx_client) = ipc::channel::<mumlib::error::Result<Option<CommandResponse>>>().unwrap();
let server_name = fs::read_to_string("/var/tmp/mumd-oneshot").unwrap(); //TODO don't panic
debug!("Connecting to mumd at {}", server_name);
let tx0 = IpcSender::connect(server_name).unwrap();
let connect_command = Command::ServerConnect {
- host: "10.0.0.10".to_string(),
+ host: "icahasse.se".to_string(),
port: 64738u16,
username: "gustav-mumd".to_string(),
accept_invalid_cert: true,
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
})),
)
}
diff --git a/mumlib/src/error.rs b/mumlib/src/error.rs
new file mode 100644
index 0000000..20415b0
--- /dev/null
+++ b/mumlib/src/error.rs
@@ -0,0 +1,11 @@
+use serde::{Serialize, Deserialize};
+
+pub type Result<T> = std::result::Result<T, Error>;
+
+#[derive(Debug, Serialize, Deserialize)]
+pub enum Error {
+ DisconnectedError,
+ AlreadyConnectedError,
+ InvalidChannelIdError,
+ InvalidServerAddrError,
+} \ No newline at end of file
diff --git a/mumlib/src/lib.rs b/mumlib/src/lib.rs
index ebf2019..b77653c 100644
--- a/mumlib/src/lib.rs
+++ b/mumlib/src/lib.rs
@@ -1,5 +1,6 @@
pub mod command;
pub mod state;
+pub mod error;
use colored::*;
use log::*;