#[cfg(unix)]
pub fn exec_reload(
raw_fd: std::os::unix::io::RawFd,
nick: &str,
server: &str,
channels: &[String],
keepalive_interval_ms: u64,
keepalive_timeout_ms: u64,
) -> crate::BoxError {
use std::os::unix::process::CommandExt;
let flags = unsafe { libc::fcntl(raw_fd, libc::F_GETFD) };
if flags == -1 {
return format!("fcntl(F_GETFD) failed: {}", std::io::Error::last_os_error()).into();
}
let rc = unsafe { libc::fcntl(raw_fd, libc::F_SETFD, flags & !libc::FD_CLOEXEC) };
if rc == -1 {
return format!("fcntl(F_SETFD) failed: {}", std::io::Error::last_os_error()).into();
}
let exe = match std::env::current_exe() {
Ok(p) => p,
Err(e) => return Box::new(e),
};
let err = std::process::Command::new(&exe)
.env(ENV_FD, raw_fd.to_string())
.env(ENV_NICK, nick)
.env(ENV_SERVER, server)
.env(ENV_CHANNELS, channels.join(","))
.env(ENV_KA_INTERVAL, keepalive_interval_ms.to_string())
.env(ENV_KA_TIMEOUT, keepalive_timeout_ms.to_string())
.exec();
Box::new(err)
}
pub const ENV_FD: &str = "IRCBOT_INHERIT_FD";
pub const ENV_NICK: &str = "IRCBOT_NICK";
pub const ENV_SERVER: &str = "IRCBOT_SERVER";
pub const ENV_CHANNELS: &str = "IRCBOT_CHANNELS";
pub const ENV_KA_INTERVAL: &str = "IRCBOT_KEEPALIVE_INTERVAL_MS";
pub const ENV_KA_TIMEOUT: &str = "IRCBOT_KEEPALIVE_TIMEOUT_MS";