1 /* Extended support for using errno values.
2 Copyright (C) 1992 Free Software Foundation, Inc.
3 Written by Fred Fish. fnf@cygnus.com
5 This file is part of the libiberty library.
6 Libiberty is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
11 Libiberty is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. */
18 #endif /* HAVE_CONFIG_H */
20 #ifndef NEED_sys_errlist
21 /* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least)
22 might declare sys_errlist in a way that the compiler might consider
23 incompatible with our later declaration, perhaps by using const
24 attributes. So we hide the declaration in errno.h (if any) using a
26 #define sys_errlist sys_errlist__
32 #ifndef NEED_sys_errlist
36 /* Routines imported from standard C runtime libraries. */
40 extern void *malloc (size_t size
); /* 4.10.3.3 */
41 extern void *memset (void *s
, int c
, size_t n
); /* 4.11.6.1 */
43 extern char *malloc (); /* Standard memory allocater */
44 extern char *memset ();
48 # define MAX(a,b) ((a) > (b) ? (a) : (b))
51 /* Translation table for errno values. See intro(2) in most UNIX systems
52 Programmers Reference Manuals.
54 Note that this table is generally only accessed when it is used at runtime
55 to initialize errno name and message tables that are indexed by errno
58 Not all of these errnos will exist on all systems. This table is the only
59 thing that should have to be updated as new error numbers are introduced.
60 It's sort of ugly, but at least its portable. */
64 int value
; /* The numeric value from <errno.h> */
65 char *name
; /* The equivalent symbolic value */
66 #ifdef NEED_sys_errlist
67 char *msg
; /* Short message about this value */
71 #ifdef NEED_sys_errlist
72 # define ENTRY(value, name, msg) {value, name, msg}
74 # define ENTRY(value, name, msg) {value, name}
77 static const struct error_info error_table
[] =
80 ENTRY(EPERM
, "EPERM", "Not owner"),
83 ENTRY(ENOENT
, "ENOENT", "No such file or directory"),
86 ENTRY(ESRCH
, "ESRCH", "No such process"),
89 ENTRY(EINTR
, "EINTR", "Interrupted system call"),
92 ENTRY(EIO
, "EIO", "I/O error"),
95 ENTRY(ENXIO
, "ENXIO", "No such device or address"),
98 ENTRY(E2BIG
, "E2BIG", "Arg list too long"),
100 #if defined (ENOEXEC)
101 ENTRY(ENOEXEC
, "ENOEXEC", "Exec format error"),
104 ENTRY(EBADF
, "EBADF", "Bad file number"),
107 ENTRY(ECHILD
, "ECHILD", "No child processes"),
109 #if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */
110 ENTRY(EWOULDBLOCK
, "EWOULDBLOCK", "Operation would block"),
113 ENTRY(EAGAIN
, "EAGAIN", "No more processes"),
116 ENTRY(ENOMEM
, "ENOMEM", "Not enough space"),
119 ENTRY(EACCES
, "EACCES", "Permission denied"),
122 ENTRY(EFAULT
, "EFAULT", "Bad address"),
124 #if defined (ENOTBLK)
125 ENTRY(ENOTBLK
, "ENOTBLK", "Block device required"),
128 ENTRY(EBUSY
, "EBUSY", "Device busy"),
131 ENTRY(EEXIST
, "EEXIST", "File exists"),
134 ENTRY(EXDEV
, "EXDEV", "Cross-device link"),
137 ENTRY(ENODEV
, "ENODEV", "No such device"),
139 #if defined (ENOTDIR)
140 ENTRY(ENOTDIR
, "ENOTDIR", "Not a directory"),
143 ENTRY(EISDIR
, "EISDIR", "Is a directory"),
146 ENTRY(EINVAL
, "EINVAL", "Invalid argument"),
149 ENTRY(ENFILE
, "ENFILE", "File table overflow"),
152 ENTRY(EMFILE
, "EMFILE", "Too many open files"),
155 ENTRY(ENOTTY
, "ENOTTY", "Not a typewriter"),
157 #if defined (ETXTBSY)
158 ENTRY(ETXTBSY
, "ETXTBSY", "Text file busy"),
161 ENTRY(EFBIG
, "EFBIG", "File too large"),
164 ENTRY(ENOSPC
, "ENOSPC", "No space left on device"),
167 ENTRY(ESPIPE
, "ESPIPE", "Illegal seek"),
170 ENTRY(EROFS
, "EROFS", "Read-only file system"),
173 ENTRY(EMLINK
, "EMLINK", "Too many links"),
176 ENTRY(EPIPE
, "EPIPE", "Broken pipe"),
179 ENTRY(EDOM
, "EDOM", "Math argument out of domain of func"),
182 ENTRY(ERANGE
, "ERANGE", "Math result not representable"),
185 ENTRY(ENOMSG
, "ENOMSG", "No message of desired type"),
188 ENTRY(EIDRM
, "EIDRM", "Identifier removed"),
191 ENTRY(ECHRNG
, "ECHRNG", "Channel number out of range"),
193 #if defined (EL2NSYNC)
194 ENTRY(EL2NSYNC
, "EL2NSYNC", "Level 2 not synchronized"),
197 ENTRY(EL3HLT
, "EL3HLT", "Level 3 halted"),
200 ENTRY(EL3RST
, "EL3RST", "Level 3 reset"),
203 ENTRY(ELNRNG
, "ELNRNG", "Link number out of range"),
205 #if defined (EUNATCH)
206 ENTRY(EUNATCH
, "EUNATCH", "Protocol driver not attached"),
209 ENTRY(ENOCSI
, "ENOCSI", "No CSI structure available"),
212 ENTRY(EL2HLT
, "EL2HLT", "Level 2 halted"),
214 #if defined (EDEADLK)
215 ENTRY(EDEADLK
, "EDEADLK", "Deadlock condition"),
218 ENTRY(ENOLCK
, "ENOLCK", "No record locks available"),
221 ENTRY(EBADE
, "EBADE", "Invalid exchange"),
224 ENTRY(EBADR
, "EBADR", "Invalid request descriptor"),
227 ENTRY(EXFULL
, "EXFULL", "Exchange full"),
230 ENTRY(ENOANO
, "ENOANO", "No anode"),
232 #if defined (EBADRQC)
233 ENTRY(EBADRQC
, "EBADRQC", "Invalid request code"),
235 #if defined (EBADSLT)
236 ENTRY(EBADSLT
, "EBADSLT", "Invalid slot"),
238 #if defined (EDEADLOCK)
239 ENTRY(EDEADLOCK
, "EDEADLOCK", "File locking deadlock error"),
242 ENTRY(EBFONT
, "EBFONT", "Bad font file format"),
245 ENTRY(ENOSTR
, "ENOSTR", "Device not a stream"),
247 #if defined (ENODATA)
248 ENTRY(ENODATA
, "ENODATA", "No data available"),
251 ENTRY(ETIME
, "ETIME", "Timer expired"),
254 ENTRY(ENOSR
, "ENOSR", "Out of streams resources"),
257 ENTRY(ENONET
, "ENONET", "Machine is not on the network"),
260 ENTRY(ENOPKG
, "ENOPKG", "Package not installed"),
262 #if defined (EREMOTE)
263 ENTRY(EREMOTE
, "EREMOTE", "Object is remote"),
265 #if defined (ENOLINK)
266 ENTRY(ENOLINK
, "ENOLINK", "Link has been severed"),
269 ENTRY(EADV
, "EADV", "Advertise error"),
272 ENTRY(ESRMNT
, "ESRMNT", "Srmount error"),
275 ENTRY(ECOMM
, "ECOMM", "Communication error on send"),
278 ENTRY(EPROTO
, "EPROTO", "Protocol error"),
280 #if defined (EMULTIHOP)
281 ENTRY(EMULTIHOP
, "EMULTIHOP", "Multihop attempted"),
283 #if defined (EDOTDOT)
284 ENTRY(EDOTDOT
, "EDOTDOT", "RFS specific error"),
286 #if defined (EBADMSG)
287 ENTRY(EBADMSG
, "EBADMSG", "Not a data message"),
289 #if defined (ENAMETOOLONG)
290 ENTRY(ENAMETOOLONG
, "ENAMETOOLONG", "File name too long"),
292 #if defined (EOVERFLOW)
293 ENTRY(EOVERFLOW
, "EOVERFLOW", "Value too large for defined data type"),
295 #if defined (ENOTUNIQ)
296 ENTRY(ENOTUNIQ
, "ENOTUNIQ", "Name not unique on network"),
299 ENTRY(EBADFD
, "EBADFD", "File descriptor in bad state"),
301 #if defined (EREMCHG)
302 ENTRY(EREMCHG
, "EREMCHG", "Remote address changed"),
304 #if defined (ELIBACC)
305 ENTRY(ELIBACC
, "ELIBACC", "Can not access a needed shared library"),
307 #if defined (ELIBBAD)
308 ENTRY(ELIBBAD
, "ELIBBAD", "Accessing a corrupted shared library"),
310 #if defined (ELIBSCN)
311 ENTRY(ELIBSCN
, "ELIBSCN", ".lib section in a.out corrupted"),
313 #if defined (ELIBMAX)
314 ENTRY(ELIBMAX
, "ELIBMAX", "Attempting to link in too many shared libraries"),
316 #if defined (ELIBEXEC)
317 ENTRY(ELIBEXEC
, "ELIBEXEC", "Cannot exec a shared library directly"),
320 ENTRY(EILSEQ
, "EILSEQ", "Illegal byte sequence"),
323 ENTRY(ENOSYS
, "ENOSYS", "Operation not applicable"),
326 ENTRY(ELOOP
, "ELOOP", "Too many symbolic links encountered"),
328 #if defined (ERESTART)
329 ENTRY(ERESTART
, "ERESTART", "Interrupted system call should be restarted"),
331 #if defined (ESTRPIPE)
332 ENTRY(ESTRPIPE
, "ESTRPIPE", "Streams pipe error"),
334 #if defined (ENOTEMPTY)
335 ENTRY(ENOTEMPTY
, "ENOTEMPTY", "Directory not empty"),
338 ENTRY(EUSERS
, "EUSERS", "Too many users"),
340 #if defined (ENOTSOCK)
341 ENTRY(ENOTSOCK
, "ENOTSOCK", "Socket operation on non-socket"),
343 #if defined (EDESTADDRREQ)
344 ENTRY(EDESTADDRREQ
, "EDESTADDRREQ", "Destination address required"),
346 #if defined (EMSGSIZE)
347 ENTRY(EMSGSIZE
, "EMSGSIZE", "Message too long"),
349 #if defined (EPROTOTYPE)
350 ENTRY(EPROTOTYPE
, "EPROTOTYPE", "Protocol wrong type for socket"),
352 #if defined (ENOPROTOOPT)
353 ENTRY(ENOPROTOOPT
, "ENOPROTOOPT", "Protocol not available"),
355 #if defined (EPROTONOSUPPORT)
356 ENTRY(EPROTONOSUPPORT
, "EPROTONOSUPPORT", "Protocol not supported"),
358 #if defined (ESOCKTNOSUPPORT)
359 ENTRY(ESOCKTNOSUPPORT
, "ESOCKTNOSUPPORT", "Socket type not supported"),
361 #if defined (EOPNOTSUPP)
362 ENTRY(EOPNOTSUPP
, "EOPNOTSUPP", "Operation not supported on transport endpoint"),
364 #if defined (EPFNOSUPPORT)
365 ENTRY(EPFNOSUPPORT
, "EPFNOSUPPORT", "Protocol family not supported"),
367 #if defined (EAFNOSUPPORT)
368 ENTRY(EAFNOSUPPORT
, "EAFNOSUPPORT", "Address family not supported by protocol"),
370 #if defined (EADDRINUSE)
371 ENTRY(EADDRINUSE
, "EADDRINUSE", "Address already in use"),
373 #if defined (EADDRNOTAVAIL)
374 ENTRY(EADDRNOTAVAIL
, "EADDRNOTAVAIL","Cannot assign requested address"),
376 #if defined (ENETDOWN)
377 ENTRY(ENETDOWN
, "ENETDOWN", "Network is down"),
379 #if defined (ENETUNREACH)
380 ENTRY(ENETUNREACH
, "ENETUNREACH", "Network is unreachable"),
382 #if defined (ENETRESET)
383 ENTRY(ENETRESET
, "ENETRESET", "Network dropped connection because of reset"),
385 #if defined (ECONNABORTED)
386 ENTRY(ECONNABORTED
, "ECONNABORTED", "Software caused connection abort"),
388 #if defined (ECONNRESET)
389 ENTRY(ECONNRESET
, "ECONNRESET", "Connection reset by peer"),
391 #if defined (ENOBUFS)
392 ENTRY(ENOBUFS
, "ENOBUFS", "No buffer space available"),
394 #if defined (EISCONN)
395 ENTRY(EISCONN
, "EISCONN", "Transport endpoint is already connected"),
397 #if defined (ENOTCONN)
398 ENTRY(ENOTCONN
, "ENOTCONN", "Transport endpoint is not connected"),
400 #if defined (ESHUTDOWN)
401 ENTRY(ESHUTDOWN
, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"),
403 #if defined (ETOOMANYREFS)
404 ENTRY(ETOOMANYREFS
, "ETOOMANYREFS", "Too many references: cannot splice"),
406 #if defined (ETIMEDOUT)
407 ENTRY(ETIMEDOUT
, "ETIMEDOUT", "Connection timed out"),
409 #if defined (ECONNREFUSED)
410 ENTRY(ECONNREFUSED
, "ECONNREFUSED", "Connection refused"),
412 #if defined (EHOSTDOWN)
413 ENTRY(EHOSTDOWN
, "EHOSTDOWN", "Host is down"),
415 #if defined (EHOSTUNREACH)
416 ENTRY(EHOSTUNREACH
, "EHOSTUNREACH", "No route to host"),
418 #if defined (EALREADY)
419 ENTRY(EALREADY
, "EALREADY", "Operation already in progress"),
421 #if defined (EINPROGRESS)
422 ENTRY(EINPROGRESS
, "EINPROGRESS", "Operation now in progress"),
425 ENTRY(ESTALE
, "ESTALE", "Stale NFS file handle"),
427 #if defined (EUCLEAN)
428 ENTRY(EUCLEAN
, "EUCLEAN", "Structure needs cleaning"),
430 #if defined (ENOTNAM)
431 ENTRY(ENOTNAM
, "ENOTNAM", "Not a XENIX named type file"),
433 #if defined (ENAVAIL)
434 ENTRY(ENAVAIL
, "ENAVAIL", "No XENIX semaphores available"),
437 ENTRY(EISNAM
, "EISNAM", "Is a named type file"),
439 #if defined (EREMOTEIO)
440 ENTRY(EREMOTEIO
, "EREMOTEIO", "Remote I/O error"),
445 /* Translation table allocated and initialized at runtime. Indexed by the
446 errno value to find the equivalent symbolic value. */
448 static char **error_names
;
449 static int num_error_names
= 0;
451 /* Translation table allocated and initialized at runtime, if it does not
452 already exist in the host environment. Indexed by the errno value to find
453 the descriptive string.
455 We don't export it for use in other modules because even though it has the
456 same name, it differs from other implementations in that it is dynamically
457 initialized rather than statically initialized. */
459 #ifdef NEED_sys_errlist
462 static char **sys_errlist
;
467 extern char *sys_errlist
[];
476 init_error_tables -- initialize the name and message tables
480 static void init_error_tables ();
484 Using the error_table, which is initialized at compile time, generate
485 the error_names and the sys_errlist (if needed) tables, which are
486 indexed at runtime by a specific errno value.
490 The initialization of the tables may fail under low memory conditions,
491 in which case we don't do anything particularly useful, but we don't
492 bomb either. Who knows, it might succeed at a later point if we free
493 some memory in the meantime. In any case, the other routines know
494 how to deal with lack of a table after trying to initialize it. This
495 may or may not be considered to be a bug, that we don't specifically
496 warn about this particular failure mode.
503 const struct error_info
*eip
;
506 /* If we haven't already scanned the error_table once to find the maximum
507 errno value, then go find it now. */
509 if (num_error_names
== 0)
511 for (eip
= error_table
; eip
-> name
!= NULL
; eip
++)
513 if (eip
-> value
>= num_error_names
)
515 num_error_names
= eip
-> value
+ 1;
520 /* Now attempt to allocate the error_names table, zero it out, and then
521 initialize it from the statically initialized error_table. */
523 if (error_names
== NULL
)
525 nbytes
= num_error_names
* sizeof (char *);
526 if ((error_names
= (char **) malloc (nbytes
)) != NULL
)
528 memset (error_names
, 0, nbytes
);
529 for (eip
= error_table
; eip
-> name
!= NULL
; eip
++)
531 error_names
[eip
-> value
] = eip
-> name
;
536 #ifdef NEED_sys_errlist
538 /* Now attempt to allocate the sys_errlist table, zero it out, and then
539 initialize it from the statically initialized error_table. */
541 if (sys_errlist
== NULL
)
543 nbytes
= num_error_names
* sizeof (char *);
544 if ((sys_errlist
= (char **) malloc (nbytes
)) != NULL
)
546 memset (sys_errlist
, 0, nbytes
);
547 sys_nerr
= num_error_names
;
548 for (eip
= error_table
; eip
-> name
!= NULL
; eip
++)
550 sys_errlist
[eip
-> value
] = eip
-> msg
;
563 errno_max -- return the max errno value
571 Returns the maximum errno value for which a corresponding symbolic
572 name or message is available. Note that in the case where
573 we use the sys_errlist supplied by the system, it is possible for
574 there to be more symbolic names than messages, or vice versa.
575 In fact, the manual page for perror(3C) explicitly warns that one
576 should check the size of the table (sys_nerr) before indexing it,
577 since new error codes may be added to the system before they are
578 added to the table. Thus sys_nerr might be smaller than value
579 implied by the largest errno value defined in <errno.h>.
581 We return the maximum value that can be used to obtain a meaningful
582 symbolic name or message.
591 if (error_names
== NULL
)
593 init_error_tables ();
595 maxsize
= MAX (sys_nerr
, num_error_names
);
596 return (maxsize
- 1);
603 strerror -- map an error number to an error message string
607 char *strerror (int errnoval)
611 Maps an errno number to an error message string, the contents of
612 which are implementation defined. On systems which have the external
613 variables sys_nerr and sys_errlist, these strings will be the same
614 as the ones used by perror().
616 If the supplied error number is within the valid range of indices
617 for the sys_errlist, but no message is available for the particular
618 error number, then returns the string "Error NUM", where NUM is the
621 If the supplied error number is not a valid index into sys_errlist,
624 The returned string is only guaranteed to be valid only until the
625 next call to strerror.
636 #ifdef NEED_sys_errlist
638 if (error_names
== NULL
)
640 init_error_tables ();
645 if ((errnoval
< 0) || (errnoval
>= sys_nerr
))
647 /* Out of range, just return NULL */
650 else if ((sys_errlist
== NULL
) || (sys_errlist
[errnoval
] == NULL
))
652 /* In range, but no sys_errlist or no entry at this index. */
653 sprintf (buf
, "Error %d", errnoval
);
658 /* In range, and a valid message. Just return the message. */
659 msg
= sys_errlist
[errnoval
];
671 strerrno -- map an error number to a symbolic name string
675 char *strerrno (int errnoval)
679 Given an error number returned from a system call (typically
680 returned in errno), returns a pointer to a string containing the
681 symbolic name of that error number, as found in <errno.h>.
683 If the supplied error number is within the valid range of indices
684 for symbolic names, but no name is available for the particular
685 error number, then returns the string "Error NUM", where NUM is
688 If the supplied error number is not within the range of valid
689 indices, then returns NULL.
693 The contents of the location pointed to are only guaranteed to be
694 valid until the next call to strerrno.
705 if (error_names
== NULL
)
707 init_error_tables ();
710 if ((errnoval
< 0) || (errnoval
>= num_error_names
))
712 /* Out of range, just return NULL */
715 else if ((error_names
== NULL
) || (error_names
[errnoval
] == NULL
))
717 /* In range, but no error_names or no entry at this index. */
718 sprintf (buf
, "Error %d", errnoval
);
723 /* In range, and a valid name. Just return the name. */
724 name
= error_names
[errnoval
];
734 strtoerrno -- map a symbolic errno name to a numeric value
738 int strtoerrno (char *name)
742 Given the symbolic name of a error number, map it to an errno value.
743 If no translation is found, returns 0.
755 if (error_names
== NULL
)
757 init_error_tables ();
759 for (errnoval
= 0; errnoval
< num_error_names
; errnoval
++)
761 if ((error_names
[errnoval
] != NULL
) &&
762 (strcmp (name
, error_names
[errnoval
]) == 0))
767 if (errnoval
== num_error_names
)
776 /* A simple little main that does nothing but print all the errno translations
777 if MAIN is defined and this file is compiled and linked. */
790 errnmax
= errno_max ();
791 printf ("%d entries in names table.\n", num_error_names
);
792 printf ("%d entries in messages table.\n", sys_nerr
);
793 printf ("%d is max useful index.\n", errnmax
);
795 /* Keep printing values until we get to the end of *both* tables, not
796 *either* table. Note that knowing the maximum useful index does *not*
797 relieve us of the responsibility of testing the return pointer for
800 for (errn
= 0; errn
<= errnmax
; errn
++)
802 name
= strerrno (errn
);
803 name
= (name
== NULL
) ? "<NULL>" : name
;
804 msg
= strerror (errn
);
805 msg
= (msg
== NULL
) ? "<NULL>" : msg
;
806 printf ("%-4d%-18s%s\n", errn
, name
, msg
);