Skip to content

Commit

Permalink
Update UVWASI
Browse files Browse the repository at this point in the history
  • Loading branch information
vshymanskyy committed Apr 23, 2020
1 parent 75aefba commit 614f50d
Showing 1 changed file with 81 additions and 49 deletions.
130 changes: 81 additions & 49 deletions source/m3_api_uvwasi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}

Expand All @@ -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);
Expand All @@ -122,22 +124,25 @@ 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)
{
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)
Expand All @@ -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);
}

Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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);
}


Expand All @@ -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,
Expand All @@ -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);
}

Expand All @@ -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
Expand All @@ -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);
}

Expand All @@ -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);
}

Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 614f50d

Please sign in to comment.