@ -15,7 +15,6 @@
# if defined(d_m3HasWASI)
typedef uint32_t __wasi_size_t ;
# include "extra/wasi_core.h"
# include <sys/types.h>
@ -25,12 +24,12 @@ typedef uint32_t __wasi_size_t;
# include <stdio.h>
# include <fcntl.h>
# if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__)
# if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__)
# include <unistd.h>
# include <sys / uio.h>
# if defined(__APPLE__)
# include <TargetConditionals.h>
# if TARGET_OS_ MAC
# if TARGET_OS_ OSX // TARGET_OS_ MAC includes iOS
# include <sys / random.h>
# else // iOS / Simulator
# include <Security / Security.h>
@ -77,45 +76,47 @@ Preopen preopen[PREOPEN_CNT] = {
static
__wasi_errno_t errno_to_wasi ( int errnum ) {
switch ( errnum ) {
case EPERM : return __WASI_E PERM; break ;
case ENOENT : return __WASI_E NOENT; break ;
case ESRCH : return __WASI_E SRCH; break ;
case EINTR : return __WASI_E INTR; break ;
case EIO : return __WASI_E IO; break ;
case ENXIO : return __WASI_E NXIO; break ;
case E2BIG : return __WASI_E 2BIG; break ;
case ENOEXEC : return __WASI_E NOEXEC; break ;
case EBADF : return __WASI_E BADF; break ;
case ECHILD : return __WASI_E CHILD; break ;
case EAGAIN : return __WASI_E AGAIN; break ;
case ENOMEM : return __WASI_E NOMEM; break ;
case EACCES : return __WASI_E ACCES; break ;
case EFAULT : return __WASI_E FAULT; break ;
case EBUSY : return __WASI_E BUSY; break ;
case EEXIST : return __WASI_E EXIST; break ;
case EXDEV : return __WASI_E XDEV; break ;
case ENODEV : return __WASI_E NODEV; break ;
case ENOTDIR : return __WASI_E NOTDIR; break ;
case EISDIR : return __WASI_E ISDIR; break ;
case EINVAL : return __WASI_E INVAL; break ;
case ENFILE : return __WASI_E NFILE; break ;
case EMFILE : return __WASI_E MFILE; break ;
case ENOTTY : return __WASI_E NOTTY; break ;
case ETXTBSY : return __WASI_E TXTBSY; break ;
case EFBIG : return __WASI_E FBIG; break ;
case ENOSPC : return __WASI_E NOSPC; break ;
case ESPIPE : return __WASI_E SPIPE; break ;
case EROFS : return __WASI_ER OFS; break ;
case EMLINK : return __WASI_E MLINK; break ;
case EPIPE : return __WASI_E PIPE; break ;
case EDOM : return __WASI_E DOM; break ;
case ERANGE : return __WASI_ER ANGE; break ;
default : return __WASI_E INVAL;
case EPERM : return __WASI_E RRNO_ PERM; break ;
case ENOENT : return __WASI_E RRNO_ NOENT; break ;
case ESRCH : return __WASI_E RRNO_ SRCH; break ;
case EINTR : return __WASI_E RRNO_ INTR; break ;
case EIO : return __WASI_E RRNO_ IO; break ;
case ENXIO : return __WASI_E RRNO_ NXIO; break ;
case E2BIG : return __WASI_E RRNO_ 2BIG; break ;
case ENOEXEC : return __WASI_E RRNO_ NOEXEC; break ;
case EBADF : return __WASI_E RRNO_ BADF; break ;
case ECHILD : return __WASI_E RRNO_ CHILD; break ;
case EAGAIN : return __WASI_E RRNO_ AGAIN; break ;
case ENOMEM : return __WASI_E RRNO_ NOMEM; break ;
case EACCES : return __WASI_E RRNO_ ACCES; break ;
case EFAULT : return __WASI_E RRNO_ FAULT; break ;
case EBUSY : return __WASI_E RRNO_ BUSY; break ;
case EEXIST : return __WASI_E RRNO_ EXIST; break ;
case EXDEV : return __WASI_E RRNO_ XDEV; break ;
case ENODEV : return __WASI_E RRNO_ NODEV; break ;
case ENOTDIR : return __WASI_E RRNO_ NOTDIR; break ;
case EISDIR : return __WASI_E RRNO_ ISDIR; break ;
case EINVAL : return __WASI_E RRNO_ INVAL; break ;
case ENFILE : return __WASI_E RRNO_ NFILE; break ;
case EMFILE : return __WASI_E RRNO_ MFILE; break ;
case ENOTTY : return __WASI_E RRNO_ NOTTY; break ;
case ETXTBSY : return __WASI_E RRNO_ TXTBSY; break ;
case EFBIG : return __WASI_E RRNO_ FBIG; break ;
case ENOSPC : return __WASI_E RRNO_ NOSPC; break ;
case ESPIPE : return __WASI_E RRNO_ SPIPE; break ;
case EROFS : return __WASI_ER RNO_R OFS; break ;
case EMLINK : return __WASI_E RRNO_ MLINK; break ;
case EPIPE : return __WASI_E RRNO_ PIPE; break ;
case EDOM : return __WASI_E RRNO_ DOM; break ;
case ERANGE : return __WASI_ER RNO_R ANGE; break ;
default : return __WASI_E RRNO_ INVAL;
}
}
# if defined(_WIN32)
# if !defined(__MINGW32__)
static inline
int clock_gettime ( int clk_id , struct timespec * spec )
{
@ -131,6 +132,8 @@ int clock_getres(int clk_id, struct timespec *spec) {
return - 1 ; // Defaults to 1000000
}
# endif
static inline
int convert_clockid ( __wasi_clockid_t in ) {
return 0 ;
@ -141,10 +144,10 @@ int convert_clockid(__wasi_clockid_t in) {
static inline
int convert_clockid ( __wasi_clockid_t in ) {
switch ( in ) {
case __WASI_CLOCK _MONOTONIC: return CLOCK_MONOTONIC ;
case __WASI_CLOCK _PROCESS_CPUTIME_ID: return CLOCK_PROCESS_CPUTIME_ID ;
case __WASI_CLOCK _REALTIME: return CLOCK_REALTIME ;
case __WASI_CLOCK _THREAD_CPUTIME_ID: return CLOCK_THREAD_CPUTIME_ID ;
case __WASI_CLOCK ID _MONOTONIC: return CLOCK_MONOTONIC ;
case __WASI_CLOCK ID _PROCESS_CPUTIME_ID: return CLOCK_PROCESS_CPUTIME_ID ;
case __WASI_CLOCK ID _REALTIME: return CLOCK_REALTIME ;
case __WASI_CLOCK ID _THREAD_CPUTIME_ID: return CLOCK_THREAD_CPUTIME_ID ;
default : return - 1 ;
}
}
@ -184,7 +187,7 @@ m3ApiRawFunction(m3_wasi_unstable_args_get)
m3ApiGetArgMem ( uint32_t * , argv )
m3ApiGetArgMem ( char * , argv_buf )
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
for ( u32 i = 0 ; i < runtime - > argc ; + + i )
{
@ -196,7 +199,7 @@ m3ApiRawFunction(m3_wasi_unstable_args_get)
* argv_buf + + = 0 ;
}
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_args_sizes_get )
@ -205,7 +208,7 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
m3ApiGetArgMem ( __wasi_size_t * , argc )
m3ApiGetArgMem ( __wasi_size_t * , argv_buf_size )
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
__wasi_size_t buflen = 0 ;
for ( u32 i = 0 ; i < runtime - > argc ; + + i )
@ -216,7 +219,7 @@ m3ApiRawFunction(m3_wasi_unstable_args_sizes_get)
m3ApiWriteMem32 ( argc , runtime - > argc ) ;
m3ApiWriteMem32 ( argv_buf_size , buflen ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_environ_get )
@ -225,9 +228,9 @@ m3ApiRawFunction(m3_wasi_unstable_environ_get)
m3ApiGetArgMem ( uint32_t * , env )
m3ApiGetArgMem ( char * , env_buf )
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
// TODO
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_environ_sizes_get )
@ -236,13 +239,13 @@ m3ApiRawFunction(m3_wasi_unstable_environ_sizes_get)
m3ApiGetArgMem ( __wasi_size_t * , env_count )
m3ApiGetArgMem ( __wasi_size_t * , env_buf_size )
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
// TODO
m3ApiWriteMem32 ( env_count , 0 ) ;
m3ApiWriteMem32 ( env_buf_size , 0 ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_fd_prestat_dir_name )
@ -252,11 +255,11 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_dir_name)
m3ApiGetArgMem ( char * , path )
m3ApiGetArg ( __wasi_size_t , path_len )
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( fd < 3 | | fd > = PREOPEN_CNT ) { m3ApiReturn ( __WASI_E BADF) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
if ( fd < 3 | | fd > = PREOPEN_CNT ) { m3ApiReturn ( __WASI_E RRNO_ BADF) ; }
size_t slen = strlen ( preopen [ fd ] . path ) ;
memcpy ( path , preopen [ fd ] . path , M3_MIN ( slen , path_len ) ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_fd_prestat_get )
@ -265,11 +268,11 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_get)
m3ApiGetArg ( __wasi_fd_t , fd )
m3ApiGetArgMem ( uint32_t * , buf ) // TODO: use actual struct
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( fd < 3 | | fd > = PREOPEN_CNT ) { m3ApiReturn ( __WASI_E BADF) ; }
if ( runtime = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
if ( fd < 3 | | fd > = PREOPEN_CNT ) { m3ApiReturn ( __WASI_E RRNO_ BADF) ; }
m3ApiWriteMem32 ( buf , __WASI_PREOPENTYPE_DIR ) ;
m3ApiWriteMem32 ( buf + 1 , strlen ( preopen [ fd ] . path ) ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_fd_fdstat_get )
@ -278,7 +281,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
m3ApiGetArg ( __wasi_fd_t , fd )
m3ApiGetArgMem ( __wasi_fdstat_t * , fdstat )
if ( runtime = = NULL | | fdstat = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | fdstat = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
# ifdef _WIN32
@ -292,7 +295,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
fdstat - > fs_flags = 0 ;
fdstat - > fs_rights_base = ( uint64_t ) - 1 ; // all rights
fdstat - > fs_rights_inheriting = ( uint64_t ) - 1 ; // all rights
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# else
struct stat fd_stat ;
int fl = fcntl ( fd , F_GETFL ) ;
@ -306,14 +309,14 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_get)
//(S_ISSOCK(mode) ? __WASI_FILETYPE_SOCKET_STREAM : 0) |
( S_ISLNK ( mode ) ? __WASI_FILETYPE_SYMBOLIC_LINK : 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_APPEND ) ? __WASI_FDFLAG S _APPEND : 0 ) |
( ( fl & O_DSYNC ) ? __WASI_FDFLAG S _DSYNC : 0 ) |
( ( fl & O_NONBLOCK ) ? __WASI_FDFLAG S _NONBLOCK : 0 ) |
//((fl & O_RSYNC) ? __WASI_FDFLAG S _RSYNC : 0) |
( ( fl & O_SYNC ) ? __WASI_FDFLAG S _SYNC : 0 ) ) ;
fdstat - > fs_rights_base = ( uint64_t ) - 1 ; // all rights
fdstat - > fs_rights_inheriting = ( uint64_t ) - 1 ; // all rights
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# endif
}
@ -325,7 +328,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_fdstat_set_flags)
// TODO
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_fd_seek )
@ -336,25 +339,25 @@ m3ApiRawFunction(m3_wasi_unstable_fd_seek)
m3ApiGetArg ( __wasi_whence_t , wasi_whence )
m3ApiGetArgMem ( __wasi_filesize_t * , result )
if ( runtime = = NULL | | result = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | result = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
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_E INVAL) ;
default : m3ApiReturn ( __WASI_E RRNO_ INVAL) ;
}
int64_t ret ;
# if defined(M3_COMPILER_MSVC)
# if defined(M3_COMPILER_MSVC) || defined(__MINGW32__)
ret = _lseeki64 ( fd , offset , whence ) ;
# else
ret = lseek ( fd , offset , whence ) ;
# endif
if ( ret < 0 ) { m3ApiReturn ( errno_to_wasi ( errno ) ) ; }
m3ApiWriteMem64 ( result , ret ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
@ -372,7 +375,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
m3ApiGetArgMem ( __wasi_fd_t * , fd )
if ( path_len > = 512 )
m3ApiReturn ( __WASI_E INVAL) ;
m3ApiReturn ( __WASI_E RRNO_ INVAL) ;
// copy path so we can ensure it is NULL terminated
# if defined(M3_COMPILER_MSVC)
@ -386,17 +389,17 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
# if defined(_WIN32)
// TODO: This all needs a proper implementation
int flags = ( ( oflags & __WASI_O _CREAT) ? _O_CREAT : 0 ) |
( ( oflags & __WASI_O _EXCL) ? _O_EXCL : 0 ) |
( ( oflags & __WASI_O _TRUNC) ? _O_TRUNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG _APPEND) ? _O_APPEND : 0 ) ;
int flags = ( ( oflags & __WASI_O FLAGS _CREAT) ? _O_CREAT : 0 ) |
( ( oflags & __WASI_O FLAGS _EXCL) ? _O_EXCL : 0 ) |
( ( oflags & __WASI_O FLAGS _TRUNC) ? _O_TRUNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG S _APPEND) ? _O_APPEND : 0 ) ;
if ( ( fs_rights_base & __WASI_RIGHT _FD_READ) & &
( fs_rights_base & __WASI_RIGHT _FD_WRITE) ) {
if ( ( fs_rights_base & __WASI_RIGHT S _FD_READ) & &
( fs_rights_base & __WASI_RIGHT S _FD_WRITE) ) {
flags | = _O_RDWR ;
} else if ( ( fs_rights_base & __WASI_RIGHT _FD_WRITE) ) {
} else if ( ( fs_rights_base & __WASI_RIGHT S _FD_WRITE) ) {
flags | = _O_WRONLY ;
} else if ( ( fs_rights_base & __WASI_RIGHT _FD_READ) ) {
} else if ( ( fs_rights_base & __WASI_RIGHT S _FD_READ) ) {
flags | = _O_RDONLY ; // no-op because O_RDONLY is 0
}
int mode = 0644 ;
@ -409,26 +412,26 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
}
else
{
* fd = host_fd ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiWriteMem32 ( fd , host_fd ) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
# else
// translate o_flags and fs_flags into flags and mode
int flags = ( ( oflags & __WASI_O _CREAT) ? O_CREAT : 0 ) |
//((oflags & __WASI_O _DIRECTORY) ? O_DIRECTORY : 0) |
( ( oflags & __WASI_O _EXCL) ? O_EXCL : 0 ) |
( ( oflags & __WASI_O _TRUNC) ? O_TRUNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG _APPEND) ? O_APPEND : 0 ) |
( ( fs_flags & __WASI_FDFLAG _DSYNC) ? O_DSYNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG _NONBLOCK) ? O_NONBLOCK : 0 ) |
//((fs_flags & __WASI_FDFLAG _RSYNC) ? O_RSYNC : 0) |
( ( fs_flags & __WASI_FDFLAG _SYNC) ? O_SYNC : 0 ) ;
if ( ( fs_rights_base & __WASI_RIGHT _FD_READ) & &
( fs_rights_base & __WASI_RIGHT _FD_WRITE) ) {
int flags = ( ( oflags & __WASI_O FLAGS _CREAT) ? O_CREAT : 0 ) |
//((oflags & __WASI_O FLAGS _DIRECTORY) ? O_DIRECTORY : 0) |
( ( oflags & __WASI_O FLAGS _EXCL) ? O_EXCL : 0 ) |
( ( oflags & __WASI_O FLAGS _TRUNC) ? O_TRUNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG S _APPEND) ? O_APPEND : 0 ) |
( ( fs_flags & __WASI_FDFLAG S _DSYNC) ? O_DSYNC : 0 ) |
( ( fs_flags & __WASI_FDFLAG S _NONBLOCK) ? O_NONBLOCK : 0 ) |
//((fs_flags & __WASI_FDFLAG S _RSYNC) ? O_RSYNC : 0) |
( ( fs_flags & __WASI_FDFLAG S _SYNC) ? O_SYNC : 0 ) ;
if ( ( fs_rights_base & __WASI_RIGHT S _FD_READ) & &
( fs_rights_base & __WASI_RIGHT S _FD_WRITE) ) {
flags | = O_RDWR ;
} else if ( ( fs_rights_base & __WASI_RIGHT _FD_WRITE) ) {
} else if ( ( fs_rights_base & __WASI_RIGHT S _FD_WRITE) ) {
flags | = O_WRONLY ;
} else if ( ( fs_rights_base & __WASI_RIGHT _FD_READ) ) {
} else if ( ( fs_rights_base & __WASI_RIGHT S _FD_READ) ) {
flags | = O_RDONLY ; // no-op because O_RDONLY is 0
}
int mode = 0644 ;
@ -441,7 +444,7 @@ m3ApiRawFunction(m3_wasi_unstable_path_open)
else
{
m3ApiWriteMem32 ( fd , host_fd ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
# endif
}
@ -454,7 +457,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
m3ApiGetArg ( __wasi_size_t , iovs_len )
m3ApiGetArgMem ( __wasi_size_t * , nread )
if ( runtime = = NULL | | nread = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | nread = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
# if defined(HAS_IOVEC)
struct iovec iovs [ iovs_len ] ;
@ -463,7 +466,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
ssize_t ret = readv ( fd , iovs , iovs_len ) ;
if ( ret < 0 ) { m3ApiReturn ( errno_to_wasi ( errno ) ) ; }
m3ApiWriteMem32 ( nread , ret ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# else
ssize_t res = 0 ;
for ( __wasi_size_t i = 0 ; i < iovs_len ; i + + ) {
@ -477,7 +480,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read)
if ( ( size_t ) ret < len ) break ;
}
m3ApiWriteMem32 ( nread , res ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# endif
}
@ -489,7 +492,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
m3ApiGetArg ( __wasi_size_t , iovs_len )
m3ApiGetArgMem ( __wasi_size_t * , nwritten )
if ( runtime = = NULL | | nwritten = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | nwritten = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
# if defined(HAS_IOVEC)
struct iovec iovs [ iovs_len ] ;
@ -498,7 +501,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
ssize_t ret = writev ( fd , iovs , iovs_len ) ;
if ( ret < 0 ) { m3ApiReturn ( errno_to_wasi ( errno ) ) ; }
m3ApiWriteMem32 ( nwritten , ret ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# else
ssize_t res = 0 ;
for ( __wasi_size_t i = 0 ; i < iovs_len ; i + + ) {
@ -512,7 +515,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write)
if ( ( size_t ) ret < len ) break ;
}
m3ApiWriteMem32 ( nwritten , res ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
# endif
}
@ -522,7 +525,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_close)
m3ApiGetArg ( __wasi_fd_t , fd )
int ret = close ( fd ) ;
m3ApiReturn ( ret = = 0 ? __WASI_E SUCCESS : ret ) ;
m3ApiReturn ( ret = = 0 ? __WASI_E RRNO_ SUCCESS : ret ) ;
}
m3ApiRawFunction ( m3_wasi_unstable_fd_datasync )
@ -534,12 +537,12 @@ m3ApiRawFunction(m3_wasi_unstable_fd_datasync)
int ret = _commit ( fd ) ;
# elif defined(__APPLE__)
int ret = fsync ( fd ) ;
# elif defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__)
# elif defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__)
int ret = fdatasync ( fd ) ;
# else
int ret = __WASI_E NOSYS;
int ret = __WASI_E RRNO_ NOSYS;
# endif
m3ApiReturn ( ret = = 0 ? __WASI_E SUCCESS : ret ) ;
m3ApiReturn ( ret = = 0 ? __WASI_E RRNO_ SUCCESS : ret ) ;
}
m3ApiRawFunction ( m3_wasi_unstable_random_get )
@ -551,7 +554,7 @@ m3ApiRawFunction(m3_wasi_unstable_random_get)
while ( 1 ) {
ssize_t retlen = 0 ;
# if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__)
# if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__EMSCRIPTEN__)
size_t reqlen = M3_MIN ( buflen , 256 ) ;
# if defined(__APPLE__) && (TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR)
retlen = SecRandomCopyBytes ( kSecRandomDefault , reqlen , buf ) < 0 ? - 1 : reqlen ;
@ -562,10 +565,10 @@ m3ApiRawFunction(m3_wasi_unstable_random_get)
retlen = getrandom ( buf , buflen , 0 ) ;
# elif defined(_WIN32)
if ( RtlGenRandom ( buf , buflen ) = = TRUE ) {
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
# else
m3ApiReturn ( __WASI_E NOSYS) ;
m3ApiReturn ( __WASI_E RRNO_ NOSYS) ;
# endif
if ( retlen < 0 ) {
if ( errno = = EINTR | | errno = = EAGAIN ) {
@ -573,7 +576,7 @@ m3ApiRawFunction(m3_wasi_unstable_random_get)
}
m3ApiReturn ( errno_to_wasi ( errno ) ) ;
} else if ( retlen = = buflen ) {
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
} else {
buf + = retlen ;
buflen - = retlen ;
@ -587,10 +590,10 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get)
m3ApiGetArg ( __wasi_clockid_t , wasi_clk_id )
m3ApiGetArgMem ( __wasi_timestamp_t * , resolution )
if ( runtime = = NULL | | resolution = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | resolution = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
int clk = convert_clockid ( wasi_clk_id ) ;
if ( clk < 0 ) m3ApiReturn ( __WASI_E INVAL) ;
if ( clk < 0 ) m3ApiReturn ( __WASI_E RRNO_ INVAL) ;
struct timespec tp ;
if ( clock_getres ( clk , & tp ) ! = 0 ) {
@ -599,7 +602,7 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get)
m3ApiWriteMem64 ( resolution , convert_timespec ( & tp ) ) ;
}
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_clock_time_get )
@ -609,10 +612,10 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get)
m3ApiGetArg ( __wasi_timestamp_t , precision )
m3ApiGetArgMem ( __wasi_timestamp_t * , time )
if ( runtime = = NULL | | time = = NULL ) { m3ApiReturn ( __WASI_E INVAL) ; }
if ( runtime = = NULL | | time = = NULL ) { m3ApiReturn ( __WASI_E RRNO_ INVAL) ; }
int clk = convert_clockid ( wasi_clk_id ) ;
if ( clk < 0 ) m3ApiReturn ( __WASI_E INVAL) ;
if ( clk < 0 ) m3ApiReturn ( __WASI_E RRNO_ INVAL) ;
struct timespec tp ;
if ( clock_gettime ( clk , & tp ) ! = 0 ) {
@ -620,7 +623,7 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get)
}
m3ApiWriteMem64 ( time , convert_timespec ( & tp ) ) ;
m3ApiReturn ( __WASI_E SUCCESS) ;
m3ApiReturn ( __WASI_E RRNO_ SUCCESS) ;
}
m3ApiRawFunction ( m3_wasi_unstable_proc_exit )