use std::path::PathBuf;
use std::process::{Command, ExitCode};
const TM_NOT_STARTED: u8 = 127;
fn sibling_tm() -> std::io::Result<PathBuf> {
let exe = std::env::current_exe()?;
Ok(exe.with_file_name(format!("tm{}", std::env::consts::EXE_SUFFIX)))
}
#[cfg(unix)]
fn run(tm: PathBuf) -> ExitCode {
use std::os::unix::process::CommandExt as _;
let mut args = std::env::args_os();
let mut cmd = Command::new(&tm);
if let Some(arg0) = args.next() {
cmd.arg0(arg0);
}
let err = cmd.args(args).exec();
eprintln!("trusty-mpm: cannot run {}: {err}", tm.display());
ExitCode::from(TM_NOT_STARTED)
}
#[cfg(not(unix))]
fn run(tm: PathBuf) -> ExitCode {
match Command::new(&tm).args(std::env::args_os().skip(1)).status() {
Ok(status) => ExitCode::from(status.code().map_or(1, |c| c as u8)),
Err(err) => {
eprintln!("trusty-mpm: cannot run {}: {err}", tm.display());
ExitCode::from(TM_NOT_STARTED)
}
}
}
fn main() -> ExitCode {
match sibling_tm() {
Ok(tm) => run(tm),
Err(err) => {
eprintln!("trusty-mpm: cannot locate this executable: {err}");
ExitCode::from(TM_NOT_STARTED)
}
}
}