From 01e2aee16455fba8122b674a4753ef16a73076da Mon Sep 17 00:00:00 2001 From: Iris Pupo Date: Sun, 4 Dec 2022 00:03:55 -0500 Subject: [PATCH 1/3] added new function for listener struct --- apps/magpie/src/service/ipc.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/magpie/src/service/ipc.rs b/apps/magpie/src/service/ipc.rs index c4271bf..1ecb694 100644 --- a/apps/magpie/src/service/ipc.rs +++ b/apps/magpie/src/service/ipc.rs @@ -66,6 +66,21 @@ impl DerefMut for Listener { } } +impl Listener { + fn new() -> std::io::Result{ + let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); + let sock_dir = Path::new(&sock_dir); + let sock_path = sock_dir.join(SOCK_NAME); + eprintln!("Making socket at: {:?}", sock_path); + + let uds = UnixListener::bind(&sock_path)?; + let path = sock_path.to_path_buf(); + Ok(Self{uds, path}) + } + +} + + pub struct IpcData { poll: Poll, window_to_client_panel: HashMap, @@ -162,15 +177,8 @@ pub struct Ipc { impl Ipc { pub fn new(window_sender: WindowMessageSender) -> std::io::Result<(Self, IpcMessageSender)> { - let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); - let sock_dir = Path::new(&sock_dir); - let sock_path = sock_dir.join(SOCK_NAME); - eprintln!("Making socket at: {:?}", sock_path); - let mut listener = Listener { - uds: UnixListener::bind(&sock_path)?, - path: sock_path.to_path_buf(), - }; + let mut listener = Listener::new()?; let mut signals = Signals::new(Signal::Interrupt | Signal::Quit)?; @@ -301,3 +309,4 @@ impl Ipc { } } } + From 0768a7dc6190418dfaa049ea544a18d79e141e08 Mon Sep 17 00:00:00 2001 From: Iris Pupo Date: Sun, 4 Dec 2022 01:08:36 -0500 Subject: [PATCH 2/3] Handle previous sockets in Listener::new() --- apps/magpie/src/service/ipc.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/magpie/src/service/ipc.rs b/apps/magpie/src/service/ipc.rs index 1ecb694..c9f0300 100644 --- a/apps/magpie/src/service/ipc.rs +++ b/apps/magpie/src/service/ipc.rs @@ -17,6 +17,8 @@ use slab::Slab; use crate::protocol::*; use crate::service::window::{WindowMessage, WindowMessageSender}; +use std::io::{Error, ErrorKind}; + const SOCK_NAME: &str = "magpie.sock"; #[derive(Debug)] @@ -71,8 +73,24 @@ impl Listener { let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); let sock_dir = Path::new(&sock_dir); let sock_path = sock_dir.join(SOCK_NAME); - eprintln!("Making socket at: {:?}", sock_path); + match UnixStream::connect(&sock_path) { + Ok(_) => { + eprintln!("Socket is already in use. Another instance of Magpie may be running."); + let kind = ErrorKind::AddrInUse; + let error = Error::new(kind, "Socket is already in use."); + return Err(error); + } + Err(ref err) if err.kind() == ErrorKind::ConnectionRefused => { + eprintln!("Found leftover socket; removing"); + std::fs::remove_file(&sock_path)?; + } + Err(ref err) if err.kind() == ErrorKind::NotFound => {} + Err(err) => return Err(err) + + } + + eprintln!("Making socket at: {:?}", sock_path); let uds = UnixListener::bind(&sock_path)?; let path = sock_path.to_path_buf(); Ok(Self{uds, path}) From c8a6aa6fbd8b210e13e3613dc5c3f5f36d250c51 Mon Sep 17 00:00:00 2001 From: mars Date: Sun, 4 Dec 2022 14:39:06 -0700 Subject: [PATCH 3/3] Cleanup socket cleanup code --- apps/magpie/src/service/ipc.rs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/apps/magpie/src/service/ipc.rs b/apps/magpie/src/service/ipc.rs index c9f0300..ad9dce2 100644 --- a/apps/magpie/src/service/ipc.rs +++ b/apps/magpie/src/service/ipc.rs @@ -17,8 +17,6 @@ use slab::Slab; use crate::protocol::*; use crate::service::window::{WindowMessage, WindowMessageSender}; -use std::io::{Error, ErrorKind}; - const SOCK_NAME: &str = "magpie.sock"; #[derive(Debug)] @@ -69,11 +67,12 @@ impl DerefMut for Listener { } impl Listener { - fn new() -> std::io::Result{ + fn new() -> std::io::Result { let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); let sock_dir = Path::new(&sock_dir); let sock_path = sock_dir.join(SOCK_NAME); + use std::io::{Error, ErrorKind}; match UnixStream::connect(&sock_path) { Ok(_) => { eprintln!("Socket is already in use. Another instance of Magpie may be running."); @@ -82,23 +81,20 @@ impl Listener { return Err(error); } Err(ref err) if err.kind() == ErrorKind::ConnectionRefused => { - eprintln!("Found leftover socket; removing"); + eprintln!("Found leftover socket; removing."); std::fs::remove_file(&sock_path)?; } Err(ref err) if err.kind() == ErrorKind::NotFound => {} - Err(err) => return Err(err) - + Err(err) => return Err(err), } eprintln!("Making socket at: {:?}", sock_path); let uds = UnixListener::bind(&sock_path)?; let path = sock_path.to_path_buf(); - Ok(Self{uds, path}) + Ok(Self { uds, path }) } - } - pub struct IpcData { poll: Poll, window_to_client_panel: HashMap, @@ -195,7 +191,6 @@ pub struct Ipc { impl Ipc { pub fn new(window_sender: WindowMessageSender) -> std::io::Result<(Self, IpcMessageSender)> { - let mut listener = Listener::new()?; let mut signals = Signals::new(Signal::Interrupt | Signal::Quit)?; @@ -327,4 +322,3 @@ impl Ipc { } } } -