xref: /openbsd-src/gnu/usr.bin/cvs/lib/strerror.c (revision 461cc63e7458ce60db55037c1a7656349538b52f)
11e72d8d2Sderaadt /* Extended support for using errno values.
21e72d8d2Sderaadt    Copyright (C) 1992 Free Software Foundation, Inc.
31e72d8d2Sderaadt    Written by Fred Fish.  fnf@cygnus.com
41e72d8d2Sderaadt 
51e72d8d2Sderaadt This file is part of the libiberty library.
61e72d8d2Sderaadt Libiberty is free software; you can redistribute it and/or
71e72d8d2Sderaadt modify it under the terms of the GNU Library General Public
81e72d8d2Sderaadt License as published by the Free Software Foundation; either
91e72d8d2Sderaadt version 2 of the License, or (at your option) any later version.
101e72d8d2Sderaadt 
111e72d8d2Sderaadt Libiberty is distributed in the hope that it will be useful,
121e72d8d2Sderaadt but WITHOUT ANY WARRANTY; without even the implied warranty of
131e72d8d2Sderaadt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*461cc63eStholo Library General Public License for more details.  */
151e72d8d2Sderaadt 
161e72d8d2Sderaadt #include "config.h"
171e72d8d2Sderaadt 
181e72d8d2Sderaadt #ifndef NEED_sys_errlist
191e72d8d2Sderaadt /* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least)
201e72d8d2Sderaadt    might declare sys_errlist in a way that the compiler might consider
211e72d8d2Sderaadt    incompatible with our later declaration, perhaps by using const
221e72d8d2Sderaadt    attributes.  So we hide the declaration in errno.h (if any) using a
231e72d8d2Sderaadt    macro. */
241e72d8d2Sderaadt #define sys_errlist sys_errlist__
251e72d8d2Sderaadt #endif
261e72d8d2Sderaadt 
271e72d8d2Sderaadt #include <stdio.h>
281e72d8d2Sderaadt #include <errno.h>
291e72d8d2Sderaadt 
301e72d8d2Sderaadt #ifndef NEED_sys_errlist
311e72d8d2Sderaadt #undef sys_errlist
321e72d8d2Sderaadt #endif
331e72d8d2Sderaadt 
341e72d8d2Sderaadt /*  Routines imported from standard C runtime libraries. */
351e72d8d2Sderaadt 
361e72d8d2Sderaadt #ifdef __STDC__
371e72d8d2Sderaadt #include <stddef.h>
381e72d8d2Sderaadt extern void *malloc (size_t size);				/* 4.10.3.3 */
391e72d8d2Sderaadt extern void *memset (void *s, int c, size_t n);			/* 4.11.6.1 */
401e72d8d2Sderaadt #else	/* !__STDC__ */
411e72d8d2Sderaadt extern char *malloc ();		/* Standard memory allocater */
421e72d8d2Sderaadt extern char *memset ();
431e72d8d2Sderaadt #endif	/* __STDC__ */
441e72d8d2Sderaadt 
451e72d8d2Sderaadt #ifndef MAX
461e72d8d2Sderaadt #  define MAX(a,b) ((a) > (b) ? (a) : (b))
471e72d8d2Sderaadt #endif
481e72d8d2Sderaadt 
491e72d8d2Sderaadt /* Translation table for errno values.  See intro(2) in most UNIX systems
501e72d8d2Sderaadt    Programmers Reference Manuals.
511e72d8d2Sderaadt 
521e72d8d2Sderaadt    Note that this table is generally only accessed when it is used at runtime
531e72d8d2Sderaadt    to initialize errno name and message tables that are indexed by errno
541e72d8d2Sderaadt    value.
551e72d8d2Sderaadt 
561e72d8d2Sderaadt    Not all of these errnos will exist on all systems.  This table is the only
571e72d8d2Sderaadt    thing that should have to be updated as new error numbers are introduced.
581e72d8d2Sderaadt    It's sort of ugly, but at least its portable. */
591e72d8d2Sderaadt 
601e72d8d2Sderaadt struct error_info
611e72d8d2Sderaadt {
621e72d8d2Sderaadt   int value;		/* The numeric value from <errno.h> */
631e72d8d2Sderaadt   char *name;		/* The equivalent symbolic value */
641e72d8d2Sderaadt #ifdef NEED_sys_errlist
651e72d8d2Sderaadt   char *msg;		/* Short message about this value */
661e72d8d2Sderaadt #endif
671e72d8d2Sderaadt };
681e72d8d2Sderaadt 
691e72d8d2Sderaadt #ifdef NEED_sys_errlist
701e72d8d2Sderaadt #   define ENTRY(value, name, msg)	{value, name, msg}
711e72d8d2Sderaadt #else
721e72d8d2Sderaadt #   define ENTRY(value, name, msg)	{value, name}
731e72d8d2Sderaadt #endif
741e72d8d2Sderaadt 
751e72d8d2Sderaadt static const struct error_info error_table[] =
761e72d8d2Sderaadt {
771e72d8d2Sderaadt #if defined (EPERM)
781e72d8d2Sderaadt   ENTRY(EPERM, "EPERM", "Not owner"),
791e72d8d2Sderaadt #endif
801e72d8d2Sderaadt #if defined (ENOENT)
811e72d8d2Sderaadt   ENTRY(ENOENT, "ENOENT", "No such file or directory"),
821e72d8d2Sderaadt #endif
831e72d8d2Sderaadt #if defined (ESRCH)
841e72d8d2Sderaadt   ENTRY(ESRCH, "ESRCH", "No such process"),
851e72d8d2Sderaadt #endif
861e72d8d2Sderaadt #if defined (EINTR)
871e72d8d2Sderaadt   ENTRY(EINTR, "EINTR", "Interrupted system call"),
881e72d8d2Sderaadt #endif
891e72d8d2Sderaadt #if defined (EIO)
901e72d8d2Sderaadt   ENTRY(EIO, "EIO", "I/O error"),
911e72d8d2Sderaadt #endif
921e72d8d2Sderaadt #if defined (ENXIO)
931e72d8d2Sderaadt   ENTRY(ENXIO, "ENXIO", "No such device or address"),
941e72d8d2Sderaadt #endif
951e72d8d2Sderaadt #if defined (E2BIG)
961e72d8d2Sderaadt   ENTRY(E2BIG, "E2BIG", "Arg list too long"),
971e72d8d2Sderaadt #endif
981e72d8d2Sderaadt #if defined (ENOEXEC)
991e72d8d2Sderaadt   ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"),
1001e72d8d2Sderaadt #endif
1011e72d8d2Sderaadt #if defined (EBADF)
1021e72d8d2Sderaadt   ENTRY(EBADF, "EBADF", "Bad file number"),
1031e72d8d2Sderaadt #endif
1041e72d8d2Sderaadt #if defined (ECHILD)
1051e72d8d2Sderaadt   ENTRY(ECHILD, "ECHILD", "No child processes"),
1061e72d8d2Sderaadt #endif
1071e72d8d2Sderaadt #if defined (EWOULDBLOCK)	/* Put before EAGAIN, sometimes aliased */
1081e72d8d2Sderaadt   ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"),
1091e72d8d2Sderaadt #endif
1101e72d8d2Sderaadt #if defined (EAGAIN)
1111e72d8d2Sderaadt   ENTRY(EAGAIN, "EAGAIN", "No more processes"),
1121e72d8d2Sderaadt #endif
1131e72d8d2Sderaadt #if defined (ENOMEM)
1141e72d8d2Sderaadt   ENTRY(ENOMEM, "ENOMEM", "Not enough space"),
1151e72d8d2Sderaadt #endif
1161e72d8d2Sderaadt #if defined (EACCES)
1171e72d8d2Sderaadt   ENTRY(EACCES, "EACCES", "Permission denied"),
1181e72d8d2Sderaadt #endif
1191e72d8d2Sderaadt #if defined (EFAULT)
1201e72d8d2Sderaadt   ENTRY(EFAULT, "EFAULT", "Bad address"),
1211e72d8d2Sderaadt #endif
1221e72d8d2Sderaadt #if defined (ENOTBLK)
1231e72d8d2Sderaadt   ENTRY(ENOTBLK, "ENOTBLK", "Block device required"),
1241e72d8d2Sderaadt #endif
1251e72d8d2Sderaadt #if defined (EBUSY)
1261e72d8d2Sderaadt   ENTRY(EBUSY, "EBUSY", "Device busy"),
1271e72d8d2Sderaadt #endif
1281e72d8d2Sderaadt #if defined (EEXIST)
1291e72d8d2Sderaadt   ENTRY(EEXIST, "EEXIST", "File exists"),
1301e72d8d2Sderaadt #endif
1311e72d8d2Sderaadt #if defined (EXDEV)
1321e72d8d2Sderaadt   ENTRY(EXDEV, "EXDEV", "Cross-device link"),
1331e72d8d2Sderaadt #endif
1341e72d8d2Sderaadt #if defined (ENODEV)
1351e72d8d2Sderaadt   ENTRY(ENODEV, "ENODEV", "No such device"),
1361e72d8d2Sderaadt #endif
1371e72d8d2Sderaadt #if defined (ENOTDIR)
1381e72d8d2Sderaadt   ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"),
1391e72d8d2Sderaadt #endif
1401e72d8d2Sderaadt #if defined (EISDIR)
1411e72d8d2Sderaadt   ENTRY(EISDIR, "EISDIR", "Is a directory"),
1421e72d8d2Sderaadt #endif
1431e72d8d2Sderaadt #if defined (EINVAL)
1441e72d8d2Sderaadt   ENTRY(EINVAL, "EINVAL", "Invalid argument"),
1451e72d8d2Sderaadt #endif
1461e72d8d2Sderaadt #if defined (ENFILE)
1471e72d8d2Sderaadt   ENTRY(ENFILE, "ENFILE", "File table overflow"),
1481e72d8d2Sderaadt #endif
1491e72d8d2Sderaadt #if defined (EMFILE)
1501e72d8d2Sderaadt   ENTRY(EMFILE, "EMFILE", "Too many open files"),
1511e72d8d2Sderaadt #endif
1521e72d8d2Sderaadt #if defined (ENOTTY)
1531e72d8d2Sderaadt   ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"),
1541e72d8d2Sderaadt #endif
1551e72d8d2Sderaadt #if defined (ETXTBSY)
1561e72d8d2Sderaadt   ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"),
1571e72d8d2Sderaadt #endif
1581e72d8d2Sderaadt #if defined (EFBIG)
1591e72d8d2Sderaadt   ENTRY(EFBIG, "EFBIG", "File too large"),
1601e72d8d2Sderaadt #endif
1611e72d8d2Sderaadt #if defined (ENOSPC)
1621e72d8d2Sderaadt   ENTRY(ENOSPC, "ENOSPC", "No space left on device"),
1631e72d8d2Sderaadt #endif
1641e72d8d2Sderaadt #if defined (ESPIPE)
1651e72d8d2Sderaadt   ENTRY(ESPIPE, "ESPIPE", "Illegal seek"),
1661e72d8d2Sderaadt #endif
1671e72d8d2Sderaadt #if defined (EROFS)
1681e72d8d2Sderaadt   ENTRY(EROFS, "EROFS", "Read-only file system"),
1691e72d8d2Sderaadt #endif
1701e72d8d2Sderaadt #if defined (EMLINK)
1711e72d8d2Sderaadt   ENTRY(EMLINK, "EMLINK", "Too many links"),
1721e72d8d2Sderaadt #endif
1731e72d8d2Sderaadt #if defined (EPIPE)
1741e72d8d2Sderaadt   ENTRY(EPIPE, "EPIPE", "Broken pipe"),
1751e72d8d2Sderaadt #endif
1761e72d8d2Sderaadt #if defined (EDOM)
1771e72d8d2Sderaadt   ENTRY(EDOM, "EDOM", "Math argument out of domain of func"),
1781e72d8d2Sderaadt #endif
1791e72d8d2Sderaadt #if defined (ERANGE)
1801e72d8d2Sderaadt   ENTRY(ERANGE, "ERANGE", "Math result not representable"),
1811e72d8d2Sderaadt #endif
1821e72d8d2Sderaadt #if defined (ENOMSG)
1831e72d8d2Sderaadt   ENTRY(ENOMSG, "ENOMSG", "No message of desired type"),
1841e72d8d2Sderaadt #endif
1851e72d8d2Sderaadt #if defined (EIDRM)
1861e72d8d2Sderaadt   ENTRY(EIDRM, "EIDRM", "Identifier removed"),
1871e72d8d2Sderaadt #endif
1881e72d8d2Sderaadt #if defined (ECHRNG)
1891e72d8d2Sderaadt   ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"),
1901e72d8d2Sderaadt #endif
1911e72d8d2Sderaadt #if defined (EL2NSYNC)
1921e72d8d2Sderaadt   ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"),
1931e72d8d2Sderaadt #endif
1941e72d8d2Sderaadt #if defined (EL3HLT)
1951e72d8d2Sderaadt   ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"),
1961e72d8d2Sderaadt #endif
1971e72d8d2Sderaadt #if defined (EL3RST)
1981e72d8d2Sderaadt   ENTRY(EL3RST, "EL3RST", "Level 3 reset"),
1991e72d8d2Sderaadt #endif
2001e72d8d2Sderaadt #if defined (ELNRNG)
2011e72d8d2Sderaadt   ENTRY(ELNRNG, "ELNRNG", "Link number out of range"),
2021e72d8d2Sderaadt #endif
2031e72d8d2Sderaadt #if defined (EUNATCH)
2041e72d8d2Sderaadt   ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"),
2051e72d8d2Sderaadt #endif
2061e72d8d2Sderaadt #if defined (ENOCSI)
2071e72d8d2Sderaadt   ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"),
2081e72d8d2Sderaadt #endif
2091e72d8d2Sderaadt #if defined (EL2HLT)
2101e72d8d2Sderaadt   ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"),
2111e72d8d2Sderaadt #endif
2121e72d8d2Sderaadt #if defined (EDEADLK)
2131e72d8d2Sderaadt   ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"),
2141e72d8d2Sderaadt #endif
2151e72d8d2Sderaadt #if defined (ENOLCK)
2161e72d8d2Sderaadt   ENTRY(ENOLCK, "ENOLCK", "No record locks available"),
2171e72d8d2Sderaadt #endif
2181e72d8d2Sderaadt #if defined (EBADE)
2191e72d8d2Sderaadt   ENTRY(EBADE, "EBADE", "Invalid exchange"),
2201e72d8d2Sderaadt #endif
2211e72d8d2Sderaadt #if defined (EBADR)
2221e72d8d2Sderaadt   ENTRY(EBADR, "EBADR", "Invalid request descriptor"),
2231e72d8d2Sderaadt #endif
2241e72d8d2Sderaadt #if defined (EXFULL)
2251e72d8d2Sderaadt   ENTRY(EXFULL, "EXFULL", "Exchange full"),
2261e72d8d2Sderaadt #endif
2271e72d8d2Sderaadt #if defined (ENOANO)
2281e72d8d2Sderaadt   ENTRY(ENOANO, "ENOANO", "No anode"),
2291e72d8d2Sderaadt #endif
2301e72d8d2Sderaadt #if defined (EBADRQC)
2311e72d8d2Sderaadt   ENTRY(EBADRQC, "EBADRQC", "Invalid request code"),
2321e72d8d2Sderaadt #endif
2331e72d8d2Sderaadt #if defined (EBADSLT)
2341e72d8d2Sderaadt   ENTRY(EBADSLT, "EBADSLT", "Invalid slot"),
2351e72d8d2Sderaadt #endif
2361e72d8d2Sderaadt #if defined (EDEADLOCK)
2371e72d8d2Sderaadt   ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"),
2381e72d8d2Sderaadt #endif
2391e72d8d2Sderaadt #if defined (EBFONT)
2401e72d8d2Sderaadt   ENTRY(EBFONT, "EBFONT", "Bad font file format"),
2411e72d8d2Sderaadt #endif
2421e72d8d2Sderaadt #if defined (ENOSTR)
2431e72d8d2Sderaadt   ENTRY(ENOSTR, "ENOSTR", "Device not a stream"),
2441e72d8d2Sderaadt #endif
2451e72d8d2Sderaadt #if defined (ENODATA)
2461e72d8d2Sderaadt   ENTRY(ENODATA, "ENODATA", "No data available"),
2471e72d8d2Sderaadt #endif
2481e72d8d2Sderaadt #if defined (ETIME)
2491e72d8d2Sderaadt   ENTRY(ETIME, "ETIME", "Timer expired"),
2501e72d8d2Sderaadt #endif
2511e72d8d2Sderaadt #if defined (ENOSR)
2521e72d8d2Sderaadt   ENTRY(ENOSR, "ENOSR", "Out of streams resources"),
2531e72d8d2Sderaadt #endif
2541e72d8d2Sderaadt #if defined (ENONET)
2551e72d8d2Sderaadt   ENTRY(ENONET, "ENONET", "Machine is not on the network"),
2561e72d8d2Sderaadt #endif
2571e72d8d2Sderaadt #if defined (ENOPKG)
2581e72d8d2Sderaadt   ENTRY(ENOPKG, "ENOPKG", "Package not installed"),
2591e72d8d2Sderaadt #endif
2601e72d8d2Sderaadt #if defined (EREMOTE)
2611e72d8d2Sderaadt   ENTRY(EREMOTE, "EREMOTE", "Object is remote"),
2621e72d8d2Sderaadt #endif
2631e72d8d2Sderaadt #if defined (ENOLINK)
2641e72d8d2Sderaadt   ENTRY(ENOLINK, "ENOLINK", "Link has been severed"),
2651e72d8d2Sderaadt #endif
2661e72d8d2Sderaadt #if defined (EADV)
2671e72d8d2Sderaadt   ENTRY(EADV, "EADV", "Advertise error"),
2681e72d8d2Sderaadt #endif
2691e72d8d2Sderaadt #if defined (ESRMNT)
2701e72d8d2Sderaadt   ENTRY(ESRMNT, "ESRMNT", "Srmount error"),
2711e72d8d2Sderaadt #endif
2721e72d8d2Sderaadt #if defined (ECOMM)
2731e72d8d2Sderaadt   ENTRY(ECOMM, "ECOMM", "Communication error on send"),
2741e72d8d2Sderaadt #endif
2751e72d8d2Sderaadt #if defined (EPROTO)
2761e72d8d2Sderaadt   ENTRY(EPROTO, "EPROTO", "Protocol error"),
2771e72d8d2Sderaadt #endif
2781e72d8d2Sderaadt #if defined (EMULTIHOP)
2791e72d8d2Sderaadt   ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"),
2801e72d8d2Sderaadt #endif
2811e72d8d2Sderaadt #if defined (EDOTDOT)
2821e72d8d2Sderaadt   ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"),
2831e72d8d2Sderaadt #endif
2841e72d8d2Sderaadt #if defined (EBADMSG)
2851e72d8d2Sderaadt   ENTRY(EBADMSG, "EBADMSG", "Not a data message"),
2861e72d8d2Sderaadt #endif
2871e72d8d2Sderaadt #if defined (ENAMETOOLONG)
2881e72d8d2Sderaadt   ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"),
2891e72d8d2Sderaadt #endif
2901e72d8d2Sderaadt #if defined (EOVERFLOW)
2911e72d8d2Sderaadt   ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"),
2921e72d8d2Sderaadt #endif
2931e72d8d2Sderaadt #if defined (ENOTUNIQ)
2941e72d8d2Sderaadt   ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"),
2951e72d8d2Sderaadt #endif
2961e72d8d2Sderaadt #if defined (EBADFD)
2971e72d8d2Sderaadt   ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"),
2981e72d8d2Sderaadt #endif
2991e72d8d2Sderaadt #if defined (EREMCHG)
3001e72d8d2Sderaadt   ENTRY(EREMCHG, "EREMCHG", "Remote address changed"),
3011e72d8d2Sderaadt #endif
3021e72d8d2Sderaadt #if defined (ELIBACC)
3031e72d8d2Sderaadt   ENTRY(ELIBACC, "ELIBACC", "Can not access a needed shared library"),
3041e72d8d2Sderaadt #endif
3051e72d8d2Sderaadt #if defined (ELIBBAD)
3061e72d8d2Sderaadt   ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"),
3071e72d8d2Sderaadt #endif
3081e72d8d2Sderaadt #if defined (ELIBSCN)
3091e72d8d2Sderaadt   ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"),
3101e72d8d2Sderaadt #endif
3111e72d8d2Sderaadt #if defined (ELIBMAX)
3121e72d8d2Sderaadt   ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"),
3131e72d8d2Sderaadt #endif
3141e72d8d2Sderaadt #if defined (ELIBEXEC)
3151e72d8d2Sderaadt   ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"),
3161e72d8d2Sderaadt #endif
3171e72d8d2Sderaadt #if defined (EILSEQ)
3181e72d8d2Sderaadt   ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"),
3191e72d8d2Sderaadt #endif
3201e72d8d2Sderaadt #if defined (ENOSYS)
3211e72d8d2Sderaadt   ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"),
3221e72d8d2Sderaadt #endif
3231e72d8d2Sderaadt #if defined (ELOOP)
3241e72d8d2Sderaadt   ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"),
3251e72d8d2Sderaadt #endif
3261e72d8d2Sderaadt #if defined (ERESTART)
3271e72d8d2Sderaadt   ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"),
3281e72d8d2Sderaadt #endif
3291e72d8d2Sderaadt #if defined (ESTRPIPE)
3301e72d8d2Sderaadt   ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"),
3311e72d8d2Sderaadt #endif
3321e72d8d2Sderaadt #if defined (ENOTEMPTY)
3331e72d8d2Sderaadt   ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"),
3341e72d8d2Sderaadt #endif
3351e72d8d2Sderaadt #if defined (EUSERS)
3361e72d8d2Sderaadt   ENTRY(EUSERS, "EUSERS", "Too many users"),
3371e72d8d2Sderaadt #endif
3381e72d8d2Sderaadt #if defined (ENOTSOCK)
3391e72d8d2Sderaadt   ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"),
3401e72d8d2Sderaadt #endif
3411e72d8d2Sderaadt #if defined (EDESTADDRREQ)
3421e72d8d2Sderaadt   ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"),
3431e72d8d2Sderaadt #endif
3441e72d8d2Sderaadt #if defined (EMSGSIZE)
3451e72d8d2Sderaadt   ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"),
3461e72d8d2Sderaadt #endif
3471e72d8d2Sderaadt #if defined (EPROTOTYPE)
3481e72d8d2Sderaadt   ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"),
3491e72d8d2Sderaadt #endif
3501e72d8d2Sderaadt #if defined (ENOPROTOOPT)
3511e72d8d2Sderaadt   ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"),
3521e72d8d2Sderaadt #endif
3531e72d8d2Sderaadt #if defined (EPROTONOSUPPORT)
3541e72d8d2Sderaadt   ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"),
3551e72d8d2Sderaadt #endif
3561e72d8d2Sderaadt #if defined (ESOCKTNOSUPPORT)
3571e72d8d2Sderaadt   ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"),
3581e72d8d2Sderaadt #endif
3591e72d8d2Sderaadt #if defined (EOPNOTSUPP)
3601e72d8d2Sderaadt   ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"),
3611e72d8d2Sderaadt #endif
3621e72d8d2Sderaadt #if defined (EPFNOSUPPORT)
3631e72d8d2Sderaadt   ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"),
3641e72d8d2Sderaadt #endif
3651e72d8d2Sderaadt #if defined (EAFNOSUPPORT)
3661e72d8d2Sderaadt   ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"),
3671e72d8d2Sderaadt #endif
3681e72d8d2Sderaadt #if defined (EADDRINUSE)
3691e72d8d2Sderaadt   ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"),
3701e72d8d2Sderaadt #endif
3711e72d8d2Sderaadt #if defined (EADDRNOTAVAIL)
3721e72d8d2Sderaadt   ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"),
3731e72d8d2Sderaadt #endif
3741e72d8d2Sderaadt #if defined (ENETDOWN)
3751e72d8d2Sderaadt   ENTRY(ENETDOWN, "ENETDOWN", "Network is down"),
3761e72d8d2Sderaadt #endif
3771e72d8d2Sderaadt #if defined (ENETUNREACH)
3781e72d8d2Sderaadt   ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"),
3791e72d8d2Sderaadt #endif
3801e72d8d2Sderaadt #if defined (ENETRESET)
3811e72d8d2Sderaadt   ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"),
3821e72d8d2Sderaadt #endif
3831e72d8d2Sderaadt #if defined (ECONNABORTED)
3841e72d8d2Sderaadt   ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"),
3851e72d8d2Sderaadt #endif
3861e72d8d2Sderaadt #if defined (ECONNRESET)
3871e72d8d2Sderaadt   ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"),
3881e72d8d2Sderaadt #endif
3891e72d8d2Sderaadt #if defined (ENOBUFS)
3901e72d8d2Sderaadt   ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"),
3911e72d8d2Sderaadt #endif
3921e72d8d2Sderaadt #if defined (EISCONN)
3931e72d8d2Sderaadt   ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"),
3941e72d8d2Sderaadt #endif
3951e72d8d2Sderaadt #if defined (ENOTCONN)
3961e72d8d2Sderaadt   ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"),
3971e72d8d2Sderaadt #endif
3981e72d8d2Sderaadt #if defined (ESHUTDOWN)
3991e72d8d2Sderaadt   ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"),
4001e72d8d2Sderaadt #endif
4011e72d8d2Sderaadt #if defined (ETOOMANYREFS)
4021e72d8d2Sderaadt   ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"),
4031e72d8d2Sderaadt #endif
4041e72d8d2Sderaadt #if defined (ETIMEDOUT)
4051e72d8d2Sderaadt   ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"),
4061e72d8d2Sderaadt #endif
4071e72d8d2Sderaadt #if defined (ECONNREFUSED)
4081e72d8d2Sderaadt   ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"),
4091e72d8d2Sderaadt #endif
4101e72d8d2Sderaadt #if defined (EHOSTDOWN)
4111e72d8d2Sderaadt   ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"),
4121e72d8d2Sderaadt #endif
4131e72d8d2Sderaadt #if defined (EHOSTUNREACH)
4141e72d8d2Sderaadt   ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"),
4151e72d8d2Sderaadt #endif
4161e72d8d2Sderaadt #if defined (EALREADY)
4171e72d8d2Sderaadt   ENTRY(EALREADY, "EALREADY", "Operation already in progress"),
4181e72d8d2Sderaadt #endif
4191e72d8d2Sderaadt #if defined (EINPROGRESS)
4201e72d8d2Sderaadt   ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"),
4211e72d8d2Sderaadt #endif
4221e72d8d2Sderaadt #if defined (ESTALE)
4231e72d8d2Sderaadt   ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"),
4241e72d8d2Sderaadt #endif
4251e72d8d2Sderaadt #if defined (EUCLEAN)
4261e72d8d2Sderaadt   ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"),
4271e72d8d2Sderaadt #endif
4281e72d8d2Sderaadt #if defined (ENOTNAM)
4291e72d8d2Sderaadt   ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"),
4301e72d8d2Sderaadt #endif
4311e72d8d2Sderaadt #if defined (ENAVAIL)
4321e72d8d2Sderaadt   ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"),
4331e72d8d2Sderaadt #endif
4341e72d8d2Sderaadt #if defined (EISNAM)
4351e72d8d2Sderaadt   ENTRY(EISNAM, "EISNAM", "Is a named type file"),
4361e72d8d2Sderaadt #endif
4371e72d8d2Sderaadt #if defined (EREMOTEIO)
4381e72d8d2Sderaadt   ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"),
4391e72d8d2Sderaadt #endif
4401e72d8d2Sderaadt   ENTRY(0, NULL, NULL)
4411e72d8d2Sderaadt };
4421e72d8d2Sderaadt 
4431e72d8d2Sderaadt /* Translation table allocated and initialized at runtime.  Indexed by the
4441e72d8d2Sderaadt    errno value to find the equivalent symbolic value. */
4451e72d8d2Sderaadt 
4461e72d8d2Sderaadt static char **error_names;
4471e72d8d2Sderaadt static int num_error_names = 0;
4481e72d8d2Sderaadt 
4491e72d8d2Sderaadt /* Translation table allocated and initialized at runtime, if it does not
4501e72d8d2Sderaadt    already exist in the host environment.  Indexed by the errno value to find
4511e72d8d2Sderaadt    the descriptive string.
4521e72d8d2Sderaadt 
4531e72d8d2Sderaadt    We don't export it for use in other modules because even though it has the
4541e72d8d2Sderaadt    same name, it differs from other implementations in that it is dynamically
4551e72d8d2Sderaadt    initialized rather than statically initialized. */
4561e72d8d2Sderaadt 
4571e72d8d2Sderaadt #ifdef NEED_sys_errlist
4581e72d8d2Sderaadt 
4591e72d8d2Sderaadt static int sys_nerr;
4601e72d8d2Sderaadt static char **sys_errlist;
4611e72d8d2Sderaadt 
4621e72d8d2Sderaadt #else
4631e72d8d2Sderaadt 
4641e72d8d2Sderaadt extern int sys_nerr;
4651e72d8d2Sderaadt extern char *sys_errlist[];
4661e72d8d2Sderaadt 
4671e72d8d2Sderaadt #endif
4681e72d8d2Sderaadt 
4691e72d8d2Sderaadt 
4701e72d8d2Sderaadt /*
4711e72d8d2Sderaadt 
4721e72d8d2Sderaadt NAME
4731e72d8d2Sderaadt 
4741e72d8d2Sderaadt 	init_error_tables -- initialize the name and message tables
4751e72d8d2Sderaadt 
4761e72d8d2Sderaadt SYNOPSIS
4771e72d8d2Sderaadt 
4781e72d8d2Sderaadt 	static void init_error_tables ();
4791e72d8d2Sderaadt 
4801e72d8d2Sderaadt DESCRIPTION
4811e72d8d2Sderaadt 
4821e72d8d2Sderaadt 	Using the error_table, which is initialized at compile time, generate
4831e72d8d2Sderaadt 	the error_names and the sys_errlist (if needed) tables, which are
4841e72d8d2Sderaadt 	indexed at runtime by a specific errno value.
4851e72d8d2Sderaadt 
4861e72d8d2Sderaadt BUGS
4871e72d8d2Sderaadt 
4881e72d8d2Sderaadt 	The initialization of the tables may fail under low memory conditions,
4891e72d8d2Sderaadt 	in which case we don't do anything particularly useful, but we don't
4901e72d8d2Sderaadt 	bomb either.  Who knows, it might succeed at a later point if we free
4911e72d8d2Sderaadt 	some memory in the meantime.  In any case, the other routines know
4921e72d8d2Sderaadt 	how to deal with lack of a table after trying to initialize it.  This
4931e72d8d2Sderaadt 	may or may not be considered to be a bug, that we don't specifically
4941e72d8d2Sderaadt 	warn about this particular failure mode.
4951e72d8d2Sderaadt 
4961e72d8d2Sderaadt */
4971e72d8d2Sderaadt 
4981e72d8d2Sderaadt static void
init_error_tables()4991e72d8d2Sderaadt init_error_tables ()
5001e72d8d2Sderaadt {
5011e72d8d2Sderaadt   const struct error_info *eip;
5021e72d8d2Sderaadt   int nbytes;
5031e72d8d2Sderaadt 
5041e72d8d2Sderaadt   /* If we haven't already scanned the error_table once to find the maximum
5051e72d8d2Sderaadt      errno value, then go find it now. */
5061e72d8d2Sderaadt 
5071e72d8d2Sderaadt   if (num_error_names == 0)
5081e72d8d2Sderaadt     {
5091e72d8d2Sderaadt       for (eip = error_table; eip -> name != NULL; eip++)
5101e72d8d2Sderaadt 	{
5111e72d8d2Sderaadt 	  if (eip -> value >= num_error_names)
5121e72d8d2Sderaadt 	    {
5131e72d8d2Sderaadt 	      num_error_names = eip -> value + 1;
5141e72d8d2Sderaadt 	    }
5151e72d8d2Sderaadt 	}
5161e72d8d2Sderaadt     }
5171e72d8d2Sderaadt 
5181e72d8d2Sderaadt   /* Now attempt to allocate the error_names table, zero it out, and then
5191e72d8d2Sderaadt      initialize it from the statically initialized error_table. */
5201e72d8d2Sderaadt 
5211e72d8d2Sderaadt   if (error_names == NULL)
5221e72d8d2Sderaadt     {
5231e72d8d2Sderaadt       nbytes = num_error_names * sizeof (char *);
5241e72d8d2Sderaadt       if ((error_names = (char **) malloc (nbytes)) != NULL)
5251e72d8d2Sderaadt 	{
5261e72d8d2Sderaadt 	  memset (error_names, 0, nbytes);
5271e72d8d2Sderaadt 	  for (eip = error_table; eip -> name != NULL; eip++)
5281e72d8d2Sderaadt 	    {
5291e72d8d2Sderaadt 	      error_names[eip -> value] = eip -> name;
5301e72d8d2Sderaadt 	    }
5311e72d8d2Sderaadt 	}
5321e72d8d2Sderaadt     }
5331e72d8d2Sderaadt 
5341e72d8d2Sderaadt #ifdef NEED_sys_errlist
5351e72d8d2Sderaadt 
5361e72d8d2Sderaadt   /* Now attempt to allocate the sys_errlist table, zero it out, and then
5371e72d8d2Sderaadt      initialize it from the statically initialized error_table. */
5381e72d8d2Sderaadt 
5391e72d8d2Sderaadt   if (sys_errlist == NULL)
5401e72d8d2Sderaadt     {
5411e72d8d2Sderaadt       nbytes = num_error_names * sizeof (char *);
5421e72d8d2Sderaadt       if ((sys_errlist = (char **) malloc (nbytes)) != NULL)
5431e72d8d2Sderaadt 	{
5441e72d8d2Sderaadt 	  memset (sys_errlist, 0, nbytes);
5451e72d8d2Sderaadt 	  sys_nerr = num_error_names;
5461e72d8d2Sderaadt 	  for (eip = error_table; eip -> name != NULL; eip++)
5471e72d8d2Sderaadt 	    {
5481e72d8d2Sderaadt 	      sys_errlist[eip -> value] = eip -> msg;
5491e72d8d2Sderaadt 	    }
5501e72d8d2Sderaadt 	}
5511e72d8d2Sderaadt     }
5521e72d8d2Sderaadt 
5531e72d8d2Sderaadt #endif
5541e72d8d2Sderaadt 
5551e72d8d2Sderaadt }
5561e72d8d2Sderaadt 
5571e72d8d2Sderaadt /*
5581e72d8d2Sderaadt 
5591e72d8d2Sderaadt NAME
5601e72d8d2Sderaadt 
5611e72d8d2Sderaadt 	errno_max -- return the max errno value
5621e72d8d2Sderaadt 
5631e72d8d2Sderaadt SYNOPSIS
5641e72d8d2Sderaadt 
5651e72d8d2Sderaadt 	int errno_max ();
5661e72d8d2Sderaadt 
5671e72d8d2Sderaadt DESCRIPTION
5681e72d8d2Sderaadt 
5691e72d8d2Sderaadt 	Returns the maximum errno value for which a corresponding symbolic
5701e72d8d2Sderaadt 	name or message is available.  Note that in the case where
5711e72d8d2Sderaadt 	we use the sys_errlist supplied by the system, it is possible for
5721e72d8d2Sderaadt 	there to be more symbolic names than messages, or vice versa.
5731e72d8d2Sderaadt 	In fact, the manual page for perror(3C) explicitly warns that one
5741e72d8d2Sderaadt 	should check the size of the table (sys_nerr) before indexing it,
5751e72d8d2Sderaadt 	since new error codes may be added to the system before they are
5761e72d8d2Sderaadt 	added to the table.  Thus sys_nerr might be smaller than value
5771e72d8d2Sderaadt 	implied by the largest errno value defined in <errno.h>.
5781e72d8d2Sderaadt 
5791e72d8d2Sderaadt 	We return the maximum value that can be used to obtain a meaningful
5801e72d8d2Sderaadt 	symbolic name or message.
5811e72d8d2Sderaadt 
5821e72d8d2Sderaadt */
5831e72d8d2Sderaadt 
5841e72d8d2Sderaadt int
errno_max()5851e72d8d2Sderaadt errno_max ()
5861e72d8d2Sderaadt {
5871e72d8d2Sderaadt   int maxsize;
5881e72d8d2Sderaadt 
5891e72d8d2Sderaadt   if (error_names == NULL)
5901e72d8d2Sderaadt     {
5911e72d8d2Sderaadt       init_error_tables ();
5921e72d8d2Sderaadt     }
5931e72d8d2Sderaadt   maxsize = MAX (sys_nerr, num_error_names);
5941e72d8d2Sderaadt   return (maxsize - 1);
5951e72d8d2Sderaadt }
5961e72d8d2Sderaadt 
5971e72d8d2Sderaadt /*
5981e72d8d2Sderaadt 
5991e72d8d2Sderaadt NAME
6001e72d8d2Sderaadt 
6011e72d8d2Sderaadt 	strerror -- map an error number to an error message string
6021e72d8d2Sderaadt 
6031e72d8d2Sderaadt SYNOPSIS
6041e72d8d2Sderaadt 
6051e72d8d2Sderaadt 	char *strerror (int errnoval)
6061e72d8d2Sderaadt 
6071e72d8d2Sderaadt DESCRIPTION
6081e72d8d2Sderaadt 
6091e72d8d2Sderaadt 	Maps an errno number to an error message string, the contents of
6101e72d8d2Sderaadt 	which are implementation defined.  On systems which have the external
6111e72d8d2Sderaadt 	variables sys_nerr and sys_errlist, these strings will be the same
6121e72d8d2Sderaadt 	as the ones used by perror().
6131e72d8d2Sderaadt 
6141e72d8d2Sderaadt 	If the supplied error number is within the valid range of indices
6151e72d8d2Sderaadt 	for the sys_errlist, but no message is available for the particular
6161e72d8d2Sderaadt 	error number, then returns the string "Error NUM", where NUM is the
6171e72d8d2Sderaadt 	error number.
6181e72d8d2Sderaadt 
6191e72d8d2Sderaadt 	If the supplied error number is not a valid index into sys_errlist,
6201e72d8d2Sderaadt 	returns NULL.
6211e72d8d2Sderaadt 
6221e72d8d2Sderaadt 	The returned string is only guaranteed to be valid only until the
6231e72d8d2Sderaadt 	next call to strerror.
6241e72d8d2Sderaadt 
6251e72d8d2Sderaadt */
6261e72d8d2Sderaadt 
6271e72d8d2Sderaadt char *
strerror(errnoval)6281e72d8d2Sderaadt strerror (errnoval)
6291e72d8d2Sderaadt   int errnoval;
6301e72d8d2Sderaadt {
6311e72d8d2Sderaadt   char *msg;
6321e72d8d2Sderaadt   static char buf[32];
6331e72d8d2Sderaadt 
6341e72d8d2Sderaadt #ifdef NEED_sys_errlist
6351e72d8d2Sderaadt 
6361e72d8d2Sderaadt   if (error_names == NULL)
6371e72d8d2Sderaadt     {
6381e72d8d2Sderaadt       init_error_tables ();
6391e72d8d2Sderaadt     }
6401e72d8d2Sderaadt 
6411e72d8d2Sderaadt #endif
6421e72d8d2Sderaadt 
6431e72d8d2Sderaadt   if ((errnoval < 0) || (errnoval >= sys_nerr))
6441e72d8d2Sderaadt     {
6451e72d8d2Sderaadt       /* Out of range, just return NULL */
6461e72d8d2Sderaadt       msg = NULL;
6471e72d8d2Sderaadt     }
6481e72d8d2Sderaadt   else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL))
6491e72d8d2Sderaadt     {
6501e72d8d2Sderaadt       /* In range, but no sys_errlist or no entry at this index. */
6511e72d8d2Sderaadt       sprintf (buf, "Error %d", errnoval);
6521e72d8d2Sderaadt       msg = buf;
6531e72d8d2Sderaadt     }
6541e72d8d2Sderaadt   else
6551e72d8d2Sderaadt     {
6561e72d8d2Sderaadt       /* In range, and a valid message.  Just return the message. */
6571e72d8d2Sderaadt       msg = sys_errlist[errnoval];
6581e72d8d2Sderaadt     }
6591e72d8d2Sderaadt 
6601e72d8d2Sderaadt   return (msg);
6611e72d8d2Sderaadt }
6621e72d8d2Sderaadt 
6631e72d8d2Sderaadt 
6641e72d8d2Sderaadt 
6651e72d8d2Sderaadt /*
6661e72d8d2Sderaadt 
6671e72d8d2Sderaadt NAME
6681e72d8d2Sderaadt 
6691e72d8d2Sderaadt 	strerrno -- map an error number to a symbolic name string
6701e72d8d2Sderaadt 
6711e72d8d2Sderaadt SYNOPSIS
6721e72d8d2Sderaadt 
6731e72d8d2Sderaadt 	char *strerrno (int errnoval)
6741e72d8d2Sderaadt 
6751e72d8d2Sderaadt DESCRIPTION
6761e72d8d2Sderaadt 
6771e72d8d2Sderaadt 	Given an error number returned from a system call (typically
6781e72d8d2Sderaadt 	returned in errno), returns a pointer to a string containing the
6791e72d8d2Sderaadt 	symbolic name of that error number, as found in <errno.h>.
6801e72d8d2Sderaadt 
6811e72d8d2Sderaadt 	If the supplied error number is within the valid range of indices
6821e72d8d2Sderaadt 	for symbolic names, but no name is available for the particular
6831e72d8d2Sderaadt 	error number, then returns the string "Error NUM", where NUM is
6841e72d8d2Sderaadt 	the error number.
6851e72d8d2Sderaadt 
6861e72d8d2Sderaadt 	If the supplied error number is not within the range of valid
6871e72d8d2Sderaadt 	indices, then returns NULL.
6881e72d8d2Sderaadt 
6891e72d8d2Sderaadt BUGS
6901e72d8d2Sderaadt 
6911e72d8d2Sderaadt 	The contents of the location pointed to are only guaranteed to be
6921e72d8d2Sderaadt 	valid until the next call to strerrno.
6931e72d8d2Sderaadt 
6941e72d8d2Sderaadt */
6951e72d8d2Sderaadt 
6961e72d8d2Sderaadt char *
strerrno(errnoval)6971e72d8d2Sderaadt strerrno (errnoval)
6981e72d8d2Sderaadt   int errnoval;
6991e72d8d2Sderaadt {
7001e72d8d2Sderaadt   char *name;
7011e72d8d2Sderaadt   static char buf[32];
7021e72d8d2Sderaadt 
7031e72d8d2Sderaadt   if (error_names == NULL)
7041e72d8d2Sderaadt     {
7051e72d8d2Sderaadt       init_error_tables ();
7061e72d8d2Sderaadt     }
7071e72d8d2Sderaadt 
7081e72d8d2Sderaadt   if ((errnoval < 0) || (errnoval >= num_error_names))
7091e72d8d2Sderaadt     {
7101e72d8d2Sderaadt       /* Out of range, just return NULL */
7111e72d8d2Sderaadt       name = NULL;
7121e72d8d2Sderaadt     }
7131e72d8d2Sderaadt   else if ((error_names == NULL) || (error_names[errnoval] == NULL))
7141e72d8d2Sderaadt     {
7151e72d8d2Sderaadt       /* In range, but no error_names or no entry at this index. */
7161e72d8d2Sderaadt       sprintf (buf, "Error %d", errnoval);
7171e72d8d2Sderaadt       name = buf;
7181e72d8d2Sderaadt     }
7191e72d8d2Sderaadt   else
7201e72d8d2Sderaadt     {
7211e72d8d2Sderaadt       /* In range, and a valid name.  Just return the name. */
7221e72d8d2Sderaadt       name = error_names[errnoval];
7231e72d8d2Sderaadt     }
7241e72d8d2Sderaadt 
7251e72d8d2Sderaadt   return (name);
7261e72d8d2Sderaadt }
7271e72d8d2Sderaadt 
7281e72d8d2Sderaadt /*
7291e72d8d2Sderaadt 
7301e72d8d2Sderaadt NAME
7311e72d8d2Sderaadt 
7321e72d8d2Sderaadt 	strtoerrno -- map a symbolic errno name to a numeric value
7331e72d8d2Sderaadt 
7341e72d8d2Sderaadt SYNOPSIS
7351e72d8d2Sderaadt 
7361e72d8d2Sderaadt 	int strtoerrno (char *name)
7371e72d8d2Sderaadt 
7381e72d8d2Sderaadt DESCRIPTION
7391e72d8d2Sderaadt 
7401e72d8d2Sderaadt 	Given the symbolic name of a error number, map it to an errno value.
7411e72d8d2Sderaadt 	If no translation is found, returns 0.
7421e72d8d2Sderaadt 
7431e72d8d2Sderaadt */
7441e72d8d2Sderaadt 
7451e72d8d2Sderaadt int
strtoerrno(name)7461e72d8d2Sderaadt strtoerrno (name)
7471e72d8d2Sderaadt   char *name;
7481e72d8d2Sderaadt {
7491e72d8d2Sderaadt   int errnoval = 0;
7501e72d8d2Sderaadt 
7511e72d8d2Sderaadt   if (name != NULL)
7521e72d8d2Sderaadt     {
7531e72d8d2Sderaadt       if (error_names == NULL)
7541e72d8d2Sderaadt 	{
7551e72d8d2Sderaadt 	  init_error_tables ();
7561e72d8d2Sderaadt 	}
7571e72d8d2Sderaadt       for (errnoval = 0; errnoval < num_error_names; errnoval++)
7581e72d8d2Sderaadt 	{
7591e72d8d2Sderaadt 	  if ((error_names[errnoval] != NULL) &&
7601e72d8d2Sderaadt 	      (strcmp (name, error_names[errnoval]) == 0))
7611e72d8d2Sderaadt 	    {
7621e72d8d2Sderaadt 	      break;
7631e72d8d2Sderaadt 	    }
7641e72d8d2Sderaadt 	}
7651e72d8d2Sderaadt       if (errnoval == num_error_names)
7661e72d8d2Sderaadt 	{
7671e72d8d2Sderaadt 	  errnoval = 0;
7681e72d8d2Sderaadt 	}
7691e72d8d2Sderaadt     }
7701e72d8d2Sderaadt   return (errnoval);
7711e72d8d2Sderaadt }
7721e72d8d2Sderaadt 
7731e72d8d2Sderaadt 
7741e72d8d2Sderaadt /* A simple little main that does nothing but print all the errno translations
7751e72d8d2Sderaadt    if MAIN is defined and this file is compiled and linked. */
7761e72d8d2Sderaadt 
7771e72d8d2Sderaadt #ifdef MAIN
7781e72d8d2Sderaadt 
main()7791e72d8d2Sderaadt main ()
7801e72d8d2Sderaadt {
7811e72d8d2Sderaadt   int errn;
7821e72d8d2Sderaadt   int errnmax;
7831e72d8d2Sderaadt   char *name;
7841e72d8d2Sderaadt   char *msg;
7851e72d8d2Sderaadt   char *strerrno ();
7861e72d8d2Sderaadt   char *strerror ();
7871e72d8d2Sderaadt 
7881e72d8d2Sderaadt   errnmax = errno_max ();
7891e72d8d2Sderaadt   printf ("%d entries in names table.\n", num_error_names);
7901e72d8d2Sderaadt   printf ("%d entries in messages table.\n", sys_nerr);
7911e72d8d2Sderaadt   printf ("%d is max useful index.\n", errnmax);
7921e72d8d2Sderaadt 
7931e72d8d2Sderaadt   /* Keep printing values until we get to the end of *both* tables, not
7941e72d8d2Sderaadt      *either* table.  Note that knowing the maximum useful index does *not*
7951e72d8d2Sderaadt      relieve us of the responsibility of testing the return pointer for
7961e72d8d2Sderaadt      NULL. */
7971e72d8d2Sderaadt 
7981e72d8d2Sderaadt   for (errn = 0; errn <= errnmax; errn++)
7991e72d8d2Sderaadt     {
8001e72d8d2Sderaadt       name = strerrno (errn);
8011e72d8d2Sderaadt       name = (name == NULL) ? "<NULL>" : name;
8021e72d8d2Sderaadt       msg = strerror (errn);
8031e72d8d2Sderaadt       msg = (msg == NULL) ? "<NULL>" : msg;
8041e72d8d2Sderaadt       printf ("%-4d%-18s%s\n", errn, name, msg);
8051e72d8d2Sderaadt     }
8061e72d8d2Sderaadt }
8071e72d8d2Sderaadt 
8081e72d8d2Sderaadt #endif
809