strerror.c revision 1.1.1.3 1 1.1 skrll /* Extended support for using errno values.
2 1.1 skrll Written by Fred Fish. fnf (at) cygnus.com
3 1.1 skrll This file is in the public domain. --Per Bothner. */
4 1.1 skrll
5 1.1 skrll #include "config.h"
6 1.1 skrll
7 1.1 skrll #ifdef HAVE_SYS_ERRLIST
8 1.1 skrll /* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least)
9 1.1 skrll might declare sys_errlist in a way that the compiler might consider
10 1.1 skrll incompatible with our later declaration, perhaps by using const
11 1.1 skrll attributes. So we hide the declaration in errno.h (if any) using a
12 1.1 skrll macro. */
13 1.1 skrll #define sys_nerr sys_nerr__
14 1.1 skrll #define sys_errlist sys_errlist__
15 1.1 skrll #endif
16 1.1 skrll
17 1.1 skrll #include "ansidecl.h"
18 1.1 skrll #include "libiberty.h"
19 1.1 skrll
20 1.1 skrll #include <stdio.h>
21 1.1 skrll #include <errno.h>
22 1.1 skrll
23 1.1 skrll #ifdef HAVE_SYS_ERRLIST
24 1.1 skrll #undef sys_nerr
25 1.1 skrll #undef sys_errlist
26 1.1 skrll #endif
27 1.1 skrll
28 1.1 skrll /* Routines imported from standard C runtime libraries. */
29 1.1 skrll
30 1.1 skrll #ifdef HAVE_STDLIB_H
31 1.1 skrll #include <stdlib.h>
32 1.1 skrll #else
33 1.1 skrll extern PTR malloc ();
34 1.1 skrll #endif
35 1.1 skrll
36 1.1 skrll #ifdef HAVE_STRING_H
37 1.1 skrll #include <string.h>
38 1.1 skrll #else
39 1.1 skrll extern PTR memset ();
40 1.1 skrll #endif
41 1.1 skrll
42 1.1 skrll #ifndef MAX
43 1.1 skrll # define MAX(a,b) ((a) > (b) ? (a) : (b))
44 1.1 skrll #endif
45 1.1 skrll
46 1.1 skrll static void init_error_tables (void);
47 1.1 skrll
48 1.1 skrll /* Translation table for errno values. See intro(2) in most UNIX systems
49 1.1 skrll Programmers Reference Manuals.
50 1.1 skrll
51 1.1 skrll Note that this table is generally only accessed when it is used at runtime
52 1.1 skrll to initialize errno name and message tables that are indexed by errno
53 1.1 skrll value.
54 1.1 skrll
55 1.1 skrll Not all of these errnos will exist on all systems. This table is the only
56 1.1 skrll thing that should have to be updated as new error numbers are introduced.
57 1.1 skrll It's sort of ugly, but at least its portable. */
58 1.1 skrll
59 1.1 skrll struct error_info
60 1.1 skrll {
61 1.1 skrll const int value; /* The numeric value from <errno.h> */
62 1.1 skrll const char *const name; /* The equivalent symbolic value */
63 1.1 skrll #ifndef HAVE_SYS_ERRLIST
64 1.1 skrll const char *const msg; /* Short message about this value */
65 1.1 skrll #endif
66 1.1 skrll };
67 1.1 skrll
68 1.1 skrll #ifndef HAVE_SYS_ERRLIST
69 1.1 skrll # define ENTRY(value, name, msg) {value, name, msg}
70 1.1 skrll #else
71 1.1 skrll # define ENTRY(value, name, msg) {value, name}
72 1.1 skrll #endif
73 1.1 skrll
74 1.1 skrll static const struct error_info error_table[] =
75 1.1 skrll {
76 1.1 skrll #if defined (EPERM)
77 1.1 skrll ENTRY(EPERM, "EPERM", "Not owner"),
78 1.1 skrll #endif
79 1.1 skrll #if defined (ENOENT)
80 1.1 skrll ENTRY(ENOENT, "ENOENT", "No such file or directory"),
81 1.1 skrll #endif
82 1.1 skrll #if defined (ESRCH)
83 1.1 skrll ENTRY(ESRCH, "ESRCH", "No such process"),
84 1.1 skrll #endif
85 1.1 skrll #if defined (EINTR)
86 1.1 skrll ENTRY(EINTR, "EINTR", "Interrupted system call"),
87 1.1 skrll #endif
88 1.1 skrll #if defined (EIO)
89 1.1 skrll ENTRY(EIO, "EIO", "I/O error"),
90 1.1 skrll #endif
91 1.1 skrll #if defined (ENXIO)
92 1.1 skrll ENTRY(ENXIO, "ENXIO", "No such device or address"),
93 1.1 skrll #endif
94 1.1 skrll #if defined (E2BIG)
95 1.1 skrll ENTRY(E2BIG, "E2BIG", "Arg list too long"),
96 1.1 skrll #endif
97 1.1 skrll #if defined (ENOEXEC)
98 1.1 skrll ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"),
99 1.1 skrll #endif
100 1.1 skrll #if defined (EBADF)
101 1.1 skrll ENTRY(EBADF, "EBADF", "Bad file number"),
102 1.1 skrll #endif
103 1.1 skrll #if defined (ECHILD)
104 1.1 skrll ENTRY(ECHILD, "ECHILD", "No child processes"),
105 1.1 skrll #endif
106 1.1 skrll #if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */
107 1.1 skrll ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"),
108 1.1 skrll #endif
109 1.1 skrll #if defined (EAGAIN)
110 1.1 skrll ENTRY(EAGAIN, "EAGAIN", "No more processes"),
111 1.1 skrll #endif
112 1.1 skrll #if defined (ENOMEM)
113 1.1 skrll ENTRY(ENOMEM, "ENOMEM", "Not enough space"),
114 1.1 skrll #endif
115 1.1 skrll #if defined (EACCES)
116 1.1 skrll ENTRY(EACCES, "EACCES", "Permission denied"),
117 1.1 skrll #endif
118 1.1 skrll #if defined (EFAULT)
119 1.1 skrll ENTRY(EFAULT, "EFAULT", "Bad address"),
120 1.1 skrll #endif
121 1.1 skrll #if defined (ENOTBLK)
122 1.1 skrll ENTRY(ENOTBLK, "ENOTBLK", "Block device required"),
123 1.1 skrll #endif
124 1.1 skrll #if defined (EBUSY)
125 1.1 skrll ENTRY(EBUSY, "EBUSY", "Device busy"),
126 1.1 skrll #endif
127 1.1 skrll #if defined (EEXIST)
128 1.1 skrll ENTRY(EEXIST, "EEXIST", "File exists"),
129 1.1 skrll #endif
130 1.1 skrll #if defined (EXDEV)
131 1.1 skrll ENTRY(EXDEV, "EXDEV", "Cross-device link"),
132 1.1 skrll #endif
133 1.1 skrll #if defined (ENODEV)
134 1.1 skrll ENTRY(ENODEV, "ENODEV", "No such device"),
135 1.1 skrll #endif
136 1.1 skrll #if defined (ENOTDIR)
137 1.1 skrll ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"),
138 1.1 skrll #endif
139 1.1 skrll #if defined (EISDIR)
140 1.1 skrll ENTRY(EISDIR, "EISDIR", "Is a directory"),
141 1.1 skrll #endif
142 1.1 skrll #if defined (EINVAL)
143 1.1 skrll ENTRY(EINVAL, "EINVAL", "Invalid argument"),
144 1.1 skrll #endif
145 1.1 skrll #if defined (ENFILE)
146 1.1 skrll ENTRY(ENFILE, "ENFILE", "File table overflow"),
147 1.1 skrll #endif
148 1.1 skrll #if defined (EMFILE)
149 1.1 skrll ENTRY(EMFILE, "EMFILE", "Too many open files"),
150 1.1 skrll #endif
151 1.1 skrll #if defined (ENOTTY)
152 1.1 skrll ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"),
153 1.1 skrll #endif
154 1.1 skrll #if defined (ETXTBSY)
155 1.1 skrll ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"),
156 1.1 skrll #endif
157 1.1 skrll #if defined (EFBIG)
158 1.1 skrll ENTRY(EFBIG, "EFBIG", "File too large"),
159 1.1 skrll #endif
160 1.1 skrll #if defined (ENOSPC)
161 1.1 skrll ENTRY(ENOSPC, "ENOSPC", "No space left on device"),
162 1.1 skrll #endif
163 1.1 skrll #if defined (ESPIPE)
164 1.1 skrll ENTRY(ESPIPE, "ESPIPE", "Illegal seek"),
165 1.1 skrll #endif
166 1.1 skrll #if defined (EROFS)
167 1.1 skrll ENTRY(EROFS, "EROFS", "Read-only file system"),
168 1.1 skrll #endif
169 1.1 skrll #if defined (EMLINK)
170 1.1 skrll ENTRY(EMLINK, "EMLINK", "Too many links"),
171 1.1 skrll #endif
172 1.1 skrll #if defined (EPIPE)
173 1.1 skrll ENTRY(EPIPE, "EPIPE", "Broken pipe"),
174 1.1 skrll #endif
175 1.1 skrll #if defined (EDOM)
176 1.1 skrll ENTRY(EDOM, "EDOM", "Math argument out of domain of func"),
177 1.1 skrll #endif
178 1.1 skrll #if defined (ERANGE)
179 1.1 skrll ENTRY(ERANGE, "ERANGE", "Math result not representable"),
180 1.1 skrll #endif
181 1.1 skrll #if defined (ENOMSG)
182 1.1 skrll ENTRY(ENOMSG, "ENOMSG", "No message of desired type"),
183 1.1 skrll #endif
184 1.1 skrll #if defined (EIDRM)
185 1.1 skrll ENTRY(EIDRM, "EIDRM", "Identifier removed"),
186 1.1 skrll #endif
187 1.1 skrll #if defined (ECHRNG)
188 1.1 skrll ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"),
189 1.1 skrll #endif
190 1.1 skrll #if defined (EL2NSYNC)
191 1.1 skrll ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"),
192 1.1 skrll #endif
193 1.1 skrll #if defined (EL3HLT)
194 1.1 skrll ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"),
195 1.1 skrll #endif
196 1.1 skrll #if defined (EL3RST)
197 1.1 skrll ENTRY(EL3RST, "EL3RST", "Level 3 reset"),
198 1.1 skrll #endif
199 1.1 skrll #if defined (ELNRNG)
200 1.1 skrll ENTRY(ELNRNG, "ELNRNG", "Link number out of range"),
201 1.1 skrll #endif
202 1.1 skrll #if defined (EUNATCH)
203 1.1 skrll ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"),
204 1.1 skrll #endif
205 1.1 skrll #if defined (ENOCSI)
206 1.1 skrll ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"),
207 1.1 skrll #endif
208 1.1 skrll #if defined (EL2HLT)
209 1.1 skrll ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"),
210 1.1 skrll #endif
211 1.1 skrll #if defined (EDEADLK)
212 1.1 skrll ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"),
213 1.1 skrll #endif
214 1.1 skrll #if defined (ENOLCK)
215 1.1 skrll ENTRY(ENOLCK, "ENOLCK", "No record locks available"),
216 1.1 skrll #endif
217 1.1 skrll #if defined (EBADE)
218 1.1 skrll ENTRY(EBADE, "EBADE", "Invalid exchange"),
219 1.1 skrll #endif
220 1.1 skrll #if defined (EBADR)
221 1.1 skrll ENTRY(EBADR, "EBADR", "Invalid request descriptor"),
222 1.1 skrll #endif
223 1.1 skrll #if defined (EXFULL)
224 1.1 skrll ENTRY(EXFULL, "EXFULL", "Exchange full"),
225 1.1 skrll #endif
226 1.1 skrll #if defined (ENOANO)
227 1.1 skrll ENTRY(ENOANO, "ENOANO", "No anode"),
228 1.1 skrll #endif
229 1.1 skrll #if defined (EBADRQC)
230 1.1 skrll ENTRY(EBADRQC, "EBADRQC", "Invalid request code"),
231 1.1 skrll #endif
232 1.1 skrll #if defined (EBADSLT)
233 1.1 skrll ENTRY(EBADSLT, "EBADSLT", "Invalid slot"),
234 1.1 skrll #endif
235 1.1 skrll #if defined (EDEADLOCK)
236 1.1 skrll ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"),
237 1.1 skrll #endif
238 1.1 skrll #if defined (EBFONT)
239 1.1 skrll ENTRY(EBFONT, "EBFONT", "Bad font file format"),
240 1.1 skrll #endif
241 1.1 skrll #if defined (ENOSTR)
242 1.1 skrll ENTRY(ENOSTR, "ENOSTR", "Device not a stream"),
243 1.1 skrll #endif
244 1.1 skrll #if defined (ENODATA)
245 1.1 skrll ENTRY(ENODATA, "ENODATA", "No data available"),
246 1.1 skrll #endif
247 1.1 skrll #if defined (ETIME)
248 1.1 skrll ENTRY(ETIME, "ETIME", "Timer expired"),
249 1.1 skrll #endif
250 1.1 skrll #if defined (ENOSR)
251 1.1 skrll ENTRY(ENOSR, "ENOSR", "Out of streams resources"),
252 1.1 skrll #endif
253 1.1 skrll #if defined (ENONET)
254 1.1 skrll ENTRY(ENONET, "ENONET", "Machine is not on the network"),
255 1.1 skrll #endif
256 1.1 skrll #if defined (ENOPKG)
257 1.1 skrll ENTRY(ENOPKG, "ENOPKG", "Package not installed"),
258 1.1 skrll #endif
259 1.1 skrll #if defined (EREMOTE)
260 1.1 skrll ENTRY(EREMOTE, "EREMOTE", "Object is remote"),
261 1.1 skrll #endif
262 1.1 skrll #if defined (ENOLINK)
263 1.1 skrll ENTRY(ENOLINK, "ENOLINK", "Link has been severed"),
264 1.1 skrll #endif
265 1.1 skrll #if defined (EADV)
266 1.1 skrll ENTRY(EADV, "EADV", "Advertise error"),
267 1.1 skrll #endif
268 1.1 skrll #if defined (ESRMNT)
269 1.1 skrll ENTRY(ESRMNT, "ESRMNT", "Srmount error"),
270 1.1 skrll #endif
271 1.1 skrll #if defined (ECOMM)
272 1.1 skrll ENTRY(ECOMM, "ECOMM", "Communication error on send"),
273 1.1 skrll #endif
274 1.1 skrll #if defined (EPROTO)
275 1.1 skrll ENTRY(EPROTO, "EPROTO", "Protocol error"),
276 1.1 skrll #endif
277 1.1 skrll #if defined (EMULTIHOP)
278 1.1 skrll ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"),
279 1.1 skrll #endif
280 1.1 skrll #if defined (EDOTDOT)
281 1.1 skrll ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"),
282 1.1 skrll #endif
283 1.1 skrll #if defined (EBADMSG)
284 1.1 skrll ENTRY(EBADMSG, "EBADMSG", "Not a data message"),
285 1.1 skrll #endif
286 1.1 skrll #if defined (ENAMETOOLONG)
287 1.1 skrll ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"),
288 1.1 skrll #endif
289 1.1 skrll #if defined (EOVERFLOW)
290 1.1 skrll ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"),
291 1.1 skrll #endif
292 1.1 skrll #if defined (ENOTUNIQ)
293 1.1 skrll ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"),
294 1.1 skrll #endif
295 1.1 skrll #if defined (EBADFD)
296 1.1 skrll ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"),
297 1.1 skrll #endif
298 1.1 skrll #if defined (EREMCHG)
299 1.1 skrll ENTRY(EREMCHG, "EREMCHG", "Remote address changed"),
300 1.1 skrll #endif
301 1.1 skrll #if defined (ELIBACC)
302 1.1.1.3 christos ENTRY(ELIBACC, "ELIBACC", "Cannot access a needed shared library"),
303 1.1 skrll #endif
304 1.1 skrll #if defined (ELIBBAD)
305 1.1 skrll ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"),
306 1.1 skrll #endif
307 1.1 skrll #if defined (ELIBSCN)
308 1.1 skrll ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"),
309 1.1 skrll #endif
310 1.1 skrll #if defined (ELIBMAX)
311 1.1 skrll ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"),
312 1.1 skrll #endif
313 1.1 skrll #if defined (ELIBEXEC)
314 1.1 skrll ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"),
315 1.1 skrll #endif
316 1.1 skrll #if defined (EILSEQ)
317 1.1 skrll ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"),
318 1.1 skrll #endif
319 1.1 skrll #if defined (ENOSYS)
320 1.1 skrll ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"),
321 1.1 skrll #endif
322 1.1 skrll #if defined (ELOOP)
323 1.1 skrll ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"),
324 1.1 skrll #endif
325 1.1 skrll #if defined (ERESTART)
326 1.1 skrll ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"),
327 1.1 skrll #endif
328 1.1 skrll #if defined (ESTRPIPE)
329 1.1 skrll ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"),
330 1.1 skrll #endif
331 1.1 skrll #if defined (ENOTEMPTY)
332 1.1 skrll ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"),
333 1.1 skrll #endif
334 1.1 skrll #if defined (EUSERS)
335 1.1 skrll ENTRY(EUSERS, "EUSERS", "Too many users"),
336 1.1 skrll #endif
337 1.1 skrll #if defined (ENOTSOCK)
338 1.1 skrll ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"),
339 1.1 skrll #endif
340 1.1 skrll #if defined (EDESTADDRREQ)
341 1.1 skrll ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"),
342 1.1 skrll #endif
343 1.1 skrll #if defined (EMSGSIZE)
344 1.1 skrll ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"),
345 1.1 skrll #endif
346 1.1 skrll #if defined (EPROTOTYPE)
347 1.1 skrll ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"),
348 1.1 skrll #endif
349 1.1 skrll #if defined (ENOPROTOOPT)
350 1.1 skrll ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"),
351 1.1 skrll #endif
352 1.1 skrll #if defined (EPROTONOSUPPORT)
353 1.1 skrll ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"),
354 1.1 skrll #endif
355 1.1 skrll #if defined (ESOCKTNOSUPPORT)
356 1.1 skrll ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"),
357 1.1 skrll #endif
358 1.1 skrll #if defined (EOPNOTSUPP)
359 1.1 skrll ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"),
360 1.1 skrll #endif
361 1.1 skrll #if defined (EPFNOSUPPORT)
362 1.1 skrll ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"),
363 1.1 skrll #endif
364 1.1 skrll #if defined (EAFNOSUPPORT)
365 1.1 skrll ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"),
366 1.1 skrll #endif
367 1.1 skrll #if defined (EADDRINUSE)
368 1.1 skrll ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"),
369 1.1 skrll #endif
370 1.1 skrll #if defined (EADDRNOTAVAIL)
371 1.1 skrll ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"),
372 1.1 skrll #endif
373 1.1 skrll #if defined (ENETDOWN)
374 1.1 skrll ENTRY(ENETDOWN, "ENETDOWN", "Network is down"),
375 1.1 skrll #endif
376 1.1 skrll #if defined (ENETUNREACH)
377 1.1 skrll ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"),
378 1.1 skrll #endif
379 1.1 skrll #if defined (ENETRESET)
380 1.1 skrll ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"),
381 1.1 skrll #endif
382 1.1 skrll #if defined (ECONNABORTED)
383 1.1 skrll ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"),
384 1.1 skrll #endif
385 1.1 skrll #if defined (ECONNRESET)
386 1.1 skrll ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"),
387 1.1 skrll #endif
388 1.1 skrll #if defined (ENOBUFS)
389 1.1 skrll ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"),
390 1.1 skrll #endif
391 1.1 skrll #if defined (EISCONN)
392 1.1 skrll ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"),
393 1.1 skrll #endif
394 1.1 skrll #if defined (ENOTCONN)
395 1.1 skrll ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"),
396 1.1 skrll #endif
397 1.1 skrll #if defined (ESHUTDOWN)
398 1.1 skrll ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"),
399 1.1 skrll #endif
400 1.1 skrll #if defined (ETOOMANYREFS)
401 1.1 skrll ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"),
402 1.1 skrll #endif
403 1.1 skrll #if defined (ETIMEDOUT)
404 1.1 skrll ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"),
405 1.1 skrll #endif
406 1.1 skrll #if defined (ECONNREFUSED)
407 1.1 skrll ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"),
408 1.1 skrll #endif
409 1.1 skrll #if defined (EHOSTDOWN)
410 1.1 skrll ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"),
411 1.1 skrll #endif
412 1.1 skrll #if defined (EHOSTUNREACH)
413 1.1 skrll ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"),
414 1.1 skrll #endif
415 1.1 skrll #if defined (EALREADY)
416 1.1 skrll ENTRY(EALREADY, "EALREADY", "Operation already in progress"),
417 1.1 skrll #endif
418 1.1 skrll #if defined (EINPROGRESS)
419 1.1 skrll ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"),
420 1.1 skrll #endif
421 1.1 skrll #if defined (ESTALE)
422 1.1 skrll ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"),
423 1.1 skrll #endif
424 1.1 skrll #if defined (EUCLEAN)
425 1.1 skrll ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"),
426 1.1 skrll #endif
427 1.1 skrll #if defined (ENOTNAM)
428 1.1 skrll ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"),
429 1.1 skrll #endif
430 1.1 skrll #if defined (ENAVAIL)
431 1.1 skrll ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"),
432 1.1 skrll #endif
433 1.1 skrll #if defined (EISNAM)
434 1.1 skrll ENTRY(EISNAM, "EISNAM", "Is a named type file"),
435 1.1 skrll #endif
436 1.1 skrll #if defined (EREMOTEIO)
437 1.1 skrll ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"),
438 1.1 skrll #endif
439 1.1 skrll ENTRY(0, NULL, NULL)
440 1.1 skrll };
441 1.1 skrll
442 1.1 skrll #ifdef EVMSERR
443 1.1 skrll /* This is not in the table, because the numeric value of EVMSERR (32767)
444 1.1 skrll lies outside the range of sys_errlist[]. */
445 1.1 skrll static struct { int value; const char *name, *msg; }
446 1.1 skrll evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" };
447 1.1 skrll #endif
448 1.1 skrll
449 1.1 skrll /* Translation table allocated and initialized at runtime. Indexed by the
450 1.1 skrll errno value to find the equivalent symbolic value. */
451 1.1 skrll
452 1.1 skrll static const char **error_names;
453 1.1 skrll static int num_error_names = 0;
454 1.1 skrll
455 1.1 skrll /* Translation table allocated and initialized at runtime, if it does not
456 1.1 skrll already exist in the host environment. Indexed by the errno value to find
457 1.1 skrll the descriptive string.
458 1.1 skrll
459 1.1 skrll We don't export it for use in other modules because even though it has the
460 1.1 skrll same name, it differs from other implementations in that it is dynamically
461 1.1 skrll initialized rather than statically initialized. */
462 1.1 skrll
463 1.1 skrll #ifndef HAVE_SYS_ERRLIST
464 1.1 skrll
465 1.1 skrll #define sys_nerr sys_nerr__
466 1.1 skrll #define sys_errlist sys_errlist__
467 1.1 skrll static int sys_nerr;
468 1.1 skrll static const char **sys_errlist;
469 1.1 skrll
470 1.1 skrll #else
471 1.1 skrll
472 1.1.1.2 christos
473 1.1.1.2 christos #ifndef sys_nerr
474 1.1 skrll extern int sys_nerr;
475 1.1.1.2 christos #endif
476 1.1.1.2 christos #ifndef sys_errlist
477 1.1 skrll extern char *sys_errlist[];
478 1.1.1.2 christos #endif
479 1.1 skrll
480 1.1 skrll #endif
481 1.1 skrll
482 1.1 skrll /*
483 1.1 skrll
484 1.1 skrll NAME
485 1.1 skrll
486 1.1 skrll init_error_tables -- initialize the name and message tables
487 1.1 skrll
488 1.1 skrll SYNOPSIS
489 1.1 skrll
490 1.1 skrll static void init_error_tables ();
491 1.1 skrll
492 1.1 skrll DESCRIPTION
493 1.1 skrll
494 1.1 skrll Using the error_table, which is initialized at compile time, generate
495 1.1 skrll the error_names and the sys_errlist (if needed) tables, which are
496 1.1 skrll indexed at runtime by a specific errno value.
497 1.1 skrll
498 1.1 skrll BUGS
499 1.1 skrll
500 1.1 skrll The initialization of the tables may fail under low memory conditions,
501 1.1 skrll in which case we don't do anything particularly useful, but we don't
502 1.1 skrll bomb either. Who knows, it might succeed at a later point if we free
503 1.1 skrll some memory in the meantime. In any case, the other routines know
504 1.1 skrll how to deal with lack of a table after trying to initialize it. This
505 1.1 skrll may or may not be considered to be a bug, that we don't specifically
506 1.1 skrll warn about this particular failure mode.
507 1.1 skrll
508 1.1 skrll */
509 1.1 skrll
510 1.1 skrll static void
511 1.1 skrll init_error_tables (void)
512 1.1 skrll {
513 1.1 skrll const struct error_info *eip;
514 1.1 skrll int nbytes;
515 1.1 skrll
516 1.1 skrll /* If we haven't already scanned the error_table once to find the maximum
517 1.1 skrll errno value, then go find it now. */
518 1.1 skrll
519 1.1 skrll if (num_error_names == 0)
520 1.1 skrll {
521 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++)
522 1.1 skrll {
523 1.1 skrll if (eip -> value >= num_error_names)
524 1.1 skrll {
525 1.1 skrll num_error_names = eip -> value + 1;
526 1.1 skrll }
527 1.1 skrll }
528 1.1 skrll }
529 1.1 skrll
530 1.1 skrll /* Now attempt to allocate the error_names table, zero it out, and then
531 1.1 skrll initialize it from the statically initialized error_table. */
532 1.1 skrll
533 1.1 skrll if (error_names == NULL)
534 1.1 skrll {
535 1.1 skrll nbytes = num_error_names * sizeof (char *);
536 1.1 skrll if ((error_names = (const char **) malloc (nbytes)) != NULL)
537 1.1 skrll {
538 1.1 skrll memset (error_names, 0, nbytes);
539 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++)
540 1.1 skrll {
541 1.1 skrll error_names[eip -> value] = eip -> name;
542 1.1 skrll }
543 1.1 skrll }
544 1.1 skrll }
545 1.1 skrll
546 1.1 skrll #ifndef HAVE_SYS_ERRLIST
547 1.1 skrll
548 1.1 skrll /* Now attempt to allocate the sys_errlist table, zero it out, and then
549 1.1 skrll initialize it from the statically initialized error_table. */
550 1.1 skrll
551 1.1 skrll if (sys_errlist == NULL)
552 1.1 skrll {
553 1.1 skrll nbytes = num_error_names * sizeof (char *);
554 1.1 skrll if ((sys_errlist = (const char **) malloc (nbytes)) != NULL)
555 1.1 skrll {
556 1.1 skrll memset (sys_errlist, 0, nbytes);
557 1.1 skrll sys_nerr = num_error_names;
558 1.1 skrll for (eip = error_table; eip -> name != NULL; eip++)
559 1.1 skrll {
560 1.1 skrll sys_errlist[eip -> value] = eip -> msg;
561 1.1 skrll }
562 1.1 skrll }
563 1.1 skrll }
564 1.1 skrll
565 1.1 skrll #endif
566 1.1 skrll
567 1.1 skrll }
568 1.1 skrll
569 1.1 skrll /*
570 1.1 skrll
571 1.1 skrll
572 1.1 skrll @deftypefn Extension int errno_max (void)
573 1.1 skrll
574 1.1 skrll Returns the maximum @code{errno} value for which a corresponding
575 1.1 skrll symbolic name or message is available. Note that in the case where we
576 1.1 skrll use the @code{sys_errlist} supplied by the system, it is possible for
577 1.1 skrll there to be more symbolic names than messages, or vice versa. In
578 1.1 skrll fact, the manual page for @code{perror(3C)} explicitly warns that one
579 1.1 skrll should check the size of the table (@code{sys_nerr}) before indexing
580 1.1 skrll it, since new error codes may be added to the system before they are
581 1.1 skrll added to the table. Thus @code{sys_nerr} might be smaller than value
582 1.1 skrll implied by the largest @code{errno} value defined in @code{<errno.h>}.
583 1.1 skrll
584 1.1 skrll We return the maximum value that can be used to obtain a meaningful
585 1.1 skrll symbolic name or message.
586 1.1 skrll
587 1.1 skrll @end deftypefn
588 1.1 skrll
589 1.1 skrll */
590 1.1 skrll
591 1.1 skrll int
592 1.1 skrll errno_max (void)
593 1.1 skrll {
594 1.1 skrll int maxsize;
595 1.1 skrll
596 1.1 skrll if (error_names == NULL)
597 1.1 skrll {
598 1.1 skrll init_error_tables ();
599 1.1 skrll }
600 1.1 skrll maxsize = MAX (sys_nerr, num_error_names);
601 1.1 skrll return (maxsize - 1);
602 1.1 skrll }
603 1.1 skrll
604 1.1 skrll #ifndef HAVE_STRERROR
605 1.1 skrll
606 1.1 skrll /*
607 1.1 skrll
608 1.1 skrll @deftypefn Supplemental char* strerror (int @var{errnoval})
609 1.1 skrll
610 1.1 skrll Maps an @code{errno} number to an error message string, the contents
611 1.1 skrll of which are implementation defined. On systems which have the
612 1.1 skrll external variables @code{sys_nerr} and @code{sys_errlist}, these
613 1.1 skrll strings will be the same as the ones used by @code{perror}.
614 1.1 skrll
615 1.1 skrll If the supplied error number is within the valid range of indices for
616 1.1 skrll the @code{sys_errlist}, but no message is available for the particular
617 1.1 skrll error number, then returns the string @samp{Error @var{num}}, where
618 1.1 skrll @var{num} is the error number.
619 1.1 skrll
620 1.1 skrll If the supplied error number is not a valid index into
621 1.1 skrll @code{sys_errlist}, returns @code{NULL}.
622 1.1 skrll
623 1.1 skrll The returned string is only guaranteed to be valid only until the
624 1.1 skrll next call to @code{strerror}.
625 1.1 skrll
626 1.1 skrll @end deftypefn
627 1.1 skrll
628 1.1 skrll */
629 1.1 skrll
630 1.1 skrll char *
631 1.1 skrll strerror (int errnoval)
632 1.1 skrll {
633 1.1 skrll const char *msg;
634 1.1 skrll static char buf[32];
635 1.1 skrll
636 1.1 skrll #ifndef HAVE_SYS_ERRLIST
637 1.1 skrll
638 1.1 skrll if (error_names == NULL)
639 1.1 skrll {
640 1.1 skrll init_error_tables ();
641 1.1 skrll }
642 1.1 skrll
643 1.1 skrll #endif
644 1.1 skrll
645 1.1 skrll if ((errnoval < 0) || (errnoval >= sys_nerr))
646 1.1 skrll {
647 1.1 skrll #ifdef EVMSERR
648 1.1 skrll if (errnoval == evmserr.value)
649 1.1 skrll msg = evmserr.msg;
650 1.1 skrll else
651 1.1 skrll #endif
652 1.1 skrll /* Out of range, just return NULL */
653 1.1 skrll msg = NULL;
654 1.1 skrll }
655 1.1 skrll else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL))
656 1.1 skrll {
657 1.1 skrll /* In range, but no sys_errlist or no entry at this index. */
658 1.1 skrll sprintf (buf, "Error %d", errnoval);
659 1.1 skrll msg = buf;
660 1.1 skrll }
661 1.1 skrll else
662 1.1 skrll {
663 1.1 skrll /* In range, and a valid message. Just return the message. */
664 1.1 skrll msg = (char *) sys_errlist[errnoval];
665 1.1 skrll }
666 1.1 skrll
667 1.1 skrll return (msg);
668 1.1 skrll }
669 1.1 skrll
670 1.1 skrll #endif /* ! HAVE_STRERROR */
671 1.1 skrll
672 1.1 skrll
673 1.1 skrll /*
674 1.1 skrll
675 1.1 skrll @deftypefn Replacement {const char*} strerrno (int @var{errnum})
676 1.1 skrll
677 1.1 skrll Given an error number returned from a system call (typically returned
678 1.1 skrll in @code{errno}), returns a pointer to a string containing the
679 1.1 skrll symbolic name of that error number, as found in @code{<errno.h>}.
680 1.1 skrll
681 1.1 skrll If the supplied error number is within the valid range of indices for
682 1.1 skrll symbolic names, but no name is available for the particular error
683 1.1 skrll number, then returns the string @samp{Error @var{num}}, where @var{num}
684 1.1 skrll is the error number.
685 1.1 skrll
686 1.1 skrll If the supplied error number is not within the range of valid
687 1.1 skrll indices, then returns @code{NULL}.
688 1.1 skrll
689 1.1 skrll The contents of the location pointed to are only guaranteed to be
690 1.1 skrll valid until the next call to @code{strerrno}.
691 1.1 skrll
692 1.1 skrll @end deftypefn
693 1.1 skrll
694 1.1 skrll */
695 1.1 skrll
696 1.1 skrll const char *
697 1.1 skrll strerrno (int errnoval)
698 1.1 skrll {
699 1.1 skrll const char *name;
700 1.1 skrll static char buf[32];
701 1.1 skrll
702 1.1 skrll if (error_names == NULL)
703 1.1 skrll {
704 1.1 skrll init_error_tables ();
705 1.1 skrll }
706 1.1 skrll
707 1.1 skrll if ((errnoval < 0) || (errnoval >= num_error_names))
708 1.1 skrll {
709 1.1 skrll #ifdef EVMSERR
710 1.1 skrll if (errnoval == evmserr.value)
711 1.1 skrll name = evmserr.name;
712 1.1 skrll else
713 1.1 skrll #endif
714 1.1 skrll /* Out of range, just return NULL */
715 1.1 skrll name = NULL;
716 1.1 skrll }
717 1.1 skrll else if ((error_names == NULL) || (error_names[errnoval] == NULL))
718 1.1 skrll {
719 1.1 skrll /* In range, but no error_names or no entry at this index. */
720 1.1 skrll sprintf (buf, "Error %d", errnoval);
721 1.1 skrll name = (const char *) buf;
722 1.1 skrll }
723 1.1 skrll else
724 1.1 skrll {
725 1.1 skrll /* In range, and a valid name. Just return the name. */
726 1.1 skrll name = error_names[errnoval];
727 1.1 skrll }
728 1.1 skrll
729 1.1 skrll return (name);
730 1.1 skrll }
731 1.1 skrll
732 1.1 skrll /*
733 1.1 skrll
734 1.1 skrll @deftypefn Extension int strtoerrno (const char *@var{name})
735 1.1 skrll
736 1.1 skrll Given the symbolic name of a error number (e.g., @code{EACCES}), map it
737 1.1 skrll to an errno value. If no translation is found, returns 0.
738 1.1 skrll
739 1.1 skrll @end deftypefn
740 1.1 skrll
741 1.1 skrll */
742 1.1 skrll
743 1.1 skrll int
744 1.1 skrll strtoerrno (const char *name)
745 1.1 skrll {
746 1.1 skrll int errnoval = 0;
747 1.1 skrll
748 1.1 skrll if (name != NULL)
749 1.1 skrll {
750 1.1 skrll if (error_names == NULL)
751 1.1 skrll {
752 1.1 skrll init_error_tables ();
753 1.1 skrll }
754 1.1 skrll for (errnoval = 0; errnoval < num_error_names; errnoval++)
755 1.1 skrll {
756 1.1 skrll if ((error_names[errnoval] != NULL) &&
757 1.1 skrll (strcmp (name, error_names[errnoval]) == 0))
758 1.1 skrll {
759 1.1 skrll break;
760 1.1 skrll }
761 1.1 skrll }
762 1.1 skrll if (errnoval == num_error_names)
763 1.1 skrll {
764 1.1 skrll #ifdef EVMSERR
765 1.1 skrll if (strcmp (name, evmserr.name) == 0)
766 1.1 skrll errnoval = evmserr.value;
767 1.1 skrll else
768 1.1 skrll #endif
769 1.1 skrll errnoval = 0;
770 1.1 skrll }
771 1.1 skrll }
772 1.1 skrll return (errnoval);
773 1.1 skrll }
774 1.1 skrll
775 1.1 skrll
776 1.1 skrll /* A simple little main that does nothing but print all the errno translations
777 1.1 skrll if MAIN is defined and this file is compiled and linked. */
778 1.1 skrll
779 1.1 skrll #ifdef MAIN
780 1.1 skrll
781 1.1 skrll #include <stdio.h>
782 1.1 skrll
783 1.1 skrll int
784 1.1 skrll main (void)
785 1.1 skrll {
786 1.1 skrll int errn;
787 1.1 skrll int errnmax;
788 1.1 skrll const char *name;
789 1.1 skrll const char *msg;
790 1.1 skrll char *strerror ();
791 1.1 skrll
792 1.1 skrll errnmax = errno_max ();
793 1.1 skrll printf ("%d entries in names table.\n", num_error_names);
794 1.1 skrll printf ("%d entries in messages table.\n", sys_nerr);
795 1.1 skrll printf ("%d is max useful index.\n", errnmax);
796 1.1 skrll
797 1.1 skrll /* Keep printing values until we get to the end of *both* tables, not
798 1.1 skrll *either* table. Note that knowing the maximum useful index does *not*
799 1.1 skrll relieve us of the responsibility of testing the return pointer for
800 1.1 skrll NULL. */
801 1.1 skrll
802 1.1 skrll for (errn = 0; errn <= errnmax; errn++)
803 1.1 skrll {
804 1.1 skrll name = strerrno (errn);
805 1.1 skrll name = (name == NULL) ? "<NULL>" : name;
806 1.1 skrll msg = strerror (errn);
807 1.1 skrll msg = (msg == NULL) ? "<NULL>" : msg;
808 1.1 skrll printf ("%-4d%-18s%s\n", errn, name, msg);
809 1.1 skrll }
810 1.1 skrll
811 1.1 skrll return 0;
812 1.1 skrll }
813 1.1 skrll
814 1.1 skrll #endif
815