diff --git a/Cargo.lock b/Cargo.lock index b7f0f387e5..2294d6550e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -415,6 +415,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "cranelift-bforest" version = "0.68.0" @@ -612,26 +618,6 @@ dependencies = [ "syn", ] -[[package]] -name = "darwin-libproc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc629b7cf42586fee31dae31f9ab73fa5ff5f0170016aa61be5fcbc12a90c516" -dependencies = [ - "darwin-libproc-sys", - "libc", - "memchr", -] - -[[package]] -name = "darwin-libproc-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef0aa083b94c54aa4cfd9bbfd37856714c139d1dc511af80270558c7ba3b4816" -dependencies = [ - "libc", -] - [[package]] name = "derivative" version = "2.2.0" @@ -1157,9 +1143,9 @@ checksum = "4d234d89ecf5621c935b69a4c7266c9a634a95e465081682be47358617ce825b" [[package]] name = "libc" -version = "0.2.106" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a60553f9a9e039a333b4e9b20573b9e9b9c0bb3a11e201ccc48ef4283456d673" +checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" [[package]] name = "libloading" @@ -2147,6 +2133,21 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "sysinfo" +version = "0.22.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f1bfab07306a27332451a662ca9c8156e3a9986f82660ba9c8e744fe8455d43" +dependencies = [ + "cfg-if 1.0.0", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "winapi", +] + [[package]] name = "tab-bar" version = "0.1.0" @@ -2871,11 +2872,11 @@ dependencies = [ "chrono", "close_fds", "daemonize", - "darwin-libproc", "highway", "insta", "log", "serde_json", + "sysinfo", "typetag", "unicode-width", "url", diff --git a/src/tests/e2e/cases.rs b/src/tests/e2e/cases.rs index e1d32ee610..3fb0d44d95 100644 --- a/src/tests/e2e/cases.rs +++ b/src/tests/e2e/cases.rs @@ -943,7 +943,7 @@ pub fn detach_and_attach_session() { name: "Wait for session to be attached", instruction: |remote_terminal: RemoteTerminal| -> bool { let mut step_is_complete = false; - if remote_terminal.cursor_position_is(77, 2) { + if remote_terminal.cursor_position_is(3, 2) { // we're back inside the session step_is_complete = true; } diff --git a/zellij-server/Cargo.toml b/zellij-server/Cargo.toml index 8482b10f3d..ebe63bf5b3 100644 --- a/zellij-server/Cargo.toml +++ b/zellij-server/Cargo.toml @@ -27,9 +27,7 @@ log = "0.4.14" typetag = "0.1.7" chrono = "0.4.19" close_fds = "0.3.2" - -[target.'cfg(target_os = "macos")'.dependencies] -darwin-libproc = "0.2.0" +sysinfo = "0.22.5" [dev-dependencies] insta = "1.6.0" diff --git a/zellij-server/src/os_input_output.rs b/zellij-server/src/os_input_output.rs index 50add75001..f0b49c68b0 100644 --- a/zellij-server/src/os_input_output.rs +++ b/zellij-server/src/os_input_output.rs @@ -2,12 +2,6 @@ use std::collections::HashMap; use crate::panes::PaneId; -#[cfg(target_os = "macos")] -use darwin_libproc; - -#[cfg(target_os = "linux")] -use std::fs; - use std::env; use std::os::unix::io::RawFd; use std::os::unix::process::CommandExt; @@ -21,6 +15,8 @@ use async_std::fs::File as AsyncFile; use async_std::os::unix::io::FromRawFd; use interprocess::local_socket::LocalSocketStream; +use sysinfo::{ProcessExt, ProcessRefreshKind, System, SystemExt}; + use nix::pty::{openpty, OpenptyResult, Winsize}; use nix::sys::signal::{kill, Signal}; use nix::sys::termios; @@ -338,16 +334,15 @@ impl ServerOsApi for ServerOsInputOutput { fn load_palette(&self) -> Palette { default_palette() } - #[cfg(target_os = "macos")] - fn get_cwd(&self, pid: Pid) -> Option { - darwin_libproc::pid_cwd(pid.as_raw()).ok() - } - #[cfg(target_os = "linux")] fn get_cwd(&self, pid: Pid) -> Option { - fs::read_link(format!("/proc/{}/cwd", pid)).ok() - } - #[cfg(all(not(target_os = "linux"), not(target_os = "macos")))] - fn get_cwd(&self, _pid: Pid) -> Option { + let mut system_info = System::new(); + // Update by minimizing information. + // See https://docs.rs/sysinfo/0.22.5/sysinfo/struct.ProcessRefreshKind.html# + system_info.refresh_processes_specifics(ProcessRefreshKind::default()); + + if let Some(process) = system_info.process(pid.into()) { + return Some(process.cwd().to_path_buf()); + } None } } @@ -376,3 +371,7 @@ pub struct ChildId { /// field is it's parent process id. pub shell: Option, } + +#[cfg(test)] +#[path = "./unit/os_input_output_tests.rs"] +mod os_input_output_tests; diff --git a/zellij-server/src/unit/os_input_output_tests.rs b/zellij-server/src/unit/os_input_output_tests.rs new file mode 100644 index 0000000000..b0e741d8f4 --- /dev/null +++ b/zellij-server/src/unit/os_input_output_tests.rs @@ -0,0 +1,49 @@ +use super::*; + +use nix::{pty::openpty, unistd::close}; + +struct TestTerminal { + openpty: OpenptyResult, +} + +impl TestTerminal { + pub fn new() -> TestTerminal { + let openpty = openpty(None, None).expect("Could not create openpty"); + TestTerminal { openpty } + } + + #[allow(dead_code)] + pub fn master(&self) -> RawFd { + self.openpty.master + } + + pub fn slave(&self) -> RawFd { + self.openpty.slave + } +} + +impl Drop for TestTerminal { + fn drop(&mut self) { + close(self.openpty.master).expect("Failed to close the master"); + close(self.openpty.slave).expect("Failed to close the slave"); + } +} + +#[test] +fn get_cwd() { + let test_terminal = TestTerminal::new(); + let test_termios = + termios::tcgetattr(test_terminal.slave()).expect("Could not configure the termios"); + + let server = ServerOsInputOutput { + orig_termios: Arc::new(Mutex::new(test_termios)), + client_senders: Arc::default(), + }; + + let pid = nix::unistd::getpid(); + assert!( + server.get_cwd(pid).is_some(), + "Get current working directory from PID {}", + pid + ); +}