diff --git a/crates/wasi/src/preview2/ctx.rs b/crates/wasi/src/preview2/ctx.rs index d56f51a240dd..90ed5678aafd 100644 --- a/crates/wasi/src/preview2/ctx.rs +++ b/crates/wasi/src/preview2/ctx.rs @@ -1,10 +1,9 @@ use super::clocks::host::{monotonic_clock, wall_clock}; use crate::preview2::{ bindings::cli::{terminal_input, terminal_output}, - bindings::filesystem::types::Descriptor, bindings::io::streams, clocks::{self, HostMonotonicClock, HostWallClock}, - filesystem::{Dir, TableFsExt}, + filesystem::Dir, pipe, random, stdio, stdio::{HostTerminalInputState, HostTerminalOutputState}, stream::{HostInputStream, HostOutputStream, TableStreamExt}, @@ -317,16 +316,6 @@ impl WasiCtxBuilder { let stdout = Some(table.push_output_stream(stdout.0).context("stdout")?); let stderr = Some(table.push_output_stream(stderr.0).context("stderr")?); - let preopens = preopens - .into_iter() - .map(|(dir, path)| { - let dirfd = table - .push_dir(dir) - .with_context(|| format!("preopen {path:?}"))?; - Ok((dirfd, path)) - }) - .collect::>>()?; - Ok(WasiCtx { stdin, stdin_terminal, @@ -362,7 +351,7 @@ pub struct WasiCtx { pub(crate) monotonic_clock: Box, pub(crate) env: Vec<(String, String)>, pub(crate) args: Vec, - pub(crate) preopens: Vec<(Resource, String)>, + pub(crate) preopens: Vec<(Dir, String)>, pub(crate) stdin: Option>, pub(crate) stdout: Option>, pub(crate) stderr: Option>, diff --git a/crates/wasi/src/preview2/filesystem.rs b/crates/wasi/src/preview2/filesystem.rs index 27dd9d97303b..3f3cfb1b4329 100644 --- a/crates/wasi/src/preview2/filesystem.rs +++ b/crates/wasi/src/preview2/filesystem.rs @@ -93,6 +93,7 @@ bitflags::bitflags! { } } +#[derive(Clone)] pub(crate) struct Dir { pub dir: Arc, pub perms: DirPerms, diff --git a/crates/wasi/src/preview2/host/filesystem.rs b/crates/wasi/src/preview2/host/filesystem.rs index 36fc6c68e410..374d4a455fa5 100644 --- a/crates/wasi/src/preview2/host/filesystem.rs +++ b/crates/wasi/src/preview2/host/filesystem.rs @@ -6,6 +6,7 @@ use crate::preview2::bindings::filesystem::{preopens, types}; use crate::preview2::bindings::io::streams; use crate::preview2::filesystem::{Dir, File, TableFsExt}; use crate::preview2::{DirPerms, FilePerms, Table, TableError, WasiView}; +use anyhow::Context; use wasmtime::component::Resource; use types::ErrorCode; @@ -22,12 +23,15 @@ impl preopens::Host for T { fn get_directories( &mut self, ) -> Result, String)>, anyhow::Error> { - Ok(self - .ctx_mut() - .preopens - .drain(..) - .map(|(fd, name)| (Resource::new_own(fd.rep()), name.clone())) - .collect()) + let mut results = Vec::new(); + for (dir, name) in self.ctx().preopens.clone() { + let fd = self + .table_mut() + .push_dir(dir) + .with_context(|| format!("failed to push preopen {name}"))?; + results.push((fd, name)); + } + Ok(results) } }