From 32cb48774ad139c7f4fe9864e28fefeaa1009c79 Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Thu, 21 Mar 2019 19:55:19 +0000 Subject: [PATCH] Remove deprecated libc::daemon call Since version 10.5 of macOS the libc::daemon call has been deprecated. While it is recommended by macOS to use launchd instead, this is not easily available on other unix platforms. However since we just spawn a daemon process to prevent Alacritty from spawning zombies, we can manually invoke `fork` in the child process to cause a double-fork and re-parent the child process under init so it can be reaped automatically. Since the daemon call is not part of POSIX, using the double fork on all unix platforms also has some portability advantages. --- src/util.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/util.rs b/src/util.rs index b7a05041..4532d2e4 100644 --- a/src/util.rs +++ b/src/util.rs @@ -15,6 +15,7 @@ use std::{cmp, io}; use std::ffi::OsStr; use std::process::Command; +use std::process::Stdio; #[cfg(not(windows))] use std::os::unix::process::CommandExt; @@ -22,8 +23,6 @@ use std::os::unix::process::CommandExt; #[cfg(windows)] use std::os::windows::process::CommandExt; #[cfg(windows)] -use std::process::Stdio; -#[cfg(windows)] use winapi::um::winbase::{CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW}; /// Threading utilities @@ -94,8 +93,13 @@ pub fn start_daemon(program: &str, args: I) -> io::Result<()> { Command::new(program) .args(args) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) .before_exec(|| unsafe { - ::libc::daemon(1, 0); + if ::libc::fork() != 0 { + std::process::exit(0); + } Ok(()) }) .spawn()?