use std::io::IsTerminal;
use std::os::fd::AsRawFd;
pub fn ensure_terminal_stdin() {
if std::io::stdin().is_terminal() {
return;
}
let tty = match std::fs::OpenOptions::new()
.read(true)
.write(true)
.open("/dev/tty")
{
Ok(f) => f,
Err(_) => return,
};
unsafe {
libc::dup2(tty.as_raw_fd(), libc::STDIN_FILENO);
}
}
pub fn with_terminal_stdout<F, R>(f: F) -> R
where
F: FnOnce() -> R,
{
if std::io::stdout().is_terminal() {
return f();
}
let saved = unsafe { libc::dup(libc::STDOUT_FILENO) };
if let Ok(tty) = std::fs::OpenOptions::new().write(true).open("/dev/tty") {
unsafe {
libc::dup2(tty.as_raw_fd(), libc::STDOUT_FILENO);
}
}
let result = f();
if saved >= 0 {
unsafe {
libc::dup2(saved, libc::STDOUT_FILENO);
libc::close(saved);
}
}
result
}