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