use std::io;
use std::os::unix::io::AsRawFd;
pub fn daemonize() -> io::Result<()> {
match unsafe { libc::fork() } {
-1 => return Err(io::Error::last_os_error()),
0 => {} _ => std::process::exit(0), }
if unsafe { libc::setsid() } == -1 {
return Err(io::Error::last_os_error());
}
match unsafe { libc::fork() } {
-1 => return Err(io::Error::last_os_error()),
0 => {} _ => std::process::exit(0), }
let devnull = std::fs::File::open("/dev/null")?;
let devnull_fd = devnull.as_raw_fd();
unsafe {
libc::dup2(devnull_fd, 0); libc::dup2(devnull_fd, 1); libc::dup2(devnull_fd, 2); }
std::env::set_current_dir("/")?;
unsafe {
libc::umask(0);
}
Ok(())
}
pub fn spawn_server_detached(session_name: Option<&str>, ssh_url: Option<&str>) -> io::Result<u32> {
let exe = std::env::current_exe()?;
let mut args = vec!["--server".to_string()];
if let Some(name) = session_name {
args.push("--session-name".to_string());
args.push(name.to_string());
}
if let Some(url) = ssh_url {
args.push("--ssh-url".to_string());
args.push(url.to_string());
}
let child = std::process::Command::new(&exe)
.args(&args)
.stdin(std::process::Stdio::null())
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.spawn()?;
Ok(child.id())
}
pub fn is_process_running(pid: u32) -> bool {
unsafe { libc::kill(pid as i32, 0) == 0 }
}