1// Copyright 2023 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 wasip1
6
7package syscall
8
9import "runtime"
10
11// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
12const (
13	E2BIG           Errno = 1
14	EACCES          Errno = 2
15	EADDRINUSE      Errno = 3
16	EADDRNOTAVAIL   Errno = 4
17	EAFNOSUPPORT    Errno = 5
18	EAGAIN          Errno = 6
19	EALREADY        Errno = 7
20	EBADF           Errno = 8
21	EBADMSG         Errno = 9
22	EBUSY           Errno = 10
23	ECANCELED       Errno = 11
24	ECHILD          Errno = 12
25	ECONNABORTED    Errno = 13
26	ECONNREFUSED    Errno = 14
27	ECONNRESET      Errno = 15
28	EDEADLK         Errno = 16
29	EDESTADDRREQ    Errno = 17
30	EDOM            Errno = 18
31	EDQUOT          Errno = 19
32	EEXIST          Errno = 20
33	EFAULT          Errno = 21
34	EFBIG           Errno = 22
35	EHOSTUNREACH    Errno = 23
36	EIDRM           Errno = 24
37	EILSEQ          Errno = 25
38	EINPROGRESS     Errno = 26
39	EINTR           Errno = 27
40	EINVAL          Errno = 28
41	EIO             Errno = 29
42	EISCONN         Errno = 30
43	EISDIR          Errno = 31
44	ELOOP           Errno = 32
45	EMFILE          Errno = 33
46	EMLINK          Errno = 34
47	EMSGSIZE        Errno = 35
48	EMULTIHOP       Errno = 36
49	ENAMETOOLONG    Errno = 37
50	ENETDOWN        Errno = 38
51	ENETRESET       Errno = 39
52	ENETUNREACH     Errno = 40
53	ENFILE          Errno = 41
54	ENOBUFS         Errno = 42
55	ENODEV          Errno = 43
56	ENOENT          Errno = 44
57	ENOEXEC         Errno = 45
58	ENOLCK          Errno = 46
59	ENOLINK         Errno = 47
60	ENOMEM          Errno = 48
61	ENOMSG          Errno = 49
62	ENOPROTOOPT     Errno = 50
63	ENOSPC          Errno = 51
64	ENOSYS          Errno = 52
65	ENOTCONN        Errno = 53
66	ENOTDIR         Errno = 54
67	ENOTEMPTY       Errno = 55
68	ENOTRECOVERABLE Errno = 56
69	ENOTSOCK        Errno = 57
70	ENOTSUP         Errno = 58
71	ENOTTY          Errno = 59
72	ENXIO           Errno = 60
73	EOVERFLOW       Errno = 61
74	EOWNERDEAD      Errno = 62
75	EPERM           Errno = 63
76	EPIPE           Errno = 64
77	EPROTO          Errno = 65
78	EPROTONOSUPPORT Errno = 66
79	EPROTOTYPE      Errno = 67
80	ERANGE          Errno = 68
81	EROFS           Errno = 69
82	ESPIPE          Errno = 70
83	ESRCH           Errno = 71
84	ESTALE          Errno = 72
85	ETIMEDOUT       Errno = 73
86	ETXTBSY         Errno = 74
87	EXDEV           Errno = 75
88	ENOTCAPABLE     Errno = 76
89	// needed by src/net/error_unix_test.go
90	EOPNOTSUPP = ENOTSUP
91)
92
93// TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
94var errorstr = [...]string{
95	E2BIG:           "Argument list too long",
96	EACCES:          "Permission denied",
97	EADDRINUSE:      "Address already in use",
98	EADDRNOTAVAIL:   "Address not available",
99	EAFNOSUPPORT:    "Address family not supported by protocol family",
100	EAGAIN:          "Try again",
101	EALREADY:        "Socket already connected",
102	EBADF:           "Bad file number",
103	EBADMSG:         "Trying to read unreadable message",
104	EBUSY:           "Device or resource busy",
105	ECANCELED:       "Operation canceled.",
106	ECHILD:          "No child processes",
107	ECONNABORTED:    "Connection aborted",
108	ECONNREFUSED:    "Connection refused",
109	ECONNRESET:      "Connection reset by peer",
110	EDEADLK:         "Deadlock condition",
111	EDESTADDRREQ:    "Destination address required",
112	EDOM:            "Math arg out of domain of func",
113	EDQUOT:          "Quota exceeded",
114	EEXIST:          "File exists",
115	EFAULT:          "Bad address",
116	EFBIG:           "File too large",
117	EHOSTUNREACH:    "Host is unreachable",
118	EIDRM:           "Identifier removed",
119	EILSEQ:          "EILSEQ",
120	EINPROGRESS:     "Connection already in progress",
121	EINTR:           "Interrupted system call",
122	EINVAL:          "Invalid argument",
123	EIO:             "I/O error",
124	EISCONN:         "Socket is already connected",
125	EISDIR:          "Is a directory",
126	ELOOP:           "Too many symbolic links",
127	EMFILE:          "Too many open files",
128	EMLINK:          "Too many links",
129	EMSGSIZE:        "Message too long",
130	EMULTIHOP:       "Multihop attempted",
131	ENAMETOOLONG:    "File name too long",
132	ENETDOWN:        "Network interface is not configured",
133	ENETRESET:       "Network dropped connection on reset",
134	ENETUNREACH:     "Network is unreachable",
135	ENFILE:          "File table overflow",
136	ENOBUFS:         "No buffer space available",
137	ENODEV:          "No such device",
138	ENOENT:          "No such file or directory",
139	ENOEXEC:         "Exec format error",
140	ENOLCK:          "No record locks available",
141	ENOLINK:         "The link has been severed",
142	ENOMEM:          "Out of memory",
143	ENOMSG:          "No message of desired type",
144	ENOPROTOOPT:     "Protocol not available",
145	ENOSPC:          "No space left on device",
146	ENOSYS:          "Not implemented on " + runtime.GOOS,
147	ENOTCONN:        "Socket is not connected",
148	ENOTDIR:         "Not a directory",
149	ENOTEMPTY:       "Directory not empty",
150	ENOTRECOVERABLE: "State not recoverable",
151	ENOTSOCK:        "Socket operation on non-socket",
152	ENOTSUP:         "Not supported",
153	ENOTTY:          "Not a typewriter",
154	ENXIO:           "No such device or address",
155	EOVERFLOW:       "Value too large for defined data type",
156	EOWNERDEAD:      "Owner died",
157	EPERM:           "Operation not permitted",
158	EPIPE:           "Broken pipe",
159	EPROTO:          "Protocol error",
160	EPROTONOSUPPORT: "Unknown protocol",
161	EPROTOTYPE:      "Protocol wrong type for socket",
162	ERANGE:          "Math result not representable",
163	EROFS:           "Read-only file system",
164	ESPIPE:          "Illegal seek",
165	ESRCH:           "No such process",
166	ESTALE:          "Stale file handle",
167	ETIMEDOUT:       "Connection timed out",
168	ETXTBSY:         "Text file busy",
169	EXDEV:           "Cross-device link",
170	ENOTCAPABLE:     "Capabilities insufficient",
171}
172
173// Do the interface allocations only once for common
174// Errno values.
175var (
176	errEAGAIN error = EAGAIN
177	errEINVAL error = EINVAL
178	errENOENT error = ENOENT
179)
180
181// errnoErr returns common boxed Errno values, to prevent
182// allocations at runtime.
183//
184// We set both noinline and nosplit to reduce code size, this function has many
185// call sites in the syscall package, inlining it causes a significant increase
186// of the compiled code; the function call ultimately does not make a difference
187// in the performance of syscall functions since the time is dominated by calls
188// to the imports and path resolution.
189//
190//go:noinline
191//go:nosplit
192func errnoErr(e Errno) error {
193	switch e {
194	case 0:
195		return nil
196	case EAGAIN:
197		return errEAGAIN
198	case EINVAL:
199		return errEINVAL
200	case ENOENT:
201		return errENOENT
202	}
203	return e
204}
205