1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// 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
}
|