summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2020-06-10 00:29:12 +0800
committerGitHub <noreply@github.com>2020-06-09 18:29:12 +0200
commit1e0808d501cf9adea65e7cacd123ea4fea06a13a (patch)
tree5322e873b5d1f7be7c39f7e8f637c333c51a38e3
parent314f666897e63ab9f982726724a7e4af1ca798a8 (diff)
fix: Deno.readSync on stdin (#6126)
Currently sync operations on stdin are failing because tokio::Stdin cannot be converted to a std::File. This commit replaces tokio::stdin with a raw file descriptor wrapped in a std::fs::File which can be converted to a tokio::File and back again making the synchronous version of op_read actually work.
-rw-r--r--cli/ops/io.rs19
-rw-r--r--cli/tests/unit/stdio_test.ts32
-rw-r--r--cli/tests/unit/unit_tests.ts1
3 files changed, 48 insertions, 4 deletions
diff --git a/cli/ops/io.rs b/cli/ops/io.rs
index 0e007ad1a..785bb42b7 100644
--- a/cli/ops/io.rs
+++ b/cli/ops/io.rs
@@ -37,6 +37,17 @@ lazy_static! {
/// resource table is dropped storing reference to that handle, the handle
/// itself won't be closed (so Deno.core.print) will still work.
// TODO(ry) It should be possible to close stdout.
+ static ref STDIN_HANDLE: std::fs::File = {
+ #[cfg(not(windows))]
+ let stdin = unsafe { std::fs::File::from_raw_fd(0) };
+ #[cfg(windows)]
+ let stdin = unsafe {
+ std::fs::File::from_raw_handle(winapi::um::processenv::GetStdHandle(
+ winapi::um::winbase::STD_INPUT_HANDLE,
+ ))
+ };
+ stdin
+ };
static ref STDOUT_HANDLE: std::fs::File = {
#[cfg(not(windows))]
let stdout = unsafe { std::fs::File::from_raw_fd(1) };
@@ -71,10 +82,10 @@ pub fn get_stdio() -> (
StreamResourceHolder,
StreamResourceHolder,
) {
- let stdin = StreamResourceHolder::new(StreamResource::Stdin(
- tokio::io::stdin(),
- TTYMetadata::default(),
- ));
+ let stdin = StreamResourceHolder::new(StreamResource::FsFile(Some({
+ let stdin = STDIN_HANDLE.try_clone().unwrap();
+ (tokio::fs::File::from_std(stdin), FileMetadata::default())
+ })));
let stdout = StreamResourceHolder::new(StreamResource::FsFile(Some({
let stdout = STDOUT_HANDLE.try_clone().unwrap();
(tokio::fs::File::from_std(stdout), FileMetadata::default())
diff --git a/cli/tests/unit/stdio_test.ts b/cli/tests/unit/stdio_test.ts
new file mode 100644
index 000000000..244ebcd47
--- /dev/null
+++ b/cli/tests/unit/stdio_test.ts
@@ -0,0 +1,32 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+import { unitTest, assertEquals } from "./test_util.ts";
+
+unitTest(async function stdioStdinRead() {
+ const nread = await Deno.stdin.read(new Uint8Array(0));
+ assertEquals(nread, 0);
+});
+
+unitTest(function stdioStdinReadSync() {
+ const nread = Deno.stdin.readSync(new Uint8Array(0));
+ assertEquals(nread, 0);
+});
+
+unitTest(async function stdioStdoutWrite() {
+ const nwritten = await Deno.stdout.write(new Uint8Array(0));
+ assertEquals(nwritten, 0);
+});
+
+unitTest(function stdioStdoutWriteSync() {
+ const nwritten = Deno.stdout.writeSync(new Uint8Array(0));
+ assertEquals(nwritten, 0);
+});
+
+unitTest(async function stdioStderrWrite() {
+ const nwritten = await Deno.stderr.write(new Uint8Array(0));
+ assertEquals(nwritten, 0);
+});
+
+unitTest(function stdioStderrWriteSync() {
+ const nwritten = Deno.stderr.writeSync(new Uint8Array(0));
+ assertEquals(nwritten, 0);
+});
diff --git a/cli/tests/unit/unit_tests.ts b/cli/tests/unit/unit_tests.ts
index 515da9f4a..7891ea418 100644
--- a/cli/tests/unit/unit_tests.ts
+++ b/cli/tests/unit/unit_tests.ts
@@ -52,6 +52,7 @@ import "./request_test.ts";
import "./resources_test.ts";
import "./signal_test.ts";
import "./stat_test.ts";
+import "./stdio_test.ts";
import "./streams_internal_test.ts";
import "./streams_piping_test.ts";
import "./streams_transform_test.ts";