Skip to content

Commit 9db2c5f

Browse files
epilysfschutt
authored andcommitted
c-api: add functions to overwrite stdin and to write to it
Fixes #2334
1 parent 6f43bed commit 9db2c5f

File tree

1 file changed

+59
-0
lines changed
  • lib/c-api/src/wasm_c_api/wasi

1 file changed

+59
-0
lines changed

lib/c-api/src/wasm_c_api/wasi/mod.rs

+59
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ pub extern "C" fn wasi_config_inherit_stdin(config: &mut wasi_config_t) {
158158
config.inherit_stdin = true;
159159
}
160160

161+
#[no_mangle]
162+
pub extern "C" fn wasi_config_overwrite_stdin(config: &mut wasi_config_t) {
163+
let piped_stdin = Box::new(Pipe::new());
164+
config.state_builder.stdin(piped_stdin);
165+
}
166+
161167
#[allow(non_camel_case_types)]
162168
pub struct wasi_env_t {
163169
/// cbindgen:ignore
@@ -250,6 +256,23 @@ pub unsafe extern "C" fn wasi_env_read_stderr(
250256
}
251257
}
252258

259+
#[no_mangle]
260+
pub unsafe extern "C" fn wasi_env_write_stdin(
261+
env: &mut wasi_env_t,
262+
buffer: *const u8,
263+
buffer_len: usize,
264+
) -> bool {
265+
let mut store_mut = env.store.store_mut();
266+
let state = env.inner.data_mut(&mut store_mut).state();
267+
let mut stdin =
268+
c_try!(state.stdin(); otherwise false).ok_or("Could not access WASI's state stdin");
269+
let wasi_stdin = c_try!(stdin.as_mut(); otherwise false);
270+
let buffer = slice::from_raw_parts(buffer, buffer_len);
271+
let msg = c_try!(std::str::from_utf8(buffer); otherwise false);
272+
c_try!(write!(wasi_stdin, "{}", msg); otherwise false);
273+
true
274+
}
275+
253276
fn read_inner(
254277
wasi_file: &mut Box<dyn WasiFile + Send + Sync + 'static>,
255278
inner_buffer: &mut [u8],
@@ -503,4 +526,40 @@ mod tests {
503526
})
504527
.success();
505528
}
529+
530+
#[test]
531+
fn test_wasi_stdin_set() {
532+
(assert_c! {
533+
#include "tests/wasmer.h"
534+
535+
int main() {
536+
wasm_engine_t* engine = wasm_engine_new();
537+
wasm_store_t* store = wasm_store_new(engine);
538+
wasi_config_t* config = wasi_config_new("example_program");
539+
wasi_config_capture_stdout(config);
540+
wasi_config_overwrite_stdin(config);
541+
542+
wasm_byte_vec_t wat;
543+
wasmer_byte_vec_new_from_string(&wat, "(module (import \"wasi_unstable\" \"args_get\" (func (param i32 i32) (result i32))))");
544+
wasm_byte_vec_t wasm;
545+
wat2wasm(&wat, &wasm);
546+
547+
wasm_module_t* module = wasm_module_new(store, &wasm);
548+
assert(module);
549+
550+
// TODO FIXME
551+
//
552+
// Test captured stdin
553+
554+
wasm_module_delete(module);
555+
wasm_byte_vec_delete(&wasm);
556+
wasm_byte_vec_delete(&wat);
557+
wasm_store_delete(store);
558+
wasm_engine_delete(engine);
559+
560+
return 0;
561+
}
562+
})
563+
.success();
564+
}
506565
}

0 commit comments

Comments
 (0)