-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy patherror_unix.go
217 lines (209 loc) · 4.11 KB
/
error_unix.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package wasi
import (
"context"
"errors"
"fmt"
"io"
"io/fs"
"net"
"syscall"
)
func makeErrno(err error) Errno {
if err == nil {
return ESUCCESS
}
if err == syscall.EAGAIN {
return EAGAIN
}
return makeErrnoSlow(err)
}
func makeErrnoSlow(err error) Errno {
switch {
case errors.Is(err, context.Canceled):
return ECANCELED
case errors.Is(err, context.DeadlineExceeded):
return ETIMEDOUT
case errors.Is(err, io.ErrUnexpectedEOF),
errors.Is(err, fs.ErrClosed),
errors.Is(err, net.ErrClosed):
return EIO
}
var sysErrno syscall.Errno
if errors.As(err, &sysErrno) {
if sysErrno == 0 {
return ESUCCESS
}
return syscallErrnoToWASI(sysErrno)
}
var wasiErrno Errno
if errors.As(err, &wasiErrno) {
return wasiErrno
}
var timeout interface{ Timeout() bool }
if errors.As(err, &timeout) {
if timeout.Timeout() {
return ETIMEDOUT
}
}
panic(fmt.Errorf("unexpected error: %v", err))
}
func errnoToSyscall(errno Errno) syscall.Errno {
switch errno {
case ESUCCESS:
return 0
case E2BIG:
return syscall.E2BIG
case EACCES:
return syscall.EACCES
case EADDRINUSE:
return syscall.EADDRINUSE
case EADDRNOTAVAIL:
return syscall.EADDRNOTAVAIL
case EAFNOSUPPORT:
return syscall.EAFNOSUPPORT
case EAGAIN:
return syscall.EAGAIN
case EALREADY:
return syscall.EALREADY
case EBADF:
return syscall.EBADF
case EBADMSG:
return syscall.EBADMSG
case EBUSY:
return syscall.EBUSY
case ECANCELED:
return syscall.ECANCELED
case ECHILD:
return syscall.ECHILD
case ECONNABORTED:
return syscall.ECONNABORTED
case ECONNREFUSED:
return syscall.ECONNREFUSED
case ECONNRESET:
return syscall.ECONNRESET
case EDEADLK:
return syscall.EDEADLK
case EDESTADDRREQ:
return syscall.EDESTADDRREQ
case EDOM:
return syscall.EDOM
case EDQUOT:
return syscall.EDQUOT
case EEXIST:
return syscall.EEXIST
case EFAULT:
return syscall.EFAULT
case EFBIG:
return syscall.EFBIG
case EHOSTUNREACH:
return syscall.EHOSTUNREACH
case EIDRM:
return syscall.EIDRM
case EILSEQ:
return syscall.EILSEQ
case EINPROGRESS:
return syscall.EINPROGRESS
case EINTR:
return syscall.EINTR
case EINVAL:
return syscall.EINVAL
case EIO:
return syscall.EIO
case EISCONN:
return syscall.EISCONN
case EISDIR:
return syscall.EISDIR
case ELOOP:
return syscall.ELOOP
case EMFILE:
return syscall.EMFILE
case EMLINK:
return syscall.EMLINK
case EMSGSIZE:
return syscall.EMSGSIZE
case EMULTIHOP:
return syscall.EMULTIHOP
case ENAMETOOLONG:
return syscall.ENAMETOOLONG
case ENETDOWN:
return syscall.ENETDOWN
case ENETRESET:
return syscall.ENETRESET
case ENETUNREACH:
return syscall.ENETUNREACH
case ENFILE:
return syscall.ENFILE
case ENOBUFS:
return syscall.ENOBUFS
case ENODEV:
return syscall.ENODEV
case ENOENT:
return syscall.ENOENT
case ENOEXEC:
return syscall.ENOEXEC
case ENOLCK:
return syscall.ENOLCK
case ENOLINK:
return syscall.ENOLINK
case ENOMEM:
return syscall.ENOMEM
case ENOMSG:
return syscall.ENOMSG
case ENOPROTOOPT:
return syscall.ENOPROTOOPT
case ENOSPC:
return syscall.ENOSPC
case ENOSYS:
return syscall.ENOSYS
case ENOTCONN:
return syscall.ENOTCONN
case ENOTDIR:
return syscall.ENOTDIR
case ENOTEMPTY:
return syscall.ENOTEMPTY
case ENOTRECOVERABLE:
return syscall.ENOTRECOVERABLE
case ENOTSOCK:
return syscall.ENOTSOCK
case ENOTSUP:
return syscall.ENOTSUP
case ENOTTY:
return syscall.ENOTTY
case ENXIO:
return syscall.ENXIO
case EOVERFLOW:
return syscall.EOVERFLOW
case EOWNERDEAD:
return syscall.EOWNERDEAD
case EPERM:
return syscall.EPERM
case EPIPE:
return syscall.EPIPE
case EPROTO:
return syscall.EPROTO
case EPROTONOSUPPORT:
return syscall.EPROTONOSUPPORT
case EPROTOTYPE:
return syscall.EPROTOTYPE
case ERANGE:
return syscall.ERANGE
case EROFS:
return syscall.EROFS
case ESPIPE:
return syscall.ESPIPE
case ESRCH:
return syscall.ESRCH
case ESTALE:
return syscall.ESTALE
case ETIMEDOUT:
return syscall.ETIMEDOUT
case ETXTBSY:
return syscall.ETXTBSY
case EXDEV:
return syscall.EXDEV
case ENOTCAPABLE:
return syscall.EPERM
default:
panic("unsupport wasi errno: " + errno.Error())
}
}