18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/build_bug.h>
38c2ecf20Sopenharmony_ci#include <linux/errno.h>
48c2ecf20Sopenharmony_ci#include <linux/errname.h>
58c2ecf20Sopenharmony_ci#include <linux/kernel.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci/*
88c2ecf20Sopenharmony_ci * Ensure these tables do not accidentally become gigantic if some
98c2ecf20Sopenharmony_ci * huge errno makes it in. On most architectures, the first table will
108c2ecf20Sopenharmony_ci * only have about 140 entries, but mips and parisc have more sparsely
118c2ecf20Sopenharmony_ci * allocated errnos (with EHWPOISON = 257 on parisc, and EDQUOT = 1133
128c2ecf20Sopenharmony_ci * on mips), so this wastes a bit of space on those - though we
138c2ecf20Sopenharmony_ci * special case the EDQUOT case.
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci#define E(err) [err + BUILD_BUG_ON_ZERO(err <= 0 || err > 300)] = "-" #err
168c2ecf20Sopenharmony_cistatic const char *names_0[] = {
178c2ecf20Sopenharmony_ci	E(E2BIG),
188c2ecf20Sopenharmony_ci	E(EACCES),
198c2ecf20Sopenharmony_ci	E(EADDRINUSE),
208c2ecf20Sopenharmony_ci	E(EADDRNOTAVAIL),
218c2ecf20Sopenharmony_ci	E(EADV),
228c2ecf20Sopenharmony_ci	E(EAFNOSUPPORT),
238c2ecf20Sopenharmony_ci	E(EAGAIN), /* EWOULDBLOCK */
248c2ecf20Sopenharmony_ci	E(EALREADY),
258c2ecf20Sopenharmony_ci	E(EBADE),
268c2ecf20Sopenharmony_ci	E(EBADF),
278c2ecf20Sopenharmony_ci	E(EBADFD),
288c2ecf20Sopenharmony_ci	E(EBADMSG),
298c2ecf20Sopenharmony_ci	E(EBADR),
308c2ecf20Sopenharmony_ci	E(EBADRQC),
318c2ecf20Sopenharmony_ci	E(EBADSLT),
328c2ecf20Sopenharmony_ci	E(EBFONT),
338c2ecf20Sopenharmony_ci	E(EBUSY),
348c2ecf20Sopenharmony_ci	E(ECANCELED), /* ECANCELLED */
358c2ecf20Sopenharmony_ci	E(ECHILD),
368c2ecf20Sopenharmony_ci	E(ECHRNG),
378c2ecf20Sopenharmony_ci	E(ECOMM),
388c2ecf20Sopenharmony_ci	E(ECONNABORTED),
398c2ecf20Sopenharmony_ci	E(ECONNREFUSED), /* EREFUSED */
408c2ecf20Sopenharmony_ci	E(ECONNRESET),
418c2ecf20Sopenharmony_ci	E(EDEADLK), /* EDEADLOCK */
428c2ecf20Sopenharmony_ci#if EDEADLK != EDEADLOCK /* mips, sparc, powerpc */
438c2ecf20Sopenharmony_ci	E(EDEADLOCK),
448c2ecf20Sopenharmony_ci#endif
458c2ecf20Sopenharmony_ci	E(EDESTADDRREQ),
468c2ecf20Sopenharmony_ci	E(EDOM),
478c2ecf20Sopenharmony_ci	E(EDOTDOT),
488c2ecf20Sopenharmony_ci#ifndef CONFIG_MIPS
498c2ecf20Sopenharmony_ci	E(EDQUOT),
508c2ecf20Sopenharmony_ci#endif
518c2ecf20Sopenharmony_ci	E(EEXIST),
528c2ecf20Sopenharmony_ci	E(EFAULT),
538c2ecf20Sopenharmony_ci	E(EFBIG),
548c2ecf20Sopenharmony_ci	E(EHOSTDOWN),
558c2ecf20Sopenharmony_ci	E(EHOSTUNREACH),
568c2ecf20Sopenharmony_ci	E(EHWPOISON),
578c2ecf20Sopenharmony_ci	E(EIDRM),
588c2ecf20Sopenharmony_ci	E(EILSEQ),
598c2ecf20Sopenharmony_ci#ifdef EINIT
608c2ecf20Sopenharmony_ci	E(EINIT),
618c2ecf20Sopenharmony_ci#endif
628c2ecf20Sopenharmony_ci	E(EINPROGRESS),
638c2ecf20Sopenharmony_ci	E(EINTR),
648c2ecf20Sopenharmony_ci	E(EINVAL),
658c2ecf20Sopenharmony_ci	E(EIO),
668c2ecf20Sopenharmony_ci	E(EISCONN),
678c2ecf20Sopenharmony_ci	E(EISDIR),
688c2ecf20Sopenharmony_ci	E(EISNAM),
698c2ecf20Sopenharmony_ci	E(EKEYEXPIRED),
708c2ecf20Sopenharmony_ci	E(EKEYREJECTED),
718c2ecf20Sopenharmony_ci	E(EKEYREVOKED),
728c2ecf20Sopenharmony_ci	E(EL2HLT),
738c2ecf20Sopenharmony_ci	E(EL2NSYNC),
748c2ecf20Sopenharmony_ci	E(EL3HLT),
758c2ecf20Sopenharmony_ci	E(EL3RST),
768c2ecf20Sopenharmony_ci	E(ELIBACC),
778c2ecf20Sopenharmony_ci	E(ELIBBAD),
788c2ecf20Sopenharmony_ci	E(ELIBEXEC),
798c2ecf20Sopenharmony_ci	E(ELIBMAX),
808c2ecf20Sopenharmony_ci	E(ELIBSCN),
818c2ecf20Sopenharmony_ci	E(ELNRNG),
828c2ecf20Sopenharmony_ci	E(ELOOP),
838c2ecf20Sopenharmony_ci	E(EMEDIUMTYPE),
848c2ecf20Sopenharmony_ci	E(EMFILE),
858c2ecf20Sopenharmony_ci	E(EMLINK),
868c2ecf20Sopenharmony_ci	E(EMSGSIZE),
878c2ecf20Sopenharmony_ci	E(EMULTIHOP),
888c2ecf20Sopenharmony_ci	E(ENAMETOOLONG),
898c2ecf20Sopenharmony_ci	E(ENAVAIL),
908c2ecf20Sopenharmony_ci	E(ENETDOWN),
918c2ecf20Sopenharmony_ci	E(ENETRESET),
928c2ecf20Sopenharmony_ci	E(ENETUNREACH),
938c2ecf20Sopenharmony_ci	E(ENFILE),
948c2ecf20Sopenharmony_ci	E(ENOANO),
958c2ecf20Sopenharmony_ci	E(ENOBUFS),
968c2ecf20Sopenharmony_ci	E(ENOCSI),
978c2ecf20Sopenharmony_ci	E(ENODATA),
988c2ecf20Sopenharmony_ci	E(ENODEV),
998c2ecf20Sopenharmony_ci	E(ENOENT),
1008c2ecf20Sopenharmony_ci	E(ENOEXEC),
1018c2ecf20Sopenharmony_ci	E(ENOKEY),
1028c2ecf20Sopenharmony_ci	E(ENOLCK),
1038c2ecf20Sopenharmony_ci	E(ENOLINK),
1048c2ecf20Sopenharmony_ci	E(ENOMEDIUM),
1058c2ecf20Sopenharmony_ci	E(ENOMEM),
1068c2ecf20Sopenharmony_ci	E(ENOMSG),
1078c2ecf20Sopenharmony_ci	E(ENONET),
1088c2ecf20Sopenharmony_ci	E(ENOPKG),
1098c2ecf20Sopenharmony_ci	E(ENOPROTOOPT),
1108c2ecf20Sopenharmony_ci	E(ENOSPC),
1118c2ecf20Sopenharmony_ci	E(ENOSR),
1128c2ecf20Sopenharmony_ci	E(ENOSTR),
1138c2ecf20Sopenharmony_ci	E(ENOSYS),
1148c2ecf20Sopenharmony_ci	E(ENOTBLK),
1158c2ecf20Sopenharmony_ci	E(ENOTCONN),
1168c2ecf20Sopenharmony_ci	E(ENOTDIR),
1178c2ecf20Sopenharmony_ci	E(ENOTEMPTY),
1188c2ecf20Sopenharmony_ci	E(ENOTNAM),
1198c2ecf20Sopenharmony_ci	E(ENOTRECOVERABLE),
1208c2ecf20Sopenharmony_ci	E(ENOTSOCK),
1218c2ecf20Sopenharmony_ci	E(ENOTTY),
1228c2ecf20Sopenharmony_ci	E(ENOTUNIQ),
1238c2ecf20Sopenharmony_ci	E(ENXIO),
1248c2ecf20Sopenharmony_ci	E(EOPNOTSUPP),
1258c2ecf20Sopenharmony_ci	E(EOVERFLOW),
1268c2ecf20Sopenharmony_ci	E(EOWNERDEAD),
1278c2ecf20Sopenharmony_ci	E(EPERM),
1288c2ecf20Sopenharmony_ci	E(EPFNOSUPPORT),
1298c2ecf20Sopenharmony_ci	E(EPIPE),
1308c2ecf20Sopenharmony_ci#ifdef EPROCLIM
1318c2ecf20Sopenharmony_ci	E(EPROCLIM),
1328c2ecf20Sopenharmony_ci#endif
1338c2ecf20Sopenharmony_ci	E(EPROTO),
1348c2ecf20Sopenharmony_ci	E(EPROTONOSUPPORT),
1358c2ecf20Sopenharmony_ci	E(EPROTOTYPE),
1368c2ecf20Sopenharmony_ci	E(ERANGE),
1378c2ecf20Sopenharmony_ci	E(EREMCHG),
1388c2ecf20Sopenharmony_ci#ifdef EREMDEV
1398c2ecf20Sopenharmony_ci	E(EREMDEV),
1408c2ecf20Sopenharmony_ci#endif
1418c2ecf20Sopenharmony_ci	E(EREMOTE),
1428c2ecf20Sopenharmony_ci	E(EREMOTEIO),
1438c2ecf20Sopenharmony_ci	E(ERESTART),
1448c2ecf20Sopenharmony_ci	E(ERFKILL),
1458c2ecf20Sopenharmony_ci	E(EROFS),
1468c2ecf20Sopenharmony_ci#ifdef ERREMOTE
1478c2ecf20Sopenharmony_ci	E(ERREMOTE),
1488c2ecf20Sopenharmony_ci#endif
1498c2ecf20Sopenharmony_ci	E(ESHUTDOWN),
1508c2ecf20Sopenharmony_ci	E(ESOCKTNOSUPPORT),
1518c2ecf20Sopenharmony_ci	E(ESPIPE),
1528c2ecf20Sopenharmony_ci	E(ESRCH),
1538c2ecf20Sopenharmony_ci	E(ESRMNT),
1548c2ecf20Sopenharmony_ci	E(ESTALE),
1558c2ecf20Sopenharmony_ci	E(ESTRPIPE),
1568c2ecf20Sopenharmony_ci	E(ETIME),
1578c2ecf20Sopenharmony_ci	E(ETIMEDOUT),
1588c2ecf20Sopenharmony_ci	E(ETOOMANYREFS),
1598c2ecf20Sopenharmony_ci	E(ETXTBSY),
1608c2ecf20Sopenharmony_ci	E(EUCLEAN),
1618c2ecf20Sopenharmony_ci	E(EUNATCH),
1628c2ecf20Sopenharmony_ci	E(EUSERS),
1638c2ecf20Sopenharmony_ci	E(EXDEV),
1648c2ecf20Sopenharmony_ci	E(EXFULL),
1658c2ecf20Sopenharmony_ci};
1668c2ecf20Sopenharmony_ci#undef E
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci#ifdef EREFUSED /* parisc */
1698c2ecf20Sopenharmony_cistatic_assert(EREFUSED == ECONNREFUSED);
1708c2ecf20Sopenharmony_ci#endif
1718c2ecf20Sopenharmony_ci#ifdef ECANCELLED /* parisc */
1728c2ecf20Sopenharmony_cistatic_assert(ECANCELLED == ECANCELED);
1738c2ecf20Sopenharmony_ci#endif
1748c2ecf20Sopenharmony_cistatic_assert(EAGAIN == EWOULDBLOCK); /* everywhere */
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci#define E(err) [err - 512 + BUILD_BUG_ON_ZERO(err < 512 || err > 550)] = "-" #err
1778c2ecf20Sopenharmony_cistatic const char *names_512[] = {
1788c2ecf20Sopenharmony_ci	E(ERESTARTSYS),
1798c2ecf20Sopenharmony_ci	E(ERESTARTNOINTR),
1808c2ecf20Sopenharmony_ci	E(ERESTARTNOHAND),
1818c2ecf20Sopenharmony_ci	E(ENOIOCTLCMD),
1828c2ecf20Sopenharmony_ci	E(ERESTART_RESTARTBLOCK),
1838c2ecf20Sopenharmony_ci	E(EPROBE_DEFER),
1848c2ecf20Sopenharmony_ci	E(EOPENSTALE),
1858c2ecf20Sopenharmony_ci	E(ENOPARAM),
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ci	E(EBADHANDLE),
1888c2ecf20Sopenharmony_ci	E(ENOTSYNC),
1898c2ecf20Sopenharmony_ci	E(EBADCOOKIE),
1908c2ecf20Sopenharmony_ci	E(ENOTSUPP),
1918c2ecf20Sopenharmony_ci	E(ETOOSMALL),
1928c2ecf20Sopenharmony_ci	E(ESERVERFAULT),
1938c2ecf20Sopenharmony_ci	E(EBADTYPE),
1948c2ecf20Sopenharmony_ci	E(EJUKEBOX),
1958c2ecf20Sopenharmony_ci	E(EIOCBQUEUED),
1968c2ecf20Sopenharmony_ci	E(ERECALLCONFLICT),
1978c2ecf20Sopenharmony_ci};
1988c2ecf20Sopenharmony_ci#undef E
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistatic const char *__errname(unsigned err)
2018c2ecf20Sopenharmony_ci{
2028c2ecf20Sopenharmony_ci	if (err < ARRAY_SIZE(names_0))
2038c2ecf20Sopenharmony_ci		return names_0[err];
2048c2ecf20Sopenharmony_ci	if (err >= 512 && err - 512 < ARRAY_SIZE(names_512))
2058c2ecf20Sopenharmony_ci		return names_512[err - 512];
2068c2ecf20Sopenharmony_ci	/* But why? */
2078c2ecf20Sopenharmony_ci	if (IS_ENABLED(CONFIG_MIPS) && err == EDQUOT) /* 1133 */
2088c2ecf20Sopenharmony_ci		return "-EDQUOT";
2098c2ecf20Sopenharmony_ci	return NULL;
2108c2ecf20Sopenharmony_ci}
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci/*
2138c2ecf20Sopenharmony_ci * errname(EIO) -> "EIO"
2148c2ecf20Sopenharmony_ci * errname(-EIO) -> "-EIO"
2158c2ecf20Sopenharmony_ci */
2168c2ecf20Sopenharmony_ciconst char *errname(int err)
2178c2ecf20Sopenharmony_ci{
2188c2ecf20Sopenharmony_ci	const char *name = __errname(abs(err));
2198c2ecf20Sopenharmony_ci	if (!name)
2208c2ecf20Sopenharmony_ci		return NULL;
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	return err > 0 ? name + 1 : name;
2238c2ecf20Sopenharmony_ci}
224