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__)
42static const char *gai_strerror_r(int ecode, char *strerrbuf, size_t buflen);
43#endif
44
45int
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
298int
299errc2no(int errc)
300{
301#if _WIN32
302 return errnum2no(errc2num(errc));
303#else
304 return errc > 0 ? errc : 0;
305#endif
306}
307
309errc2num(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
566int
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
809int
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
931int
933{
934#if _WIN32
935 return GetLastError();
936#elif LELY_NO_ERRNO
937 return 0;
938#else
939 return errno;
940#endif
941}
942
943void
944set_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
955const char *
956errno2str_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
987const char *
988errc2str_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__)
1040static const char *
1041gai_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
int errnum2c(errnum_t errnum)
Transforms a platform-independent error number to a native error code.
Definition errnum.c:810
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
const char * errc2str_r(int errc, char *strerrbuf, size_t buflen)
Returns a string describing a native error code.
Definition errnum.c:988
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
const char * errno2str_r(int errnum, char *strerrbuf, size_t buflen)
Returns a string describing a standard C error number.
Definition errnum.c:956
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....