27 lines
1.1 KiB
Rust
27 lines
1.1 KiB
Rust
#![cfg(unix)]
|
|
|
|
use std::{env, os::unix::process::CommandExt, process::Command};
|
|
|
|
use conduit::{debug, info, utils};
|
|
|
|
pub(super) fn restart() -> ! {
|
|
// SAFETY: We have allowed an override for the case where the current_exe() has
|
|
// been replaced or removed. By default the server will fail to restart if the
|
|
// binary has been replaced (i.e. by cargo); this is for security purposes.
|
|
// Command::exec() used to panic in that case.
|
|
//
|
|
// We can (and do) prevent that panic by checking the result of current_exe()
|
|
// prior to committing to restart, returning an error to the user without any
|
|
// unexpected shutdown. In a nutshell that is the execuse for this unsafety.
|
|
// Nevertheless, we still want a way to override the restart preventation (i.e.
|
|
// admin server restart --force).
|
|
let exe = unsafe { utils::sys::current_exe().expect("program path must be available") };
|
|
let envs = env::vars();
|
|
let args = env::args().skip(1);
|
|
debug!(?exe, ?args, ?envs, "Restart");
|
|
|
|
info!("Restart");
|
|
|
|
let error = Command::new(exe).args(args).envs(envs).exec();
|
|
panic!("{error:?}");
|
|
}
|