use std::process;
#[cfg(target_os = "linux")]
use microsandbox_agentd::{AgentdConfig, AgentdError, BootParams, agent, clock, handoff, init};
#[cfg(not(target_os = "linux"))]
fn main() {
eprintln!("agentd is only supported on Linux");
process::exit(1);
}
#[cfg(target_os = "linux")]
fn main() {
let boot_time_ns = clock::boottime_ns();
let mut boot = match BootParams::from_env() {
Ok(b) => b,
Err(e) => {
eprintln!("agentd: config parse failed: {e}");
process::exit(1);
}
};
let config = match AgentdConfig::from_env() {
Ok(c) => c,
Err(e) => {
eprintln!("agentd: config parse failed: {e}");
process::exit(1);
}
};
let handoff_spec = boot.take_handoff_init();
let init_start = clock::boottime_ns();
if let Err(e) = init::init(boot) {
eprintln!("agentd: init failed: {e}");
process::exit(1);
}
let init_time_ns = clock::boottime_ns() - init_start;
if let Some(spec) = handoff_spec
&& let Err(e) = handoff::do_handoff(spec)
{
eprintln!("agentd: handoff failed: {e}");
process::exit(1);
}
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.expect("agentd: failed to build tokio runtime");
rt.block_on(async {
match agent::run(boot_time_ns, init_time_ns, &config).await {
Ok(()) => {}
Err(AgentdError::Shutdown) => {}
Err(e) => {
eprintln!("agentd: agent loop error: {e}");
process::exit(1);
}
}
});
process::exit(0);
}