use std::io;
use std::os::unix::io::AsRawFd;
use std::path::Path;
pub fn daemonize(log_path: &Path) -> io::Result<()> {
unsafe {
match libc::fork() {
-1 => return Err(io::Error::last_os_error()),
0 => {}
_ => std::process::exit(0),
}
if libc::setsid() == -1 {
return Err(io::Error::last_os_error());
}
match libc::fork() {
-1 => return Err(io::Error::last_os_error()),
0 => {}
_ => std::process::exit(0),
}
libc::umask(0);
libc::chdir(c"/".as_ptr());
}
let log = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(log_path)?;
let devnull = std::fs::OpenOptions::new().read(true).open("/dev/null")?;
unsafe {
libc::dup2(devnull.as_raw_fd(), 0);
libc::dup2(log.as_raw_fd(), 1);
libc::dup2(log.as_raw_fd(), 2);
}
std::mem::forget(log);
std::mem::forget(devnull);
Ok(())
}