diff options
Diffstat (limited to 'alacritty/src/daemon.rs')
-rw-r--r-- | alacritty/src/daemon.rs | 94 |
1 files changed, 46 insertions, 48 deletions
diff --git a/alacritty/src/daemon.rs b/alacritty/src/daemon.rs index 4b95cb6b..730a2cc7 100644 --- a/alacritty/src/daemon.rs +++ b/alacritty/src/daemon.rs @@ -1,42 +1,31 @@ -#[cfg(not(windows))] -use std::error::Error; use std::ffi::OsStr; -use std::fmt::Debug; #[cfg(not(any(target_os = "macos", windows)))] use std::fs; use std::io; -#[cfg(not(windows))] -use std::os::unix::process::CommandExt; #[cfg(windows)] use std::os::windows::process::CommandExt; -#[cfg(not(windows))] -use std::path::PathBuf; use std::process::{Command, Stdio}; -use log::{debug, warn}; -#[cfg(windows)] -use winapi::um::winbase::{CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW}; +#[rustfmt::skip] +#[cfg(not(windows))] +use { + std::error::Error, + std::os::unix::process::CommandExt, + std::os::unix::io::RawFd, + std::path::PathBuf, +}; #[cfg(not(windows))] -use alacritty_terminal::tty; +use libc::pid_t; +#[cfg(windows)] +use winapi::um::winbase::{CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW}; #[cfg(target_os = "macos")] use crate::macos; -/// Start the daemon and log error on failure. -pub fn start_daemon<I, S>(program: &str, args: I) -where - I: IntoIterator<Item = S> + Debug + Copy, - S: AsRef<OsStr>, -{ - match spawn_daemon(program, args) { - Ok(_) => debug!("Launched {} with args {:?}", program, args), - Err(_) => warn!("Unable to launch {} with args {:?}", program, args), - } -} - +/// Start a new process in the background. #[cfg(windows)] -fn spawn_daemon<I, S>(program: &str, args: I) -> io::Result<()> +pub fn spawn_daemon<I, S>(program: &str, args: I) -> io::Result<()> where I: IntoIterator<Item = S> + Copy, S: AsRef<OsStr>, @@ -55,37 +44,21 @@ where .map(|_| ()) } -/// Get working directory of controlling process. -#[cfg(not(windows))] -pub fn foreground_process_path() -> Result<PathBuf, Box<dyn Error>> { - let mut pid = unsafe { libc::tcgetpgrp(tty::master_fd()) }; - if pid < 0 { - pid = tty::child_pid(); - } - - #[cfg(not(any(target_os = "macos", target_os = "freebsd")))] - let link_path = format!("/proc/{}/cwd", pid); - #[cfg(target_os = "freebsd")] - let link_path = format!("/compat/linux/proc/{}/cwd", pid); - - #[cfg(not(target_os = "macos"))] - let cwd = fs::read_link(link_path)?; - - #[cfg(target_os = "macos")] - let cwd = macos::proc::cwd(pid)?; - - Ok(cwd) -} - +/// Start a new process in the background. #[cfg(not(windows))] -fn spawn_daemon<I, S>(program: &str, args: I) -> io::Result<()> +pub fn spawn_daemon<I, S>( + program: &str, + args: I, + master_fd: RawFd, + shell_pid: u32, +) -> io::Result<()> where I: IntoIterator<Item = S> + Copy, S: AsRef<OsStr>, { let mut command = Command::new(program); command.args(args).stdin(Stdio::null()).stdout(Stdio::null()).stderr(Stdio::null()); - if let Ok(cwd) = foreground_process_path() { + if let Ok(cwd) = foreground_process_path(master_fd, shell_pid) { command.current_dir(cwd); } unsafe { @@ -108,3 +81,28 @@ where .map(|_| ()) } } + +/// Get working directory of controlling process. +#[cfg(not(windows))] +pub fn foreground_process_path( + master_fd: RawFd, + shell_pid: u32, +) -> Result<PathBuf, Box<dyn Error>> { + let mut pid = unsafe { libc::tcgetpgrp(master_fd) }; + if pid < 0 { + pid = shell_pid as pid_t; + } + + #[cfg(not(any(target_os = "macos", target_os = "freebsd")))] + let link_path = format!("/proc/{}/cwd", pid); + #[cfg(target_os = "freebsd")] + let link_path = format!("/compat/linux/proc/{}/cwd", pid); + + #[cfg(not(target_os = "macos"))] + let cwd = fs::read_link(link_path)?; + + #[cfg(target_os = "macos")] + let cwd = macos::proc::cwd(pid)?; + + Ok(cwd) +} |