]>
Commit | Line | Data |
---|---|---|
57f5677e RV |
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> | |
aa6159ab | 6 | #include <linux/math.h> |
57f5677e RV |
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), | |
0c2baf65 | 24 | E(EAGAIN), /* EWOULDBLOCK */ |
57f5677e RV |
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), | |
0c2baf65 | 35 | E(ECANCELED), /* ECANCELLED */ |
57f5677e RV |
36 | E(ECHILD), |
37 | E(ECHRNG), | |
38 | E(ECOMM), | |
39 | E(ECONNABORTED), | |
0c2baf65 | 40 | E(ECONNREFUSED), /* EREFUSED */ |
57f5677e | 41 | E(ECONNRESET), |
0c2baf65 AB |
42 | E(EDEADLK), /* EDEADLOCK */ |
43 | #if EDEADLK != EDEADLOCK /* mips, sparc, powerpc */ | |
57f5677e | 44 | E(EDEADLOCK), |
0c2baf65 | 45 | #endif |
57f5677e RV |
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), | |
57f5677e RV |
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), | |
57f5677e RV |
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), | |
57f5677e RV |
166 | }; |
167 | #undef E | |
168 | ||
0c2baf65 AB |
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 | ||
57f5677e RV |
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 | } | |
21db9314 | 225 | EXPORT_SYMBOL(errname); |