xref: /linux/lib/errname.c (revision ab52c59103002b49f2455371e4b9c56ba3ef1781)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/build_bug.h>
3 #include <linux/errno.h>
4 #include <linux/errname.h>
5 #include <linux/kernel.h>
6 #include <linux/math.h>
7 
8 /*
9  * Ensure these tables do not accidentally become gigantic if some
10  * huge errno makes it in. On most architectures, the first table will
11  * only have about 140 entries, but mips and parisc have more sparsely
12  * allocated errnos (with EHWPOISON = 257 on parisc, and EDQUOT = 1133
13  * on mips), so this wastes a bit of space on those - though we
14  * special case the EDQUOT case.
15  */
16 #define E(err) [err + BUILD_BUG_ON_ZERO(err <= 0 || err > 300)] = "-" #err
17 static const char *names_0[] = {
18 	E(E2BIG),
19 	E(EACCES),
20 	E(EADDRINUSE),
21 	E(EADDRNOTAVAIL),
22 	E(EADV),
23 	E(EAFNOSUPPORT),
24 	E(EAGAIN), /* EWOULDBLOCK */
25 	E(EALREADY),
26 	E(EBADE),
27 	E(EBADF),
28 	E(EBADFD),
29 	E(EBADMSG),
30 	E(EBADR),
31 	E(EBADRQC),
32 	E(EBADSLT),
33 	E(EBFONT),
34 	E(EBUSY),
35 	E(ECANCELED), /* ECANCELLED */
36 	E(ECHILD),
37 	E(ECHRNG),
38 	E(ECOMM),
39 	E(ECONNABORTED),
40 	E(ECONNREFUSED), /* EREFUSED */
41 	E(ECONNRESET),
42 	E(EDEADLK), /* EDEADLOCK */
43 #if EDEADLK != EDEADLOCK /* mips, sparc, powerpc */
44 	E(EDEADLOCK),
45 #endif
46 	E(EDESTADDRREQ),
47 	E(EDOM),
48 	E(EDOTDOT),
49 #ifndef CONFIG_MIPS
50 	E(EDQUOT),
51 #endif
52 	E(EEXIST),
53 	E(EFAULT),
54 	E(EFBIG),
55 	E(EHOSTDOWN),
56 	E(EHOSTUNREACH),
57 	E(EHWPOISON),
58 	E(EIDRM),
59 	E(EILSEQ),
60 #ifdef EINIT
61 	E(EINIT),
62 #endif
63 	E(EINPROGRESS),
64 	E(EINTR),
65 	E(EINVAL),
66 	E(EIO),
67 	E(EISCONN),
68 	E(EISDIR),
69 	E(EISNAM),
70 	E(EKEYEXPIRED),
71 	E(EKEYREJECTED),
72 	E(EKEYREVOKED),
73 	E(EL2HLT),
74 	E(EL2NSYNC),
75 	E(EL3HLT),
76 	E(EL3RST),
77 	E(ELIBACC),
78 	E(ELIBBAD),
79 	E(ELIBEXEC),
80 	E(ELIBMAX),
81 	E(ELIBSCN),
82 	E(ELNRNG),
83 	E(ELOOP),
84 	E(EMEDIUMTYPE),
85 	E(EMFILE),
86 	E(EMLINK),
87 	E(EMSGSIZE),
88 	E(EMULTIHOP),
89 	E(ENAMETOOLONG),
90 	E(ENAVAIL),
91 	E(ENETDOWN),
92 	E(ENETRESET),
93 	E(ENETUNREACH),
94 	E(ENFILE),
95 	E(ENOANO),
96 	E(ENOBUFS),
97 	E(ENOCSI),
98 	E(ENODATA),
99 	E(ENODEV),
100 	E(ENOENT),
101 	E(ENOEXEC),
102 	E(ENOKEY),
103 	E(ENOLCK),
104 	E(ENOLINK),
105 	E(ENOMEDIUM),
106 	E(ENOMEM),
107 	E(ENOMSG),
108 	E(ENONET),
109 	E(ENOPKG),
110 	E(ENOPROTOOPT),
111 	E(ENOSPC),
112 	E(ENOSR),
113 	E(ENOSTR),
114 	E(ENOSYS),
115 	E(ENOTBLK),
116 	E(ENOTCONN),
117 	E(ENOTDIR),
118 	E(ENOTEMPTY),
119 	E(ENOTNAM),
120 	E(ENOTRECOVERABLE),
121 	E(ENOTSOCK),
122 	E(ENOTTY),
123 	E(ENOTUNIQ),
124 	E(ENXIO),
125 	E(EOPNOTSUPP),
126 	E(EOVERFLOW),
127 	E(EOWNERDEAD),
128 	E(EPERM),
129 	E(EPFNOSUPPORT),
130 	E(EPIPE),
131 #ifdef EPROCLIM
132 	E(EPROCLIM),
133 #endif
134 	E(EPROTO),
135 	E(EPROTONOSUPPORT),
136 	E(EPROTOTYPE),
137 	E(ERANGE),
138 	E(EREMCHG),
139 #ifdef EREMDEV
140 	E(EREMDEV),
141 #endif
142 	E(EREMOTE),
143 	E(EREMOTEIO),
144 	E(ERESTART),
145 	E(ERFKILL),
146 	E(EROFS),
147 #ifdef ERREMOTE
148 	E(ERREMOTE),
149 #endif
150 	E(ESHUTDOWN),
151 	E(ESOCKTNOSUPPORT),
152 	E(ESPIPE),
153 	E(ESRCH),
154 	E(ESRMNT),
155 	E(ESTALE),
156 	E(ESTRPIPE),
157 	E(ETIME),
158 	E(ETIMEDOUT),
159 	E(ETOOMANYREFS),
160 	E(ETXTBSY),
161 	E(EUCLEAN),
162 	E(EUNATCH),
163 	E(EUSERS),
164 	E(EXDEV),
165 	E(EXFULL),
166 };
167 #undef E
168 
169 #ifdef EREFUSED /* parisc */
170 static_assert(EREFUSED == ECONNREFUSED);
171 #endif
172 #ifdef ECANCELLED /* parisc */
173 static_assert(ECANCELLED == ECANCELED);
174 #endif
175 static_assert(EAGAIN == EWOULDBLOCK); /* everywhere */
176 
177 #define E(err) [err - 512 + BUILD_BUG_ON_ZERO(err < 512 || err > 550)] = "-" #err
178 static const char *names_512[] = {
179 	E(ERESTARTSYS),
180 	E(ERESTARTNOINTR),
181 	E(ERESTARTNOHAND),
182 	E(ENOIOCTLCMD),
183 	E(ERESTART_RESTARTBLOCK),
184 	E(EPROBE_DEFER),
185 	E(EOPENSTALE),
186 	E(ENOPARAM),
187 
188 	E(EBADHANDLE),
189 	E(ENOTSYNC),
190 	E(EBADCOOKIE),
191 	E(ENOTSUPP),
192 	E(ETOOSMALL),
193 	E(ESERVERFAULT),
194 	E(EBADTYPE),
195 	E(EJUKEBOX),
196 	E(EIOCBQUEUED),
197 	E(ERECALLCONFLICT),
198 };
199 #undef E
200 
201 static const char *__errname(unsigned err)
202 {
203 	if (err < ARRAY_SIZE(names_0))
204 		return names_0[err];
205 	if (err >= 512 && err - 512 < ARRAY_SIZE(names_512))
206 		return names_512[err - 512];
207 	/* But why? */
208 	if (IS_ENABLED(CONFIG_MIPS) && err == EDQUOT) /* 1133 */
209 		return "-EDQUOT";
210 	return NULL;
211 }
212 
213 /*
214  * errname(EIO) -> "EIO"
215  * errname(-EIO) -> "-EIO"
216  */
217 const char *errname(int err)
218 {
219 	const char *name = __errname(abs(err));
220 	if (!name)
221 		return NULL;
222 
223 	return err > 0 ? name + 1 : name;
224 }
225 EXPORT_SYMBOL(errname);
226