@@ -21,6 +21,7 @@ use std::sync::Arc;
2121use std:: time:: Duration ;
2222
2323use tokio:: select;
24+ #[ cfg( unix) ]
2425use tokio:: signal:: unix:: { SignalKind , signal} ;
2526use tracing_appender:: non_blocking:: WorkerGuard ;
2627
@@ -66,13 +67,27 @@ async fn main() -> anyhow::Result<()> {
6667 }
6768
6869 // Start IPC listener
69- let socket_path = global_config_service:: daemon_socket_path ( ) ?;
70- let listener = IpcListener :: bind ( & socket_path) . await ?;
70+ #[ cfg( unix) ]
71+ #[ allow( unused_mut) ] // Windows needs mut for accept(), Unix doesn't
72+ let mut listener = {
73+ let socket_path = global_config_service:: daemon_socket_path ( ) ?;
74+ let listener = IpcListener :: bind ( & socket_path) . await ?;
75+ tracing:: info!( "granaryd listening on {:?}" , listener. socket_path( ) ) ;
76+ listener
77+ } ;
7178
72- tracing:: info!( "granaryd listening on {:?}" , listener. socket_path( ) ) ;
79+ #[ cfg( windows) ]
80+ let mut listener = {
81+ let pipe_name = global_config_service:: daemon_pipe_name ( ) ;
82+ let listener = IpcListener :: bind ( & pipe_name) . await ?;
83+ tracing:: info!( "granaryd listening on {}" , listener. pipe_name( ) ) ;
84+ listener
85+ } ;
7386
7487 // Set up signal handlers
88+ #[ cfg( unix) ]
7589 let mut sigterm = signal ( SignalKind :: terminate ( ) ) ?;
90+ #[ cfg( unix) ]
7691 let mut sigint = signal ( SignalKind :: interrupt ( ) ) ?;
7792
7893 // Flag to track shutdown request from IPC
@@ -95,7 +110,8 @@ async fn main() -> anyhow::Result<()> {
95110 _ => { }
96111 }
97112
98- // Main loop
113+ // Main loop - Unix version with SIGTERM/SIGINT handling
114+ #[ cfg( unix) ]
99115 loop {
100116 // Check if shutdown was requested via IPC
101117 if shutdown_flag. load ( std:: sync:: atomic:: Ordering :: SeqCst ) {
@@ -147,6 +163,55 @@ async fn main() -> anyhow::Result<()> {
147163 }
148164 }
149165
166+ // Main loop - Windows version with Ctrl+C handling
167+ #[ cfg( windows) ]
168+ loop {
169+ // Check if shutdown was requested via IPC
170+ if shutdown_flag. load ( std:: sync:: atomic:: Ordering :: SeqCst ) {
171+ tracing:: info!( "Shutdown requested via IPC" ) ;
172+ break ;
173+ }
174+
175+ select ! {
176+ // Handle Ctrl+C
177+ _ = tokio:: signal:: ctrl_c( ) => {
178+ tracing:: info!( "Received Ctrl+C, shutting down..." ) ;
179+ break ;
180+ }
181+
182+ // Periodic log cleanup
183+ _ = cleanup_interval. tick( ) => {
184+ match manager. cleanup_old_logs( & log_retention_config) {
185+ Ok ( deleted) if deleted > 0 => {
186+ tracing:: info!( "Periodic log cleanup: deleted {} old log files" , deleted) ;
187+ }
188+ Err ( e) => {
189+ tracing:: warn!( "Periodic log cleanup failed: {}" , e) ;
190+ }
191+ _ => { }
192+ }
193+ }
194+
195+ // Accept new connections
196+ result = listener. accept( ) => {
197+ match result {
198+ Ok ( conn) => {
199+ let manager = Arc :: clone( & manager) ;
200+ let shutdown_flag = Arc :: clone( & shutdown_flag) ;
201+ tokio:: spawn( async move {
202+ if let Err ( e) = handle_connection( conn, & manager, & shutdown_flag) . await {
203+ tracing:: error!( "Connection error: {}" , e) ;
204+ }
205+ } ) ;
206+ }
207+ Err ( e) => {
208+ tracing:: error!( "Accept error: {}" , e) ;
209+ }
210+ }
211+ }
212+ }
213+ }
214+
150215 // Graceful shutdown
151216 tracing:: info!( "Shutting down workers..." ) ;
152217 manager. shutdown_all ( ) . await ?;
0 commit comments