diff --git a/source/m3_api_uvwasi.c b/source/m3_api_uvwasi.c index 40ff607c..06bb7ce4 100644 --- a/source/m3_api_uvwasi.c +++ b/source/m3_api_uvwasi.c @@ -2,8 +2,7 @@ // m3_api_uvwasi.c // // Created by Colin J. Ihrig on 4/20/20. -// Copyright © 2020 Colin J. Ihrig. All rights reserved. - +// Copyright © 2020 Colin J. Ihrig, Volodymyr Shymanskyy. All rights reserved. // #define _POSIX_C_SOURCE 200809L @@ -53,7 +52,7 @@ m3ApiRawFunction(m3_wasi_unstable_args_get) for (u32 i = 0; i < runtime->argc; ++i) { - argv[i] = m3ApiPtrToOffset (argv_buf); + m3ApiWriteMem32(&argv[i], m3ApiPtrToOffset(argv_buf)); size_t len = strlen (runtime->argv [i]); memcpy (argv_buf, runtime->argv [i], len); @@ -72,12 +71,15 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get) if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); } - *argc = runtime->argc; - *argv_buf_size = 0; + __wasi_size_t buflen = 0; for (u32 i = 0; i < runtime->argc; ++i) { - * argv_buf_size += strlen (runtime->argv [i]) + 1; + buflen += strlen (runtime->argv [i]) + 1; } + + m3ApiWriteMem32(argc, runtime->argc); + m3ApiWriteMem32(argv_buf_size, buflen); + m3ApiReturn(UVWASI_ESUCCESS); } @@ -88,17 +90,17 @@ m3ApiRawFunction(m3_wasi_unstable_environ_get) m3ApiGetArgMem (char* , env_buf) char **environment; - uvwasi_errno_t err; + uvwasi_errno_t ret; environment = calloc(uvwasi.envc, sizeof(char *)); if (environment == NULL) { m3ApiReturn(UVWASI_ENOMEM); } - err = uvwasi_environ_get(&uvwasi, environment, env_buf); - if (err != UVWASI_ESUCCESS) { + ret = uvwasi_environ_get(&uvwasi, environment, env_buf); + if (ret != UVWASI_ESUCCESS) { free(environment); - m3ApiReturn(err); + m3ApiReturn(ret); } uint32_t environ_buf_offset = m3ApiPtrToOffset(env_buf); @@ -122,12 +124,13 @@ m3ApiRawFunction(m3_wasi_unstable_environ_sizes_get) size_t count; size_t buf_size; - uvwasi_errno_t err; + uvwasi_errno_t ret; - err = uvwasi_environ_sizes_get(&uvwasi, &count, &buf_size); + ret = uvwasi_environ_sizes_get(&uvwasi, &count, &buf_size); *env_count = count; *env_buf_size = buf_size; - m3ApiReturn(err); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_prestat_dir_name) @@ -135,9 +138,11 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_dir_name) m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t , fd) m3ApiGetArgMem (char* , path) - m3ApiGetArg (size_t , path_len) + m3ApiGetArg (__wasi_size_t , path_len) + + uvwasi_errno_t ret = uvwasi_fd_prestat_dir_name(&uvwasi, fd, path, path_len); - m3ApiReturn(uvwasi_fd_prestat_dir_name(&uvwasi, fd, path, path_len)); + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_prestat_get) @@ -147,16 +152,16 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_get) m3ApiGetArgMem (uint32_t * , buf) uvwasi_prestat_t prestat; - uvwasi_errno_t err; + uvwasi_errno_t ret; - err = uvwasi_fd_prestat_get(&uvwasi, fd, &prestat); - if (err != UVWASI_ESUCCESS) { - m3ApiReturn(err); + ret = uvwasi_fd_prestat_get(&uvwasi, fd, &prestat); + if (ret != UVWASI_ESUCCESS) { + m3ApiReturn(ret); } // TODO(cjihrig): This memory writing logic is wrong. - *buf = prestat.pr_type; - *(buf + 1) = prestat.u.dir.pr_name_len; + m3ApiWriteMem32(buf, prestat.pr_type); + m3ApiWriteMem32(buf+1, prestat.u.dir.pr_name_len); m3ApiReturn(UVWASI_ESUCCESS); } @@ -166,7 +171,11 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get) m3ApiGetArg (uvwasi_fd_t , fd) m3ApiGetArgMem (uvwasi_fdstat_t* , fdstat) - m3ApiReturn(uvwasi_fd_fdstat_get(&uvwasi, fd, fdstat)); + uvwasi_errno_t ret = uvwasi_fd_fdstat_get(&uvwasi, fd, fdstat); + + //TODO: m3ApiWriteMem + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags) @@ -175,7 +184,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags) m3ApiGetArg (uvwasi_fd_t , fd) m3ApiGetArg (uvwasi_fdflags_t , flags) - m3ApiReturn(uvwasi_fd_fdstat_set_flags(&uvwasi, fd, flags)); + uvwasi_errno_t ret = uvwasi_fd_fdstat_set_flags(&uvwasi, fd, flags); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_seek) @@ -186,7 +197,11 @@ m3ApiRawFunction(m3_wasi_unstable_fd_seek) m3ApiGetArg (uvwasi_whence_t , whence) m3ApiGetArgMem (uvwasi_filesize_t* , result) - m3ApiReturn(uvwasi_fd_seek(&uvwasi, fd, offset, whence, result)); + uvwasi_errno_t ret = uvwasi_fd_seek(&uvwasi, fd, offset, whence, result); + + //TODO: m3ApiWriteMem + + m3ApiReturn(ret); } @@ -203,7 +218,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_open) m3ApiGetArg (uvwasi_fdflags_t , fs_flags) m3ApiGetArgMem (uvwasi_fd_t * , fd) - m3ApiReturn(uvwasi_path_open(&uvwasi, + uvwasi_errno_t ret = uvwasi_path_open(&uvwasi, dirfd, dirflags, path, @@ -212,20 +227,26 @@ m3ApiRawFunction(m3_wasi_unstable_path_open) fs_rights_base, fs_rights_inheriting, fs_flags, - fd)); + fd); + + //TODO: m3ApiWriteMem + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_path_filestat_get) { m3ApiReturnType (uint32_t) - m3ApiGetArg (__wasi_fd_t , fd) - m3ApiGetArg (__wasi_lookupflags_t , flags) + m3ApiGetArg (uvwasi_fd_t , fd) + m3ApiGetArg (uvwasi_lookupflags_t , flags) m3ApiGetArgMem (const char * , path) m3ApiGetArg (uint32_t , path_len) - m3ApiGetArgMem (__wasi_filestat_t * , buf) + m3ApiGetArgMem (uvwasi_filestat_t * , buf) uvwasi_errno_t ret = uvwasi_path_filestat_get(&uvwasi, fd, flags, path, path_len, buf); + //TODO: m3ApiWriteMem + m3ApiReturn(ret); } @@ -238,6 +259,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read) m3ApiGetArgMem (__wasi_size_t* , nread) // TODO: check iovs_len + #if defined(M3_COMPILER_MSVC) uvwasi_ciovec_t iovs[32]; #else @@ -246,17 +268,13 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read) size_t num_read; uvwasi_errno_t ret; - if (iovs == NULL) { - m3ApiReturn(UVWASI_ENOMEM); - } - for (__wasi_size_t i = 0; i < iovs_len; ++i) { - iovs[i].buf = m3ApiOffsetToPtr(wasi_iovs[i].buf); - iovs[i].buf_len = wasi_iovs[i].buf_len; + iovs[i].buf = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf)); + iovs[i].buf_len = m3ApiReadMem32(&wasi_iovs[i].buf_len); } ret = uvwasi_fd_read(&uvwasi, fd, iovs, iovs_len, &num_read); - *nread = num_read; + m3ApiWriteMem32(nread, num_read); m3ApiReturn(ret); } @@ -278,17 +296,13 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write) size_t num_written; uvwasi_errno_t ret; - if (iovs == NULL) { - m3ApiReturn(UVWASI_ENOMEM); - } - for (__wasi_size_t i = 0; i < iovs_len; ++i) { - iovs[i].buf = m3ApiOffsetToPtr(wasi_iovs[i].buf); - iovs[i].buf_len = wasi_iovs[i].buf_len; + iovs[i].buf = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf)); + iovs[i].buf_len = m3ApiReadMem32(&wasi_iovs[i].buf_len); } ret = uvwasi_fd_write(&uvwasi, fd, iovs, iovs_len, &num_written); - *nwritten = num_written; + m3ApiWriteMem32(nwritten, num_written); m3ApiReturn(ret); } @@ -331,6 +345,8 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get) uvwasi_errno_t ret = uvwasi_clock_res_get(&uvwasi, wasi_clk_id, resolution); + //TODO: m3ApiWriteMem64 + m3ApiReturn(ret); } @@ -343,19 +359,23 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get) uvwasi_errno_t ret = uvwasi_clock_time_get(&uvwasi, wasi_clk_id, precision, time); + //TODO: m3ApiWriteMem64 + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_poll_oneoff) { m3ApiReturnType (uint32_t) - m3ApiGetArgMem (const __wasi_subscription_t* , in) - m3ApiGetArgMem (__wasi_event_t* , out) + m3ApiGetArgMem (const uvwasi_subscription_t* , in) + m3ApiGetArgMem (uvwasi_event_t* , out) m3ApiGetArg (__wasi_size_t , nsubscriptions) m3ApiGetArgMem (__wasi_size_t* , nevents) uvwasi_errno_t ret = uvwasi_poll_oneoff(&uvwasi, in, out, nsubscriptions, nevents); + //TODO: m3ApiWriteMem + m3ApiReturn(ret); } @@ -400,18 +420,30 @@ M3Result m3_LinkWASI (IM3Module module) // working with command line arguments. init_options.argc = 0; init_options.argv = NULL; - init_options.envp = (char**) environ; + + char* env[7]; + env[0] = "TERM=xterm-256color"; + env[1] = "COLORTERM=truecolor"; + env[2] = "LANG=en_US.UTF-8"; + env[3] = "PWD=/"; + env[4] = "HOME=/"; + env[5] = "PATH=/"; + env[6] = NULL; + + init_options.envp = env; // TODO(cjihrig): This requires better support for the --dir command line // flag to implement properly. For now, just let WASI applications access // the current working directory as the sandboxed root directory. - uvwasi_preopen_t preopens[1]; + uvwasi_preopen_t preopens[2]; preopens[0].mapped_path = "/"; preopens[0].real_path = "."; + preopens[1].mapped_path = "."; + preopens[1].real_path = "."; - init_options.preopenc = 1; - init_options.preopens = &preopens; + init_options.preopenc = 2; + init_options.preopens = preopens; init_options.allocator = NULL; ret = uvwasi_init(&uvwasi, &init_options);