From dc3f67ca8725edc49417127dd2bcc5d6fef0f219 Mon Sep 17 00:00:00 2001 From: Thiago Patriota Date: Sat, 14 Mar 2026 15:16:02 -0300 Subject: [PATCH] fix: Add #[cfg(unix)] guards for nix crate imports and signal handling - postgres.rs, minio.rs, redis.rs: Wrap nix::sys::signal and nix::unistd imports with #[cfg(unix)] to allow compilation on Windows - Use child.kill() as fallback on non-unix platforms for process management --- src/services/minio.rs | 36 ++++++++++++++++++++++++++++++------ src/services/postgres.rs | 36 ++++++++++++++++++++++++++++++------ src/services/redis.rs | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 90 insertions(+), 18 deletions(-) diff --git a/src/services/minio.rs b/src/services/minio.rs index 204291a..345e130 100644 --- a/src/services/minio.rs +++ b/src/services/minio.rs @@ -1,6 +1,8 @@ use super::{check_tcp_port, ensure_dir, wait_for, HEALTH_CHECK_INTERVAL, HEALTH_CHECK_TIMEOUT}; use anyhow::{Context, Result}; +#[cfg(unix)] use nix::sys::signal::{kill, Signal}; +#[cfg(unix)] use nix::unistd::Pid; use std::collections::HashMap; use std::path::PathBuf; @@ -394,8 +396,13 @@ impl MinioService { if let Some(ref mut child) = self.process { log::info!("Stopping MinIO..."); - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); for _ in 0..50 { match child.try_wait() { @@ -408,7 +415,13 @@ impl MinioService { } } - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); self.process = None; } @@ -427,12 +440,23 @@ impl MinioService { impl Drop for MinioService { fn drop(&mut self) { if let Some(ref mut child) = self.process { - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); std::thread::sleep(Duration::from_millis(500)); - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); } } diff --git a/src/services/postgres.rs b/src/services/postgres.rs index 38ad5f1..64912db 100644 --- a/src/services/postgres.rs +++ b/src/services/postgres.rs @@ -1,6 +1,8 @@ use super::{check_tcp_port, ensure_dir, wait_for, HEALTH_CHECK_INTERVAL, HEALTH_CHECK_TIMEOUT}; use anyhow::{Context, Result}; +#[cfg(unix)] use nix::sys::signal::{kill, Signal}; +#[cfg(unix)] use nix::unistd::Pid; use std::path::PathBuf; use std::process::{Child, Command, Stdio}; @@ -427,8 +429,13 @@ unix_socket_directories = '{}' if let Some(ref mut child) = self.process { log::info!("Stopping PostgreSQL..."); - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); for _ in 0..50 { match child.try_wait() { @@ -441,7 +448,13 @@ unix_socket_directories = '{}' } } - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); self.process = None; } @@ -460,12 +473,23 @@ unix_socket_directories = '{}' impl Drop for PostgresService { fn drop(&mut self) { if let Some(ref mut child) = self.process { - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); std::thread::sleep(Duration::from_millis(500)); - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); } } diff --git a/src/services/redis.rs b/src/services/redis.rs index dd9780c..e6b50c7 100644 --- a/src/services/redis.rs +++ b/src/services/redis.rs @@ -1,6 +1,8 @@ use super::{check_tcp_port, ensure_dir, wait_for, HEALTH_CHECK_INTERVAL, HEALTH_CHECK_TIMEOUT}; use anyhow::{Context, Result}; +#[cfg(unix)] use nix::sys::signal::{kill, Signal}; +#[cfg(unix)] use nix::unistd::Pid; use std::path::PathBuf; use std::process::{Child, Command, Stdio}; @@ -368,8 +370,13 @@ impl RedisService { } } - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); for _ in 0..20 { match child.try_wait() { @@ -382,7 +389,13 @@ impl RedisService { } } - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); self.process = None; } @@ -415,12 +428,23 @@ impl Drop for RedisService { std::thread::sleep(Duration::from_millis(200)); } - let pid = Pid::from_raw(child.id() as i32); - let _ = kill(pid, Signal::SIGTERM); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGTERM); + } + #[cfg(not(unix))] + let _ = child.kill(); std::thread::sleep(Duration::from_millis(300)); - let _ = kill(pid, Signal::SIGKILL); + #[cfg(unix)] + { + let pid = Pid::from_raw(child.id() as i32); + let _ = kill(pid, Signal::SIGKILL); + } + #[cfg(not(unix))] + let _ = child.kill(); let _ = child.wait(); } }