blob: 0bdfbc7007593f8ce99d1239f50858a8c06da45d [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* C++ stream style string formatter and printer used in KUnit for outputting
* KUnit messages.
*
* Copyright (C) 2019, Google LLC.
* Author: Mike Krinkin <krinkin@google.com>
*/
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <test/strerror.h>
#define SUCCESS 0
#define MAKE_ERROR(errno) [errno] = #errno
static const char * const errmap[] = {
MAKE_ERROR(SUCCESS),
MAKE_ERROR(EPERM),
MAKE_ERROR(ENOENT),
MAKE_ERROR(ESRCH),
MAKE_ERROR(EINTR),
MAKE_ERROR(EIO),
MAKE_ERROR(ENXIO),
MAKE_ERROR(E2BIG),
MAKE_ERROR(ENOEXEC),
MAKE_ERROR(EBADF),
MAKE_ERROR(ECHILD),
MAKE_ERROR(EAGAIN),
MAKE_ERROR(ENOMEM),
MAKE_ERROR(EACCES),
MAKE_ERROR(EFAULT),
MAKE_ERROR(ENOTBLK),
MAKE_ERROR(EBUSY),
MAKE_ERROR(EEXIST),
MAKE_ERROR(EXDEV),
MAKE_ERROR(ENODEV),
MAKE_ERROR(ENOTDIR),
MAKE_ERROR(EISDIR),
MAKE_ERROR(EINVAL),
MAKE_ERROR(ENFILE),
MAKE_ERROR(EMFILE),
MAKE_ERROR(ENOTTY),
MAKE_ERROR(ETXTBSY),
MAKE_ERROR(EFBIG),
MAKE_ERROR(ENOSPC),
MAKE_ERROR(ESPIPE),
MAKE_ERROR(EROFS),
MAKE_ERROR(EMLINK),
MAKE_ERROR(EPIPE),
MAKE_ERROR(EDOM),
MAKE_ERROR(ERANGE),
MAKE_ERROR(EDEADLK),
MAKE_ERROR(ENAMETOOLONG),
MAKE_ERROR(ENOLCK),
MAKE_ERROR(ENOSYS),
MAKE_ERROR(ENOTEMPTY),
MAKE_ERROR(ELOOP),
MAKE_ERROR(ENOMSG),
MAKE_ERROR(EIDRM),
MAKE_ERROR(ECHRNG),
MAKE_ERROR(EL2NSYNC),
MAKE_ERROR(EL3HLT),
MAKE_ERROR(EL3RST),
MAKE_ERROR(ELNRNG),
MAKE_ERROR(EUNATCH),
MAKE_ERROR(ENOCSI),
MAKE_ERROR(EL2HLT),
MAKE_ERROR(EBADE),
MAKE_ERROR(EBADR),
MAKE_ERROR(EXFULL),
MAKE_ERROR(ENOANO),
MAKE_ERROR(EBADRQC),
MAKE_ERROR(EBADSLT),
MAKE_ERROR(EBFONT),
MAKE_ERROR(ENOSTR),
MAKE_ERROR(ENODATA),
MAKE_ERROR(ETIME),
MAKE_ERROR(ENOSR),
MAKE_ERROR(ENONET),
MAKE_ERROR(ENOPKG),
MAKE_ERROR(EREMOTE),
MAKE_ERROR(ENOLINK),
MAKE_ERROR(EADV),
MAKE_ERROR(ESRMNT),
MAKE_ERROR(ECOMM),
MAKE_ERROR(EPROTO),
MAKE_ERROR(EMULTIHOP),
MAKE_ERROR(EDOTDOT),
MAKE_ERROR(EBADMSG),
MAKE_ERROR(EOVERFLOW),
MAKE_ERROR(ENOTUNIQ),
MAKE_ERROR(EBADFD),
MAKE_ERROR(EREMCHG),
MAKE_ERROR(ELIBACC),
MAKE_ERROR(ELIBBAD),
MAKE_ERROR(ELIBSCN),
MAKE_ERROR(ELIBMAX),
MAKE_ERROR(ELIBEXEC),
MAKE_ERROR(EILSEQ),
MAKE_ERROR(ERESTART),
MAKE_ERROR(ESTRPIPE),
MAKE_ERROR(EUSERS),
MAKE_ERROR(ENOTSOCK),
MAKE_ERROR(EDESTADDRREQ),
MAKE_ERROR(EMSGSIZE),
MAKE_ERROR(EPROTOTYPE),
MAKE_ERROR(ENOPROTOOPT),
MAKE_ERROR(EPROTONOSUPPORT),
MAKE_ERROR(ESOCKTNOSUPPORT),
MAKE_ERROR(EOPNOTSUPP),
MAKE_ERROR(EPFNOSUPPORT),
MAKE_ERROR(EAFNOSUPPORT),
MAKE_ERROR(EADDRINUSE),
MAKE_ERROR(EADDRNOTAVAIL),
MAKE_ERROR(ENETDOWN),
MAKE_ERROR(ENETUNREACH),
MAKE_ERROR(ENETRESET),
MAKE_ERROR(ECONNABORTED),
MAKE_ERROR(ECONNRESET),
MAKE_ERROR(ENOBUFS),
MAKE_ERROR(EISCONN),
MAKE_ERROR(ENOTCONN),
MAKE_ERROR(ESHUTDOWN),
MAKE_ERROR(ETOOMANYREFS),
MAKE_ERROR(ETIMEDOUT),
MAKE_ERROR(ECONNREFUSED),
MAKE_ERROR(EHOSTDOWN),
MAKE_ERROR(EHOSTUNREACH),
MAKE_ERROR(EALREADY),
MAKE_ERROR(EINPROGRESS),
MAKE_ERROR(ESTALE),
MAKE_ERROR(EUCLEAN),
MAKE_ERROR(ENOTNAM),
MAKE_ERROR(ENAVAIL),
MAKE_ERROR(EISNAM),
MAKE_ERROR(EREMOTEIO),
MAKE_ERROR(EDQUOT),
MAKE_ERROR(ENOMEDIUM),
MAKE_ERROR(EMEDIUMTYPE),
MAKE_ERROR(ECANCELED),
MAKE_ERROR(ENOKEY),
MAKE_ERROR(EKEYEXPIRED),
MAKE_ERROR(EKEYREVOKED),
MAKE_ERROR(EKEYREJECTED),
MAKE_ERROR(EOWNERDEAD),
MAKE_ERROR(ENOTRECOVERABLE),
MAKE_ERROR(ERFKILL),
MAKE_ERROR(EHWPOISON)
};
const char *strerror(int errno)
{
if (errno < 0 || errno >= ARRAY_SIZE(errmap))
return NULL;
return errmap[errno];
}
const char *strerror_r(int errno, char *buf, size_t buflen)
{
const char *err = strerror(errno);
if (!buflen)
return NULL;
// GNU version of strerror_r() may sometimes return a pointer to a
// static string, this implementation doesn't do it mostly to keep
// the behavior consistent and predicatble.
buf[buflen - 1] = '\0';
if (err)
return strncpy(buf, err, buflen - 1);
snprintf(buf, buflen - 1, "%d (unknown error)", errno);
return buf;
}