use crate::Handle;
use std::{ffi::OsString, path::PathBuf};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PipeName(pub PathBuf);
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Stdio {
Stdin,
Stdout,
Stderr,
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum ProcessStdio {
#[default]
Inherit,
Null,
Pipe,
Handle(Handle),
}
#[derive(Clone, Debug)]
pub struct ProcessSpec {
pub program: OsString,
pub args: Vec<OsString>,
pub env: Vec<(OsString, OsString)>,
pub env_clear: bool,
pub cwd: Option<PathBuf>,
pub stdio: [ProcessStdio; 3],
pub extra: Vec<ChildFd>,
pub uid: Option<u32>,
pub gid: Option<u32>,
pub new_process_group: bool,
pub windows_hide: bool,
pub detached: bool,
pub controlling_terminal: bool,
}
pub const MAX_CHILD_FD: u32 = 255;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ChildFd {
pub number: u32,
pub source: ChildFdSource,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ChildFdSource {
Null,
Pipe,
Duplex,
Handle(Handle),
}
impl ProcessSpec {
pub fn new(program: impl Into<OsString>) -> Self {
Self {
program: program.into(),
args: Vec::new(),
env: Vec::new(),
env_clear: false,
cwd: None,
stdio: [ProcessStdio::Inherit; 3],
uid: None,
gid: None,
new_process_group: false,
windows_hide: false,
detached: false,
controlling_terminal: false,
extra: Vec::new(),
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct Process {
pub handle: Handle,
pub pid: u32,
pub stdin: Option<Handle>,
pub stdout: Option<Handle>,
pub stderr: Option<Handle>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Signal {
Int,
Term,
Kill,
Hup,
Chld,
WinCh,
Usr1,
Usr2,
Break,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct ExitStatus {
pub code: Option<i32>,
pub signal: Option<i32>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TtyMode {
Normal,
Raw,
Io,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WindowSize {
pub columns: u16,
pub rows: u16,
}