diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-10-30 08:53:08 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-30 15:53:08 +0000 |
commit | 09204107d85351dae07a45f6a9684b5b6e573652 (patch) | |
tree | 5a04f3a877e677e382e34684784ddf832838bd77 /cli/util/unix.rs | |
parent | 1acef755ca8a0a0433a98e4a66433c63ee0a3b09 (diff) |
fix: implement node:tty (#20892)
Fixes #21012
Closes https://github.com/denoland/deno/issues/20855
Fixes https://github.com/denoland/deno/issues/20890
Fixes https://github.com/denoland/deno/issues/20611
Fixes https://github.com/denoland/deno/issues/20336
Fixes `create-svelte` from https://github.com/denoland/deno/issues/17248
Fixes more reports here:
- https://github.com/denoland/deno/issues/6529#issuecomment-1432690559
- https://github.com/denoland/deno/issues/6529#issuecomment-1522059006
- https://github.com/denoland/deno/issues/6529#issuecomment-1695803570
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); + } + } +} |