diff --git a/main.ts b/main.ts index ab6e94b..8f3eb88 100644 --- a/main.ts +++ b/main.ts @@ -118,7 +118,8 @@ async function validateInstance() { async function checkAlreadyRunning() { try { - const running = await invoke('is_rclone_running') + const rcPort = 5572 + const running = await invoke('is_rclone_running', { port: rcPort }) if (running) { const confirmed = await ask( 'Rclone is already running on this system.\n\nPlease stop it before launching Rclone UI.', diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4bf59d7..1575038 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -183,7 +183,27 @@ fn get_uid() -> String { } #[tauri::command] -fn is_rclone_running() -> bool { +fn is_rclone_running(port: Option) -> bool { + + if let Some(port) = port { + use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, TcpStream}; + use std::time::Duration; + + let timeout = Duration::from_millis(200); + let addrs = [ + SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), port), + SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), port), + ]; + + for addr in addrs.iter() { + if let Ok(stream) = TcpStream::connect_timeout(addr, timeout) { + drop(stream); + return true; + } + } + + return false; + } let system = System::new_all(); for (_pid, process) in system.processes() {