use std::io;
pub fn fork_daemon() -> io::Result<ForkResult> {
let pid = unsafe { libc::fork() };
match pid {
-1 => Err(io::Error::last_os_error()),
0 => {
if unsafe { libc::setsid() } == -1 {
eprintln!("setsid failed: {}", io::Error::last_os_error());
std::process::exit(1);
}
redirect_stdio_to_devnull();
Ok(ForkResult::Child)
}
child_pid => {
Ok(ForkResult::Parent(child_pid))
}
}
}
pub enum ForkResult {
Parent(i32),
Child,
}
fn redirect_stdio_to_devnull() {
unsafe {
let devnull = libc::open(c"/dev/null".as_ptr(), libc::O_RDWR);
if devnull >= 0 {
let _ = libc::dup2(devnull, libc::STDIN_FILENO);
let _ = libc::dup2(devnull, libc::STDOUT_FILENO);
let _ = libc::dup2(devnull, libc::STDERR_FILENO);
if devnull > libc::STDERR_FILENO {
let _ = libc::close(devnull);
}
}
}
}