use std::ffi::CString;
use std::path::Path;
pub fn exec_with_interp(
target: &Path,
interpreter: &Path,
lib_path: &str,
argv0: &str,
args: &[String],
) -> ! {
let interp_str = interpreter.to_string_lossy();
let target_str = target.to_string_lossy();
let is_musl = interpreter
.file_name()
.and_then(|n| n.to_str())
.is_some_and(|n| n.starts_with("ld-musl-"));
let mut options = userland_execve::ExecOptions::new(interpreter);
let interp_argv0 = CString::new(interp_str.as_ref()).unwrap();
options.arg(&interp_argv0);
if !is_musl {
let f = CString::new("--inhibit-cache").unwrap();
options.arg(&f);
}
if !lib_path.is_empty() {
let f = CString::new("--library-path").unwrap();
let v = CString::new(lib_path).unwrap();
options.arg(&f);
options.arg(&v);
}
let argv0_flag = CString::new("--argv0").unwrap();
let argv0_val = CString::new(argv0).unwrap();
options.arg(&argv0_flag);
options.arg(&argv0_val);
let target_c = CString::new(target_str.as_ref()).unwrap();
options.arg(&target_c);
for arg in args {
let arg_c = CString::new(arg.as_str()).unwrap();
options.arg(&arg_c);
}
for (key, value) in std::env::vars() {
let key_c = CString::new(key).unwrap();
let value_c = CString::new(value).unwrap();
options.env(&key_c, &value_c);
}
userland_execve::exec_with_options(options)
}
pub const fn is_supported() -> bool {
cfg!(all(
target_os = "linux",
any(target_arch = "x86_64", target_arch = "aarch64")
))
}