diff --git a/crates/spaceshd/src/launchd.rs b/crates/spaceshd/src/launchd.rs new file mode 100644 index 0000000..46ae93d --- /dev/null +++ b/crates/spaceshd/src/launchd.rs @@ -0,0 +1,4 @@ +use anyhow::Result; +pub fn install_agent() -> Result<()> { + anyhow::bail!("install-agent implemented in Task 16") +} diff --git a/crates/spaceshd/src/main.rs b/crates/spaceshd/src/main.rs index 4950730..5ac916a 100644 --- a/crates/spaceshd/src/main.rs +++ b/crates/spaceshd/src/main.rs @@ -1,8 +1,35 @@ +mod launchd; mod lifecycle; mod registry; mod server; mod surface; -fn main() { - println!("spaceshd skeleton"); +use anyhow::Result; + +#[tokio::main] +async fn main() -> Result<()> { + let arg = std::env::args().nth(1); + match arg.as_deref() { + Some("install-agent") => { + launchd::install_agent()?; + println!("launchd agent installed"); + Ok(()) + } + Some("--help") | Some("-h") => { + println!("spaceshd [install-agent]"); + Ok(()) + } + _ => run_daemon().await, + } +} + +async fn run_daemon() -> Result<()> { + let Some(_lock) = lifecycle::acquire_instance_lock()? else { + eprintln!("another spaceshd is already running"); + return Ok(()); + }; + lifecycle::clear_stale_socket()?; + let sock = lifecycle::socket_path()?; + eprintln!("spaceshd listening on {}", sock.display()); + server::serve(&sock).await }