IO: support populate fds into WASM application (#655)

Add new API wasm_runtime_set_wasi_args_ex to support populate stdio fds

Signed-off-by: LiFeng <lifeng68@huawei.com>
This commit is contained in:
LiFeng
2021-06-22 14:41:49 +08:00
committed by GitHub
parent 38c2ca63d0
commit c6783ef258
8 changed files with 90 additions and 20 deletions

View File

@ -550,20 +550,24 @@ static bool
set_wasi_args(void *wasm_module,
const char **dir_list, uint32_t dir_list_size,
const char **env_list, uint32_t env_list_size,
int stdinfd, int stdoutfd, int stderrfd,
char **argv, uint32_t argc)
{
uint64_t ecall_args[7];
uint64_t ecall_args[10];
ecall_args[0] = (uint64_t)(uintptr_t)wasm_module;
ecall_args[1] = (uint64_t)(uintptr_t)dir_list;
ecall_args[2] = dir_list_size;
ecall_args[3] = (uint64_t)(uintptr_t)env_list;
ecall_args[4] = env_list_size;
ecall_args[5] = (uint64_t)(uintptr_t)argv;
ecall_args[6] = argc;
ecall_args[5] = stdinfd;
ecall_args[6] = stdoutfd;
ecall_args[7] = stderrfd;
ecall_args[8] = (uint64_t)(uintptr_t)argv;
ecall_args[9] = argc;
if (SGX_SUCCESS != ecall_handle_command(g_eid, CMD_SET_WASI_ARGS,
(uint8_t *)ecall_args,
sizeof(uint64_t) * 7)) {
sizeof(uint64_t) * 10)) {
printf("Call ecall_handle_command() failed.\n");
}
@ -702,7 +706,7 @@ main(int argc, char *argv[])
/* Set wasi arguments */
if (!set_wasi_args(wasm_module, dir_list, dir_list_size,
env_list, env_list_size, argv, argc)) {
env_list, env_list_size, 0, 1, 2, argv, argc)) {
printf("%s\n", "set wasi arguments failed.\n");
goto fail3;
}
@ -773,6 +777,9 @@ wamr_pal_create_process(struct wamr_pal_create_process_args *args)
uint32_t max_thread_num = 4;
char *wasm_files[16];
void *wasm_module_inst[16];
int stdinfd = -1;
int stdoutfd = -1;
int stderrfd = -1;
int argc = 2;
char *argv[argc] = { (char*)"./iwasm", (char *)args->argv[0] };
@ -796,6 +803,12 @@ wamr_pal_create_process(struct wamr_pal_create_process_args *args)
wasm_files[i] = (char *)args->argv[i];
}
if (args->stdio != NULL) {
stdinfd = args->stdio->stdin_fd;
stdoutfd = args->stdio->stdout_fd;
stderrfd = args->stdio->stderr_fd;
}
/* Init runtime */
if (!init_runtime(alloc_with_pool, max_thread_num)) {
printf("Failed to init runtime\n");
@ -834,7 +847,9 @@ wamr_pal_create_process(struct wamr_pal_create_process_args *args)
/* Set wasi arguments */
if (!set_wasi_args(wasm_module, dir_list, dir_list_size,
env_list, env_list_size, argv, argc)) {
env_list, env_list_size,
stdinfd, stdoutfd, stderrfd,
argv, argc)) {
printf("%s\n", "set wasi arguments failed.\n");
unload_module(wasm_module);
free(wasm_file_buf);

View File

@ -311,13 +311,16 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
uint32 dir_list_size = *(uint32 *)args++;
char **env_list = *(char ***)args++;
uint32 env_list_size = *(uint32 *)args++;
int stdinfd = *(int *)args++;
int stdoutfd = *(int *)args++;
int stderrfd = *(int *)args++;
char **wasi_argv = *(char ***)args++;
char *p, *p1;
uint32 wasi_argc = *(uint32 *)args++;
uint64 total_size = 0;
int32 i, str_len;
bh_assert(argc == 7);
bh_assert(argc == 10);
total_size += sizeof(char *) * (uint64)dir_list_size
+ sizeof(char *) * (uint64)env_list_size
@ -382,14 +385,17 @@ handle_cmd_set_wasi_args(uint64 *args, int32 argc)
p += sizeof(char *) * wasi_argc;
}
wasm_runtime_set_wasi_args(enclave_module->module,
(const char **)enclave_module->wasi_dir_list,
dir_list_size,
NULL, 0,
(const char **)enclave_module->wasi_env_list,
env_list_size,
enclave_module->wasi_argv,
enclave_module->wasi_argc);
wasm_runtime_set_wasi_args_ex(enclave_module->module,
(const char **)enclave_module->wasi_dir_list,
dir_list_size,
NULL, 0,
(const char **)enclave_module->wasi_env_list,
env_list_size,
enclave_module->wasi_argv,
enclave_module->wasi_argc,
(stdinfd != -1) ? stdinfd : 0,
(stdoutfd != -1) ? stdoutfd : 1,
(stderrfd != -1) ? stderrfd : 2);
*args_org = true;
}