@@ -158,6 +158,12 @@ pub extern "C" fn wasi_config_inherit_stdin(config: &mut wasi_config_t) {
158
158
config. inherit_stdin = true ;
159
159
}
160
160
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
+
161
167
#[ allow( non_camel_case_types) ]
162
168
pub struct wasi_env_t {
163
169
/// cbindgen:ignore
@@ -250,6 +256,23 @@ pub unsafe extern "C" fn wasi_env_read_stderr(
250
256
}
251
257
}
252
258
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
+
253
276
fn read_inner (
254
277
wasi_file : & mut Box < dyn WasiFile + Send + Sync + ' static > ,
255
278
inner_buffer : & mut [ u8 ] ,
@@ -503,4 +526,40 @@ mod tests {
503
526
} )
504
527
. success ( ) ;
505
528
}
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
+ }
506
565
}
0 commit comments