aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/main.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-11-28 02:46:10 +0100
committerGustav Sörnäs <gustav@sornas.net>2020-11-28 02:46:10 +0100
commit1014f6c85b3d77009d8ee34f9517c73fc32f5379 (patch)
tree3736f150813671ef0ac3aa8f2a847021ca7bb3a7 /mumd/src/main.rs
parent790fdc02d071d0f110eff1b17374f315a1516fb7 (diff)
parent7f04dcfc4c04f2266f1399f238f8869c1c09b57a (diff)
downloadmum-1014f6c85b3d77009d8ee34f9517c73fc32f5379.tar.gz
Merge branch 'dont-overwrite-socket-file' into 'main'
Dont overwrite socket file Closes #72 See merge request gustav/mum!40
Diffstat (limited to 'mumd/src/main.rs')
-rw-r--r--mumd/src/main.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/mumd/src/main.rs b/mumd/src/main.rs
index b83299f..db6d2ef 100644
--- a/mumd/src/main.rs
+++ b/mumd/src/main.rs
@@ -8,7 +8,7 @@ use crate::network::ConnectionInfo;
use crate::state::State;
use futures::join;
-use ipc_channel::ipc::{IpcOneShotServer, IpcSender};
+use ipc_channel::ipc::{self, IpcOneShotServer, IpcSender};
use log::*;
use mumble_protocol::control::ControlPacket;
use mumble_protocol::crypt::ClientCryptState;
@@ -25,6 +25,26 @@ async fn main() {
setup_logger(std::io::stderr(), true);
notify::init();
+ // check if another instance is live
+ let (tx_client, rx_client) =
+ ipc::channel::<mumlib::error::Result<Option<CommandResponse>>>().unwrap();
+ if let Ok(server_name) = fs::read_to_string(mumlib::SOCKET_PATH) {
+ if let Ok(tx0) = IpcSender::connect(server_name) {
+ if tx0.send((Command::Ping, tx_client)).is_ok() {
+ match rx_client.recv() {
+ Ok(Ok(Some(CommandResponse::Pong))) => {
+ error!("Another instance of mumd is already running");
+ return;
+ },
+ resp => {
+ warn!("Ping with weird response. Continuing...");
+ debug!("Response was {:?}", resp);
+ }
+ }
+ }
+ }
+ }
+
// Oneshot channel for setting UDP CryptState from control task
// 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