runx-runtime 0.6.19

Native Rust runtime for local runx execution, adapters, harness replay, receipts, and sandboxing.
Documentation
use std::process::Command;

#[cfg(unix)]
use std::os::unix::process::CommandExt;

#[derive(Clone, Copy, Debug)]
pub(crate) enum ProcessSignal {
    #[cfg(any(
        feature = "cli-tool",
        feature = "external-adapter",
        feature = "thread-outbox-provider",
        feature = "mcp"
    ))]
    Terminate,
    Force,
}

#[cfg(unix)]
impl ProcessSignal {
    const fn rustix_signal(self) -> rustix::process::Signal {
        match self {
            #[cfg(any(
                feature = "cli-tool",
                feature = "external-adapter",
                feature = "thread-outbox-provider",
                feature = "mcp"
            ))]
            Self::Terminate => rustix::process::Signal::TERM,
            Self::Force => rustix::process::Signal::KILL,
        }
    }
}

#[cfg(unix)]
pub(crate) fn configure_process_group(command: &mut Command) {
    command.process_group(0);
}

#[cfg(not(unix))]
pub(crate) fn configure_process_group(_command: &mut Command) {}

#[cfg(unix)]
pub(crate) fn signal_process_group_id(process_id: u32, signal: ProcessSignal) -> bool {
    use rustix::process::{Pid, kill_process_group};

    let Ok(raw_pid) = i32::try_from(process_id) else {
        return false;
    };
    let Some(pid) = Pid::from_raw(raw_pid) else {
        return false;
    };
    kill_process_group(pid, signal.rustix_signal()).is_ok()
}

#[cfg(not(unix))]
pub(crate) fn signal_process_group_id(_process_id: u32, _signal: ProcessSignal) -> bool {
    false
}