From 00e3ec14466d372e2c6399a959714fee93adb13b Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Fri, 1 Mar 2019 10:59:52 -0800 Subject: [PATCH] add execvp --- lib/emscripten/emtests/test_execvp.c | 17 ++++++++ lib/emscripten/emtests/test_execvp.out | 1 + lib/emscripten/emtests/test_execvp.wasm | Bin 0 -> 45386 bytes lib/emscripten/emtests/test_execvp_windows.c | 18 ++++++++ .../emtests/test_execvp_windows.wasm | Bin 0 -> 45500 bytes lib/emscripten/src/exec.rs | 40 ++++++++++++++++++ lib/emscripten/src/lib.rs | 4 ++ lib/emscripten/tests/emtests/mod.rs | 1 + lib/emscripten/tests/emtests/test_execvp.rs | 17 ++++++++ 9 files changed, 98 insertions(+) create mode 100644 lib/emscripten/emtests/test_execvp.c create mode 100644 lib/emscripten/emtests/test_execvp.out create mode 100644 lib/emscripten/emtests/test_execvp.wasm create mode 100644 lib/emscripten/emtests/test_execvp_windows.c create mode 100644 lib/emscripten/emtests/test_execvp_windows.wasm create mode 100644 lib/emscripten/src/exec.rs create mode 100644 lib/emscripten/tests/emtests/test_execvp.rs diff --git a/lib/emscripten/emtests/test_execvp.c b/lib/emscripten/emtests/test_execvp.c new file mode 100644 index 000000000..402654721 --- /dev/null +++ b/lib/emscripten/emtests/test_execvp.c @@ -0,0 +1,17 @@ +#include +#include + +int main() { + char command[] = "touch"; + char arg1[] = "foo.txt"; + char* argv[3]; + argv[0] = command; + argv[1] = arg1; + argv[2] = 0; + + printf("_execvp\n"); + int result = execvp(command, argv); + // should not return, and not print this message + printf("error"); + return 0; +} diff --git a/lib/emscripten/emtests/test_execvp.out b/lib/emscripten/emtests/test_execvp.out new file mode 100644 index 000000000..5048f1e2c --- /dev/null +++ b/lib/emscripten/emtests/test_execvp.out @@ -0,0 +1 @@ +_execvp diff --git a/lib/emscripten/emtests/test_execvp.wasm b/lib/emscripten/emtests/test_execvp.wasm new file mode 100644 index 0000000000000000000000000000000000000000..a0959cc56fbd6670bce2a3b64c462e56c32f84b4 GIT binary patch literal 45386 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 W*Kr0-25am0f;fzW_2zo;!hZn2x$Q3i literal 0 HcmV?d00001 diff --git a/lib/emscripten/emtests/test_execvp_windows.c b/lib/emscripten/emtests/test_execvp_windows.c new file mode 100644 index 000000000..c3920a4fa --- /dev/null +++ b/lib/emscripten/emtests/test_execvp_windows.c @@ -0,0 +1,18 @@ +#include +#include + +int main() { + char command[] = "C:\\Windows\\System32\\cmd.exe"; + char arg1[] = "echo"; + char arg2[] = "foo"; + char* argv[4]; + argv[0] = command; + argv[1] = arg1; + argv[2] = arg2; + argv[3] = 0; + printf("_execvp\n"); + int result = execvp(command, argv); + // should not return, and not print this message + printf("error"); + return 0; +} diff --git a/lib/emscripten/emtests/test_execvp_windows.wasm b/lib/emscripten/emtests/test_execvp_windows.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ec3a210c5cf578243cff0bc20afc2ced0256d3e7 GIT binary patch literal 45500 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 i32 { + // a single reference to re-use + let emscripten_memory = ctx.memory(0); + + // read command name as string + let command_name_string_vec: Vec = emscripten_memory.view() + [(command_name_offset as usize)..] + .iter() + .map(|cell| cell.get()) + .take_while(|&byte| byte != 0) + .collect(); + let command_name_string = CString::new(command_name_string_vec).unwrap(); + + // get the array of args + let mut argv: Vec<*const i8> = emscripten_memory.view()[((argv_offset / 4) as usize)..] + .iter() + .map(|cell: &Cell| cell.get()) + .take_while(|&byte| byte != 0) + .map(|offset| { + let p: *const i8 = (emscripten_memory.view::()[(offset as usize)..]) + .iter() + .map(|cell| cell.as_ptr() as *const i8) + .collect::>()[0]; + p + }) + .collect(); + + // push a nullptr on to the end of the args array + argv.push(std::ptr::null()); + + // construct raw pointers and hand them to `execvp` + let command_pointer = command_name_string.as_ptr() as *const i8; + let args_pointer = argv.as_ptr(); + unsafe { execvp(command_pointer, args_pointer) } +} diff --git a/lib/emscripten/src/lib.rs b/lib/emscripten/src/lib.rs index 373ad51ab..cbcb5c1fc 100644 --- a/lib/emscripten/src/lib.rs +++ b/lib/emscripten/src/lib.rs @@ -31,6 +31,7 @@ mod emscripten_target; mod env; mod errno; mod exception; +mod exec; mod io; mod jmp; mod linking; @@ -439,6 +440,9 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject "___unlock" => func!(crate::lock::___unlock), "___wait" => func!(crate::lock::___wait), + // exec + "_execvp" => func!(crate::exec::_execvp), + // Env "___assert_fail" => func!(crate::env::___assert_fail), "_getenv" => func!(crate::env::_getenv), diff --git a/lib/emscripten/tests/emtests/mod.rs b/lib/emscripten/tests/emtests/mod.rs index efedf0d6b..89a66bf2b 100644 --- a/lib/emscripten/tests/emtests/mod.rs +++ b/lib/emscripten/tests/emtests/mod.rs @@ -43,6 +43,7 @@ mod test_exceptions_2; mod test_exceptions_multi; mod test_exceptions_std; mod test_exceptions_white_list; +mod test_execvp; mod test_fast_math; mod test_flexarray_struct; mod test_float32_precise; diff --git a/lib/emscripten/tests/emtests/test_execvp.rs b/lib/emscripten/tests/emtests/test_execvp.rs new file mode 100644 index 000000000..c9b4b5113 --- /dev/null +++ b/lib/emscripten/tests/emtests/test_execvp.rs @@ -0,0 +1,17 @@ +#[test] +fn test_execvp() { + #[cfg(not(target_os = "windows"))] + assert_emscripten_output!( + "../../emtests/test_execvp.wasm", + "test_execvp", + vec![], + "../../emtests/test_execvp.out" + ); + #[cfg(target_os = "windows")] + assert_emscripten_output!( + "../../emtests/test_execvp_windows.wasm", + "test_execvp", + vec![], + "../../emtests/test_execvp.out" + ); +}