mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-06 20:13:40 +00:00
8e7a288bb4
Instead of hardcoding the command line parameters and the environment variables in the binary, pass them at runtime to Node.js and use the WASIp1 API to retrieve them in wasm_exec.js. The only real benefit right now is that it becomes possible to change `go.argv` and `go.env` before running a wasm binary. This also changes the syscall package for GOOS=js: it now becomes more like a libc (using wasi-libc), which means error values like `syscall.EEXIST` will actually match the one returned by the relevant libc function. Wasm binary size for packages that import the os package will be increased somewhat.
372 lines
14 KiB
Go
372 lines
14 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
//go:build baremetal || nintendoswitch || wasm_unknown
|
|
|
|
package syscall
|
|
|
|
// TODO: generate with runtime/mknacl.sh, allow override with IRT.
|
|
const (
|
|
sys_null = 1
|
|
sys_nameservice = 2
|
|
sys_dup = 8
|
|
sys_dup2 = 9
|
|
sys_open = 10
|
|
sys_close = 11
|
|
sys_read = 12
|
|
sys_write = 13
|
|
sys_lseek = 14
|
|
sys_stat = 16
|
|
sys_fstat = 17
|
|
sys_chmod = 18
|
|
sys_isatty = 19
|
|
sys_brk = 20
|
|
sys_mmap = 21
|
|
sys_munmap = 22
|
|
sys_getdents = 23
|
|
sys_mprotect = 24
|
|
sys_list_mappings = 25
|
|
sys_exit = 30
|
|
sys_getpid = 31
|
|
sys_sched_yield = 32
|
|
sys_sysconf = 33
|
|
sys_gettimeofday = 40
|
|
sys_clock = 41
|
|
sys_nanosleep = 42
|
|
sys_clock_getres = 43
|
|
sys_clock_gettime = 44
|
|
sys_mkdir = 45
|
|
sys_rmdir = 46
|
|
sys_chdir = 47
|
|
sys_getcwd = 48
|
|
sys_unlink = 49
|
|
sys_imc_makeboundsock = 60
|
|
sys_imc_accept = 61
|
|
sys_imc_connect = 62
|
|
sys_imc_sendmsg = 63
|
|
sys_imc_recvmsg = 64
|
|
sys_imc_mem_obj_create = 65
|
|
sys_imc_socketpair = 66
|
|
sys_mutex_create = 70
|
|
sys_mutex_lock = 71
|
|
sys_mutex_trylock = 72
|
|
sys_mutex_unlock = 73
|
|
sys_cond_create = 74
|
|
sys_cond_wait = 75
|
|
sys_cond_signal = 76
|
|
sys_cond_broadcast = 77
|
|
sys_cond_timed_wait_abs = 79
|
|
sys_thread_create = 80
|
|
sys_thread_exit = 81
|
|
sys_tls_init = 82
|
|
sys_thread_nice = 83
|
|
sys_tls_get = 84
|
|
sys_second_tls_set = 85
|
|
sys_second_tls_get = 86
|
|
sys_exception_handler = 87
|
|
sys_exception_stack = 88
|
|
sys_exception_clear_flag = 89
|
|
sys_sem_create = 100
|
|
sys_sem_wait = 101
|
|
sys_sem_post = 102
|
|
sys_sem_get_value = 103
|
|
sys_dyncode_create = 104
|
|
sys_dyncode_modify = 105
|
|
sys_dyncode_delete = 106
|
|
sys_test_infoleak = 109
|
|
sys_test_crash = 110
|
|
sys_test_syscall_1 = 111
|
|
sys_test_syscall_2 = 112
|
|
sys_futex_wait_abs = 120
|
|
sys_futex_wake = 121
|
|
sys_pread = 130
|
|
sys_pwrite = 131
|
|
sys_truncate = 140
|
|
sys_lstat = 141
|
|
sys_link = 142
|
|
sys_rename = 143
|
|
sys_symlink = 144
|
|
sys_access = 145
|
|
sys_readlink = 146
|
|
sys_utimes = 147
|
|
sys_get_random_bytes = 150
|
|
)
|
|
|
|
// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
|
|
const (
|
|
// native_client/src/trusted/service_runtime/include/sys/errno.h
|
|
// The errors are mainly copied from Linux.
|
|
EPERM Errno = 1 /* Operation not permitted */
|
|
ENOENT Errno = 2 /* No such file or directory */
|
|
ESRCH Errno = 3 /* No such process */
|
|
EINTR Errno = 4 /* Interrupted system call */
|
|
EIO Errno = 5 /* I/O error */
|
|
ENXIO Errno = 6 /* No such device or address */
|
|
E2BIG Errno = 7 /* Argument list too long */
|
|
ENOEXEC Errno = 8 /* Exec format error */
|
|
EBADF Errno = 9 /* Bad file number */
|
|
ECHILD Errno = 10 /* No child processes */
|
|
EAGAIN Errno = 11 /* Try again */
|
|
ENOMEM Errno = 12 /* Out of memory */
|
|
EACCES Errno = 13 /* Permission denied */
|
|
EFAULT Errno = 14 /* Bad address */
|
|
EBUSY Errno = 16 /* Device or resource busy */
|
|
EEXIST Errno = 17 /* File exists */
|
|
EXDEV Errno = 18 /* Cross-device link */
|
|
ENODEV Errno = 19 /* No such device */
|
|
ENOTDIR Errno = 20 /* Not a directory */
|
|
EISDIR Errno = 21 /* Is a directory */
|
|
EINVAL Errno = 22 /* Invalid argument */
|
|
ENFILE Errno = 23 /* File table overflow */
|
|
EMFILE Errno = 24 /* Too many open files */
|
|
ENOTTY Errno = 25 /* Not a typewriter */
|
|
EFBIG Errno = 27 /* File too large */
|
|
ENOSPC Errno = 28 /* No space left on device */
|
|
ESPIPE Errno = 29 /* Illegal seek */
|
|
EROFS Errno = 30 /* Read-only file system */
|
|
EMLINK Errno = 31 /* Too many links */
|
|
EPIPE Errno = 32 /* Broken pipe */
|
|
ENAMETOOLONG Errno = 36 /* File name too long */
|
|
ENOSYS Errno = 38 /* Function not implemented */
|
|
EDQUOT Errno = 122 /* Quota exceeded */
|
|
EDOM Errno = 33 /* Math arg out of domain of func */
|
|
ERANGE Errno = 34 /* Math result not representable */
|
|
EDEADLK Errno = 35 /* Deadlock condition */
|
|
ENOLCK Errno = 37 /* No record locks available */
|
|
ENOTEMPTY Errno = 39 /* Directory not empty */
|
|
ELOOP Errno = 40 /* Too many symbolic links */
|
|
ENOMSG Errno = 42 /* No message of desired type */
|
|
EIDRM Errno = 43 /* Identifier removed */
|
|
ECHRNG Errno = 44 /* Channel number out of range */
|
|
EL2NSYNC Errno = 45 /* Level 2 not synchronized */
|
|
EL3HLT Errno = 46 /* Level 3 halted */
|
|
EL3RST Errno = 47 /* Level 3 reset */
|
|
ELNRNG Errno = 48 /* Link number out of range */
|
|
EUNATCH Errno = 49 /* Protocol driver not attached */
|
|
ENOCSI Errno = 50 /* No CSI structure available */
|
|
EL2HLT Errno = 51 /* Level 2 halted */
|
|
EBADE Errno = 52 /* Invalid exchange */
|
|
EBADR Errno = 53 /* Invalid request descriptor */
|
|
EXFULL Errno = 54 /* Exchange full */
|
|
ENOANO Errno = 55 /* No anode */
|
|
EBADRQC Errno = 56 /* Invalid request code */
|
|
EBADSLT Errno = 57 /* Invalid slot */
|
|
EDEADLOCK Errno = EDEADLK /* File locking deadlock error */
|
|
EBFONT Errno = 59 /* Bad font file fmt */
|
|
ENOSTR Errno = 60 /* Device not a stream */
|
|
ENODATA Errno = 61 /* No data (for no delay io) */
|
|
ETIME Errno = 62 /* Timer expired */
|
|
ENOSR Errno = 63 /* Out of streams resources */
|
|
ENONET Errno = 64 /* Machine is not on the network */
|
|
ENOPKG Errno = 65 /* Package not installed */
|
|
EREMOTE Errno = 66 /* The object is remote */
|
|
ENOLINK Errno = 67 /* The link has been severed */
|
|
EADV Errno = 68 /* Advertise error */
|
|
ESRMNT Errno = 69 /* Srmount error */
|
|
ECOMM Errno = 70 /* Communication error on send */
|
|
EPROTO Errno = 71 /* Protocol error */
|
|
EMULTIHOP Errno = 72 /* Multihop attempted */
|
|
EDOTDOT Errno = 73 /* Cross mount point (not really error) */
|
|
EBADMSG Errno = 74 /* Trying to read unreadable message */
|
|
EOVERFLOW Errno = 75 /* Value too large for defined data type */
|
|
ENOTUNIQ Errno = 76 /* Given log. name not unique */
|
|
EBADFD Errno = 77 /* f.d. invalid for this operation */
|
|
EREMCHG Errno = 78 /* Remote address changed */
|
|
ELIBACC Errno = 79 /* Can't access a needed shared lib */
|
|
ELIBBAD Errno = 80 /* Accessing a corrupted shared lib */
|
|
ELIBSCN Errno = 81 /* .lib section in a.out corrupted */
|
|
ELIBMAX Errno = 82 /* Attempting to link in too many libs */
|
|
ELIBEXEC Errno = 83 /* Attempting to exec a shared library */
|
|
EILSEQ Errno = 84
|
|
EUSERS Errno = 87
|
|
ENOTSOCK Errno = 88 /* Socket operation on non-socket */
|
|
EDESTADDRREQ Errno = 89 /* Destination address required */
|
|
EMSGSIZE Errno = 90 /* Message too long */
|
|
EPROTOTYPE Errno = 91 /* Protocol wrong type for socket */
|
|
ENOPROTOOPT Errno = 92 /* Protocol not available */
|
|
EPROTONOSUPPORT Errno = 93 /* Unknown protocol */
|
|
ESOCKTNOSUPPORT Errno = 94 /* Socket type not supported */
|
|
EOPNOTSUPP Errno = 95 /* Operation not supported on transport endpoint */
|
|
EPFNOSUPPORT Errno = 96 /* Protocol family not supported */
|
|
EAFNOSUPPORT Errno = 97 /* Address family not supported by protocol family */
|
|
EADDRINUSE Errno = 98 /* Address already in use */
|
|
EADDRNOTAVAIL Errno = 99 /* Address not available */
|
|
ENETDOWN Errno = 100 /* Network interface is not configured */
|
|
ENETUNREACH Errno = 101 /* Network is unreachable */
|
|
ENETRESET Errno = 102
|
|
ECONNABORTED Errno = 103 /* Connection aborted */
|
|
ECONNRESET Errno = 104 /* Connection reset by peer */
|
|
ENOBUFS Errno = 105 /* No buffer space available */
|
|
EISCONN Errno = 106 /* Socket is already connected */
|
|
ENOTCONN Errno = 107 /* Socket is not connected */
|
|
ESHUTDOWN Errno = 108 /* Can't send after socket shutdown */
|
|
ETOOMANYREFS Errno = 109
|
|
ETIMEDOUT Errno = 110 /* Connection timed out */
|
|
ECONNREFUSED Errno = 111 /* Connection refused */
|
|
EHOSTDOWN Errno = 112 /* Host is down */
|
|
EHOSTUNREACH Errno = 113 /* Host is unreachable */
|
|
EALREADY Errno = 114 /* Socket already connected */
|
|
EINPROGRESS Errno = 115 /* Connection already in progress */
|
|
ESTALE Errno = 116
|
|
ENOTSUP Errno = EOPNOTSUPP /* Not supported */
|
|
ENOMEDIUM Errno = 123 /* No medium (in tape drive) */
|
|
ECANCELED Errno = 125 /* Operation canceled. */
|
|
ELBIN Errno = 2048 /* Inode is remote (not really error) */
|
|
EFTYPE Errno = 2049 /* Inappropriate file type or format */
|
|
ENMFILE Errno = 2050 /* No more files */
|
|
EPROCLIM Errno = 2051
|
|
ENOSHARE Errno = 2052 /* No such host or network path */
|
|
ECASECLASH Errno = 2053 /* Filename exists with different case */
|
|
EWOULDBLOCK Errno = EAGAIN /* Operation would block */
|
|
)
|
|
|
|
// Do the interface allocations only once for common
|
|
// Errno values.
|
|
var (
|
|
errEAGAIN error = EAGAIN
|
|
errEINVAL error = EINVAL
|
|
errENOENT error = ENOENT
|
|
)
|
|
|
|
// errnoErr returns common boxed Errno values, to prevent
|
|
// allocations at runtime.
|
|
func errnoErr(e Errno) error {
|
|
switch e {
|
|
case 0:
|
|
return nil
|
|
case EAGAIN:
|
|
return errEAGAIN
|
|
case EINVAL:
|
|
return errEINVAL
|
|
case ENOENT:
|
|
return errENOENT
|
|
}
|
|
return e
|
|
}
|
|
|
|
var errnoByCode = map[string]Errno{
|
|
"EPERM": EPERM,
|
|
"ENOENT": ENOENT,
|
|
"ESRCH": ESRCH,
|
|
"EINTR": EINTR,
|
|
"EIO": EIO,
|
|
"ENXIO": ENXIO,
|
|
"E2BIG": E2BIG,
|
|
"ENOEXEC": ENOEXEC,
|
|
"EBADF": EBADF,
|
|
"ECHILD": ECHILD,
|
|
"EAGAIN": EAGAIN,
|
|
"ENOMEM": ENOMEM,
|
|
"EACCES": EACCES,
|
|
"EFAULT": EFAULT,
|
|
"EBUSY": EBUSY,
|
|
"EEXIST": EEXIST,
|
|
"EXDEV": EXDEV,
|
|
"ENODEV": ENODEV,
|
|
"ENOTDIR": ENOTDIR,
|
|
"EISDIR": EISDIR,
|
|
"EINVAL": EINVAL,
|
|
"ENFILE": ENFILE,
|
|
"EMFILE": EMFILE,
|
|
"ENOTTY": ENOTTY,
|
|
"EFBIG": EFBIG,
|
|
"ENOSPC": ENOSPC,
|
|
"ESPIPE": ESPIPE,
|
|
"EROFS": EROFS,
|
|
"EMLINK": EMLINK,
|
|
"EPIPE": EPIPE,
|
|
"ENAMETOOLONG": ENAMETOOLONG,
|
|
"ENOSYS": ENOSYS,
|
|
"EDQUOT": EDQUOT,
|
|
"EDOM": EDOM,
|
|
"ERANGE": ERANGE,
|
|
"EDEADLK": EDEADLK,
|
|
"ENOLCK": ENOLCK,
|
|
"ENOTEMPTY": ENOTEMPTY,
|
|
"ELOOP": ELOOP,
|
|
"ENOMSG": ENOMSG,
|
|
"EIDRM": EIDRM,
|
|
"ECHRNG": ECHRNG,
|
|
"EL2NSYNC": EL2NSYNC,
|
|
"EL3HLT": EL3HLT,
|
|
"EL3RST": EL3RST,
|
|
"ELNRNG": ELNRNG,
|
|
"EUNATCH": EUNATCH,
|
|
"ENOCSI": ENOCSI,
|
|
"EL2HLT": EL2HLT,
|
|
"EBADE": EBADE,
|
|
"EBADR": EBADR,
|
|
"EXFULL": EXFULL,
|
|
"ENOANO": ENOANO,
|
|
"EBADRQC": EBADRQC,
|
|
"EBADSLT": EBADSLT,
|
|
"EDEADLOCK": EDEADLOCK,
|
|
"EBFONT": EBFONT,
|
|
"ENOSTR": ENOSTR,
|
|
"ENODATA": ENODATA,
|
|
"ETIME": ETIME,
|
|
"ENOSR": ENOSR,
|
|
"ENONET": ENONET,
|
|
"ENOPKG": ENOPKG,
|
|
"EREMOTE": EREMOTE,
|
|
"ENOLINK": ENOLINK,
|
|
"EADV": EADV,
|
|
"ESRMNT": ESRMNT,
|
|
"ECOMM": ECOMM,
|
|
"EPROTO": EPROTO,
|
|
"EMULTIHOP": EMULTIHOP,
|
|
"EDOTDOT": EDOTDOT,
|
|
"EBADMSG": EBADMSG,
|
|
"EOVERFLOW": EOVERFLOW,
|
|
"ENOTUNIQ": ENOTUNIQ,
|
|
"EBADFD": EBADFD,
|
|
"EREMCHG": EREMCHG,
|
|
"ELIBACC": ELIBACC,
|
|
"ELIBBAD": ELIBBAD,
|
|
"ELIBSCN": ELIBSCN,
|
|
"ELIBMAX": ELIBMAX,
|
|
"ELIBEXEC": ELIBEXEC,
|
|
"EILSEQ": EILSEQ,
|
|
"EUSERS": EUSERS,
|
|
"ENOTSOCK": ENOTSOCK,
|
|
"EDESTADDRREQ": EDESTADDRREQ,
|
|
"EMSGSIZE": EMSGSIZE,
|
|
"EPROTOTYPE": EPROTOTYPE,
|
|
"ENOPROTOOPT": ENOPROTOOPT,
|
|
"EPROTONOSUPPORT": EPROTONOSUPPORT,
|
|
"ESOCKTNOSUPPORT": ESOCKTNOSUPPORT,
|
|
"EOPNOTSUPP": EOPNOTSUPP,
|
|
"EPFNOSUPPORT": EPFNOSUPPORT,
|
|
"EAFNOSUPPORT": EAFNOSUPPORT,
|
|
"EADDRINUSE": EADDRINUSE,
|
|
"EADDRNOTAVAIL": EADDRNOTAVAIL,
|
|
"ENETDOWN": ENETDOWN,
|
|
"ENETUNREACH": ENETUNREACH,
|
|
"ENETRESET": ENETRESET,
|
|
"ECONNABORTED": ECONNABORTED,
|
|
"ECONNRESET": ECONNRESET,
|
|
"ENOBUFS": ENOBUFS,
|
|
"EISCONN": EISCONN,
|
|
"ENOTCONN": ENOTCONN,
|
|
"ESHUTDOWN": ESHUTDOWN,
|
|
"ETOOMANYREFS": ETOOMANYREFS,
|
|
"ETIMEDOUT": ETIMEDOUT,
|
|
"ECONNREFUSED": ECONNREFUSED,
|
|
"EHOSTDOWN": EHOSTDOWN,
|
|
"EHOSTUNREACH": EHOSTUNREACH,
|
|
"EALREADY": EALREADY,
|
|
"EINPROGRESS": EINPROGRESS,
|
|
"ESTALE": ESTALE,
|
|
"ENOTSUP": ENOTSUP,
|
|
"ENOMEDIUM": ENOMEDIUM,
|
|
"ECANCELED": ECANCELED,
|
|
"ELBIN": ELBIN,
|
|
"EFTYPE": EFTYPE,
|
|
"ENMFILE": ENMFILE,
|
|
"EPROCLIM": EPROCLIM,
|
|
"ENOSHARE": ENOSHARE,
|
|
"ECASECLASH": ECASECLASH,
|
|
"EWOULDBLOCK": EWOULDBLOCK,
|
|
}
|