|
|
|
@ -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);
|
|
|
|
|