@@ -82,31 +82,99 @@ pub fn is_interrupted(errno: i32) -> bool {
8282}
8383
8484pub fn decode_error_kind ( errno : i32 ) -> std_io:: ErrorKind {
85- use std_io:: ErrorKind :: * ;
86- if errno > u16:: MAX as i32 || errno < 0 {
87- return Uncategorized ;
85+ use std_io:: ErrorKind ;
86+
87+ let Ok ( errno) = u16:: try_from ( errno) else {
88+ return ErrorKind :: Uncategorized ;
89+ } ;
90+
91+ macro_rules! match_errno {
92+ ( $( $( $errno: ident) |+ => $errkind: ident) ,* , _ => $wildcard: ident $( , ) ?) => {
93+ match errno {
94+ $( e if $( e == :: wasi:: $errno. raw( ) ) ||+ => ErrorKind :: $errkind) ,* ,
95+ _ => ErrorKind :: $wildcard,
96+ }
97+ } ;
8898 }
8999
90- match errno {
91- e if e == wasi:: ERRNO_CONNREFUSED . raw ( ) . into ( ) => ConnectionRefused ,
92- e if e == wasi:: ERRNO_CONNRESET . raw ( ) . into ( ) => ConnectionReset ,
93- e if e == wasi:: ERRNO_PERM . raw ( ) . into ( ) || e == wasi:: ERRNO_ACCES . raw ( ) . into ( ) => {
94- PermissionDenied
95- }
96- e if e == wasi:: ERRNO_PIPE . raw ( ) . into ( ) => BrokenPipe ,
97- e if e == wasi:: ERRNO_NOTCONN . raw ( ) . into ( ) => NotConnected ,
98- e if e == wasi:: ERRNO_CONNABORTED . raw ( ) . into ( ) => ConnectionAborted ,
99- e if e == wasi:: ERRNO_ADDRNOTAVAIL . raw ( ) . into ( ) => AddrNotAvailable ,
100- e if e == wasi:: ERRNO_ADDRINUSE . raw ( ) . into ( ) => AddrInUse ,
101- e if e == wasi:: ERRNO_NOENT . raw ( ) . into ( ) => NotFound ,
102- e if e == wasi:: ERRNO_INTR . raw ( ) . into ( ) => Interrupted ,
103- e if e == wasi:: ERRNO_INVAL . raw ( ) . into ( ) => InvalidInput ,
104- e if e == wasi:: ERRNO_TIMEDOUT . raw ( ) . into ( ) => TimedOut ,
105- e if e == wasi:: ERRNO_EXIST . raw ( ) . into ( ) => AlreadyExists ,
106- e if e == wasi:: ERRNO_AGAIN . raw ( ) . into ( ) => WouldBlock ,
107- e if e == wasi:: ERRNO_NOSYS . raw ( ) . into ( ) => Unsupported ,
108- e if e == wasi:: ERRNO_NOMEM . raw ( ) . into ( ) => OutOfMemory ,
109- _ => Uncategorized ,
100+ match_errno ! {
101+ ERRNO_2BIG => ArgumentListTooLong ,
102+ ERRNO_ACCES => PermissionDenied ,
103+ ERRNO_ADDRINUSE => AddrInUse ,
104+ ERRNO_ADDRNOTAVAIL => AddrNotAvailable ,
105+ ERRNO_AFNOSUPPORT => Unsupported ,
106+ ERRNO_AGAIN => WouldBlock ,
107+ // ALREADY => "connection already in progress",
108+ // BADF => "bad file descriptor",
109+ // BADMSG => "bad message",
110+ ERRNO_BUSY => ResourceBusy ,
111+ // CANCELED => "operation canceled",
112+ // CHILD => "no child processes",
113+ ERRNO_CONNABORTED => ConnectionAborted ,
114+ ERRNO_CONNREFUSED => ConnectionRefused ,
115+ ERRNO_CONNRESET => ConnectionReset ,
116+ ERRNO_DEADLK => Deadlock ,
117+ // DESTADDRREQ => "destination address required",
118+ ERRNO_DOM => InvalidInput ,
119+ // DQUOT => /* reserved */,
120+ ERRNO_EXIST => AlreadyExists ,
121+ // FAULT => "bad address",
122+ ERRNO_FBIG => FileTooLarge ,
123+ ERRNO_HOSTUNREACH => HostUnreachable ,
124+ // IDRM => "identifier removed",
125+ // ILSEQ => "illegal byte sequence",
126+ // INPROGRESS => "operation in progress",
127+ ERRNO_INTR => Interrupted ,
128+ ERRNO_INVAL => InvalidInput ,
129+ ERRNO_IO => Uncategorized ,
130+ // ISCONN => "socket is connected",
131+ ERRNO_ISDIR => IsADirectory ,
132+ ERRNO_LOOP => FilesystemLoop ,
133+ // MFILE => "file descriptor value too large",
134+ ERRNO_MLINK => TooManyLinks ,
135+ // MSGSIZE => "message too large",
136+ // MULTIHOP => /* reserved */,
137+ ERRNO_NAMETOOLONG => InvalidFilename ,
138+ ERRNO_NETDOWN => NetworkDown ,
139+ // NETRESET => "connection aborted by network",
140+ ERRNO_NETUNREACH => NetworkUnreachable ,
141+ // NFILE => "too many files open in system",
142+ // NOBUFS => "no buffer space available",
143+ ERRNO_NODEV => NotFound ,
144+ ERRNO_NOENT => NotFound ,
145+ // NOEXEC => "executable file format error",
146+ // NOLCK => "no locks available",
147+ // NOLINK => /* reserved */,
148+ ERRNO_NOMEM => OutOfMemory ,
149+ // NOMSG => "no message of the desired type",
150+ // NOPROTOOPT => "protocol not available",
151+ ERRNO_NOSPC => StorageFull ,
152+ ERRNO_NOSYS => Unsupported ,
153+ ERRNO_NOTCONN => NotConnected ,
154+ ERRNO_NOTDIR => NotADirectory ,
155+ ERRNO_NOTEMPTY => DirectoryNotEmpty ,
156+ // NOTRECOVERABLE => "state not recoverable",
157+ // NOTSOCK => "not a socket",
158+ ERRNO_NOTSUP => Unsupported ,
159+ // NOTTY => "inappropriate I/O control operation",
160+ ERRNO_NXIO => NotFound ,
161+ // OVERFLOW => "value too large to be stored in data type",
162+ // OWNERDEAD => "previous owner died",
163+ ERRNO_PERM => PermissionDenied ,
164+ ERRNO_PIPE => BrokenPipe ,
165+ // PROTO => "protocol error",
166+ ERRNO_PROTONOSUPPORT => Unsupported ,
167+ // PROTOTYPE => "protocol wrong type for socket",
168+ // RANGE => "result too large",
169+ ERRNO_ROFS => ReadOnlyFilesystem ,
170+ ERRNO_SPIPE => NotSeekable ,
171+ ERRNO_SRCH => NotFound ,
172+ // STALE => /* reserved */,
173+ ERRNO_TIMEDOUT => TimedOut ,
174+ ERRNO_TXTBSY => ResourceBusy ,
175+ ERRNO_XDEV => CrossesDevices ,
176+ ERRNO_NOTCAPABLE => PermissionDenied ,
177+ _ => Uncategorized ,
110178 }
111179}
112180
@@ -124,6 +192,7 @@ pub fn hashmap_random_keys() -> (u64, u64) {
124192 return ret;
125193}
126194
195+ #[ inline]
127196fn err2io ( err : wasi:: Errno ) -> std_io:: Error {
128197 std_io:: Error :: from_raw_os_error ( err. raw ( ) . into ( ) )
129198}
0 commit comments