diff options
Diffstat (limited to 'runtime/ops/tty.rs')
-rw-r--r-- | runtime/ops/tty.rs | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs index b24c9d893..1d4c123a2 100644 --- a/runtime/ops/tty.rs +++ b/runtime/ops/tty.rs @@ -1,10 +1,13 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. use std::io::Error; +use std::io::IsTerminal; use deno_core::error::AnyError; use deno_core::op; +use deno_core::op2; use deno_core::OpState; +use deno_core::ResourceHandle; #[cfg(unix)] use deno_core::ResourceId; @@ -162,32 +165,27 @@ fn op_stdin_set_raw( } } -#[op(fast)] -fn op_isatty( - state: &mut OpState, - rid: u32, - out: &mut [u8], -) -> Result<(), AnyError> { - let raw_fd = state.resource_table.get_fd(rid)?; - #[cfg(windows)] - { - use winapi::shared::minwindef::FALSE; - use winapi::um::consoleapi; - - let handle = raw_fd; - let mut test_mode: DWORD = 0; - // If I cannot get mode out of console, it is not a console. - out[0] = - // SAFETY: Windows API - unsafe { consoleapi::GetConsoleMode(handle, &mut test_mode) != FALSE } - as u8; - } - #[cfg(unix)] - { - // SAFETY: Posix API - out[0] = unsafe { libc::isatty(raw_fd as libc::c_int) == 1 } as u8; - } - Ok(()) +#[op2(fast)] +fn op_isatty(state: &mut OpState, rid: u32) -> Result<bool, AnyError> { + let handle = state.resource_table.get_handle(rid)?; + // TODO(mmastrac): this can migrate to the deno_core implementation when it lands + Ok(match handle { + ResourceHandle::Fd(fd) if handle.is_valid() => { + #[cfg(windows)] + { + // SAFETY: The resource remains open for the for the duration of borrow_raw + unsafe { + std::os::windows::io::BorrowedHandle::borrow_raw(fd).is_terminal() + } + } + #[cfg(unix)] + { + // SAFETY: The resource remains open for the for the duration of borrow_raw + unsafe { std::os::fd::BorrowedFd::borrow_raw(fd).is_terminal() } + } + } + _ => false, + }) } #[op(fast)] |