diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-08-01 12:48:39 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-01 14:48:39 -0400 |
commit | 45572e329a395cb20ecb8c2867cc66b7d3a28cfe (patch) | |
tree | b54b46483048356848e4168ec052a583b7151191 /runtime/ops/tty.rs | |
parent | ab2627a014d3a5bb861e30e608cef0b6debb4ff2 (diff) |
refactor(runtime): use new fd methods from resource table (#20010)
Prereq for fast streams work. No longer need `#[cfg]` around
`backing_fd`.
Diffstat (limited to 'runtime/ops/tty.rs')
-rw-r--r-- | runtime/ops/tty.rs | 204 |
1 files changed, 80 insertions, 124 deletions
diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs index 9c34c512f..c77d0ee99 100644 --- a/runtime/ops/tty.rs +++ b/runtime/ops/tty.rs @@ -3,12 +3,9 @@ use std::io::Error; use std::rc::Rc; -use deno_core::error::resource_unavailable; use deno_core::error::AnyError; use deno_core::op; use deno_core::OpState; -use deno_core::Resource; -use deno_io::fs::FileResource; #[cfg(unix)] use deno_core::ResourceId; @@ -45,35 +42,6 @@ use winapi::shared::minwindef::DWORD; #[cfg(windows)] use winapi::um::wincon; -#[cfg(windows)] -fn get_fd_from_resource( - resource: Rc<FileResource>, -) -> Result<std::os::windows::io::RawHandle, AnyError> { - use winapi::um::handleapi; - - #[allow(deprecated)] - let Some(handle) = resource.backing_fd() else { - return Err(resource_unavailable()); - }; - if handle == handleapi::INVALID_HANDLE_VALUE { - return Err(Error::last_os_error().into()); - } else if handle.is_null() { - return Err(custom_error("ReferenceError", "null handle")); - } - Ok(handle) -} - -#[cfg(not(windows))] -fn get_fd_from_resource( - resource: Rc<FileResource>, -) -> Result<std::os::unix::prelude::RawFd, AnyError> { - #[allow(deprecated)] - match resource.backing_fd() { - Some(fd) => Ok(fd), - None => Err(resource_unavailable()), - } -} - deno_core::extension!( deno_tty, ops = [op_stdin_set_raw, op_isatty, op_console_size], @@ -110,6 +78,7 @@ fn op_stdin_set_raw( cbreak: bool, ) -> Result<(), AnyError> { let rid = 0; // stdin is always rid=0 + let handle_or_fd = state.resource_table.get_fd(rid)?; // From https://github.com/kkawakam/rustyline/blob/master/src/tty/windows.rs // and https://github.com/kkawakam/rustyline/blob/master/src/tty/unix.rs @@ -121,79 +90,76 @@ fn op_stdin_set_raw( use winapi::shared::minwindef::FALSE; use winapi::um::consoleapi; + let handle = handle_or_fd; + if cbreak { return Err(deno_core::error::not_supported()); } - FileResource::with_resource(state, rid, move |resource| { - let handle = get_fd_from_resource(resource)?; - let mut original_mode: DWORD = 0; - // SAFETY: winapi call - if unsafe { consoleapi::GetConsoleMode(handle, &mut original_mode) } - == FALSE - { - return Err(Error::last_os_error().into()); - } + let mut original_mode: DWORD = 0; + // SAFETY: winapi call + if unsafe { consoleapi::GetConsoleMode(handle, &mut original_mode) } + == FALSE + { + return Err(Error::last_os_error().into()); + } - let new_mode = if is_raw { - mode_raw_input_on(original_mode) - } else { - mode_raw_input_off(original_mode) - }; + let new_mode = if is_raw { + mode_raw_input_on(original_mode) + } else { + mode_raw_input_off(original_mode) + }; - // SAFETY: winapi call - if unsafe { consoleapi::SetConsoleMode(handle, new_mode) } == FALSE { - return Err(Error::last_os_error().into()); - } + // SAFETY: winapi call + if unsafe { consoleapi::SetConsoleMode(handle, new_mode) } == FALSE { + return Err(Error::last_os_error().into()); + } - Ok(()) - }) + Ok(()) } #[cfg(unix)] { let tty_mode_store = state.borrow::<TtyModeStore>().clone(); let previous_mode = tty_mode_store.get(rid); - FileResource::with_resource(state, rid, move |resource| { - let raw_fd = get_fd_from_resource(resource)?; - - if is_raw { - let mut raw = match previous_mode { - Some(mode) => mode, - None => { - // Save original mode. - let original_mode = termios::tcgetattr(raw_fd)?; - tty_mode_store.set(rid, original_mode.clone()); - original_mode - } - }; - - raw.input_flags &= !(termios::InputFlags::BRKINT - | termios::InputFlags::ICRNL - | termios::InputFlags::INPCK - | termios::InputFlags::ISTRIP - | termios::InputFlags::IXON); - - raw.control_flags |= termios::ControlFlags::CS8; - - raw.local_flags &= !(termios::LocalFlags::ECHO - | termios::LocalFlags::ICANON - | termios::LocalFlags::IEXTEN); - if !cbreak { - raw.local_flags &= !(termios::LocalFlags::ISIG); - } - raw.control_chars[termios::SpecialCharacterIndices::VMIN as usize] = 1; - raw.control_chars[termios::SpecialCharacterIndices::VTIME as usize] = 0; - termios::tcsetattr(raw_fd, termios::SetArg::TCSADRAIN, &raw)?; - } else { - // Try restore saved mode. - if let Some(mode) = tty_mode_store.take(rid) { - termios::tcsetattr(raw_fd, termios::SetArg::TCSADRAIN, &mode)?; + let raw_fd = handle_or_fd; + + if is_raw { + let mut raw = match previous_mode { + Some(mode) => mode, + None => { + // Save original mode. + let original_mode = termios::tcgetattr(raw_fd)?; + tty_mode_store.set(rid, original_mode.clone()); + original_mode } + }; + + raw.input_flags &= !(termios::InputFlags::BRKINT + | termios::InputFlags::ICRNL + | termios::InputFlags::INPCK + | termios::InputFlags::ISTRIP + | termios::InputFlags::IXON); + + raw.control_flags |= termios::ControlFlags::CS8; + + raw.local_flags &= !(termios::LocalFlags::ECHO + | termios::LocalFlags::ICANON + | termios::LocalFlags::IEXTEN); + if !cbreak { + raw.local_flags &= !(termios::LocalFlags::ISIG); } + raw.control_chars[termios::SpecialCharacterIndices::VMIN as usize] = 1; + raw.control_chars[termios::SpecialCharacterIndices::VTIME as usize] = 0; + termios::tcsetattr(raw_fd, termios::SetArg::TCSADRAIN, &raw)?; + } else { + // Try restore saved mode. + if let Some(mode) = tty_mode_store.take(rid) { + termios::tcsetattr(raw_fd, termios::SetArg::TCSADRAIN, &mode)?; + } + } - Ok(()) - }) + Ok(()) } } @@ -203,34 +169,26 @@ fn op_isatty( rid: u32, out: &mut [u8], ) -> Result<(), AnyError> { - FileResource::with_resource(state, rid, move |resource| { - let raw_fd = get_fd_from_resource(resource)?; - #[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. - // TODO(bartlomieju): - #[allow(clippy::undocumented_unsafe_blocks)] - { - out[0] = unsafe { - consoleapi::GetConsoleMode(handle, &mut test_mode) != FALSE - } as u8; - } - } - #[cfg(unix)] - { - // TODO(bartlomieju): - #[allow(clippy::undocumented_unsafe_blocks)] - { - out[0] = unsafe { libc::isatty(raw_fd as libc::c_int) == 1 } as u8; - } - } - Ok(()) - }) + 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(()) } #[op(fast)] @@ -243,13 +201,11 @@ fn op_console_size( result: &mut [u32], rid: u32, ) -> Result<(), AnyError> { - FileResource::with_resource(state, rid, move |resource| { - let fd = get_fd_from_resource(resource)?; - let size = console_size_from_fd(fd)?; - result[0] = size.cols; - result[1] = size.rows; - Ok(()) - }) + let fd = state.resource_table.get_fd(rid)?; + let size = console_size_from_fd(fd)?; + result[0] = size.cols; + result[1] = size.rows; + Ok(()) } let mut last_result = Ok(()); |