|
|
|
@ -26,11 +26,11 @@ typedef uint32_t __wasi_size_t;
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
|
struct wasi_iovec
|
|
|
|
|
typedef struct wasi_iovec_t
|
|
|
|
|
{
|
|
|
|
|
__wasi_size_t iov_base;
|
|
|
|
|
__wasi_size_t iov_len;
|
|
|
|
|
};
|
|
|
|
|
__wasi_size_t buf;
|
|
|
|
|
__wasi_size_t buf_len;
|
|
|
|
|
} wasi_iovec_t;
|
|
|
|
|
|
|
|
|
|
#define PREOPEN_CNT 3
|
|
|
|
|
|
|
|
|
@ -113,19 +113,19 @@ __wasi_timestamp_t convert_timespec(const struct timespec *ts) {
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_args_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArgMem (u32 * , argv_offset)
|
|
|
|
|
m3ApiGetArgMem (u8 * , argv_buf_offset)
|
|
|
|
|
m3ApiGetArgMem (uint32_t * , argv)
|
|
|
|
|
m3ApiGetArgMem (char * , argv_buf)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
|
for (u32 i = 0; i < runtime->argc; ++i)
|
|
|
|
|
{
|
|
|
|
|
argv_offset [i] = m3ApiPtrToOffset (argv_buf_offset);
|
|
|
|
|
|
|
|
|
|
size_t len = strlen (runtime->argv [i]);
|
|
|
|
|
memcpy (argv_buf_offset, runtime->argv [i], len);
|
|
|
|
|
argv_buf_offset += len;
|
|
|
|
|
* argv_buf_offset++ = 0;
|
|
|
|
|
m3ApiWriteMem32(&argv[i], m3ApiPtrToOffset(argv_buf));
|
|
|
|
|
|
|
|
|
|
size_t len = strlen (runtime->argv[i]);
|
|
|
|
|
memcpy (argv_buf, runtime->argv[i], len);
|
|
|
|
|
argv_buf += len;
|
|
|
|
|
* argv_buf++ = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
@ -134,25 +134,28 @@ m3ApiRawFunction(m3_wasi_unstable_args_get)
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , argc)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , argv_buf_size)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , argc)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , argv_buf_size)
|
|
|
|
|
|
|
|
|
|
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(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_environ_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (uint32_t , environ_ptrs_offset)
|
|
|
|
|
m3ApiGetArg (uint32_t , environ_strs_offset)
|
|
|
|
|
m3ApiGetArgMem (uint32_t * , env)
|
|
|
|
|
m3ApiGetArgMem (char * , env_buf)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
// TODO
|
|
|
|
@ -162,13 +165,15 @@ m3ApiRawFunction(m3_wasi_unstable_environ_get)
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_environ_sizes_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , environ_count)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , environ_buf_size)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , env_count)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , env_buf_size)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
*environ_count = 0;
|
|
|
|
|
*environ_buf_size = 0;
|
|
|
|
|
m3ApiWriteMem32(env_count, 0);
|
|
|
|
|
m3ApiWriteMem32(env_buf_size, 0);
|
|
|
|
|
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -176,13 +181,13 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_dir_name)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArgMem (char* , path)
|
|
|
|
|
m3ApiGetArgMem (char * , path)
|
|
|
|
|
m3ApiGetArg (__wasi_size_t , path_len)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
if (fd < 3 || fd >= PREOPEN_CNT) { m3ApiReturn(__WASI_EBADF); }
|
|
|
|
|
int size = M3_MIN(strlen(preopen[fd].path), path_len);
|
|
|
|
|
memcpy(path, preopen[fd].path, size);
|
|
|
|
|
size_t slen = strlen(preopen[fd].path);
|
|
|
|
|
memcpy(path, preopen[fd].path, M3_MIN(slen, path_len));
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -190,12 +195,12 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArgMem (uint32_t* , buf) // TODO: use actual struct
|
|
|
|
|
m3ApiGetArgMem (uint32_t * , buf) // TODO: use actual struct
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
if (fd < 3 || fd >= PREOPEN_CNT) { m3ApiReturn(__WASI_EBADF); }
|
|
|
|
|
*(buf) = __WASI_PREOPENTYPE_DIR;
|
|
|
|
|
*(buf+1) = strlen(preopen[fd].path);
|
|
|
|
|
m3ApiWriteMem32(buf, __WASI_PREOPENTYPE_DIR);
|
|
|
|
|
m3ApiWriteMem32(buf+1, strlen(preopen[fd].path));
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -203,7 +208,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArgMem (__wasi_fdstat_t* , fdstat)
|
|
|
|
|
m3ApiGetArgMem (__wasi_fdstat_t * , fdstat)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || fdstat == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
@ -218,33 +223,50 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
|
|
|
|
|
(S_ISREG(mode) ? __WASI_FILETYPE_REGULAR_FILE : 0) |
|
|
|
|
|
//(S_ISSOCK(mode) ? __WASI_FILETYPE_SOCKET_STREAM : 0) |
|
|
|
|
|
(S_ISLNK(mode) ? __WASI_FILETYPE_SYMBOLIC_LINK : 0);
|
|
|
|
|
fdstat->fs_flags = ((fl & O_APPEND) ? __WASI_FDFLAG_APPEND : 0) |
|
|
|
|
|
m3ApiWriteMem16(&fdstat->fs_flags,
|
|
|
|
|
((fl & O_APPEND) ? __WASI_FDFLAG_APPEND : 0) |
|
|
|
|
|
//((fl & O_DSYNC) ? __WASI_FDFLAG_DSYNC : 0) |
|
|
|
|
|
((fl & O_NONBLOCK) ? __WASI_FDFLAG_NONBLOCK : 0) |
|
|
|
|
|
//((fl & O_RSYNC) ? __WASI_FDFLAG_RSYNC : 0) |
|
|
|
|
|
((fl & O_SYNC) ? __WASI_FDFLAG_SYNC : 0);
|
|
|
|
|
((fl & O_SYNC) ? __WASI_FDFLAG_SYNC : 0));
|
|
|
|
|
fdstat->fs_rights_base = (uint64_t)-1; // all rights
|
|
|
|
|
fdstat->fs_rights_inheriting = (uint64_t)-1; // all rights
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArg (__wasi_fdflags_t , flags)
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_fd_seek)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArg (__wasi_filedelta_t , offset)
|
|
|
|
|
m3ApiGetArg (__wasi_whence_t , whence)
|
|
|
|
|
m3ApiGetArgMem (__wasi_filesize_t* , result)
|
|
|
|
|
m3ApiGetArg (__wasi_whence_t , wasi_whence)
|
|
|
|
|
m3ApiGetArgMem (__wasi_filesize_t * , result)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || result == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
|
int wasi_whence = whence == __WASI_WHENCE_END ? SEEK_END :
|
|
|
|
|
__WASI_WHENCE_CUR ? SEEK_CUR : 0;
|
|
|
|
|
int64_t ret;
|
|
|
|
|
ret = lseek(fd, offset, wasi_whence);
|
|
|
|
|
int whence;
|
|
|
|
|
switch (wasi_whence) {
|
|
|
|
|
case __WASI_WHENCE_CUR: whence = SEEK_CUR; break;
|
|
|
|
|
case __WASI_WHENCE_END: whence = SEEK_END; break;
|
|
|
|
|
case __WASI_WHENCE_SET: whence = SEEK_SET; break;
|
|
|
|
|
default: m3ApiReturn(__WASI_EINVAL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int64_t ret;
|
|
|
|
|
ret = lseek(fd, offset, whence);
|
|
|
|
|
if (ret < 0) { m3ApiReturn(errno_to_wasi(errno)); }
|
|
|
|
|
*result = ret;
|
|
|
|
|
m3ApiWriteMem64(result, ret);
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -255,7 +277,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , dirfd)
|
|
|
|
|
m3ApiGetArg (__wasi_lookupflags_t , dirflags)
|
|
|
|
|
m3ApiGetArgMem (const char * , path)
|
|
|
|
|
m3ApiGetArg (uint32_t , path_len)
|
|
|
|
|
m3ApiGetArg (__wasi_size_t , path_len)
|
|
|
|
|
m3ApiGetArg (__wasi_oflags_t , oflags)
|
|
|
|
|
m3ApiGetArg (__wasi_rights_t , fs_rights_base)
|
|
|
|
|
m3ApiGetArg (__wasi_rights_t , fs_rights_inheriting)
|
|
|
|
@ -269,7 +291,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
|
|
|
|
|
char host_path [path_len+1];
|
|
|
|
|
|
|
|
|
|
memcpy (host_path, path, path_len);
|
|
|
|
|
host_path [path_len] = '\0'; // NULL terminator
|
|
|
|
|
host_path[path_len] = '\0'; // NULL terminator
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
m3ApiReturn(__WASI_ENOSYS);
|
|
|
|
@ -279,17 +301,16 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArg (uint32_t , iovs_offset)
|
|
|
|
|
m3ApiGetArgMem (wasi_iovec_t * , wasi_iovs)
|
|
|
|
|
m3ApiGetArg (__wasi_size_t , iovs_len)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , nread)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , nread)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || nread == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
|
ssize_t res = 0;
|
|
|
|
|
struct wasi_iovec *wasi_iov = m3ApiOffsetToPtr(iovs_offset);
|
|
|
|
|
for (__wasi_size_t i = 0; i < iovs_len; i++) {
|
|
|
|
|
void* addr = m3ApiOffsetToPtr(wasi_iov[i].iov_base);
|
|
|
|
|
size_t len = wasi_iov[i].iov_len;
|
|
|
|
|
void* addr = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf));
|
|
|
|
|
size_t len = m3ApiReadMem32(&wasi_iovs[i].buf_len);
|
|
|
|
|
if (len == 0) continue;
|
|
|
|
|
|
|
|
|
|
int ret = read (fd, addr, len);
|
|
|
|
@ -297,7 +318,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
|
|
|
|
|
res += ret;
|
|
|
|
|
if ((size_t)ret < len) break;
|
|
|
|
|
}
|
|
|
|
|
*nread = res;
|
|
|
|
|
m3ApiWriteMem32(nread, res);
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -305,17 +326,16 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_fd_t , fd)
|
|
|
|
|
m3ApiGetArg (uint32_t , iovs_offset)
|
|
|
|
|
m3ApiGetArgMem (wasi_iovec_t * , wasi_iovs)
|
|
|
|
|
m3ApiGetArg (__wasi_size_t , iovs_len)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t* , nwritten)
|
|
|
|
|
m3ApiGetArgMem (__wasi_size_t * , nwritten)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || nwritten == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
|
ssize_t res = 0;
|
|
|
|
|
struct wasi_iovec *wasi_iov = m3ApiOffsetToPtr(iovs_offset);
|
|
|
|
|
for (__wasi_size_t i = 0; i < iovs_len; i++) {
|
|
|
|
|
void* addr = m3ApiOffsetToPtr(wasi_iov[i].iov_base);
|
|
|
|
|
size_t len = wasi_iov[i].iov_len;
|
|
|
|
|
void* addr = m3ApiOffsetToPtr(m3ApiReadMem32(&wasi_iovs[i].buf));
|
|
|
|
|
size_t len = m3ApiReadMem32(&wasi_iovs[i].buf_len);
|
|
|
|
|
if (len == 0) continue;
|
|
|
|
|
|
|
|
|
|
int ret = write (fd, addr, len);
|
|
|
|
@ -323,7 +343,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
|
|
|
|
|
res += ret;
|
|
|
|
|
if ((size_t)ret < len) break;
|
|
|
|
|
}
|
|
|
|
|
*nwritten = res;
|
|
|
|
|
m3ApiWriteMem32(nwritten, res);
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -348,19 +368,19 @@ m3ApiRawFunction(m3_wasi_unstable_fd_datasync)
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_random_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArgMem (uint8_t* , buf)
|
|
|
|
|
m3ApiGetArgMem (uint8_t * , buf)
|
|
|
|
|
m3ApiGetArg (__wasi_size_t , buflen)
|
|
|
|
|
|
|
|
|
|
while (1) {
|
|
|
|
|
ssize_t retlen = 0;
|
|
|
|
|
|
|
|
|
|
#if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__)
|
|
|
|
|
size_t reqlen = M3_MIN(buflen, 256);
|
|
|
|
|
if (getentropy(buf, reqlen) < 0) {
|
|
|
|
|
retlen = -1;
|
|
|
|
|
} else {
|
|
|
|
|
retlen = reqlen;
|
|
|
|
|
}
|
|
|
|
|
size_t reqlen = M3_MIN (buflen, 256);
|
|
|
|
|
# if defined(__APPLE__) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
|
|
|
|
|
retlen = SecRandomCopyBytes(kSecRandomDefault, reqlen, buf) < 0 ? -1 : reqlen;
|
|
|
|
|
# else
|
|
|
|
|
retlen = getentropy(buf, reqlen) < 0 ? -1 : reqlen;
|
|
|
|
|
# endif
|
|
|
|
|
#elif defined(__FreeBSD__) || defined(__linux__)
|
|
|
|
|
retlen = getrandom(buf, buflen, 0);
|
|
|
|
|
#elif defined(_WIN32)
|
|
|
|
@ -388,7 +408,7 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_clockid_t , wasi_clk_id)
|
|
|
|
|
m3ApiGetArgMem (__wasi_timestamp_t* , resolution)
|
|
|
|
|
m3ApiGetArgMem (__wasi_timestamp_t * , resolution)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || resolution == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
@ -396,10 +416,11 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get)
|
|
|
|
|
if (clk < 0) m3ApiReturn(__WASI_EINVAL);
|
|
|
|
|
|
|
|
|
|
struct timespec tp;
|
|
|
|
|
if (clock_getres(clk, &tp) != 0)
|
|
|
|
|
*resolution = 1000000;
|
|
|
|
|
else
|
|
|
|
|
*resolution = convert_timespec(&tp);
|
|
|
|
|
if (clock_getres(clk, &tp) != 0) {
|
|
|
|
|
m3ApiWriteMem64(resolution, 1000000);
|
|
|
|
|
} else {
|
|
|
|
|
m3ApiWriteMem64(resolution, convert_timespec(&tp));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
@ -409,7 +430,7 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get)
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (__wasi_clockid_t , wasi_clk_id)
|
|
|
|
|
m3ApiGetArg (__wasi_timestamp_t , precision)
|
|
|
|
|
m3ApiGetArgMem (__wasi_timestamp_t* , time)
|
|
|
|
|
m3ApiGetArgMem (__wasi_timestamp_t * , time)
|
|
|
|
|
|
|
|
|
|
if (runtime == NULL || time == NULL) { m3ApiReturn(__WASI_EINVAL); }
|
|
|
|
|
|
|
|
|
@ -421,15 +442,16 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get)
|
|
|
|
|
m3ApiReturn(errno_to_wasi(errno));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*time = convert_timespec(&tp);
|
|
|
|
|
m3ApiWriteMem64(time, convert_timespec(&tp));
|
|
|
|
|
m3ApiReturn(__WASI_ESUCCESS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3ApiRawFunction(m3_wasi_unstable_proc_exit)
|
|
|
|
|
{
|
|
|
|
|
m3ApiReturnType (uint32_t)
|
|
|
|
|
m3ApiGetArg (uint32_t, code)
|
|
|
|
|
|
|
|
|
|
runtime->exit_code = code;
|
|
|
|
|
|
|
|
|
|
m3ApiTrap(m3Err_trapExit);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -448,35 +470,64 @@ M3Result m3_LinkEspWASI (IM3Module module)
|
|
|
|
|
{
|
|
|
|
|
M3Result result = m3Err_none;
|
|
|
|
|
|
|
|
|
|
const char* wasi = "wasi_unstable";
|
|
|
|
|
|
|
|
|
|
// TODO: Preopen dirs
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_sizes_get", "i(**)", &m3_wasi_unstable_args_sizes_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "environ_sizes_get", "i(**)", &m3_wasi_unstable_environ_sizes_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_get", "i(**)", &m3_wasi_unstable_args_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "environ_get", "i(**)", &m3_wasi_unstable_environ_get)));
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_dir_name", "i(i*i)", &m3_wasi_unstable_fd_prestat_dir_name)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_get", "i(i*)", &m3_wasi_unstable_fd_prestat_get)));
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiiii*)", &m3_wasi_unstable_path_open)));
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(iii*)", &m3_wasi_unstable_fd_write)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(iii*)", &m3_wasi_unstable_fd_read)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iii*)", &m3_wasi_unstable_fd_seek)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", "i(i)", &m3_wasi_unstable_fd_datasync)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_close", "i(i)", &m3_wasi_unstable_fd_close)));
|
|
|
|
|
static const char* namespaces[2] = { "wasi_unstable", "wasi_snapshot_preview1" };
|
|
|
|
|
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sock_send", "i()", &...)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sock_recv", "i()", &...)));
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "random_get", "i(*i)", &m3_wasi_unstable_random_get)));
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_res_get", "i(i*)", &m3_wasi_unstable_clock_res_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_time_get", "i(ii*)", &m3_wasi_unstable_clock_time_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_exit", "i(i)", &m3_wasi_unstable_proc_exit)));
|
|
|
|
|
for (int i=0; i<2; i++)
|
|
|
|
|
{
|
|
|
|
|
const char* wasi = namespaces[i];
|
|
|
|
|
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_get", "i(**)", &m3_wasi_unstable_args_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "args_sizes_get", "i(**)", &m3_wasi_unstable_args_sizes_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_res_get", "i(i*)", &m3_wasi_unstable_clock_res_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_time_get", "i(iI*)", &m3_wasi_unstable_clock_time_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "environ_get", "i(**)", &m3_wasi_unstable_environ_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "environ_sizes_get", "i(**)", &m3_wasi_unstable_environ_sizes_get)));
|
|
|
|
|
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_advise", "i(iIIi)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_allocate", "i(iII)", )));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_close", "i(i)", &m3_wasi_unstable_fd_close)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", "i(i)", &m3_wasi_unstable_fd_datasync)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_rights", "i(iII)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_get", "i(i*)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_size", "i(iI)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_filestat_set_times","i(iIIi)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_pread", "i(i*iI*)",)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_get", "i(i*)", &m3_wasi_unstable_fd_prestat_get)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_dir_name", "i(i*i)", &m3_wasi_unstable_fd_prestat_dir_name)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_pwrite", "i(i*iI*)",)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(i*i*)", &m3_wasi_unstable_fd_read)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_readdir", "i(i*iI*)",)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_renumber", "i(ii)", )));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_sync", "i(i)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_tell", "i(i*)", )));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(i*i*)", &m3_wasi_unstable_fd_write)));
|
|
|
|
|
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_create_directory", "i(i*i)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_get", "i(ii*i*)", &m3_wasi_unstable_path_filestat_get)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_set_times", "i(ii*iIIi)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_link", "i(ii*ii*i)", )));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiIIi*)", &m3_wasi_unstable_path_open)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_readlink", "i(i*i*i*)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_remove_directory", "i(i*i)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_rename", "i(i*ii*i)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_symlink", "i(*ii*i)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_unlink_file", "i(i*i)", )));
|
|
|
|
|
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "poll_oneoff", "i(**i*)", &m3_wasi_unstable_poll_oneoff)));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_exit", "v(i)", &m3_wasi_unstable_proc_exit)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_raise", "i(i)", )));
|
|
|
|
|
_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "random_get", "i(*i)", &m3_wasi_unstable_random_get)));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sched_yield", "i()", )));
|
|
|
|
|
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sock_recv", "i(i*ii**)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sock_send", "i(i*ii*)", )));
|
|
|
|
|
//_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "sock_shutdown", "i(ii)", )));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_catch:
|
|
|
|
|
return result;
|
|
|
|
|