mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-12 05:18:43 +00:00
fix: Upgrade c-api to use new WasiPipe implementation
Need to use WasiBidirectionalPipePair to allow accessing the stdout/stderr.
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
pub use super::unstable::wasi::wasi_get_unordered_imports;
|
pub use super::unstable::wasi::wasi_get_unordered_imports;
|
||||||
use super::{
|
use super::{
|
||||||
externals::{wasm_extern_t, wasm_extern_vec_t, wasm_func_t, wasm_memory_t},
|
externals::{wasm_extern_t, wasm_extern_vec_t, wasm_func_t},
|
||||||
instance::wasm_instance_t,
|
instance::wasm_instance_t,
|
||||||
module::wasm_module_t,
|
module::wasm_module_t,
|
||||||
store::{wasm_store_t, StoreRef},
|
store::{wasm_store_t, StoreRef},
|
||||||
@@ -18,7 +18,8 @@ use std::slice;
|
|||||||
#[cfg(feature = "webc_runner")]
|
#[cfg(feature = "webc_runner")]
|
||||||
use wasmer_api::{AsStoreMut, Imports, Module};
|
use wasmer_api::{AsStoreMut, Imports, Module};
|
||||||
use wasmer_wasi::{
|
use wasmer_wasi::{
|
||||||
get_wasi_version, Pipe, WasiFile, WasiFunctionEnv, WasiState, WasiStateBuilder, WasiVersion,
|
get_wasi_version, wasmer_vfs::AsyncReadExt, WasiBidirectionalPipePair, WasiEnv, WasiFile,
|
||||||
|
WasiFunctionEnv, WasiState, WasiStateBuilder, WasiVersion,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -270,11 +271,11 @@ fn prepare_webc_env(
|
|||||||
let mut wasi_env = config.state_builder;
|
let mut wasi_env = config.state_builder;
|
||||||
|
|
||||||
if !config.inherit_stdout {
|
if !config.inherit_stdout {
|
||||||
wasi_env.stdout(Box::new(Pipe::new()));
|
wasi_env.stdout(Box::new(WasiBidirectionalPipePair::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.inherit_stderr {
|
if !config.inherit_stderr {
|
||||||
wasi_env.stderr(Box::new(Pipe::new()));
|
wasi_env.stderr(Box::new(WasiBidirectionalPipePair::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
wasi_env.set_fs(filesystem);
|
wasi_env.set_fs(filesystem);
|
||||||
@@ -307,11 +308,15 @@ pub unsafe extern "C" fn wasi_env_new(
|
|||||||
let store = &mut store?.inner;
|
let store = &mut store?.inner;
|
||||||
let mut store_mut = store.store_mut();
|
let mut store_mut = store.store_mut();
|
||||||
if !config.inherit_stdout {
|
if !config.inherit_stdout {
|
||||||
config.state_builder.stdout(Box::new(Pipe::new()));
|
config
|
||||||
|
.state_builder
|
||||||
|
.stdout(Box::new(WasiBidirectionalPipePair::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if !config.inherit_stderr {
|
if !config.inherit_stderr {
|
||||||
config.state_builder.stderr(Box::new(Pipe::new()));
|
config
|
||||||
|
.state_builder
|
||||||
|
.stderr(Box::new(WasiBidirectionalPipePair::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: impl capturer for stdin
|
// TODO: impl capturer for stdin
|
||||||
@@ -340,7 +345,8 @@ pub unsafe extern "C" fn wasi_env_read_stdout(
|
|||||||
|
|
||||||
if let Ok(mut stdout) = state.stdout() {
|
if let Ok(mut stdout) = state.stdout() {
|
||||||
if let Some(stdout) = stdout.as_mut() {
|
if let Some(stdout) = stdout.as_mut() {
|
||||||
read_inner(stdout, inner_buffer)
|
let env = env.inner.data(&env.store.store()).clone();
|
||||||
|
read_inner(&env, stdout, inner_buffer)
|
||||||
} else {
|
} else {
|
||||||
update_last_error("could not find a file handle for `stdout`");
|
update_last_error("could not find a file handle for `stdout`");
|
||||||
-1
|
-1
|
||||||
@@ -362,7 +368,8 @@ pub unsafe extern "C" fn wasi_env_read_stderr(
|
|||||||
let state = env.inner.data_mut(&mut store_mut).state();
|
let state = env.inner.data_mut(&mut store_mut).state();
|
||||||
if let Ok(mut stderr) = state.stderr() {
|
if let Ok(mut stderr) = state.stderr() {
|
||||||
if let Some(stderr) = stderr.as_mut() {
|
if let Some(stderr) = stderr.as_mut() {
|
||||||
read_inner(stderr, inner_buffer)
|
let env = env.inner.data(&env.store.store()).clone();
|
||||||
|
read_inner(&env, stderr, inner_buffer)
|
||||||
} else {
|
} else {
|
||||||
update_last_error("could not find a file handle for `stderr`");
|
update_last_error("could not find a file handle for `stderr`");
|
||||||
-1
|
-1
|
||||||
@@ -374,16 +381,19 @@ pub unsafe extern "C" fn wasi_env_read_stderr(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn read_inner(
|
fn read_inner(
|
||||||
|
env: &WasiEnv,
|
||||||
wasi_file: &mut Box<dyn WasiFile + Send + Sync + 'static>,
|
wasi_file: &mut Box<dyn WasiFile + Send + Sync + 'static>,
|
||||||
inner_buffer: &mut [u8],
|
inner_buffer: &mut [u8],
|
||||||
) -> isize {
|
) -> isize {
|
||||||
match wasi_file.read(inner_buffer) {
|
env.tasks().block_on(async {
|
||||||
|
match wasi_file.read(inner_buffer).await {
|
||||||
Ok(a) => a as isize,
|
Ok(a) => a as isize,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
update_last_error(format!("failed to read wasi_file: {}", err));
|
update_last_error(format!("failed to read wasi_file: {}", err));
|
||||||
-1
|
-1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The version of WASI. This is determined by the imports namespace
|
/// The version of WASI. This is determined by the imports namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user