xref: /openbmc/linux/lib/errname.c (revision b97d6790d03b763eca08847a9a5869a4291b9f9a)
157f5677eSRasmus Villemoes // SPDX-License-Identifier: GPL-2.0
257f5677eSRasmus Villemoes #include <linux/build_bug.h>
357f5677eSRasmus Villemoes #include <linux/errno.h>
457f5677eSRasmus Villemoes #include <linux/errname.h>
557f5677eSRasmus Villemoes #include <linux/kernel.h>
6aa6159abSAndy Shevchenko #include <linux/math.h>
757f5677eSRasmus Villemoes 
857f5677eSRasmus Villemoes /*
957f5677eSRasmus Villemoes  * Ensure these tables do not accidentally become gigantic if some
1057f5677eSRasmus Villemoes  * huge errno makes it in. On most architectures, the first table will
1157f5677eSRasmus Villemoes  * only have about 140 entries, but mips and parisc have more sparsely
1257f5677eSRasmus Villemoes  * allocated errnos (with EHWPOISON = 257 on parisc, and EDQUOT = 1133
1357f5677eSRasmus Villemoes  * on mips), so this wastes a bit of space on those - though we
1457f5677eSRasmus Villemoes  * special case the EDQUOT case.
1557f5677eSRasmus Villemoes  */
1657f5677eSRasmus Villemoes #define E(err) [err + BUILD_BUG_ON_ZERO(err <= 0 || err > 300)] = "-" #err
1757f5677eSRasmus Villemoes static const char *names_0[] = {
1857f5677eSRasmus Villemoes 	E(E2BIG),
1957f5677eSRasmus Villemoes 	E(EACCES),
2057f5677eSRasmus Villemoes 	E(EADDRINUSE),
2157f5677eSRasmus Villemoes 	E(EADDRNOTAVAIL),
2257f5677eSRasmus Villemoes 	E(EADV),
2357f5677eSRasmus Villemoes 	E(EAFNOSUPPORT),
24*0c2baf65SArnd Bergmann 	E(EAGAIN), /* EWOULDBLOCK */
2557f5677eSRasmus Villemoes 	E(EALREADY),
2657f5677eSRasmus Villemoes 	E(EBADE),
2757f5677eSRasmus Villemoes 	E(EBADF),
2857f5677eSRasmus Villemoes 	E(EBADFD),
2957f5677eSRasmus Villemoes 	E(EBADMSG),
3057f5677eSRasmus Villemoes 	E(EBADR),
3157f5677eSRasmus Villemoes 	E(EBADRQC),
3257f5677eSRasmus Villemoes 	E(EBADSLT),
3357f5677eSRasmus Villemoes 	E(EBFONT),
3457f5677eSRasmus Villemoes 	E(EBUSY),
35*0c2baf65SArnd Bergmann 	E(ECANCELED), /* ECANCELLED */
3657f5677eSRasmus Villemoes 	E(ECHILD),
3757f5677eSRasmus Villemoes 	E(ECHRNG),
3857f5677eSRasmus Villemoes 	E(ECOMM),
3957f5677eSRasmus Villemoes 	E(ECONNABORTED),
40*0c2baf65SArnd Bergmann 	E(ECONNREFUSED), /* EREFUSED */
4157f5677eSRasmus Villemoes 	E(ECONNRESET),
42*0c2baf65SArnd Bergmann 	E(EDEADLK), /* EDEADLOCK */
43*0c2baf65SArnd Bergmann #if EDEADLK != EDEADLOCK /* mips, sparc, powerpc */
4457f5677eSRasmus Villemoes 	E(EDEADLOCK),
45*0c2baf65SArnd Bergmann #endif
4657f5677eSRasmus Villemoes 	E(EDESTADDRREQ),
4757f5677eSRasmus Villemoes 	E(EDOM),
4857f5677eSRasmus Villemoes 	E(EDOTDOT),
4957f5677eSRasmus Villemoes #ifndef CONFIG_MIPS
5057f5677eSRasmus Villemoes 	E(EDQUOT),
5157f5677eSRasmus Villemoes #endif
5257f5677eSRasmus Villemoes 	E(EEXIST),
5357f5677eSRasmus Villemoes 	E(EFAULT),
5457f5677eSRasmus Villemoes 	E(EFBIG),
5557f5677eSRasmus Villemoes 	E(EHOSTDOWN),
5657f5677eSRasmus Villemoes 	E(EHOSTUNREACH),
5757f5677eSRasmus Villemoes 	E(EHWPOISON),
5857f5677eSRasmus Villemoes 	E(EIDRM),
5957f5677eSRasmus Villemoes 	E(EILSEQ),
6057f5677eSRasmus Villemoes #ifdef EINIT
6157f5677eSRasmus Villemoes 	E(EINIT),
6257f5677eSRasmus Villemoes #endif
6357f5677eSRasmus Villemoes 	E(EINPROGRESS),
6457f5677eSRasmus Villemoes 	E(EINTR),
6557f5677eSRasmus Villemoes 	E(EINVAL),
6657f5677eSRasmus Villemoes 	E(EIO),
6757f5677eSRasmus Villemoes 	E(EISCONN),
6857f5677eSRasmus Villemoes 	E(EISDIR),
6957f5677eSRasmus Villemoes 	E(EISNAM),
7057f5677eSRasmus Villemoes 	E(EKEYEXPIRED),
7157f5677eSRasmus Villemoes 	E(EKEYREJECTED),
7257f5677eSRasmus Villemoes 	E(EKEYREVOKED),
7357f5677eSRasmus Villemoes 	E(EL2HLT),
7457f5677eSRasmus Villemoes 	E(EL2NSYNC),
7557f5677eSRasmus Villemoes 	E(EL3HLT),
7657f5677eSRasmus Villemoes 	E(EL3RST),
7757f5677eSRasmus Villemoes 	E(ELIBACC),
7857f5677eSRasmus Villemoes 	E(ELIBBAD),
7957f5677eSRasmus Villemoes 	E(ELIBEXEC),
8057f5677eSRasmus Villemoes 	E(ELIBMAX),
8157f5677eSRasmus Villemoes 	E(ELIBSCN),
8257f5677eSRasmus Villemoes 	E(ELNRNG),
8357f5677eSRasmus Villemoes 	E(ELOOP),
8457f5677eSRasmus Villemoes 	E(EMEDIUMTYPE),
8557f5677eSRasmus Villemoes 	E(EMFILE),
8657f5677eSRasmus Villemoes 	E(EMLINK),
8757f5677eSRasmus Villemoes 	E(EMSGSIZE),
8857f5677eSRasmus Villemoes 	E(EMULTIHOP),
8957f5677eSRasmus Villemoes 	E(ENAMETOOLONG),
9057f5677eSRasmus Villemoes 	E(ENAVAIL),
9157f5677eSRasmus Villemoes 	E(ENETDOWN),
9257f5677eSRasmus Villemoes 	E(ENETRESET),
9357f5677eSRasmus Villemoes 	E(ENETUNREACH),
9457f5677eSRasmus Villemoes 	E(ENFILE),
9557f5677eSRasmus Villemoes 	E(ENOANO),
9657f5677eSRasmus Villemoes 	E(ENOBUFS),
9757f5677eSRasmus Villemoes 	E(ENOCSI),
9857f5677eSRasmus Villemoes 	E(ENODATA),
9957f5677eSRasmus Villemoes 	E(ENODEV),
10057f5677eSRasmus Villemoes 	E(ENOENT),
10157f5677eSRasmus Villemoes 	E(ENOEXEC),
10257f5677eSRasmus Villemoes 	E(ENOKEY),
10357f5677eSRasmus Villemoes 	E(ENOLCK),
10457f5677eSRasmus Villemoes 	E(ENOLINK),
10557f5677eSRasmus Villemoes 	E(ENOMEDIUM),
10657f5677eSRasmus Villemoes 	E(ENOMEM),
10757f5677eSRasmus Villemoes 	E(ENOMSG),
10857f5677eSRasmus Villemoes 	E(ENONET),
10957f5677eSRasmus Villemoes 	E(ENOPKG),
11057f5677eSRasmus Villemoes 	E(ENOPROTOOPT),
11157f5677eSRasmus Villemoes 	E(ENOSPC),
11257f5677eSRasmus Villemoes 	E(ENOSR),
11357f5677eSRasmus Villemoes 	E(ENOSTR),
11457f5677eSRasmus Villemoes 	E(ENOSYS),
11557f5677eSRasmus Villemoes 	E(ENOTBLK),
11657f5677eSRasmus Villemoes 	E(ENOTCONN),
11757f5677eSRasmus Villemoes 	E(ENOTDIR),
11857f5677eSRasmus Villemoes 	E(ENOTEMPTY),
11957f5677eSRasmus Villemoes 	E(ENOTNAM),
12057f5677eSRasmus Villemoes 	E(ENOTRECOVERABLE),
12157f5677eSRasmus Villemoes 	E(ENOTSOCK),
12257f5677eSRasmus Villemoes 	E(ENOTTY),
12357f5677eSRasmus Villemoes 	E(ENOTUNIQ),
12457f5677eSRasmus Villemoes 	E(ENXIO),
12557f5677eSRasmus Villemoes 	E(EOPNOTSUPP),
12657f5677eSRasmus Villemoes 	E(EOVERFLOW),
12757f5677eSRasmus Villemoes 	E(EOWNERDEAD),
12857f5677eSRasmus Villemoes 	E(EPERM),
12957f5677eSRasmus Villemoes 	E(EPFNOSUPPORT),
13057f5677eSRasmus Villemoes 	E(EPIPE),
13157f5677eSRasmus Villemoes #ifdef EPROCLIM
13257f5677eSRasmus Villemoes 	E(EPROCLIM),
13357f5677eSRasmus Villemoes #endif
13457f5677eSRasmus Villemoes 	E(EPROTO),
13557f5677eSRasmus Villemoes 	E(EPROTONOSUPPORT),
13657f5677eSRasmus Villemoes 	E(EPROTOTYPE),
13757f5677eSRasmus Villemoes 	E(ERANGE),
13857f5677eSRasmus Villemoes 	E(EREMCHG),
13957f5677eSRasmus Villemoes #ifdef EREMDEV
14057f5677eSRasmus Villemoes 	E(EREMDEV),
14157f5677eSRasmus Villemoes #endif
14257f5677eSRasmus Villemoes 	E(EREMOTE),
14357f5677eSRasmus Villemoes 	E(EREMOTEIO),
14457f5677eSRasmus Villemoes 	E(ERESTART),
14557f5677eSRasmus Villemoes 	E(ERFKILL),
14657f5677eSRasmus Villemoes 	E(EROFS),
14757f5677eSRasmus Villemoes #ifdef ERREMOTE
14857f5677eSRasmus Villemoes 	E(ERREMOTE),
14957f5677eSRasmus Villemoes #endif
15057f5677eSRasmus Villemoes 	E(ESHUTDOWN),
15157f5677eSRasmus Villemoes 	E(ESOCKTNOSUPPORT),
15257f5677eSRasmus Villemoes 	E(ESPIPE),
15357f5677eSRasmus Villemoes 	E(ESRCH),
15457f5677eSRasmus Villemoes 	E(ESRMNT),
15557f5677eSRasmus Villemoes 	E(ESTALE),
15657f5677eSRasmus Villemoes 	E(ESTRPIPE),
15757f5677eSRasmus Villemoes 	E(ETIME),
15857f5677eSRasmus Villemoes 	E(ETIMEDOUT),
15957f5677eSRasmus Villemoes 	E(ETOOMANYREFS),
16057f5677eSRasmus Villemoes 	E(ETXTBSY),
16157f5677eSRasmus Villemoes 	E(EUCLEAN),
16257f5677eSRasmus Villemoes 	E(EUNATCH),
16357f5677eSRasmus Villemoes 	E(EUSERS),
16457f5677eSRasmus Villemoes 	E(EXDEV),
16557f5677eSRasmus Villemoes 	E(EXFULL),
16657f5677eSRasmus Villemoes };
16757f5677eSRasmus Villemoes #undef E
16857f5677eSRasmus Villemoes 
169*0c2baf65SArnd Bergmann #ifdef EREFUSED /* parisc */
170*0c2baf65SArnd Bergmann static_assert(EREFUSED == ECONNREFUSED);
171*0c2baf65SArnd Bergmann #endif
172*0c2baf65SArnd Bergmann #ifdef ECANCELLED /* parisc */
173*0c2baf65SArnd Bergmann static_assert(ECANCELLED == ECANCELED);
174*0c2baf65SArnd Bergmann #endif
175*0c2baf65SArnd Bergmann static_assert(EAGAIN == EWOULDBLOCK); /* everywhere */
176*0c2baf65SArnd Bergmann 
17757f5677eSRasmus Villemoes #define E(err) [err - 512 + BUILD_BUG_ON_ZERO(err < 512 || err > 550)] = "-" #err
17857f5677eSRasmus Villemoes static const char *names_512[] = {
17957f5677eSRasmus Villemoes 	E(ERESTARTSYS),
18057f5677eSRasmus Villemoes 	E(ERESTARTNOINTR),
18157f5677eSRasmus Villemoes 	E(ERESTARTNOHAND),
18257f5677eSRasmus Villemoes 	E(ENOIOCTLCMD),
18357f5677eSRasmus Villemoes 	E(ERESTART_RESTARTBLOCK),
18457f5677eSRasmus Villemoes 	E(EPROBE_DEFER),
18557f5677eSRasmus Villemoes 	E(EOPENSTALE),
18657f5677eSRasmus Villemoes 	E(ENOPARAM),
18757f5677eSRasmus Villemoes 
18857f5677eSRasmus Villemoes 	E(EBADHANDLE),
18957f5677eSRasmus Villemoes 	E(ENOTSYNC),
19057f5677eSRasmus Villemoes 	E(EBADCOOKIE),
19157f5677eSRasmus Villemoes 	E(ENOTSUPP),
19257f5677eSRasmus Villemoes 	E(ETOOSMALL),
19357f5677eSRasmus Villemoes 	E(ESERVERFAULT),
19457f5677eSRasmus Villemoes 	E(EBADTYPE),
19557f5677eSRasmus Villemoes 	E(EJUKEBOX),
19657f5677eSRasmus Villemoes 	E(EIOCBQUEUED),
19757f5677eSRasmus Villemoes 	E(ERECALLCONFLICT),
19857f5677eSRasmus Villemoes };
19957f5677eSRasmus Villemoes #undef E
20057f5677eSRasmus Villemoes 
__errname(unsigned err)20157f5677eSRasmus Villemoes static const char *__errname(unsigned err)
20257f5677eSRasmus Villemoes {
20357f5677eSRasmus Villemoes 	if (err < ARRAY_SIZE(names_0))
20457f5677eSRasmus Villemoes 		return names_0[err];
20557f5677eSRasmus Villemoes 	if (err >= 512 && err - 512 < ARRAY_SIZE(names_512))
20657f5677eSRasmus Villemoes 		return names_512[err - 512];
20757f5677eSRasmus Villemoes 	/* But why? */
20857f5677eSRasmus Villemoes 	if (IS_ENABLED(CONFIG_MIPS) && err == EDQUOT) /* 1133 */
20957f5677eSRasmus Villemoes 		return "-EDQUOT";
21057f5677eSRasmus Villemoes 	return NULL;
21157f5677eSRasmus Villemoes }
21257f5677eSRasmus Villemoes 
21357f5677eSRasmus Villemoes /*
21457f5677eSRasmus Villemoes  * errname(EIO) -> "EIO"
21557f5677eSRasmus Villemoes  * errname(-EIO) -> "-EIO"
21657f5677eSRasmus Villemoes  */
errname(int err)21757f5677eSRasmus Villemoes const char *errname(int err)
21857f5677eSRasmus Villemoes {
21957f5677eSRasmus Villemoes 	const char *name = __errname(abs(err));
22057f5677eSRasmus Villemoes 	if (!name)
22157f5677eSRasmus Villemoes 		return NULL;
22257f5677eSRasmus Villemoes 
22357f5677eSRasmus Villemoes 	return err > 0 ? name + 1 : name;
22457f5677eSRasmus Villemoes }
225