Home | History | Annotate | Line # | Download | only in libiberty
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