aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/daemon.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/daemon.rs')
-rw-r--r--alacritty/src/daemon.rs94
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)
+}