diff options
Diffstat (limited to 'cli/util/unix.rs')
-rw-r--r-- | cli/util/unix.rs | 24 |
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); + } + } +} |