Project

General

Profile

Download (3.51 KB) Statistics
| Branch: | Tag: | Revision:
7e8045d8 David Sorber
#include "error.h"
#include <errno.h> // for E2BIG, EACCES, EADDRINUSE, EADDRNOTAVAIL
#include <stddef.h> // for ptrdiff_t, size_t
#include "sparse.h" // for __force
#include "simplest-defs.h" // for NELEM

/* One is not supposed to use sys_errlist[] any longer.

strerror() grabs locks and loads a locale to translate the error
message. On top of that, it's not thread safe.

To work around the thread-safe business, one is supposed to
allocate a buffer and call strerror_r, for the privilege of having
locale-dependent error messages precisely when things are going
wrong and the last thing I want to do is load a file from disk.

Oracle policy prevents me from drawing the appropriate conclusion
in writing. Let's just say that returning a static string seems
simpler than any of the above.
*/
/* as long as I am redoing strerror(), we may as well print
ECONNABORTED instead of some translation into English, which then I
have to mentally map back to ECONNABORTED */
#define DO(x) [x] = #x
static const char *const errlist[] = {
DO(EPERM),
DO(ENOENT),
DO(ESRCH),
DO(EINTR),
DO(EIO),
DO(ENXIO),
DO(E2BIG),
DO(ENOEXEC),
DO(EBADF),
DO(ECHILD),
DO(EDEADLK),
DO(ENOMEM),
DO(EACCES),
DO(EFAULT),
DO(ENOTBLK),
DO(EBUSY),
DO(EEXIST),
DO(EXDEV),
DO(ENODEV),
DO(ENOTDIR),
DO(EISDIR),
DO(EINVAL),
DO(EMFILE),
DO(ENFILE),
DO(ENOTTY),
DO(ETXTBSY),
DO(EFBIG),
DO(ENOSPC),
DO(ESPIPE),
DO(EROFS),
DO(EMLINK),
DO(EPIPE),
DO(EDOM),
DO(ERANGE),
DO(EAGAIN),
DO(EINPROGRESS),
DO(EALREADY),
DO(ENOTSOCK),
DO(EMSGSIZE),
DO(EPROTOTYPE),
DO(ENOPROTOOPT),
DO(EPROTONOSUPPORT),
DO(ESOCKTNOSUPPORT),
DO(EOPNOTSUPP),
DO(EPFNOSUPPORT),
DO(EAFNOSUPPORT),
DO(EADDRINUSE),
DO(EADDRNOTAVAIL),
DO(ENETDOWN),
DO(ENETUNREACH),
DO(ENETRESET),
DO(ECONNABORTED),
DO(ECONNRESET),
DO(ENOBUFS),
DO(EISCONN),
DO(ENOTCONN),
DO(EDESTADDRREQ),
DO(ESHUTDOWN),
DO(ETOOMANYREFS),
DO(ETIMEDOUT),
DO(ECONNREFUSED),
DO(ELOOP),
DO(ENAMETOOLONG),
DO(EHOSTDOWN),
DO(EHOSTUNREACH),
DO(ENOTEMPTY),
DO(EUSERS),
DO(EDQUOT),
DO(ESTALE),
DO(EREMOTE),
DO(ENOLCK),
DO(EILSEQ),
DO(EBADMSG),
DO(EIDRM),
DO(EMULTIHOP),
DO(ENODATA),
DO(ENOLINK),
DO(ENOMSG),
DO(ENOSR),
DO(ENOSTR),
DO(EOVERFLOW),
DO(EPROTO),
DO(ETIME),
DO(ECANCELED),
DO(ECHRNG),
DO(EL2NSYNC),
DO(EL3HLT),
DO(EL3RST),
DO(ELNRNG),
DO(EUNATCH),
DO(ENOCSI),
DO(EL2HLT),
DO(EBADE),
DO(EBADR),
DO(EXFULL),
DO(ENOANO),
DO(EBADRQC),
DO(EBADSLT),
DO(EBFONT),
DO(ENONET),
DO(ENOPKG),
DO(EADV),
DO(ESRMNT),
DO(ECOMM),
DO(EDOTDOT),
DO(ENOTUNIQ),
DO(EBADFD),
DO(EREMCHG),
DO(ELIBACC),
DO(ELIBBAD),
DO(ELIBSCN),
DO(ELIBMAX),
DO(ELIBEXEC),
DO(ESTRPIPE),
DO(EUCLEAN),
DO(ENOTNAM),
DO(ENAVAIL),
DO(EISNAM),
DO(EREMOTEIO),
DO(ENOMEDIUM),
DO(EMEDIUMTYPE),
DO(ENOKEY),
DO(EKEYEXPIRED),
DO(EKEYREVOKED),
DO(EKEYREJECTED),
DO(EOWNERDEAD),
DO(ENOTRECOVERABLE),
DO(ERFKILL),
DO(EHWPOISON),
};

const char *xstrerror(int err)
{
ptrdiff_t err1 = err;
if (1
&& err1 >= 0
&& (__force size_t)err1 < NELEM(errlist)
&& errlist[err1]) {
return errlist[err1];
} else {
return "Unknown error";
}
}