use std::os::fd::AsFd as _;
use std::time::Duration;
use ferroday_cage::relay::{Escalation, Relay, RelayError, Signals, install_panic_restore};
use ferroday_cage::{ExitStatus, Pty, Running, Terminal};
use rustix::termios;
fn caller_is_terminal() -> bool {
termios::tcgetattr(rustix::stdio::stdin()).is_ok()
}
pub fn terminal_for_caller() -> Terminal {
match termios::tcgetwinsize(rustix::stdio::stdin()) {
Ok(size) => Terminal::new().size(size.ws_row, size.ws_col),
Err(_) => Terminal::new(),
}
}
pub fn relay(
mut running: Running<'_>,
pty: Pty,
signals: Signals,
timeout: Option<Duration>,
kill_after: Duration,
) -> Result<Option<ExitStatus>, RelayError> {
let interactive = caller_is_terminal();
if interactive {
install_panic_restore();
}
let stdin = std::io::stdin();
let stdout = std::io::stdout();
Relay::new(stdin.as_fd(), stdout.as_fd())
.raw(interactive)
.escalation(Escalation::new(timeout, kill_after))
.run(&mut running, &pty, &signals)
}