From 09204107d85351dae07a45f6a9684b5b6e573652 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Mon, 30 Oct 2023 08:53:08 -0700 Subject: 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 --- cli/util/unix.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'cli/util/unix.rs') 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::(); + if tcgetattr(libc::STDIN_FILENO, &mut termios) == 0 { + static mut ORIG_TERMIOS: Option = 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); + } + } +} -- cgit v1.2.3