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