summaryrefslogtreecommitdiff
path: root/cli/util/unix.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/util/unix.rs')
-rw-r--r--cli/util/unix.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/cli/util/unix.rs b/cli/util/unix.rs
index fd0c94ea6..2fa3c2063 100644
--- a/cli/util/unix.rs
+++ b/cli/util/unix.rs
@@ -43,3 +43,27 @@ pub fn raise_fd_limit() {
}
}
}
+
+pub fn prepare_stdio() {
+ #[cfg(unix)]
+ // SAFETY: Save current state of stdio and restore it when we exit.
+ unsafe {
+ use libc::atexit;
+ use libc::tcgetattr;
+ use libc::tcsetattr;
+ use libc::termios;
+
+ let mut termios = std::mem::zeroed::<termios>();
+ if tcgetattr(libc::STDIN_FILENO, &mut termios) == 0 {
+ static mut ORIG_TERMIOS: Option<termios> = None;
+ ORIG_TERMIOS = Some(termios);
+
+ extern "C" fn reset_stdio() {
+ // SAFETY: Reset the stdio state.
+ unsafe { tcsetattr(libc::STDIN_FILENO, 0, &ORIG_TERMIOS.unwrap()) };
+ }
+
+ atexit(reset_stdio);
+ }
+ }
+}