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