summaryrefslogtreecommitdiff
path: root/cli/util/unix.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2023-10-30 08:53:08 -0700
committerGitHub <noreply@github.com>2023-10-30 15:53:08 +0000
commit09204107d85351dae07a45f6a9684b5b6e573652 (patch)
tree5a04f3a877e677e382e34684784ddf832838bd77 /cli/util/unix.rs
parent1acef755ca8a0a0433a98e4a66433c63ee0a3b09 (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.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);
+ }
+ }
+}