summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/main.rs1
-rw-r--r--cli/tests/node_compat/config.jsonc2
-rw-r--r--cli/tests/node_compat/test/parallel/test-tty-stdin-end.js14
-rw-r--r--cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js74
-rw-r--r--cli/util/unix.rs24
5 files changed, 115 insertions, 0 deletions
diff --git a/cli/main.rs b/cli/main.rs
index 0817c0984..dbd3b470b 100644
--- a/cli/main.rs
+++ b/cli/main.rs
@@ -272,6 +272,7 @@ pub(crate) fn unstable_warn_cb(feature: &str) {
pub fn main() {
setup_panic_hook();
+ util::unix::prepare_stdio();
util::unix::raise_fd_limit();
util::windows::ensure_stdio_open();
#[cfg(windows)]
diff --git a/cli/tests/node_compat/config.jsonc b/cli/tests/node_compat/config.jsonc
index 8a31f4dc2..93a51b671 100644
--- a/cli/tests/node_compat/config.jsonc
+++ b/cli/tests/node_compat/config.jsonc
@@ -88,6 +88,7 @@
"test-querystring.js",
"test-readline-interface.js",
"test-stdin-from-file-spawn.js",
+ "test-ttywrap-invalid-fd.js",
"test-url-urltooptions.js",
"test-util-format.js",
"test-util-inspect-namespace.js",
@@ -625,6 +626,7 @@
"test-timers-unref-throw-then-ref.js",
"test-timers-user-call.js",
"test-timers-zero-timeout.js",
+ "test-tty-stdin-end.js",
"test-url-domain-ascii-unicode.js",
"test-url-fileurltopath.js",
"test-url-format-invalid-input.js",
diff --git a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js b/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js
new file mode 100644
index 000000000..ee38cbd2c
--- /dev/null
+++ b/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js
@@ -0,0 +1,14 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 18.12.1
+// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually.
+
+'use strict';
+require('../common');
+
+// This test ensures that Node.js doesn't crash on `process.stdin.emit("end")`.
+// https://github.com/nodejs/node/issues/1068
+
+process.stdin.emit('end');
diff --git a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js b/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js
new file mode 100644
index 000000000..95b9bffe6
--- /dev/null
+++ b/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js
@@ -0,0 +1,74 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 18.12.1
+// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually.
+
+// Flags: --expose-internals
+'use strict';
+
+// const common = require('../common');
+const tty = require('tty');
+// const { internalBinding } = require('internal/test/binding');
+// const {
+// UV_EBADF,
+// UV_EINVAL
+// } = internalBinding('uv');
+const assert = require('assert');
+
+assert.throws(
+ () => new tty.WriteStream(-1),
+ {
+ code: 'ERR_INVALID_FD',
+ name: 'RangeError',
+ message: '"fd" must be a positive integer: -1'
+ }
+);
+
+// {
+// const info = {
+// code: common.isWindows ? 'EBADF' : 'EINVAL',
+// message: common.isWindows ? 'bad file descriptor' : 'invalid argument',
+// errno: common.isWindows ? UV_EBADF : UV_EINVAL,
+// syscall: 'uv_tty_init'
+// };
+
+// const suffix = common.isWindows ?
+// 'EBADF (bad file descriptor)' : 'EINVAL (invalid argument)';
+// const message = `TTY initialization failed: uv_tty_init returned ${suffix}`;
+
+// assert.throws(
+// () => {
+// common.runWithInvalidFD((fd) => {
+// new tty.WriteStream(fd);
+// });
+// }, {
+// code: 'ERR_TTY_INIT_FAILED',
+// name: 'SystemError',
+// message,
+// info
+// }
+// );
+
+// assert.throws(
+// () => {
+// common.runWithInvalidFD((fd) => {
+// new tty.ReadStream(fd);
+// });
+// }, {
+// code: 'ERR_TTY_INIT_FAILED',
+// name: 'SystemError',
+// message,
+// info
+// });
+// }
+
+assert.throws(
+ () => new tty.ReadStream(-1),
+ {
+ code: 'ERR_INVALID_FD',
+ name: 'RangeError',
+ message: '"fd" must be a positive integer: -1'
+ }
+);
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);
+ }
+ }
+}