From ae59d70bf291601b62f28ec7d624ab2f8859f14a Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 1 Dec 2021 15:23:09 -0600 Subject: [PATCH] added arguments to __spawn_process --- core/runtime/onyx_run.onyx | 2 +- src/wasm_runtime.c | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/core/runtime/onyx_run.onyx b/core/runtime/onyx_run.onyx index ca1af5a1..4b2fd6d4 100644 --- a/core/runtime/onyx_run.onyx +++ b/core/runtime/onyx_run.onyx @@ -17,4 +17,4 @@ use package wasi #export "_thread_exit" _thread_exit } -__spawn_process :: (path: str) -> i32 #foreign "env" "spawn_process" --- \ No newline at end of file +__spawn_process :: (path: str, args: [] str) -> i32 #foreign "env" "spawn_process" --- \ No newline at end of file diff --git a/src/wasm_runtime.c b/src/wasm_runtime.c index e8ff234d..3a0a8d58 100644 --- a/src/wasm_runtime.c +++ b/src/wasm_runtime.c @@ -175,15 +175,32 @@ static wasm_trap_t* onyx_kill_thread_impl(const wasm_val_vec_t* params, wasm_val static wasm_trap_t* onyx_spawn_process_impl(const wasm_val_vec_t* params, wasm_val_vec_t* results) { char* process_str = (char *) wasm_memory_data(wasm_memory) + params->data[0].of.i32; i32 process_len = params->data[1].of.i32; + i32 args_ptr = params->data[2].of.i32; + i32 args_len = params->data[3].of.i32; char process_path[1024]; process_len = bh_min(1023, process_len); memcpy(process_path, process_str, process_len); process_path[process_len] = '\0'; + char **process_args = bh_alloc_array(global_scratch_allocator, char *, args_len + 2); + byte_t* data = wasm_memory_data(wasm_memory); + byte_t* array_loc = data + args_ptr; + fori (i, 1, args_len + 1) { + char *arg_str = data + *(i32 *) (array_loc + (i - 1) * 8); + i32 arg_len = *(i32 *) (array_loc + (i - 1) * 8 + 4); + + char *arg = bh_alloc_array(global_scratch_allocator, char, arg_len + 1); + memcpy(arg, arg_str, arg_len); + arg[arg_len] = '\0'; + process_args[i] = arg; + } + process_args[0] = process_path; + process_args[args_len + 1] = NULL; + #ifdef _BH_LINUX if (fork() == 0) { - execv(process_path, NULL); + execv(process_path, process_args); } i32 status; @@ -295,7 +312,9 @@ void onyx_run_wasm(bh_buffer wasm_bytes) { } if (wasm_name_equals_string(import_name, "spawn_process")) { - wasm_functype_t* func_type = wasm_functype_new_2_1(wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32()); + wasm_functype_t* func_type = wasm_functype_new_4_1( + wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32(), wasm_valtype_new_i32(), + wasm_valtype_new_i32()); wasm_func_t* wasm_func = wasm_func_new(wasm_store, func_type, onyx_spawn_process_impl); import = wasm_func_as_extern(wasm_func); -- 2.25.1