From df6d6cb3a70cbea9d088c7af47f3540896b98089 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 25 May 2021 16:26:31 +0530 Subject: [PATCH] check for residual socket files and clean them --- src/sessions.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/sessions.rs b/src/sessions.rs index ee72a34d..fd834e40 100644 --- a/src/sessions.rs +++ b/src/sessions.rs @@ -1,6 +1,10 @@ use std::os::unix::fs::FileTypeExt; use std::{fs, io, process}; -use zellij_utils::consts::ZELLIJ_SOCK_DIR; +use zellij_utils::{ + consts::ZELLIJ_SOCK_DIR, + interprocess::local_socket::LocalSocketStream, + ipc::{ClientToServerMsg, IpcSenderWithContext}, +}; fn get_sessions() -> Result, io::ErrorKind> { match fs::read_dir(&*ZELLIJ_SOCK_DIR) { @@ -8,8 +12,9 @@ fn get_sessions() -> Result, io::ErrorKind> { let mut sessions = Vec::new(); files.for_each(|file| { let file = file.unwrap(); - if file.file_type().unwrap().is_socket() { - sessions.push(file.file_name().into_string().unwrap()); + let file_name = file.file_name().into_string().unwrap(); + if file.file_type().unwrap().is_socket() && assert_socket(&file_name) { + sessions.push(file_name); } }); Ok(sessions) @@ -84,3 +89,21 @@ pub(crate) fn assert_session_ne(name: &str) { }; process::exit(exit_code); } + +fn assert_socket(name: &str) -> bool { + let path = &*ZELLIJ_SOCK_DIR.join(name); + match LocalSocketStream::connect(path) { + Ok(stream) => { + IpcSenderWithContext::new(stream).send(ClientToServerMsg::ClientExited); + true + } + Err(e) => { + if e.kind() == io::ErrorKind::ConnectionRefused { + drop(fs::remove_file(path)); + false + } else { + true + } + } + } +}