Lely core libraries  2.2.5
errnum.c
Go to the documentation of this file.
1 
24 #include "util.h"
25 #define LELY_UTIL_ERRNUM_INLINE extern inline
26 #include <lely/util/errnum.h>
27 #include <lely/util/util.h>
28 
29 #include <string.h>
30 
31 #if _WIN32
32 
33 #include <windows.h>
34 
35 #ifndef ERRSTR_SIZE
36 #define ERRSTR_SIZE 256
37 #endif
38 static _Thread_local char errstr[ERRSTR_SIZE];
39 
40 #endif // _WIN32
41 
42 int
44 {
45 #if _WIN32
46  return errnum2c(errno2num(errnum));
47 #else
48  return errnum;
49 #endif
50 }
51 
54 {
55  switch (errnum) {
56 #ifdef E2BIG
57  case E2BIG: return ERRNUM_2BIG;
58 #endif
59 #ifdef EACCES
60  case EACCES: return ERRNUM_ACCES;
61 #endif
62 #ifdef EADDRINUSE
63  case EADDRINUSE: return ERRNUM_ADDRINUSE;
64 #endif
65 #ifdef EADDRNOTAVAIL
66  case EADDRNOTAVAIL: return ERRNUM_ADDRNOTAVAIL;
67 #endif
68 #ifdef EAFNOSUPPORT
69  case EAFNOSUPPORT: return ERRNUM_AFNOSUPPORT;
70 #endif
71 #ifdef EAGAIN
72  case EAGAIN: return ERRNUM_AGAIN;
73 #endif
74 #ifdef EALREADY
75  case EALREADY: return ERRNUM_ALREADY;
76 #endif
77 #ifdef EBADF
78  case EBADF: return ERRNUM_BADF;
79 #endif
80 #ifdef EBADMSG
81  case EBADMSG: return ERRNUM_BADMSG;
82 #endif
83 #ifdef EBUSY
84  case EBUSY: return ERRNUM_BUSY;
85 #endif
86 #ifdef ECANCELED
87  case ECANCELED: return ERRNUM_CANCELED;
88 #endif
89 #ifdef ECHILD
90  case ECHILD: return ERRNUM_CHILD;
91 #endif
92 #ifdef ECONNABORTED
93  case ECONNABORTED: return ERRNUM_CONNABORTED;
94 #endif
95 #ifdef ECONNREFUSED
96  case ECONNREFUSED: return ERRNUM_CONNREFUSED;
97 #endif
98 #ifdef ECONNRESET
99  case ECONNRESET: return ERRNUM_CONNRESET;
100 #endif
101 #ifdef EDEADLK
102  case EDEADLK: return ERRNUM_DEADLK;
103 #endif
104 #ifdef EDESTADDRREQ
105  case EDESTADDRREQ: return ERRNUM_DESTADDRREQ;
106 #endif
107  // clang-format off
108  case EDOM: return ERRNUM_DOM;
109  // clang-format on
110 // #ifdef EDQUOT
111 // case EDQUOT: return ERRNUM_DQUOT;
112 // #endif
113 #ifdef EEXIST
114  case EEXIST: return ERRNUM_EXIST;
115 #endif
116 #ifdef EFAULT
117  case EFAULT: return ERRNUM_FAULT;
118 #endif
119 #ifdef EFBIG
120  case EFBIG: return ERRNUM_FBIG;
121 #endif
122 #ifdef EHOSTUNREACH
123  case EHOSTUNREACH: return ERRNUM_HOSTUNREACH;
124 #endif
125 #ifdef EIDRM
126  case EIDRM: return ERRNUM_IDRM;
127 #endif
128  case EILSEQ: return ERRNUM_ILSEQ;
129 #ifdef EINPROGRESS
130  case EINPROGRESS: return ERRNUM_INPROGRESS;
131 #endif
132 #ifdef EINTR
133  case EINTR: return ERRNUM_INTR;
134 #endif
135 #ifdef EINVAL
136  case EINVAL: return ERRNUM_INVAL;
137 #endif
138 #ifdef EIO
139  case EIO: return ERRNUM_IO;
140 #endif
141 #ifdef EISCONN
142  case EISCONN: return ERRNUM_ISCONN;
143 #endif
144 #ifdef EISDIR
145  case EISDIR: return ERRNUM_ISDIR;
146 #endif
147 #ifdef ELOOP
148  case ELOOP: return ERRNUM_LOOP;
149 #endif
150 #ifdef EMFILE
151  case EMFILE: return ERRNUM_MFILE;
152 #endif
153 #ifdef EMLINK
154  case EMLINK: return ERRNUM_MLINK;
155 #endif
156 #ifdef EMSGSIZE
157  case EMSGSIZE: return ERRNUM_MSGSIZE;
158 #endif
159 // #ifdef EMULTIHOP
160 // case EMULTIHOP: return ERRNUM_MULTIHOP;
161 // #endif
162 #ifdef ENAMETOOLONG
163  case ENAMETOOLONG: return ERRNUM_NAMETOOLONG;
164 #endif
165 #ifdef ENETDOWN
166  case ENETDOWN: return ERRNUM_NETDOWN;
167 #endif
168 #ifdef ENETRESET
169  case ENETRESET: return ERRNUM_NETRESET;
170 #endif
171 #ifdef ENETUNREACH
172  case ENETUNREACH: return ERRNUM_NETUNREACH;
173 #endif
174 #ifdef ENFILE
175  case ENFILE: return ERRNUM_NFILE;
176 #endif
177 #ifdef ENOBUFS
178  case ENOBUFS: return ERRNUM_NOBUFS;
179 #endif
180 #ifdef ENODATA
181  case ENODATA: return ERRNUM_NODATA;
182 #endif
183 #ifdef ENODEV
184  case ENODEV: return ERRNUM_NODEV;
185 #endif
186 #ifdef ENOENT
187  case ENOENT: return ERRNUM_NOENT;
188 #endif
189 #ifdef ENOEXEC
190  case ENOEXEC: return ERRNUM_NOEXEC;
191 #endif
192 #ifdef ENOLCK
193  case ENOLCK: return ERRNUM_NOLCK;
194 #endif
195 // #ifdef ENOLINK
196 // case ENOLINK: return ERRNUM_NOLINK;
197 // #endif
198 #ifdef ENOMEM
199  case ENOMEM: return ERRNUM_NOMEM;
200 #endif
201 #ifdef ENOMSG
202  case ENOMSG: return ERRNUM_NOMSG;
203 #endif
204 #ifdef ENOPROTOOPT
205  case ENOPROTOOPT: return ERRNUM_NOPROTOOPT;
206 #endif
207 #ifdef ENOSPC
208  case ENOSPC: return ERRNUM_NOSPC;
209 #endif
210 #ifdef ENOSR
211  case ENOSR: return ERRNUM_NOSR;
212 #endif
213 #ifdef ENOSTR
214  case ENOSTR: return ERRNUM_NOSTR;
215 #endif
216 #ifdef ENOSYS
217  case ENOSYS: return ERRNUM_NOSYS;
218 #endif
219 #ifdef ENOTCONN
220  case ENOTCONN: return ERRNUM_NOTCONN;
221 #endif
222 #ifdef ENOTDIR
223  case ENOTDIR: return ERRNUM_NOTDIR;
224 #endif
225 #ifdef ENOTEMPTY
226  case ENOTEMPTY: return ERRNUM_NOTEMPTY;
227 #endif
228 #ifdef ENOTRECOVERABLE
229  case ENOTRECOVERABLE: return ERRNUM_NOTRECOVERABLE;
230 #endif
231 #ifdef ENOTSOCK
232  case ENOTSOCK: return ERRNUM_NOTSOCK;
233 #endif
234 #ifdef ENOTSUP
235  case ENOTSUP: return ERRNUM_NOTSUP;
236 #endif
237 #ifdef ENOTTY
238  case ENOTTY: return ERRNUM_NOTTY;
239 #endif
240 #ifdef ENXIO
241  case ENXIO: return ERRNUM_NXIO;
242 #endif
243 #if defined(EOPNOTSUPP) && EOPNOTSUPP != ENOTSUP
244  case EOPNOTSUPP: return ERRNUM_OPNOTSUPP;
245 #endif
246 #ifdef EOVERFLOW
247  case EOVERFLOW: return ERRNUM_OVERFLOW;
248 #endif
249 #ifdef EOWNERDEAD
250  case EOWNERDEAD: return ERRNUM_OWNERDEAD;
251 #endif
252 #ifdef EPERM
253  case EPERM: return ERRNUM_PERM;
254 #endif
255 #ifdef EPIPE
256  case EPIPE: return ERRNUM_PIPE;
257 #endif
258 #ifdef EPROTO
259  case EPROTO: return ERRNUM_PROTO;
260 #endif
261 #ifdef EPROTONOSUPPORT
262  case EPROTONOSUPPORT: return ERRNUM_PROTONOSUPPORT;
263 #endif
264 #ifdef EPROTOTYPE
265  case EPROTOTYPE: return ERRNUM_PROTOTYPE;
266 #endif
267  case ERANGE: return ERRNUM_RANGE;
268 #ifdef EROFS
269  case EROFS: return ERRNUM_ROFS;
270 #endif
271 #ifdef ESPIPE
272  case ESPIPE: return ERRNUM_SPIPE;
273 #endif
274 #ifdef ESRCH
275  case ESRCH: return ERRNUM_SRCH;
276 #endif
277 // #ifdef ESTALE
278 // case ESTALE: return ERRNUM_STALE;
279 // #endif
280 #ifdef ETIME
281  case ETIME: return ERRNUM_TIME;
282 #endif
283 #ifdef ETIMEDOUT
284  case ETIMEDOUT: return ERRNUM_TIMEDOUT;
285 #endif
286 #ifdef ETXTBSY
287  case ETXTBSY: return ERRNUM_TXTBSY;
288 #endif
289 #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
290  case EWOULDBLOCK: return ERRNUM_WOULDBLOCK;
291 #endif
292 #ifdef EXDEV
293  case EXDEV: return ERRNUM_XDEV;
294 #endif
295  default: return 0;
296  }
297 }
298 
299 int
300 errc2no(int errc)
301 {
302 #if _WIN32
303  return errnum2no(errc2num(errc));
304 #else
305  return errc > 0 ? errc : 0;
306 #endif
307 }
308 
309 errnum_t
310 errc2num(int errc)
311 {
312 #if _WIN32
313  switch (errc) {
314  case ERROR_ACCESS_DENIED: return ERRNUM_ACCES;
315  case ERROR_ADDRESS_ALREADY_ASSOCIATED: return ERRNUM_ADDRINUSE;
316  case ERROR_ACTIVE_CONNECTIONS: return ERRNUM_AGAIN;
317  case ERROR_ALREADY_EXISTS: return ERRNUM_EXIST;
318  case ERROR_ARENA_TRASHED: return ERRNUM_NOMEM;
319  case ERROR_ARITHMETIC_OVERFLOW: return ERRNUM_RANGE;
320  case ERROR_BAD_DEVICE: return ERRNUM_NODEV;
321  case ERROR_BAD_ENVIRONMENT: return ERRNUM_2BIG;
322  case ERROR_BAD_EXE_FORMAT: return ERRNUM_NOEXEC;
323  case ERROR_BAD_FORMAT: return ERRNUM_NOEXEC;
324  case ERROR_BAD_NET_NAME: return ERRNUM_NOENT;
325  case ERROR_BAD_NETPATH: return ERRNUM_NOENT;
326  case ERROR_BAD_NET_RESP: return ERRNUM_NOSYS;
327  case ERROR_BAD_PATHNAME: return ERRNUM_NOENT;
328  case ERROR_BAD_PIPE: return ERRNUM_INVAL;
329  // case ERROR_BAD_PIPE: return ERRNUM_PIPE; // libuv
330  case ERROR_BAD_UNIT: return ERRNUM_NODEV;
331  case ERROR_BAD_USERNAME: return ERRNUM_INVAL;
332  case ERROR_BEGINNING_OF_MEDIA: return ERRNUM_IO;
333  case ERROR_BROKEN_PIPE: return ERRNUM_PIPE;
334  // case ERROR_BUFFER_OVERFLOW: return ERRNUM_FAULT; / libuv
335  case ERROR_BUFFER_OVERFLOW: return ERRNUM_NAMETOOLONG;
336  case ERROR_BUS_RESET: return ERRNUM_IO;
337  case ERROR_BUSY: return ERRNUM_BUSY;
338  case ERROR_BUSY_DRIVE: return ERRNUM_BUSY;
339  case ERROR_CALL_NOT_IMPLEMENTED: return ERRNUM_NOSYS;
340  case ERROR_CANCELLED: return ERRNUM_INTR;
341  case ERROR_CANNOT_MAKE: return ERRNUM_ACCES;
342  // case ERROR_CANNOT_MAKE: return ERRNUM_NOSPC; // libuv
343  // case ERROR_CANNOT_MAKE: return ERRNUM_PERM; // Cygwin
344  case ERROR_CANTOPEN: return ERRNUM_IO;
345  case ERROR_CANTREAD: return ERRNUM_IO;
346  case ERROR_CANTWRITE: return ERRNUM_IO;
347  case ERROR_CANT_RESOLVE_FILENAME: return ERRNUM_LOOP;
348  // case ERROR_CHILD_NOT_COMPLETE: return ERRNUM_BUSY; // Cygwin
349  case ERROR_CHILD_NOT_COMPLETE: return ERRNUM_CHILD;
350  case ERROR_COMMITMENT_LIMIT: return ERRNUM_AGAIN;
351  case ERROR_CONNECTION_ABORTED: return ERRNUM_CONNABORTED;
352  case ERROR_CONNECTION_REFUSED: return ERRNUM_CONNREFUSED;
353  case ERROR_CRC: return ERRNUM_IO;
354  case ERROR_CURRENT_DIRECTORY: return ERRNUM_ACCES;
355  case ERROR_DEVICE_DOOR_OPEN: return ERRNUM_IO;
356  // case ERROR_DEVICE_IN_USE: return ERRNUM_AGAIN; // Cygwin
357  case ERROR_DEVICE_IN_USE: return ERRNUM_BUSY;
358  case ERROR_DEVICE_REQUIRES_CLEANING: return ERRNUM_IO;
359  case ERROR_DEV_NOT_EXIST: return ERRNUM_NODEV;
360  // case ERROR_DEV_NOT_EXIST: return ERRNUM_NOENT; // Cywgin
361  // case ERROR_DIRECTORY: return ERRNUM_INVAL; // Cygwin, <system_error>
362  // case ERROR_DIRECTORY: return ERRNUM_NOENT; // libuv
363  case ERROR_DIRECTORY: return ERRNUM_NOTDIR;
364  case ERROR_DIR_NOT_EMPTY: return ERRNUM_NOTEMPTY;
365  case ERROR_DISK_CORRUPT: return ERRNUM_IO;
366  case ERROR_DISK_FULL: return ERRNUM_NOSPC;
367  case ERROR_DRIVE_LOCKED: return ERRNUM_ACCES;
368  case ERROR_DS_GENERIC_ERROR: return ERRNUM_IO;
369  case ERROR_EAS_DIDNT_FIT: return ERRNUM_NOSPC;
370  case ERROR_EAS_NOT_SUPPORTED: return ERRNUM_NOTSUP;
371  case ERROR_EA_LIST_INCONSISTENT: return ERRNUM_INVAL;
372  case ERROR_EA_TABLE_FULL: return ERRNUM_NOSPC;
373 #ifdef ERROR_ELEVATION_REQUIRED
374  case ERROR_ELEVATION_REQUIRED: return ERRNUM_ACCES;
375 #endif
376  case ERROR_END_OF_MEDIA: return ERRNUM_NOSPC;
377  case ERROR_EOM_OVERFLOW: return ERRNUM_IO;
378  case ERROR_EXE_MACHINE_TYPE_MISMATCH: return ERRNUM_NOEXEC;
379  case ERROR_EXE_MARKED_INVALID: return ERRNUM_NOEXEC;
380  case ERROR_FAIL_I24: return ERRNUM_ACCES;
381  case ERROR_FILE_CORRUPT: return ERRNUM_EXIST;
382  case ERROR_FILE_EXISTS: return ERRNUM_EXIST;
383  case ERROR_FILE_INVALID: return ERRNUM_NXIO;
384  case ERROR_FILEMARK_DETECTED: return ERRNUM_IO;
385  case ERROR_FILENAME_EXCED_RANGE: return ERRNUM_NAMETOOLONG;
386  // case ERROR_FILENAME_EXCED_RANGE: return ERRNUM_NOENT; // Wine
387  case ERROR_FILE_NOT_FOUND: return ERRNUM_NOENT;
388 #ifdef ERROR_FLOAT_MULTIPLE_FAULTS
389  case ERROR_FLOAT_MULTIPLE_FAULTS: return ERRNUM_DOM;
390 #endif
391  case ERROR_GEN_FAILURE: return ERRNUM_IO;
392  case ERROR_HANDLE_DISK_FULL: return ERRNUM_NOSPC;
393  case ERROR_HANDLE_EOF: return ERRNUM_NODATA;
394  case ERROR_HOST_UNREACHABLE: return ERRNUM_HOSTUNREACH;
395 #ifdef ERROR_ILLEGAL_CHARACTER
396  case ERROR_ILLEGAL_CHARACTER: return ERRNUM_ILSEQ;
397 #endif
398  case ERROR_INSUFFICIENT_BUFFER: return ERRNUM_INVAL;
399  case ERROR_INVALID_ACCESS: return ERRNUM_ACCES;
400  case ERROR_INVALID_ADDRESS: return ERRNUM_INVAL;
401  case ERROR_INVALID_AT_INTERRUPT_TIME: return ERRNUM_INTR;
402  case ERROR_INVALID_BLOCK: return ERRNUM_NOMEM;
403  case ERROR_INVALID_BLOCK_LENGTH: return ERRNUM_IO;
404  case ERROR_INVALID_CATEGORY: return ERRNUM_NOTTY;
405  case ERROR_INVALID_DATA: return ERRNUM_INVAL;
406  case ERROR_INVALID_DRIVE: return ERRNUM_NODEV;
407  // case ERROR_INVALID_DRIVE: return ERRNUM_NOENT; // libuv, Wine
408  case ERROR_INVALID_EA_NAME: return ERRNUM_INVAL;
409  case ERROR_INVALID_EXE_SIGNATURE: return ERRNUM_NOEXEC;
410  case ERROR_INVALID_FLAGS: return ERRNUM_BADF;
411  // case ERROR_INVALID_FUNCTION: return ERRNUM_ISDIR; // libuv
412  case ERROR_INVALID_FUNCTION: return ERRNUM_NOSYS;
413  case ERROR_INVALID_HANDLE: return ERRNUM_BADF;
414  // case ERROR_INVALID_HANDLE: return ERRNUM_INVAL; // Boost,
415  // <system_error>
416  case ERROR_INVALID_NAME: return ERRNUM_INVAL;
417  // case ERROR_INVALID_NAME: return ERRNUM_NOENT; // Cygwin, libuv
418  case ERROR_INVALID_PARAMETER: return ERRNUM_INVAL;
419  case ERROR_INVALID_REPARSE_DATA: return ERRNUM_NOENT;
420  case ERROR_INVALID_SIGNAL_NUMBER: return ERRNUM_INVAL;
421  case ERROR_IOPL_NOT_ENABLED: return ERRNUM_NOEXEC;
422  case ERROR_IO_DEVICE: return ERRNUM_IO;
423  case ERROR_IO_INCOMPLETE: return ERRNUM_AGAIN;
424  case ERROR_IO_PENDING: return ERRNUM_AGAIN;
425  case ERROR_LOCK_FAILED: return ERRNUM_ACCES;
426  // case ERROR_LOCK_VIOLATION: return ERRNUM_ACCES; // Wine
427  // case ERROR_LOCK_VIOLATION: return ERRNUM_BUSY; // Cygwin, libuv
428  case ERROR_LOCK_VIOLATION: return ERRNUM_NOLCK;
429  case ERROR_LOCKED: return ERRNUM_NOLCK;
430  case ERROR_MAX_THRDS_REACHED: return ERRNUM_AGAIN;
431  // case ERROR_META_EXPANSION_TOO_LONG: return ERRNUM_2BIG; // libuv
432  case ERROR_META_EXPANSION_TOO_LONG: return ERRNUM_INVAL;
433  case ERROR_MOD_NOT_FOUND: return ERRNUM_NOENT;
434  case ERROR_MORE_DATA: return ERRNUM_MSGSIZE;
435  case ERROR_NEGATIVE_SEEK: return ERRNUM_INVAL;
436  case ERROR_NESTING_NOT_ALLOWED: return ERRNUM_AGAIN;
437  // case ERROR_NETNAME_DELETED: return ERRNUM_CONNRESET; // libuv
438  case ERROR_NETNAME_DELETED: return ERRNUM_NOENT;
439  case ERROR_NETWORK_ACCESS_DENIED: return ERRNUM_ACCES;
440  case ERROR_NETWORK_UNREACHABLE: return ERRNUM_NETUNREACH;
441  // case ERROR_NOACCESS: return ERRNUM_ACCES; // Boost, libuv,
442  // <system_error>
443  case ERROR_NOACCESS: return ERRNUM_FAULT;
444  case ERROR_NONE_MAPPED: return ERRNUM_INVAL;
445  case ERROR_NONPAGED_SYSTEM_RESOURCES: return ERRNUM_AGAIN;
446  case ERROR_NOT_CONNECTED: return ERRNUM_NOTCONN;
447  case ERROR_NOT_ENOUGH_MEMORY: return ERRNUM_NOMEM;
448  case ERROR_NOT_ENOUGH_QUOTA: return ERRNUM_IO;
449  // case ERROR_NOT_ENOUGH_QUOTA: return ERRNUM_NOMEM; // Wine
450  case ERROR_NOT_LOCKED: return ERRNUM_ACCES;
451  case ERROR_NOT_OWNER: return ERRNUM_PERM;
452  case ERROR_NOT_READY: return ERRNUM_AGAIN;
453  case ERROR_NOT_SAME_DEVICE: return ERRNUM_XDEV;
454  case ERROR_NOT_SUPPORTED: return ERRNUM_NOSYS;
455  // case ERROR_NOT_SUPPORTED: return ERRNUM_NOTSUP; // libuv
456  case ERROR_NO_DATA_DETECTED: return ERRNUM_IO;
457  case ERROR_NO_DATA: return ERRNUM_PIPE;
458  case ERROR_NO_MORE_FILES: return ERRNUM_NOENT;
459  case ERROR_NO_MORE_SEARCH_HANDLES: return ERRNUM_NFILE;
460  case ERROR_NO_PROC_SLOTS: return ERRNUM_AGAIN;
461  case ERROR_NO_SIGNAL_SENT: return ERRNUM_IO;
462  case ERROR_NO_SYSTEM_RESOURCES: return ERRNUM_FBIG;
463  case ERROR_NO_TOKEN: return ERRNUM_INVAL;
464  case ERROR_NO_UNICODE_TRANSLATION: return ERRNUM_ILSEQ;
465  case ERROR_OPEN_FAILED: return ERRNUM_IO;
466  case ERROR_OPEN_FILES: return ERRNUM_AGAIN;
467  // case ERROR_OPEN_FILES: return ERRNUM_BUSY; // Cygwin, <system_error>
468  case ERROR_OPERATION_ABORTED: return ERRNUM_CANCELED;
469  case ERROR_OUTOFMEMORY: return ERRNUM_NOMEM;
470  case ERROR_PAGED_SYSTEM_RESOURCES: return ERRNUM_AGAIN;
471  case ERROR_PAGEFILE_QUOTA: return ERRNUM_AGAIN;
472  case ERROR_PATH_NOT_FOUND: return ERRNUM_NOENT;
473  case ERROR_PIPE_BUSY: return ERRNUM_BUSY;
474  case ERROR_PIPE_CONNECTED: return ERRNUM_BUSY;
475  case ERROR_PIPE_NOT_CONNECTED: return ERRNUM_PIPE;
476  case ERROR_POSSIBLE_DEADLOCK: return ERRNUM_DEADLK;
477  case ERROR_PRIVILEGE_NOT_HELD: return ERRNUM_PERM;
478  case ERROR_PROCESS_ABORTED: return ERRNUM_FAULT;
479  case ERROR_PROC_NOT_FOUND: return ERRNUM_SRCH;
480  case ERROR_READ_FAULT: return ERRNUM_IO;
481  case ERROR_RETRY: return ERRNUM_AGAIN;
482  case ERROR_SECTOR_NOT_FOUND: return ERRNUM_INVAL;
483  // case ERROR_SEEK: return ERRNUM_INVAL; // Cygwin
484  case ERROR_SEEK: return ERRNUM_IO;
485  case ERROR_SEEK_ON_DEVICE: return ERRNUM_ACCES;
486  case ERROR_SEM_TIMEOUT: return ERRNUM_TIMEDOUT;
487  case ERROR_SERVICE_REQUEST_TIMEOUT: return ERRNUM_BUSY;
488  case ERROR_SETMARK_DETECTED: return ERRNUM_IO;
489  case ERROR_SHARING_BUFFER_EXCEEDED: return ERRNUM_NOLCK;
490  case ERROR_SHARING_VIOLATION: return ERRNUM_ACCES;
491  // case ERROR_SHARING_VIOLATION: return ERRNUM_BUSY; // Cygwin, libuv
492  case ERROR_SIGNAL_PENDING: return ERRNUM_BUSY;
493  case ERROR_SIGNAL_REFUSED: return ERRNUM_IO;
494 #ifdef ERROR_SYMLINK_NOT_SUPPORTED
495  case ERROR_SYMLINK_NOT_SUPPORTED: return ERRNUM_INVAL;
496 #endif
497  case ERROR_THREAD_1_INACTIVE: return ERRNUM_INVAL;
498  // case ERROR_TIMEOUT: return ERRNUM_BUSY; // Cygwin
499  case ERROR_TIMEOUT: return ERRNUM_TIMEDOUT;
500  case ERROR_TOO_MANY_LINKS: return ERRNUM_MLINK;
501  case ERROR_TOO_MANY_OPEN_FILES: return ERRNUM_MFILE;
502  case ERROR_UNEXP_NET_ERR: return ERRNUM_IO;
503  case ERROR_WAIT_NO_CHILDREN: return ERRNUM_CHILD;
504  case ERROR_WORKING_SET_QUOTA: return ERRNUM_AGAIN;
505  case ERROR_WRITE_FAULT: return ERRNUM_IO;
506  // case ERROR_WRITE_PROTECT: return ERRNUM_ACCES; // Boost,
507  // <system_error>
508  case ERROR_WRITE_PROTECT: return ERRNUM_ROFS;
509  case WSAEACCES: return ERRNUM_ACCES;
510  case WSAEADDRINUSE: return ERRNUM_ADDRINUSE;
511  case WSAEADDRNOTAVAIL: return ERRNUM_ADDRNOTAVAIL;
512  case WSAEAFNOSUPPORT: return ERRNUM_AFNOSUPPORT;
513  case WSAEALREADY: return ERRNUM_ALREADY;
514  case WSAEBADF: return ERRNUM_BADF;
515  case WSAECONNABORTED: return ERRNUM_CONNABORTED;
516  case WSAECONNREFUSED: return ERRNUM_CONNREFUSED;
517  case WSAECONNRESET: return ERRNUM_CONNRESET;
518  case WSAEDESTADDRREQ: return ERRNUM_DESTADDRREQ;
519  case WSAEFAULT: return ERRNUM_FAULT;
520  case WSAEHOSTUNREACH: return ERRNUM_HOSTUNREACH;
521  case WSAEINPROGRESS: return ERRNUM_INPROGRESS;
522  // case WSAEINTR: return ERRNUM_CANCELED; // libuv
523  case WSAEINTR: return ERRNUM_INTR;
524  case WSAEINVAL: return ERRNUM_INVAL;
525  case WSAEISCONN: return ERRNUM_ISCONN;
526  case WSAEMFILE: return ERRNUM_MFILE;
527  case WSAEMSGSIZE: return ERRNUM_MSGSIZE;
528  case WSAENAMETOOLONG: return ERRNUM_NAMETOOLONG;
529  case WSAENETDOWN: return ERRNUM_NETDOWN;
530  case WSAENETRESET: return ERRNUM_NETRESET;
531  case WSAENETUNREACH: return ERRNUM_NETUNREACH;
532  case WSAENOBUFS: return ERRNUM_NOBUFS;
533  case WSAENOPROTOOPT: return ERRNUM_NOPROTOOPT;
534  case WSAENOTCONN: return ERRNUM_NOTCONN;
535  case WSAENOTSOCK: return ERRNUM_NOTSOCK;
536  case WSAEOPNOTSUPP: return ERRNUM_OPNOTSUPP;
537  case WSAEPFNOSUPPORT: return ERRNUM_INVAL;
538  case WSAEPROTONOSUPPORT: return ERRNUM_PROTONOSUPPORT;
539  case WSAEPROTOTYPE: return ERRNUM_PROTOTYPE;
540  case WSAESHUTDOWN: return ERRNUM_PIPE;
541  case WSAESOCKTNOSUPPORT: return ERRNUM_AI_SOCKTYPE;
542  // case WSAESOCKTNOSUPPORT: return ERRNUM_INVAL; // libuv
543  case WSAETIMEDOUT: return ERRNUM_TIMEDOUT;
544  // case WSAEWOULDBLOCK: return ERRNUM_AGAIN; // libuv
545  case WSAEWOULDBLOCK: return ERRNUM_WOULDBLOCK;
546  case WSAHOST_NOT_FOUND: return ERRNUM_AI_NONAME;
547  // case WSAHOST_NOT_FOUND: return ERRNUM_NOENT; // libuv
548  case WSANO_DATA: return ERRNUM_NOENT;
549  case WSANO_RECOVERY: return ERRNUM_AI_FAIL;
550  case WSATRY_AGAIN: return ERRNUM_AI_AGAIN;
551  case WSATYPE_NOT_FOUND: return ERRNUM_AI_SERVICE;
552  default: return 0;
553  }
554 #else
555 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
556  switch (errc) {
557  case -ABS(EAI_AGAIN): return ERRNUM_AI_AGAIN;
558  case -ABS(EAI_BADFLAGS): return ERRNUM_AI_BADFLAGS;
559  case -ABS(EAI_FAIL): return ERRNUM_AI_FAIL;
560  case -ABS(EAI_FAMILY): return ERRNUM_AI_FAMILY;
561  case -ABS(EAI_MEMORY): return ERRNUM_AI_MEMORY;
562  case -ABS(EAI_NONAME): return ERRNUM_AI_NONAME;
563  case -ABS(EAI_OVERFLOW): return ERRNUM_AI_OVERFLOW;
564  case -ABS(EAI_SERVICE): return ERRNUM_AI_SERVICE;
565  case -ABS(EAI_SOCKTYPE): return ERRNUM_AI_SOCKTYPE;
566  default: break;
567  }
568 #endif
569  return errno2num(errc);
570 #endif // _WIN32
571 }
572 
573 int
575 {
576  switch (errnum) {
577 #ifdef E2BIG
578  case ERRNUM_2BIG: return E2BIG;
579 #endif
580 #ifdef EACCES
581  case ERRNUM_ACCES: return EACCES;
582 #endif
583 #ifdef EADDRINUSE
584  case ERRNUM_ADDRINUSE: return EADDRINUSE;
585 #endif
586 #ifdef EADDRNOTAVAIL
587  case ERRNUM_ADDRNOTAVAIL: return EADDRNOTAVAIL;
588 #endif
589 #ifdef EAFNOSUPPORT
590  case ERRNUM_AFNOSUPPORT: return EAFNOSUPPORT;
591 #endif
592 #ifdef EAGAIN
593  case ERRNUM_AGAIN: return EAGAIN;
594 #endif
595 #ifdef EALREADY
596  case ERRNUM_ALREADY: return EALREADY;
597 #endif
598 #ifdef EBADF
599  case ERRNUM_BADF: return EBADF;
600 #endif
601 #ifdef EBADMSG
602  case ERRNUM_BADMSG: return EBADMSG;
603 #endif
604 #ifdef EBUSY
605  case ERRNUM_BUSY: return EBUSY;
606 #endif
607 #ifdef ECANCELED
608  case ERRNUM_CANCELED: return ECANCELED;
609 #endif
610 #ifdef ECHILD
611  case ERRNUM_CHILD: return ECHILD;
612 #endif
613 #ifdef ECONNABORTED
614  case ERRNUM_CONNABORTED: return ECONNABORTED;
615 #endif
616 #ifdef ECONNREFUSED
617  case ERRNUM_CONNREFUSED: return ECONNREFUSED;
618 #endif
619 #ifdef ECONNRESET
620  case ERRNUM_CONNRESET: return ECONNRESET;
621 #endif
622 #ifdef EDEADLK
623  case ERRNUM_DEADLK: return EDEADLK;
624 #endif
625 #ifdef EDESTADDRREQ
626  case ERRNUM_DESTADDRREQ: return EDESTADDRREQ;
627 #endif
628 #ifdef EDOM
629  case ERRNUM_DOM: return EDOM;
630 #endif
631 // #ifdef EDQUOT
632 // case ERRNUM_DQUOT: return EDQUOT;
633 // #endif
634 #ifdef EEXIST
635  case ERRNUM_EXIST: return EEXIST;
636 #endif
637 #ifdef EFAULT
638  case ERRNUM_FAULT: return EFAULT;
639 #endif
640 #ifdef EFBIG
641  case ERRNUM_FBIG: return EFBIG;
642 #endif
643 #ifdef EHOSTUNREACH
644  case ERRNUM_HOSTUNREACH: return EHOSTUNREACH;
645 #endif
646 #ifdef EIDRM
647  case ERRNUM_IDRM: return EIDRM;
648 #endif
649 #ifdef EILSED
650  case ERRNUM_ILSEQ: return EILSEQ;
651 #endif
652 #ifdef EINPROGRESS
653  case ERRNUM_INPROGRESS: return EINPROGRESS;
654 #endif
655 #ifdef EINTR
656  case ERRNUM_INTR: return EINTR;
657 #endif
658 #ifdef EINVAL
659  case ERRNUM_INVAL: return EINVAL;
660 #endif
661 #ifdef EIO
662  case ERRNUM_IO: return EIO;
663 #endif
664 #ifdef EISCONN
665  case ERRNUM_ISCONN: return EISCONN;
666 #endif
667 #ifdef EISDIR
668  case ERRNUM_ISDIR: return EISDIR;
669 #endif
670 #ifdef ELOOP
671  case ERRNUM_LOOP: return ELOOP;
672 #endif
673 #ifdef EMFILE
674  case ERRNUM_MFILE: return EMFILE;
675 #endif
676 #ifdef EMLINK
677  case ERRNUM_MLINK: return EMLINK;
678 #endif
679 #ifdef EMSGSIZE
680  case ERRNUM_MSGSIZE: return EMSGSIZE;
681 #endif
682 // #ifdef EMULTIHOP
683 // case ERRNUM_MULTIHOP: return EMULTIHOP;
684 // #endif
685 #ifdef ENAMETOOLONG
686  case ERRNUM_NAMETOOLONG: return ENAMETOOLONG;
687 #endif
688 #ifdef ENETDOWN
689  case ERRNUM_NETDOWN: return ENETDOWN;
690 #endif
691 #ifdef ENETRESET
692  case ERRNUM_NETRESET: return ENETRESET;
693 #endif
694 #ifdef ENETUNREACH
695  case ERRNUM_NETUNREACH: return ENETUNREACH;
696 #endif
697 #ifdef ENFILE
698  case ERRNUM_NFILE: return ENFILE;
699 #endif
700 #ifdef ENOBUFS
701  case ERRNUM_NOBUFS: return ENOBUFS;
702 #endif
703 #ifdef ENODATA
704  case ERRNUM_NODATA: return ENODATA;
705 #endif
706 #ifdef ENODEV
707  case ERRNUM_NODEV: return ENODEV;
708 #endif
709 #ifdef ENOENT
710  case ERRNUM_NOENT: return ENOENT;
711 #endif
712 #ifdef ENOEXEC
713  case ERRNUM_NOEXEC: return ENOEXEC;
714 #endif
715 #ifdef ENOLCK
716  case ERRNUM_NOLCK: return ENOLCK;
717 #endif
718 // #ifdef ENOLINK
719 // case ERRNUM_NOLINK: return ENOLINK;
720 // #endif
721 #ifdef ENOMEM
722  case ERRNUM_NOMEM: return ENOMEM;
723 #endif
724 #ifdef ENOMSG
725  case ERRNUM_NOMSG: return ENOMSG;
726 #endif
727 #ifdef ENOPROTOOPT
728  case ERRNUM_NOPROTOOPT: return ENOPROTOOPT;
729 #endif
730 #ifdef ENOSPC
731  case ERRNUM_NOSPC: return ENOSPC;
732 #endif
733 #ifdef ENOSR
734  case ERRNUM_NOSR: return ENOSR;
735 #endif
736 #ifdef ENOSTR
737  case ERRNUM_NOSTR: return ENOSTR;
738 #endif
739 #ifdef ENOSYS
740  case ERRNUM_NOSYS: return ENOSYS;
741 #endif
742 #ifdef ENOTCONN
743  case ERRNUM_NOTCONN: return ENOTCONN;
744 #endif
745 #ifdef ENOTDIR
746  case ERRNUM_NOTDIR: return ENOTDIR;
747 #endif
748 #ifdef ENOTEMPTY
749  case ERRNUM_NOTEMPTY: return ENOTEMPTY;
750 #endif
751 #ifdef ENOTRECOVERABLE
752  case ERRNUM_NOTRECOVERABLE: return ENOTRECOVERABLE;
753 #endif
754 #ifdef ENOTSOCK
755  case ERRNUM_NOTSOCK: return ENOTSOCK;
756 #endif
757 #ifdef ENOTSUP
758  case ERRNUM_NOTSUP: return ENOTSUP;
759 #endif
760 #ifdef ENOTTY
761  case ERRNUM_NOTTY: return ENOTTY;
762 #endif
763 #ifdef ENXIO
764  case ERRNUM_NXIO: return ENXIO;
765 #endif
766 #ifdef EOPNOTSUPP
767  case ERRNUM_OPNOTSUPP: return EOPNOTSUPP;
768 #endif
769 #ifdef EOVERFLOW
770  case ERRNUM_OVERFLOW: return EOVERFLOW;
771 #endif
772 #ifdef EOWNERDEAD
773  case ERRNUM_OWNERDEAD: return EOWNERDEAD;
774 #endif
775 #ifdef EPERM
776  case ERRNUM_PERM: return EPERM;
777 #endif
778 #ifdef EPIPE
779  case ERRNUM_PIPE: return EPIPE;
780 #endif
781 #ifdef EPROTO
782  case ERRNUM_PROTO: return EPROTO;
783 #endif
784 #ifdef EPROTONOSUPPORT
785  case ERRNUM_PROTONOSUPPORT: return EPROTONOSUPPORT;
786 #endif
787 #ifdef EPROTOTYPE
788  case ERRNUM_PROTOTYPE: return EPROTOTYPE;
789 #endif
790 #ifdef ERANGE
791  case ERRNUM_RANGE: return ERANGE;
792 #endif
793 #ifdef EROFS
794  case ERRNUM_ROFS: return EROFS;
795 #endif
796 #ifdef ESPIPE
797  case ERRNUM_SPIPE: return ESPIPE;
798 #endif
799 #ifdef ESRCH
800  case ERRNUM_SRCH: return ESRCH;
801 #endif
802 // #ifdef ESTALE
803 // case ERRNUM_STALE: return ESTALE;
804 // #endif
805 #ifdef ETIME
806  case ERRNUM_TIME: return ETIME;
807 #endif
808 #ifdef ETIMEDOUT
809  case ERRNUM_TIMEDOUT: return ETIMEDOUT;
810 #endif
811 #ifdef ETXTBSY
812  case ERRNUM_TXTBSY: return ETXTBSY;
813 #endif
814 #ifdef EWOULDBLOCK
815  case ERRNUM_WOULDBLOCK: return EWOULDBLOCK;
816 #endif
817 #ifdef EXDEV
818  case ERRNUM_XDEV: return EXDEV;
819 #endif
820  default: return 0;
821  }
822 }
823 
824 int
826 {
827 #if _WIN32
828  switch (errnum) {
829  case ERRNUM_2BIG: return ERROR_BAD_ENVIRONMENT;
830  case ERRNUM_ACCES: return ERROR_ACCESS_DENIED;
831  case ERRNUM_ADDRINUSE: return WSAEADDRINUSE;
832  case ERRNUM_ADDRNOTAVAIL: return WSAEADDRNOTAVAIL;
833  case ERRNUM_AFNOSUPPORT: return WSAEAFNOSUPPORT;
834  case ERRNUM_AGAIN: return ERROR_RETRY;
835  case ERRNUM_ALREADY: return WSAEALREADY;
836  case ERRNUM_BADF: return ERROR_INVALID_HANDLE;
837  // case ERRNUM_BADMSG: return ...;
838  case ERRNUM_BUSY: return ERROR_BUSY;
839  case ERRNUM_CANCELED: return ERROR_OPERATION_ABORTED;
840  case ERRNUM_CHILD: return ERROR_WAIT_NO_CHILDREN;
841  case ERRNUM_CONNABORTED: return WSAECONNABORTED;
842  case ERRNUM_CONNREFUSED: return WSAECONNREFUSED;
843  case ERRNUM_CONNRESET: return WSAECONNRESET;
844  case ERRNUM_DEADLK: return ERROR_POSSIBLE_DEADLOCK;
845  case ERRNUM_DESTADDRREQ: return WSAEDESTADDRREQ;
846 #ifdef ERROR_FLOAT_MULTIPLE_FAULTS
847  case ERRNUM_DOM: return ERROR_FLOAT_MULTIPLE_FAULTS;
848 #endif
849  // case ERRNUM_DQUOT: return ...;
850  case ERRNUM_EXIST: return ERROR_FILE_EXISTS;
851  case ERRNUM_FAULT: return ERROR_NOACCESS;
852  case ERRNUM_FBIG: return ERROR_NO_SYSTEM_RESOURCES;
853  // clang-format off
854  case ERRNUM_HOSTUNREACH: return WSAEHOSTUNREACH;
855  // case ERRNUM_IDRM: return ...;
856 #ifdef ERROR_ILLEGAL_CHARACTER
857  case ERRNUM_ILSEQ: return ERROR_ILLEGAL_CHARACTER;
858 #endif
859  // clang-format on
860  case ERRNUM_INPROGRESS: return WSAEINPROGRESS;
861  case ERRNUM_INTR: return WSAEINTR;
862  case ERRNUM_INVAL: return ERROR_INVALID_PARAMETER;
863  case ERRNUM_IO: return ERROR_IO_DEVICE;
864  case ERRNUM_ISCONN: return WSAEISCONN;
865  case ERRNUM_ISDIR: return ERROR_FILE_EXISTS;
866  case ERRNUM_LOOP: return ERROR_CANT_RESOLVE_FILENAME;
867  case ERRNUM_MFILE: return ERROR_TOO_MANY_OPEN_FILES;
868  case ERRNUM_MLINK: return ERROR_TOO_MANY_LINKS;
869  case ERRNUM_MSGSIZE: return WSAEMSGSIZE;
870  // case ERRNUM_MULTIHOP: return ...;
871  case ERRNUM_NAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
872  case ERRNUM_NETDOWN: return WSAENETDOWN;
873  case ERRNUM_NETRESET: return WSAENETRESET;
874  case ERRNUM_NETUNREACH: return WSAENETUNREACH;
875  case ERRNUM_NFILE: return ERROR_NO_MORE_SEARCH_HANDLES;
876  case ERRNUM_NOBUFS: return WSAENOBUFS;
877  case ERRNUM_NODATA: return ERROR_HANDLE_EOF;
878  case ERRNUM_NODEV: return ERROR_DEV_NOT_EXIST;
879  case ERRNUM_NOENT: return ERROR_PATH_NOT_FOUND;
880  case ERRNUM_NOEXEC: return ERROR_BAD_FORMAT;
881  case ERRNUM_NOLCK: return ERROR_LOCK_VIOLATION;
882  // case ERRNUM_NOLINK: return ERROR_NOT_CONNECTED;
883  case ERRNUM_NOMEM: return ERROR_NOT_ENOUGH_MEMORY;
884  // case ERRNUM_NOMSG: return ...;
885  case ERRNUM_NOPROTOOPT: return WSAENOPROTOOPT;
886  case ERRNUM_NOSPC: return ERROR_DISK_FULL;
887  // case ERRNUM_NOSR: return ...;
888  // case ERRNUM_NOSTR: return ...;
889  case ERRNUM_NOSYS: return ERROR_CALL_NOT_IMPLEMENTED;
890  case ERRNUM_NOTCONN: return WSAENOTCONN;
891  case ERRNUM_NOTDIR: return ERROR_DIRECTORY;
892  case ERRNUM_NOTEMPTY: return ERROR_DIR_NOT_EMPTY;
893  // case ERRNUM_NOTRECOVERABLE: return ...;
894  case ERRNUM_NOTSOCK: return WSAENOTSOCK;
895  case ERRNUM_NOTSUP: return ERROR_EAS_NOT_SUPPORTED;
896  case ERRNUM_NOTTY: return ERROR_INVALID_CATEGORY;
897  case ERRNUM_NXIO: return ERROR_FILE_INVALID;
898  case ERRNUM_OPNOTSUPP: return WSAEOPNOTSUPP;
899  case ERRNUM_OVERFLOW: return ERROR_INVALID_PARAMETER;
900  // case ERRNUM_OWNERDEAD: return ...;
901  case ERRNUM_PERM: return ERROR_PRIVILEGE_NOT_HELD;
902  case ERRNUM_PIPE: return ERROR_BROKEN_PIPE;
903  // case ERRNUM_PROTO: return ...;
904  case ERRNUM_PROTONOSUPPORT: return WSAEPROTONOSUPPORT;
905  case ERRNUM_PROTOTYPE: return WSAEPROTOTYPE;
906  case ERRNUM_RANGE: return ERROR_ARITHMETIC_OVERFLOW;
907  case ERRNUM_ROFS: return ERROR_WRITE_PROTECT;
908  case ERRNUM_SPIPE: return ERROR_SEEK;
909  case ERRNUM_SRCH: return ERROR_PROC_NOT_FOUND;
910  // case ERRNUM_STALE: return ...;
911  // case ERRNUM_TIME: return ...;
912  case ERRNUM_TIMEDOUT: return ERROR_TIMEOUT;
913  // case ERRNUM_TXTBSY: return ...;
914  case ERRNUM_WOULDBLOCK: return WSAEWOULDBLOCK;
915  case ERRNUM_XDEV: return ERROR_NOT_SAME_DEVICE;
916  case ERRNUM_AI_AGAIN: return WSATRY_AGAIN;
917  case ERRNUM_AI_BADFLAGS: return WSAEINVAL;
918  case ERRNUM_AI_FAIL: return WSANO_RECOVERY;
919  case ERRNUM_AI_FAMILY: return WSAEAFNOSUPPORT;
920  case ERRNUM_AI_MEMORY: return ERROR_NOT_ENOUGH_MEMORY;
921  case ERRNUM_AI_NONAME: return WSAHOST_NOT_FOUND;
922  case ERRNUM_AI_SERVICE: return WSATYPE_NOT_FOUND;
923  case ERRNUM_AI_SOCKTYPE: return WSAESOCKTNOSUPPORT;
924  case ERRNUM_AI_OVERFLOW: return WSAEFAULT;
925  default: return 0;
926  }
927 #else
928 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
929  switch (errnum) {
930  case ERRNUM_AI_AGAIN: return -ABS(EAI_AGAIN);
931  case ERRNUM_AI_BADFLAGS: return -ABS(EAI_BADFLAGS);
932  case ERRNUM_AI_FAIL: return -ABS(EAI_FAIL);
933  case ERRNUM_AI_FAMILY: return -ABS(EAI_FAMILY);
934  case ERRNUM_AI_MEMORY: return -ABS(EAI_MEMORY);
935  case ERRNUM_AI_NONAME: return -ABS(EAI_NONAME);
936  case ERRNUM_AI_OVERFLOW: return -ABS(EAI_OVERFLOW);
937  case ERRNUM_AI_SERVICE: return -ABS(EAI_SERVICE);
938  case ERRNUM_AI_SOCKTYPE: return -ABS(EAI_SOCKTYPE);
939  default: break;
940  }
941 #endif
942  return errnum2no(errnum);
943 #endif // _WIN32
944 }
945 
946 int
947 get_errc(void)
948 {
949 #if _WIN32
950  return GetLastError();
951 #else
952  return errno;
953 #endif
954 }
955 
956 void
957 set_errc(int errc)
958 {
959 #if _WIN32
960  SetLastError(errc);
961 #else
962  errno = errc;
963 #endif
964 }
965 
966 const char *
968 {
969  return strerror(errnum);
970 }
971 
972 const char *
973 errc2str(int errc)
974 {
975 #if _WIN32
976  // clang-format off
977  if (!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
978  | FORMAT_MESSAGE_IGNORE_INSERTS,
979  NULL, errc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
980  errstr, sizeof(errstr), NULL))
981  return NULL;
982  // clang-format on
983  // Remove terminating line-break ("\r\n") from error message.
984  size_t n = strlen(errstr);
985  if (n >= 2)
986  errstr[n - 2] = '\0';
987  return errstr;
988 #else
989 #if _POSIX_C_SOURCE >= 200112L && !defined(__NEWLIB__)
990  switch (errc) {
991  case -ABS(EAI_AGAIN): return gai_strerror(EAI_AGAIN);
992  case -ABS(EAI_BADFLAGS): return gai_strerror(EAI_BADFLAGS);
993  case -ABS(EAI_FAIL): return gai_strerror(EAI_FAIL);
994  case -ABS(EAI_FAMILY): return gai_strerror(EAI_FAMILY);
995  case -ABS(EAI_MEMORY): return gai_strerror(EAI_MEMORY);
996  case -ABS(EAI_NONAME): return gai_strerror(EAI_NONAME);
997  case -ABS(EAI_OVERFLOW): return gai_strerror(EAI_OVERFLOW);
998  case -ABS(EAI_SERVICE): return gai_strerror(EAI_SERVICE);
999  case -ABS(EAI_SOCKTYPE): return gai_strerror(EAI_SOCKTYPE);
1000  }
1001 #endif
1002  return errno2str(errc);
1003 #endif
1004 }
ERRNUM_TXTBSY
@ ERRNUM_TXTBSY
Text file busy.
Definition: errnum.h:228
ERRNUM_CONNREFUSED
@ ERRNUM_CONNREFUSED
Connection refused.
Definition: errnum.h:102
ERRNUM_LOOP
@ ERRNUM_LOOP
Too many levels of symbolic links.
Definition: errnum.h:137
ERRNUM_AI_NONAME
@ ERRNUM_AI_NONAME
The name does not resolve for the supplied parameters.
Definition: errnum.h:250
ERRNUM_NXIO
@ ERRNUM_NXIO
No such device or address.
Definition: errnum.h:197
ERRNUM_NOEXEC
@ ERRNUM_NOEXEC
Executable file format error.
Definition: errnum.h:164
ERRNUM_EXIST
@ ERRNUM_EXIST
File exists.
Definition: errnum.h:113
ERRNUM_HOSTUNREACH
@ ERRNUM_HOSTUNREACH
Host is unreachable.
Definition: errnum.h:119
ERRNUM_NOTSOCK
@ ERRNUM_NOTSOCK
Not a socket.
Definition: errnum.h:191
ERRNUM_ACCES
@ ERRNUM_ACCES
Permission denied.
Definition: errnum.h:78
string.h
ERRNUM_2BIG
@ ERRNUM_2BIG
Argument list too long.
Definition: errnum.h:76
ERRNUM_FAULT
@ ERRNUM_FAULT
Bad address.
Definition: errnum.h:115
ERRNUM_BUSY
@ ERRNUM_BUSY
Device or resource busy.
Definition: errnum.h:94
util.h
ERRNUM_NETDOWN
@ ERRNUM_NETDOWN
Network is down.
Definition: errnum.h:148
ERRNUM_NOTDIR
@ ERRNUM_NOTDIR
Not a directory or a symbolic link to a directory.
Definition: errnum.h:185
ERRNUM_NOBUFS
@ ERRNUM_NOBUFS
No buffer space available.
Definition: errnum.h:156
ERRNUM_OWNERDEAD
@ ERRNUM_OWNERDEAD
Previous owner died.
Definition: errnum.h:203
ERRNUM_NOPROTOOPT
@ ERRNUM_NOPROTOOPT
Protocol not available.
Definition: errnum.h:173
ERRNUM_NAMETOOLONG
@ ERRNUM_NAMETOOLONG
Filename too long.
Definition: errnum.h:146
ERRNUM_NOMSG
@ ERRNUM_NOMSG
No message of the desired type.
Definition: errnum.h:171
errc2no
int errc2no(int errc)
Transforms a native error code to a standard C error number.
Definition: errnum.c:300
ERRNUM_NODEV
@ ERRNUM_NODEV
No such device.
Definition: errnum.h:160
ERRNUM_AI_FAMILY
@ ERRNUM_AI_FAMILY
The address family was not recognized or the address length was invalid for the specified family.
Definition: errnum.h:246
ERRNUM_NOMEM
@ ERRNUM_NOMEM
Not enough space.
Definition: errnum.h:169
ERRNUM_AFNOSUPPORT
@ ERRNUM_AFNOSUPPORT
Address family not supported.
Definition: errnum.h:84
ERRNUM_MSGSIZE
@ ERRNUM_MSGSIZE
Message too large.
Definition: errnum.h:143
get_errc
int get_errc(void)
Returns the last (thread-specific) native error code set by a system call or library function.
Definition: errnum.c:947
ERRNUM_CHILD
@ ERRNUM_CHILD
No child process.
Definition: errnum.h:98
ERRNUM_PROTONOSUPPORT
@ ERRNUM_PROTONOSUPPORT
Protocol not supported.
Definition: errnum.h:211
errno2c
int errno2c(int errnum)
Transforms a standard C error number to a native error code.
Definition: errnum.c:43
ERRNUM_INTR
@ ERRNUM_INTR
Interrupted function.
Definition: errnum.h:127
ERRNUM_NOTCONN
@ ERRNUM_NOTCONN
The socket is not connected.
Definition: errnum.h:183
ERRNUM_PROTOTYPE
@ ERRNUM_PROTOTYPE
Protocol wrong type for socket.
Definition: errnum.h:213
ERRNUM_CONNRESET
@ ERRNUM_CONNRESET
Connection reset.
Definition: errnum.h:104
ERRNUM_NOSPC
@ ERRNUM_NOSPC
No space left on device.
Definition: errnum.h:175
ERRNUM_NOTRECOVERABLE
@ ERRNUM_NOTRECOVERABLE
State not recoverable.
Definition: errnum.h:189
ERRNUM_BADF
@ ERRNUM_BADF
Bad file descriptor.
Definition: errnum.h:90
ERRNUM_CANCELED
@ ERRNUM_CANCELED
Operation canceled.
Definition: errnum.h:96
ERRNUM_RANGE
@ ERRNUM_RANGE
Result too large.
Definition: errnum.h:215
errno2num
errnum_t errno2num(int errnum)
Transforms a standard C error number to a platform-independent error number.
Definition: errnum.c:53
ERRNUM_AI_SERVICE
@ ERRNUM_AI_SERVICE
The service passed was not recognized for the specified socket type.
Definition: errnum.h:254
ERRNUM_ISDIR
@ ERRNUM_ISDIR
Is a directory.
Definition: errnum.h:135
ABS
#define ABS(a)
Returns the absolute value of a.
Definition: util.h:30
errnum2c
int errnum2c(errnum_t errnum)
Transforms a platform-independent error number to a native error code.
Definition: errnum.c:825
ERRNUM_NOTTY
@ ERRNUM_NOTTY
Inappropriate I/O control operation.
Definition: errnum.h:195
ERRNUM_NETUNREACH
@ ERRNUM_NETUNREACH
Network unreachable.
Definition: errnum.h:152
ERRNUM_NOLCK
@ ERRNUM_NOLCK
No locks available.
Definition: errnum.h:166
ERRNUM_PIPE
@ ERRNUM_PIPE
Broken pipe.
Definition: errnum.h:207
ERRNUM_IO
@ ERRNUM_IO
I/O error.
Definition: errnum.h:131
ERRNUM_CONNABORTED
@ ERRNUM_CONNABORTED
Connection aborted.
Definition: errnum.h:100
ERRNUM_NFILE
@ ERRNUM_NFILE
Too many files open in system.
Definition: errnum.h:154
errnum
errnum
The platform-independent error numbers.
Definition: errnum.h:74
ERRNUM_AI_MEMORY
@ ERRNUM_AI_MEMORY
There was a memory allocation failure.
Definition: errnum.h:248
errnum.h
ERRNUM_NODATA
@ ERRNUM_NODATA
No message is available on the STREAM head read queue.
Definition: errnum.h:158
ERRNUM_SRCH
@ ERRNUM_SRCH
No such process.
Definition: errnum.h:221
ERRNUM_ALREADY
@ ERRNUM_ALREADY
Connection already in progress.
Definition: errnum.h:88
ERRNUM_INVAL
@ ERRNUM_INVAL
Invalid argument.
Definition: errnum.h:129
ERRNUM_AI_FAIL
@ ERRNUM_AI_FAIL
A non-recoverable error occurred.
Definition: errnum.h:241
errc2str
const char * errc2str(int errc)
Returns a string describing a native error code.
Definition: errnum.c:973
ERRNUM_NOENT
@ ERRNUM_NOENT
No such file or directory.
Definition: errnum.h:162
ERRNUM_WOULDBLOCK
@ ERRNUM_WOULDBLOCK
Operation would block.
Definition: errnum.h:230
ERRNUM_ADDRINUSE
@ ERRNUM_ADDRINUSE
Address in use.
Definition: errnum.h:80
ERRNUM_NOSR
@ ERRNUM_NOSR
No STREAM resources.
Definition: errnum.h:177
ERRNUM_INPROGRESS
@ ERRNUM_INPROGRESS
Operation in progress.
Definition: errnum.h:125
ERRNUM_DESTADDRREQ
@ ERRNUM_DESTADDRREQ
Destination address required.
Definition: errnum.h:108
ERRNUM_OPNOTSUPP
@ ERRNUM_OPNOTSUPP
Operation not supported on socket.
Definition: errnum.h:199
ERRNUM_NOSTR
@ ERRNUM_NOSTR
Not a STREAM.
Definition: errnum.h:179
set_errc
void set_errc(int errc)
Sets the current (thread-specific) native error code to errc.
Definition: errnum.c:957
ERRNUM_NETRESET
@ ERRNUM_NETRESET
Connection aborted by network.
Definition: errnum.h:150
errnum2no
int errnum2no(errnum_t errnum)
Transforms a platform-independent error number to a standard C error number.
Definition: errnum.c:574
ERRNUM_ADDRNOTAVAIL
@ ERRNUM_ADDRNOTAVAIL
Address not available.
Definition: errnum.h:82
ERRNUM_PERM
@ ERRNUM_PERM
Operation not permitted.
Definition: errnum.h:205
ERRNUM_AI_AGAIN
@ ERRNUM_AI_AGAIN
The name could not be resolved at this time.
Definition: errnum.h:237
ERRNUM_SPIPE
@ ERRNUM_SPIPE
Invalid seek.
Definition: errnum.h:219
ERRNUM_MLINK
@ ERRNUM_MLINK
Too many links.
Definition: errnum.h:141
ERRNUM_XDEV
@ ERRNUM_XDEV
Cross-device link.
Definition: errnum.h:232
ERRNUM_ISCONN
@ ERRNUM_ISCONN
Socket is connected.
Definition: errnum.h:133
ERRNUM_FBIG
@ ERRNUM_FBIG
File too large.
Definition: errnum.h:117
ERRNUM_MFILE
@ ERRNUM_MFILE
File descriptor value too large.
Definition: errnum.h:139
ERRNUM_PROTO
@ ERRNUM_PROTO
Protocol error.
Definition: errnum.h:209
ERRNUM_BADMSG
@ ERRNUM_BADMSG
Bad message.
Definition: errnum.h:92
ERRNUM_DEADLK
@ ERRNUM_DEADLK
Resource deadlock would occur.
Definition: errnum.h:106
ERRNUM_AI_OVERFLOW
@ ERRNUM_AI_OVERFLOW
An argument buffer overflowed.
Definition: errnum.h:252
ERRNUM_IDRM
@ ERRNUM_IDRM
Identifier removed.
Definition: errnum.h:121
ERRNUM_DOM
@ ERRNUM_DOM
Mathematics argument out of domain of function.
Definition: errnum.h:110
errnum_t
enum errnum errnum_t
The platform-independent error number type.
Definition: errnum.h:263
ERRNUM_AI_SOCKTYPE
@ ERRNUM_AI_SOCKTYPE
The intended socket type was not recognized.
Definition: errnum.h:256
ERRNUM_TIMEDOUT
@ ERRNUM_TIMEDOUT
Connection timed out.
Definition: errnum.h:226
_Thread_local
#define _Thread_local
An object whose identifier is declared with the storage-class specifier _Thread_local has thread stor...
Definition: features.h:239
errc2num
errnum_t errc2num(int errc)
Transforms a native error code to a platform-independent error number.
Definition: errnum.c:310
ERRNUM_OVERFLOW
@ ERRNUM_OVERFLOW
Value too large to be stored in data type.
Definition: errnum.h:201
ERRNUM_NOTSUP
@ ERRNUM_NOTSUP
Not supported.
Definition: errnum.h:193
ERRNUM_TIME
@ ERRNUM_TIME
Stream ioctl() timeout.
Definition: errnum.h:224
ERRNUM_AI_BADFLAGS
@ ERRNUM_AI_BADFLAGS
The flags had an invalid value.
Definition: errnum.h:239
errno2str
const char * errno2str(int errnum)
Returns a string describing a standard C error number.
Definition: errnum.c:967
ERRNUM_NOTEMPTY
@ ERRNUM_NOTEMPTY
Directory not empty.
Definition: errnum.h:187
ERRNUM_ROFS
@ ERRNUM_ROFS
Read-only file system.
Definition: errnum.h:217
ERRNUM_AGAIN
@ ERRNUM_AGAIN
Resource unavailable, try again.
Definition: errnum.h:86
ERRNUM_NOSYS
@ ERRNUM_NOSYS
Function not supported.
Definition: errnum.h:181
ERRNUM_ILSEQ
@ ERRNUM_ILSEQ
Illegal byte sequence.
Definition: errnum.h:123