// zyginit.reef — Main init daemon (PID 1) // // This is the entry point for the Zygaena init system. // It replaces SMF's svc.startd + svc.configd + master restarter. // // Boot sequence: // 1. Scan /etc/zyginit.d/enabled.d/ for enabled services // 2. Parse TOML definitions → ServiceDef structs // 3. Build dependency graph → topological sort // 4. Start services in parallel, respecting dependency order // 5. Mount tmpfs, create /var/run/zyginit.sock // 6. Enter poll(2) event loop import config.{load_enabled_services, ServiceDef} import depgraph.{build_graph, topo_sort} import contract.{open_bundle} import supervisor.{start_service, handle_exit, ServiceRuntime, ServiceState} import socket.{create_socket, handle_client} const CONFIG_DIR: &str = "/etc/zyginit.d"; const DIAG_DIR: &str = "/var/run/zyginit"; fn main() -> i32 { // TODO: implement // Phase 1: Load configuration // let services = load_enabled_services(CONFIG_DIR)?; // Phase 2: Build dependency graph and compute boot order // let graph = build_graph(services)?; // let tiers = topo_sort(graph)?; // Phase 3: Start services tier by tier // for tier in tiers { // // Start all services in this tier in parallel // for svc_name in tier { // start_service(services[svc_name]); // } // // Wait for all services in tier to reach Running state // } // Phase 4: Set up communication // let bundle_fd = open_bundle()?; // let socket_fd = create_socket()?; // let signal_fd = setup_signal_pipe()?; // self-pipe trick for signals // Phase 5: Event loop // loop { // poll([bundle_fd, socket_fd, signal_fd], -1); // // Handle contract events (service exits) // // Handle socket connections (zygctl commands) // // Handle signals (SIGCHLD, SIGTERM, SIGHUP for reload) // } 0 }