1// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build js && wasm
6// +build js,wasm
7
8package syscall
9
10import "runtime"
11
12// These were originally used by Nacl, then later also used by
13// js/wasm. Now that they're only used by js/wasm, these numbers are
14// just arbitrary.
15//
16// TODO: delete? replace with something meaningful?
17const (
18	sys_null                 = 1
19	sys_nameservice          = 2
20	sys_dup                  = 8
21	sys_dup2                 = 9
22	sys_open                 = 10
23	sys_close                = 11
24	sys_read                 = 12
25	sys_write                = 13
26	sys_lseek                = 14
27	sys_stat                 = 16
28	sys_fstat                = 17
29	sys_chmod                = 18
30	sys_isatty               = 19
31	sys_brk                  = 20
32	sys_mmap                 = 21
33	sys_munmap               = 22
34	sys_getdents             = 23
35	sys_mprotect             = 24
36	sys_list_mappings        = 25
37	sys_exit                 = 30
38	sys_getpid               = 31
39	sys_sched_yield          = 32
40	sys_sysconf              = 33
41	sys_gettimeofday         = 40
42	sys_clock                = 41
43	sys_nanosleep            = 42
44	sys_clock_getres         = 43
45	sys_clock_gettime        = 44
46	sys_mkdir                = 45
47	sys_rmdir                = 46
48	sys_chdir                = 47
49	sys_getcwd               = 48
50	sys_unlink               = 49
51	sys_imc_makeboundsock    = 60
52	sys_imc_accept           = 61
53	sys_imc_connect          = 62
54	sys_imc_sendmsg          = 63
55	sys_imc_recvmsg          = 64
56	sys_imc_mem_obj_create   = 65
57	sys_imc_socketpair       = 66
58	sys_mutex_create         = 70
59	sys_mutex_lock           = 71
60	sys_mutex_trylock        = 72
61	sys_mutex_unlock         = 73
62	sys_cond_create          = 74
63	sys_cond_wait            = 75
64	sys_cond_signal          = 76
65	sys_cond_broadcast       = 77
66	sys_cond_timed_wait_abs  = 79
67	sys_thread_create        = 80
68	sys_thread_exit          = 81
69	sys_tls_init             = 82
70	sys_thread_nice          = 83
71	sys_tls_get              = 84
72	sys_second_tls_set       = 85
73	sys_second_tls_get       = 86
74	sys_exception_handler    = 87
75	sys_exception_stack      = 88
76	sys_exception_clear_flag = 89
77	sys_sem_create           = 100
78	sys_sem_wait             = 101
79	sys_sem_post             = 102
80	sys_sem_get_value        = 103
81	sys_dyncode_create       = 104
82	sys_dyncode_modify       = 105
83	sys_dyncode_delete       = 106
84	sys_test_infoleak        = 109
85	sys_test_crash           = 110
86	sys_test_syscall_1       = 111
87	sys_test_syscall_2       = 112
88	sys_futex_wait_abs       = 120
89	sys_futex_wake           = 121
90	sys_pread                = 130
91	sys_pwrite               = 131
92	sys_truncate             = 140
93	sys_lstat                = 141
94	sys_link                 = 142
95	sys_rename               = 143
96	sys_symlink              = 144
97	sys_access               = 145
98	sys_readlink             = 146
99	sys_utimes               = 147
100	sys_get_random_bytes     = 150
101)
102
103// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
104const (
105	// native_client/src/trusted/service_runtime/include/sys/errno.h
106	// The errors are mainly copied from Linux.
107	EPERM           Errno = 1       /* Operation not permitted */
108	ENOENT          Errno = 2       /* No such file or directory */
109	ESRCH           Errno = 3       /* No such process */
110	EINTR           Errno = 4       /* Interrupted system call */
111	EIO             Errno = 5       /* I/O error */
112	ENXIO           Errno = 6       /* No such device or address */
113	E2BIG           Errno = 7       /* Argument list too long */
114	ENOEXEC         Errno = 8       /* Exec format error */
115	EBADF           Errno = 9       /* Bad file number */
116	ECHILD          Errno = 10      /* No child processes */
117	EAGAIN          Errno = 11      /* Try again */
118	ENOMEM          Errno = 12      /* Out of memory */
119	EACCES          Errno = 13      /* Permission denied */
120	EFAULT          Errno = 14      /* Bad address */
121	EBUSY           Errno = 16      /* Device or resource busy */
122	EEXIST          Errno = 17      /* File exists */
123	EXDEV           Errno = 18      /* Cross-device link */
124	ENODEV          Errno = 19      /* No such device */
125	ENOTDIR         Errno = 20      /* Not a directory */
126	EISDIR          Errno = 21      /* Is a directory */
127	EINVAL          Errno = 22      /* Invalid argument */
128	ENFILE          Errno = 23      /* File table overflow */
129	EMFILE          Errno = 24      /* Too many open files */
130	ENOTTY          Errno = 25      /* Not a typewriter */
131	EFBIG           Errno = 27      /* File too large */
132	ENOSPC          Errno = 28      /* No space left on device */
133	ESPIPE          Errno = 29      /* Illegal seek */
134	EROFS           Errno = 30      /* Read-only file system */
135	EMLINK          Errno = 31      /* Too many links */
136	EPIPE           Errno = 32      /* Broken pipe */
137	ENAMETOOLONG    Errno = 36      /* File name too long */
138	ENOSYS          Errno = 38      /* Function not implemented */
139	EDQUOT          Errno = 122     /* Quota exceeded */
140	EDOM            Errno = 33      /* Math arg out of domain of func */
141	ERANGE          Errno = 34      /* Math result not representable */
142	EDEADLK         Errno = 35      /* Deadlock condition */
143	ENOLCK          Errno = 37      /* No record locks available */
144	ENOTEMPTY       Errno = 39      /* Directory not empty */
145	ELOOP           Errno = 40      /* Too many symbolic links */
146	ENOMSG          Errno = 42      /* No message of desired type */
147	EIDRM           Errno = 43      /* Identifier removed */
148	ECHRNG          Errno = 44      /* Channel number out of range */
149	EL2NSYNC        Errno = 45      /* Level 2 not synchronized */
150	EL3HLT          Errno = 46      /* Level 3 halted */
151	EL3RST          Errno = 47      /* Level 3 reset */
152	ELNRNG          Errno = 48      /* Link number out of range */
153	EUNATCH         Errno = 49      /* Protocol driver not attached */
154	ENOCSI          Errno = 50      /* No CSI structure available */
155	EL2HLT          Errno = 51      /* Level 2 halted */
156	EBADE           Errno = 52      /* Invalid exchange */
157	EBADR           Errno = 53      /* Invalid request descriptor */
158	EXFULL          Errno = 54      /* Exchange full */
159	ENOANO          Errno = 55      /* No anode */
160	EBADRQC         Errno = 56      /* Invalid request code */
161	EBADSLT         Errno = 57      /* Invalid slot */
162	EDEADLOCK       Errno = EDEADLK /* File locking deadlock error */
163	EBFONT          Errno = 59      /* Bad font file fmt */
164	ENOSTR          Errno = 60      /* Device not a stream */
165	ENODATA         Errno = 61      /* No data (for no delay io) */
166	ETIME           Errno = 62      /* Timer expired */
167	ENOSR           Errno = 63      /* Out of streams resources */
168	ENONET          Errno = 64      /* Machine is not on the network */
169	ENOPKG          Errno = 65      /* Package not installed */
170	EREMOTE         Errno = 66      /* The object is remote */
171	ENOLINK         Errno = 67      /* The link has been severed */
172	EADV            Errno = 68      /* Advertise error */
173	ESRMNT          Errno = 69      /* Srmount error */
174	ECOMM           Errno = 70      /* Communication error on send */
175	EPROTO          Errno = 71      /* Protocol error */
176	EMULTIHOP       Errno = 72      /* Multihop attempted */
177	EDOTDOT         Errno = 73      /* Cross mount point (not really error) */
178	EBADMSG         Errno = 74      /* Trying to read unreadable message */
179	EOVERFLOW       Errno = 75      /* Value too large for defined data type */
180	ENOTUNIQ        Errno = 76      /* Given log. name not unique */
181	EBADFD          Errno = 77      /* f.d. invalid for this operation */
182	EREMCHG         Errno = 78      /* Remote address changed */
183	ELIBACC         Errno = 79      /* Can't access a needed shared lib */
184	ELIBBAD         Errno = 80      /* Accessing a corrupted shared lib */
185	ELIBSCN         Errno = 81      /* .lib section in a.out corrupted */
186	ELIBMAX         Errno = 82      /* Attempting to link in too many libs */
187	ELIBEXEC        Errno = 83      /* Attempting to exec a shared library */
188	EILSEQ          Errno = 84
189	EUSERS          Errno = 87
190	ENOTSOCK        Errno = 88  /* Socket operation on non-socket */
191	EDESTADDRREQ    Errno = 89  /* Destination address required */
192	EMSGSIZE        Errno = 90  /* Message too long */
193	EPROTOTYPE      Errno = 91  /* Protocol wrong type for socket */
194	ENOPROTOOPT     Errno = 92  /* Protocol not available */
195	EPROTONOSUPPORT Errno = 93  /* Unknown protocol */
196	ESOCKTNOSUPPORT Errno = 94  /* Socket type not supported */
197	EOPNOTSUPP      Errno = 95  /* Operation not supported on transport endpoint */
198	EPFNOSUPPORT    Errno = 96  /* Protocol family not supported */
199	EAFNOSUPPORT    Errno = 97  /* Address family not supported by protocol family */
200	EADDRINUSE      Errno = 98  /* Address already in use */
201	EADDRNOTAVAIL   Errno = 99  /* Address not available */
202	ENETDOWN        Errno = 100 /* Network interface is not configured */
203	ENETUNREACH     Errno = 101 /* Network is unreachable */
204	ENETRESET       Errno = 102
205	ECONNABORTED    Errno = 103 /* Connection aborted */
206	ECONNRESET      Errno = 104 /* Connection reset by peer */
207	ENOBUFS         Errno = 105 /* No buffer space available */
208	EISCONN         Errno = 106 /* Socket is already connected */
209	ENOTCONN        Errno = 107 /* Socket is not connected */
210	ESHUTDOWN       Errno = 108 /* Can't send after socket shutdown */
211	ETOOMANYREFS    Errno = 109
212	ETIMEDOUT       Errno = 110 /* Connection timed out */
213	ECONNREFUSED    Errno = 111 /* Connection refused */
214	EHOSTDOWN       Errno = 112 /* Host is down */
215	EHOSTUNREACH    Errno = 113 /* Host is unreachable */
216	EALREADY        Errno = 114 /* Socket already connected */
217	EINPROGRESS     Errno = 115 /* Connection already in progress */
218	ESTALE          Errno = 116
219	ENOTSUP         Errno = EOPNOTSUPP /* Not supported */
220	ENOMEDIUM       Errno = 123        /* No medium (in tape drive) */
221	ECANCELED       Errno = 125        /* Operation canceled. */
222	ELBIN           Errno = 2048       /* Inode is remote (not really error) */
223	EFTYPE          Errno = 2049       /* Inappropriate file type or format */
224	ENMFILE         Errno = 2050       /* No more files */
225	EPROCLIM        Errno = 2051
226	ENOSHARE        Errno = 2052   /* No such host or network path */
227	ECASECLASH      Errno = 2053   /* Filename exists with different case */
228	EWOULDBLOCK     Errno = EAGAIN /* Operation would block */
229)
230
231// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
232var errorstr = [...]string{
233	EPERM:           "Operation not permitted",
234	ENOENT:          "No such file or directory",
235	ESRCH:           "No such process",
236	EINTR:           "Interrupted system call",
237	EIO:             "I/O error",
238	ENXIO:           "No such device or address",
239	E2BIG:           "Argument list too long",
240	ENOEXEC:         "Exec format error",
241	EBADF:           "Bad file number",
242	ECHILD:          "No child processes",
243	EAGAIN:          "Try again",
244	ENOMEM:          "Out of memory",
245	EACCES:          "Permission denied",
246	EFAULT:          "Bad address",
247	EBUSY:           "Device or resource busy",
248	EEXIST:          "File exists",
249	EXDEV:           "Cross-device link",
250	ENODEV:          "No such device",
251	ENOTDIR:         "Not a directory",
252	EISDIR:          "Is a directory",
253	EINVAL:          "Invalid argument",
254	ENFILE:          "File table overflow",
255	EMFILE:          "Too many open files",
256	ENOTTY:          "Not a typewriter",
257	EFBIG:           "File too large",
258	ENOSPC:          "No space left on device",
259	ESPIPE:          "Illegal seek",
260	EROFS:           "Read-only file system",
261	EMLINK:          "Too many links",
262	EPIPE:           "Broken pipe",
263	ENAMETOOLONG:    "File name too long",
264	ENOSYS:          "not implemented on " + runtime.GOOS,
265	EDQUOT:          "Quota exceeded",
266	EDOM:            "Math arg out of domain of func",
267	ERANGE:          "Math result not representable",
268	EDEADLK:         "Deadlock condition",
269	ENOLCK:          "No record locks available",
270	ENOTEMPTY:       "Directory not empty",
271	ELOOP:           "Too many symbolic links",
272	ENOMSG:          "No message of desired type",
273	EIDRM:           "Identifier removed",
274	ECHRNG:          "Channel number out of range",
275	EL2NSYNC:        "Level 2 not synchronized",
276	EL3HLT:          "Level 3 halted",
277	EL3RST:          "Level 3 reset",
278	ELNRNG:          "Link number out of range",
279	EUNATCH:         "Protocol driver not attached",
280	ENOCSI:          "No CSI structure available",
281	EL2HLT:          "Level 2 halted",
282	EBADE:           "Invalid exchange",
283	EBADR:           "Invalid request descriptor",
284	EXFULL:          "Exchange full",
285	ENOANO:          "No anode",
286	EBADRQC:         "Invalid request code",
287	EBADSLT:         "Invalid slot",
288	EBFONT:          "Bad font file fmt",
289	ENOSTR:          "Device not a stream",
290	ENODATA:         "No data (for no delay io)",
291	ETIME:           "Timer expired",
292	ENOSR:           "Out of streams resources",
293	ENONET:          "Machine is not on the network",
294	ENOPKG:          "Package not installed",
295	EREMOTE:         "The object is remote",
296	ENOLINK:         "The link has been severed",
297	EADV:            "Advertise error",
298	ESRMNT:          "Srmount error",
299	ECOMM:           "Communication error on send",
300	EPROTO:          "Protocol error",
301	EMULTIHOP:       "Multihop attempted",
302	EDOTDOT:         "Cross mount point (not really error)",
303	EBADMSG:         "Trying to read unreadable message",
304	EOVERFLOW:       "Value too large for defined data type",
305	ENOTUNIQ:        "Given log. name not unique",
306	EBADFD:          "f.d. invalid for this operation",
307	EREMCHG:         "Remote address changed",
308	ELIBACC:         "Can't access a needed shared lib",
309	ELIBBAD:         "Accessing a corrupted shared lib",
310	ELIBSCN:         ".lib section in a.out corrupted",
311	ELIBMAX:         "Attempting to link in too many libs",
312	ELIBEXEC:        "Attempting to exec a shared library",
313	ENOTSOCK:        "Socket operation on non-socket",
314	EDESTADDRREQ:    "Destination address required",
315	EMSGSIZE:        "Message too long",
316	EPROTOTYPE:      "Protocol wrong type for socket",
317	ENOPROTOOPT:     "Protocol not available",
318	EPROTONOSUPPORT: "Unknown protocol",
319	ESOCKTNOSUPPORT: "Socket type not supported",
320	EOPNOTSUPP:      "Operation not supported on transport endpoint",
321	EPFNOSUPPORT:    "Protocol family not supported",
322	EAFNOSUPPORT:    "Address family not supported by protocol family",
323	EADDRINUSE:      "Address already in use",
324	EADDRNOTAVAIL:   "Address not available",
325	ENETDOWN:        "Network interface is not configured",
326	ENETUNREACH:     "Network is unreachable",
327	ECONNABORTED:    "Connection aborted",
328	ECONNRESET:      "Connection reset by peer",
329	ENOBUFS:         "No buffer space available",
330	EISCONN:         "Socket is already connected",
331	ENOTCONN:        "Socket is not connected",
332	ESHUTDOWN:       "Can't send after socket shutdown",
333	ETIMEDOUT:       "Connection timed out",
334	ECONNREFUSED:    "Connection refused",
335	EHOSTDOWN:       "Host is down",
336	EHOSTUNREACH:    "Host is unreachable",
337	EALREADY:        "Socket already connected",
338	EINPROGRESS:     "Connection already in progress",
339	ENOMEDIUM:       "No medium (in tape drive)",
340	ECANCELED:       "Operation canceled.",
341	ELBIN:           "Inode is remote (not really error)",
342	EFTYPE:          "Inappropriate file type or format",
343	ENMFILE:         "No more files",
344	ENOSHARE:        "No such host or network path",
345	ECASECLASH:      "Filename exists with different case",
346}
347
348// Do the interface allocations only once for common
349// Errno values.
350var (
351	errEAGAIN error = EAGAIN
352	errEINVAL error = EINVAL
353	errENOENT error = ENOENT
354)
355
356// errnoErr returns common boxed Errno values, to prevent
357// allocations at runtime.
358func errnoErr(e Errno) error {
359	switch e {
360	case 0:
361		return nil
362	case EAGAIN:
363		return errEAGAIN
364	case EINVAL:
365		return errEINVAL
366	case ENOENT:
367		return errENOENT
368	}
369	return e
370}
371
372var errnoByCode = map[string]Errno{
373	"EPERM":           EPERM,
374	"ENOENT":          ENOENT,
375	"ESRCH":           ESRCH,
376	"EINTR":           EINTR,
377	"EIO":             EIO,
378	"ENXIO":           ENXIO,
379	"E2BIG":           E2BIG,
380	"ENOEXEC":         ENOEXEC,
381	"EBADF":           EBADF,
382	"ECHILD":          ECHILD,
383	"EAGAIN":          EAGAIN,
384	"ENOMEM":          ENOMEM,
385	"EACCES":          EACCES,
386	"EFAULT":          EFAULT,
387	"EBUSY":           EBUSY,
388	"EEXIST":          EEXIST,
389	"EXDEV":           EXDEV,
390	"ENODEV":          ENODEV,
391	"ENOTDIR":         ENOTDIR,
392	"EISDIR":          EISDIR,
393	"EINVAL":          EINVAL,
394	"ENFILE":          ENFILE,
395	"EMFILE":          EMFILE,
396	"ENOTTY":          ENOTTY,
397	"EFBIG":           EFBIG,
398	"ENOSPC":          ENOSPC,
399	"ESPIPE":          ESPIPE,
400	"EROFS":           EROFS,
401	"EMLINK":          EMLINK,
402	"EPIPE":           EPIPE,
403	"ENAMETOOLONG":    ENAMETOOLONG,
404	"ENOSYS":          ENOSYS,
405	"EDQUOT":          EDQUOT,
406	"EDOM":            EDOM,
407	"ERANGE":          ERANGE,
408	"EDEADLK":         EDEADLK,
409	"ENOLCK":          ENOLCK,
410	"ENOTEMPTY":       ENOTEMPTY,
411	"ELOOP":           ELOOP,
412	"ENOMSG":          ENOMSG,
413	"EIDRM":           EIDRM,
414	"ECHRNG":          ECHRNG,
415	"EL2NSYNC":        EL2NSYNC,
416	"EL3HLT":          EL3HLT,
417	"EL3RST":          EL3RST,
418	"ELNRNG":          ELNRNG,
419	"EUNATCH":         EUNATCH,
420	"ENOCSI":          ENOCSI,
421	"EL2HLT":          EL2HLT,
422	"EBADE":           EBADE,
423	"EBADR":           EBADR,
424	"EXFULL":          EXFULL,
425	"ENOANO":          ENOANO,
426	"EBADRQC":         EBADRQC,
427	"EBADSLT":         EBADSLT,
428	"EDEADLOCK":       EDEADLOCK,
429	"EBFONT":          EBFONT,
430	"ENOSTR":          ENOSTR,
431	"ENODATA":         ENODATA,
432	"ETIME":           ETIME,
433	"ENOSR":           ENOSR,
434	"ENONET":          ENONET,
435	"ENOPKG":          ENOPKG,
436	"EREMOTE":         EREMOTE,
437	"ENOLINK":         ENOLINK,
438	"EADV":            EADV,
439	"ESRMNT":          ESRMNT,
440	"ECOMM":           ECOMM,
441	"EPROTO":          EPROTO,
442	"EMULTIHOP":       EMULTIHOP,
443	"EDOTDOT":         EDOTDOT,
444	"EBADMSG":         EBADMSG,
445	"EOVERFLOW":       EOVERFLOW,
446	"ENOTUNIQ":        ENOTUNIQ,
447	"EBADFD":          EBADFD,
448	"EREMCHG":         EREMCHG,
449	"ELIBACC":         ELIBACC,
450	"ELIBBAD":         ELIBBAD,
451	"ELIBSCN":         ELIBSCN,
452	"ELIBMAX":         ELIBMAX,
453	"ELIBEXEC":        ELIBEXEC,
454	"EILSEQ":          EILSEQ,
455	"EUSERS":          EUSERS,
456	"ENOTSOCK":        ENOTSOCK,
457	"EDESTADDRREQ":    EDESTADDRREQ,
458	"EMSGSIZE":        EMSGSIZE,
459	"EPROTOTYPE":      EPROTOTYPE,
460	"ENOPROTOOPT":     ENOPROTOOPT,
461	"EPROTONOSUPPORT": EPROTONOSUPPORT,
462	"ESOCKTNOSUPPORT": ESOCKTNOSUPPORT,
463	"EOPNOTSUPP":      EOPNOTSUPP,
464	"EPFNOSUPPORT":    EPFNOSUPPORT,
465	"EAFNOSUPPORT":    EAFNOSUPPORT,
466	"EADDRINUSE":      EADDRINUSE,
467	"EADDRNOTAVAIL":   EADDRNOTAVAIL,
468	"ENETDOWN":        ENETDOWN,
469	"ENETUNREACH":     ENETUNREACH,
470	"ENETRESET":       ENETRESET,
471	"ECONNABORTED":    ECONNABORTED,
472	"ECONNRESET":      ECONNRESET,
473	"ENOBUFS":         ENOBUFS,
474	"EISCONN":         EISCONN,
475	"ENOTCONN":        ENOTCONN,
476	"ESHUTDOWN":       ESHUTDOWN,
477	"ETOOMANYREFS":    ETOOMANYREFS,
478	"ETIMEDOUT":       ETIMEDOUT,
479	"ECONNREFUSED":    ECONNREFUSED,
480	"EHOSTDOWN":       EHOSTDOWN,
481	"EHOSTUNREACH":    EHOSTUNREACH,
482	"EALREADY":        EALREADY,
483	"EINPROGRESS":     EINPROGRESS,
484	"ESTALE":          ESTALE,
485	"ENOTSUP":         ENOTSUP,
486	"ENOMEDIUM":       ENOMEDIUM,
487	"ECANCELED":       ECANCELED,
488	"ELBIN":           ELBIN,
489	"EFTYPE":          EFTYPE,
490	"ENMFILE":         ENMFILE,
491	"EPROCLIM":        EPROCLIM,
492	"ENOSHARE":        ENOSHARE,
493	"ECASECLASH":      ECASECLASH,
494	"EWOULDBLOCK":     EWOULDBLOCK,
495}
496