diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/build.rs | 6 | ||||
-rw-r--r-- | runtime/ops/process.rs | 6 | ||||
-rw-r--r-- | runtime/ops/tty.rs | 125 | ||||
-rw-r--r-- | runtime/web_worker.rs | 5 | ||||
-rw-r--r-- | runtime/worker.rs | 6 |
5 files changed, 84 insertions, 64 deletions
diff --git a/runtime/build.rs b/runtime/build.rs index bba2eae55..d096df7db 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -18,7 +18,6 @@ mod startup_snapshot { use deno_core::Extension; use deno_core::ExtensionFileSource; use deno_core::ModuleCode; - use deno_fs::StdFs; use std::path::Path; fn transpile_ts_for_snapshotting( @@ -310,7 +309,10 @@ mod startup_snapshot { deno_napi::deno_napi::init_ops_and_esm::<Permissions>(), deno_http::deno_http::init_ops_and_esm(), deno_io::deno_io::init_ops_and_esm(Default::default()), - deno_fs::deno_fs::init_ops_and_esm::<_, Permissions>(false, StdFs), + deno_fs::deno_fs::init_ops_and_esm::<Permissions>( + false, + std::sync::Arc::new(deno_fs::RealFs), + ), runtime::init_ops_and_esm(), // FIXME(bartlomieju): these extensions are specified last, because they // depend on `runtime`, even though it should be other way around diff --git a/runtime/ops/process.rs b/runtime/ops/process.rs index cf8740255..d991c961f 100644 --- a/runtime/ops/process.rs +++ b/runtime/ops/process.rs @@ -12,10 +12,10 @@ use deno_core::RcRef; use deno_core::Resource; use deno_core::ResourceId; use deno_core::ZeroCopyBuf; +use deno_io::fs::FileResource; use deno_io::ChildStderrResource; use deno_io::ChildStdinResource; use deno_io::ChildStdoutResource; -use deno_io::StdFileResource; use serde::Deserialize; use serde::Serialize; use std::borrow::Cow; @@ -93,7 +93,9 @@ impl StdioOrRid { ) -> Result<std::process::Stdio, AnyError> { match &self { StdioOrRid::Stdio(val) => Ok(val.as_stdio()), - StdioOrRid::Rid(rid) => StdFileResource::as_stdio(state, *rid), + StdioOrRid::Rid(rid) => { + FileResource::with_file(state, *rid, |file| Ok(file.as_stdio()?)) + } } } } diff --git a/runtime/ops/tty.rs b/runtime/ops/tty.rs index a3dc03a6f..7f24daec4 100644 --- a/runtime/ops/tty.rs +++ b/runtime/ops/tty.rs @@ -1,10 +1,14 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +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_io::StdFileResource; -use std::io::Error; +use deno_core::Resource; +use deno_io::fs::FileResource; #[cfg(unix)] use deno_core::ResourceId; @@ -14,8 +18,6 @@ use nix::sys::termios; use std::cell::RefCell; #[cfg(unix)] use std::collections::HashMap; -#[cfg(unix)] -use std::rc::Rc; #[cfg(unix)] #[derive(Default, Clone)] @@ -44,13 +46,14 @@ use winapi::shared::minwindef::DWORD; use winapi::um::wincon; #[cfg(windows)] -fn get_windows_handle( - f: &std::fs::File, +fn get_fd_from_resource( + resource: Rc<FileResource>, ) -> Result<std::os::windows::io::RawHandle, AnyError> { - use std::os::windows::io::AsRawHandle; use winapi::um::handleapi; - let handle = f.as_raw_handle(); + 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() { @@ -59,6 +62,16 @@ fn get_windows_handle( Ok(handle) } +#[cfg(not(windows))] +fn get_fd_from_resource( + resource: Rc<FileResource>, +) -> Result<std::os::unix::prelude::RawFd, AnyError> { + 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], @@ -106,23 +119,15 @@ fn op_stdin_set_raw( // Copyright (c) 2019 Timon. MIT license. #[cfg(windows)] { - use std::os::windows::io::AsRawHandle; use winapi::shared::minwindef::FALSE; use winapi::um::consoleapi; - use winapi::um::handleapi; if cbreak { return Err(deno_core::error::not_supported()); } - StdFileResource::with_file(state, rid, move |std_file| { - let handle = std_file.as_raw_handle(); - - 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")); - } + 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) } @@ -147,13 +152,11 @@ fn op_stdin_set_raw( } #[cfg(unix)] { - use std::os::unix::io::AsRawFd; - let tty_mode_store = state.borrow::<TtyModeStore>().clone(); let previous_mode = tty_mode_store.get(rid); - StdFileResource::with_file(state, rid, move |std_file| { - let raw_fd = std_file.as_raw_fd(); + FileResource::with_resource(state, rid, move |resource| { + let raw_fd = get_fd_from_resource(resource)?; if is_raw { let mut raw = match previous_mode { @@ -201,13 +204,14 @@ fn op_isatty( rid: u32, out: &mut [u8], ) -> Result<(), AnyError> { - StdFileResource::with_file(state, rid, move |std_file| { + 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 = get_windows_handle(std_file)?; + 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): @@ -220,8 +224,6 @@ fn op_isatty( } #[cfg(unix)] { - use std::os::unix::io::AsRawFd; - let raw_fd = std_file.as_raw_fd(); // TODO(bartlomieju): #[allow(clippy::undocumented_unsafe_blocks)] { @@ -242,8 +244,9 @@ fn op_console_size( result: &mut [u32], rid: u32, ) -> Result<(), AnyError> { - StdFileResource::with_file(state, rid, move |std_file| { - let size = console_size(std_file)?; + 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(()) @@ -276,40 +279,50 @@ pub fn console_size( { use std::os::windows::io::AsRawHandle; let handle = std_file.as_raw_handle(); - - // SAFETY: winapi calls - unsafe { - let mut bufinfo: winapi::um::wincon::CONSOLE_SCREEN_BUFFER_INFO = - std::mem::zeroed(); - - if winapi::um::wincon::GetConsoleScreenBufferInfo(handle, &mut bufinfo) - == 0 - { - return Err(Error::last_os_error()); - } - Ok(ConsoleSize { - cols: bufinfo.dwSize.X as u32, - rows: bufinfo.dwSize.Y as u32, - }) - } + console_size_from_fd(handle) } - #[cfg(unix)] { use std::os::unix::io::AsRawFd; - let fd = std_file.as_raw_fd(); - // SAFETY: libc calls - unsafe { - let mut size: libc::winsize = std::mem::zeroed(); - if libc::ioctl(fd, libc::TIOCGWINSZ, &mut size as *mut _) != 0 { - return Err(Error::last_os_error()); - } - Ok(ConsoleSize { - cols: size.ws_col as u32, - rows: size.ws_row as u32, - }) + console_size_from_fd(fd) + } +} + +#[cfg(windows)] +fn console_size_from_fd( + handle: std::os::windows::io::RawHandle, +) -> Result<ConsoleSize, std::io::Error> { + // SAFETY: winapi calls + unsafe { + let mut bufinfo: winapi::um::wincon::CONSOLE_SCREEN_BUFFER_INFO = + std::mem::zeroed(); + + if winapi::um::wincon::GetConsoleScreenBufferInfo(handle, &mut bufinfo) == 0 + { + return Err(Error::last_os_error()); } + Ok(ConsoleSize { + cols: bufinfo.dwSize.X as u32, + rows: bufinfo.dwSize.Y as u32, + }) + } +} + +#[cfg(not(windows))] +fn console_size_from_fd( + fd: std::os::unix::prelude::RawFd, +) -> Result<ConsoleSize, std::io::Error> { + // SAFETY: libc calls + unsafe { + let mut size: libc::winsize = std::mem::zeroed(); + if libc::ioctl(fd, libc::TIOCGWINSZ, &mut size as *mut _) != 0 { + return Err(Error::last_os_error()); + } + Ok(ConsoleSize { + cols: size.ws_col as u32, + rows: size.ws_row as u32, + }) } } diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 1b3dd2809..e485c0c35 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -34,7 +34,7 @@ use deno_core::RuntimeOptions; use deno_core::SharedArrayBufferStore; use deno_core::Snapshot; use deno_core::SourceMapGetter; -use deno_fs::StdFs; +use deno_fs::FileSystem; use deno_io::Stdio; use deno_kv::sqlite::SqliteDbHandler; use deno_tls::RootCertStoreProvider; @@ -331,6 +331,7 @@ pub struct WebWorkerOptions { pub unsafely_ignore_certificate_errors: Option<Vec<String>>, pub root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>, pub seed: Option<u64>, + pub fs: Arc<dyn FileSystem>, pub module_loader: Rc<dyn ModuleLoader>, pub node_fs: Option<Arc<dyn deno_node::NodeFs>>, pub npm_resolver: Option<Arc<dyn deno_node::NpmResolver>>, @@ -441,7 +442,7 @@ impl WebWorker { deno_napi::deno_napi::init_ops::<PermissionsContainer>(), deno_http::deno_http::init_ops(), deno_io::deno_io::init_ops(Some(options.stdio)), - deno_fs::deno_fs::init_ops::<_, PermissionsContainer>(unstable, StdFs), + deno_fs::deno_fs::init_ops::<PermissionsContainer>(unstable, options.fs), deno_node::deno_node::init_ops::<PermissionsContainer>( options.npm_resolver, options.node_fs, diff --git a/runtime/worker.rs b/runtime/worker.rs index ac67011f0..b9db21780 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -30,7 +30,7 @@ use deno_core::RuntimeOptions; use deno_core::SharedArrayBufferStore; use deno_core::Snapshot; use deno_core::SourceMapGetter; -use deno_fs::StdFs; +use deno_fs::FileSystem; use deno_io::Stdio; use deno_kv::sqlite::SqliteDbHandler; use deno_tls::RootCertStoreProvider; @@ -87,6 +87,7 @@ pub struct WorkerOptions { pub root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>, pub seed: Option<u64>, + pub fs: Arc<dyn FileSystem>, /// Implementation of `ModuleLoader` which will be /// called when V8 requests to load ES modules. /// @@ -149,6 +150,7 @@ impl Default for WorkerOptions { create_web_worker_cb: Arc::new(|_| { unimplemented!("web workers are not supported") }), + fs: Arc::new(deno_fs::RealFs), module_loader: Rc::new(FsModuleLoader), seed: None, unsafely_ignore_certificate_errors: Default::default(), @@ -266,7 +268,7 @@ impl MainWorker { deno_napi::deno_napi::init_ops::<PermissionsContainer>(), deno_http::deno_http::init_ops(), deno_io::deno_io::init_ops(Some(options.stdio)), - deno_fs::deno_fs::init_ops::<_, PermissionsContainer>(unstable, StdFs), + deno_fs::deno_fs::init_ops::<PermissionsContainer>(unstable, options.fs), deno_node::deno_node::init_ops::<PermissionsContainer>( options.npm_resolver, options.node_fs, |