root/software/fss-parallel-tools/common/error.c @ b1d8e8c9
| 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";
|
|||
}
|
|||
}
|