| /*** |
| **** CAUTION!!! KEEP DOC CONSISTENT---if you change text of a message |
| **** here, change two places: |
| **** 1) the leading doc section (alphabetized by macro) |
| **** 2) the real text inside switch(errnum) |
| ***/ |
| |
| /* |
| FUNCTION |
| <<strerror>>---convert error number to string |
| |
| INDEX |
| strerror |
| |
| ANSI_SYNOPSIS |
| #include <string.h> |
| char *strerror(int <[errnum]>); |
| char *_strerror_r(struct _reent <[ptr]>, int <[errnum]>, |
| int <[internal]>, int *<[error]>); |
| |
| TRAD_SYNOPSIS |
| #include <string.h> |
| char *strerror(<[errnum]>) |
| int <[errnum]>; |
| |
| DESCRIPTION |
| <<strerror>> converts the error number <[errnum]> into a |
| string. The value of <[errnum]> is usually a copy of <<errno>>. |
| If <<errnum>> is not a known error number, the result points to an |
| empty string. |
| |
| This implementation of <<strerror>> prints out the following strings |
| for each of the values defined in `<<errno.h>>': |
| |
| o+ |
| o 0 |
| Success |
| |
| o E2BIG |
| Arg list too long |
| |
| o EACCES |
| Permission denied |
| |
| o EADDRINUSE |
| Address already in use |
| |
| o EADV |
| Advertise error |
| |
| o EAFNOSUPPORT |
| Address family not supported by protocol family |
| |
| o EAGAIN |
| No more processes |
| |
| o EALREADY |
| Socket already connected |
| |
| o EBADF |
| Bad file number |
| |
| o EBADMSG |
| Bad message |
| |
| o EBUSY |
| Device or resource busy |
| |
| o ECHILD |
| No children |
| |
| o ECOMM |
| Communication error |
| |
| o ECONNABORTED |
| Software caused connection abort |
| |
| o ECONNREFUSED |
| Connection refused |
| |
| o EDEADLK |
| Deadlock |
| |
| o EDESTADDRREQ |
| Destination address required |
| |
| o EEXIST |
| File exists |
| |
| o EDOM |
| Math argument |
| |
| o EFAULT |
| Bad address |
| |
| o EFBIG |
| File too large |
| |
| o EHOSTDOWN |
| Host is down |
| |
| o EHOSTUNREACH |
| Host is unreachable |
| |
| o EIDRM |
| Identifier removed |
| |
| o EINPROGRESS |
| Connection already in progress |
| |
| o EINTR |
| Interrupted system call |
| |
| o EINVAL |
| Invalid argument |
| |
| o EIO |
| I/O error |
| |
| o EISCONN |
| Socket is already connected |
| |
| o EISDIR |
| Is a directory |
| |
| o ELIBACC |
| Cannot access a needed shared library |
| |
| o ELIBBAD |
| Accessing a corrupted shared library |
| |
| o ELIBEXEC |
| Cannot exec a shared library directly |
| |
| o ELIBMAX |
| Attempting to link in more shared libraries than system limit |
| |
| o ELIBSCN |
| <<.lib>> section in a.out corrupted |
| |
| o EMFILE |
| Too many open files |
| |
| o EMLINK |
| Too many links |
| |
| o EMSGSIZE |
| Message too long |
| |
| o EMULTIHOP |
| Multihop attempted |
| |
| o ENAMETOOLONG |
| File or path name too long |
| |
| o ENETDOWN |
| Network interface not configured |
| |
| o ENETUNREACH |
| Network is unreachable |
| |
| o ENFILE |
| Too many open files in system |
| |
| o ENODEV |
| No such device |
| |
| o ENOENT |
| No such file or directory |
| |
| o ENOEXEC |
| Exec format error |
| |
| o ENOLCK |
| No lock |
| |
| o ENOLINK |
| Virtual circuit is gone |
| |
| o ENOMEM |
| Not enough space |
| |
| o ENOMSG |
| No message of desired type |
| |
| o ENONET |
| Machine is not on the network |
| |
| o ENOPKG |
| No package |
| |
| o ENOPROTOOPT |
| Protocol not available |
| |
| o ENOSPC |
| No space left on device |
| |
| o ENOSR |
| No stream resources |
| |
| o ENOSTR |
| Not a stream |
| |
| o ENOSYS |
| Function not implemented |
| |
| o ENOTBLK |
| Block device required |
| |
| o ENOTCONN |
| Socket is not connected |
| |
| o ENOTDIR |
| Not a directory |
| |
| o ENOTEMPTY |
| Directory not empty |
| |
| o ENOTSOCK |
| Socket operation on non-socket |
| |
| o ENOTSUP |
| Not supported |
| |
| o ENOTTY |
| Not a character device |
| |
| o ENXIO |
| No such device or address |
| |
| o EPERM |
| Not owner |
| |
| o EPIPE |
| Broken pipe |
| |
| o EPROTO |
| Protocol error |
| |
| o EPROTOTYPE |
| Protocol wrong type for socket |
| |
| o EPROTONOSUPPORT |
| Unknown protocol |
| |
| o ERANGE |
| Result too large |
| |
| o EREMOTE |
| Resource is remote |
| |
| o EROFS |
| Read-only file system |
| |
| o ESHUTDOWN |
| Can't send after socket shutdown |
| |
| o ESOCKTNOSUPPORT |
| Socket type not supported |
| |
| o ESPIPE |
| Illegal seek |
| |
| o ESRCH |
| No such process |
| |
| o ESRMNT |
| Srmount error |
| |
| o ETIME |
| Stream ioctl timeout |
| |
| o ETIMEDOUT |
| Connection timed out |
| |
| o ETXTBSY |
| Text file busy |
| |
| o EXDEV |
| Cross-device link |
| |
| o ECANCELED |
| Operation canceled |
| |
| o ENOTRECOVERABLE |
| State not recoverable |
| |
| o EOWNERDEAD |
| Previous owner died |
| |
| o ESTRPIPE |
| Strings pipe error |
| |
| o- |
| |
| <<_strerror_r>> is a reentrant version of the above. |
| |
| RETURNS |
| This function returns a pointer to a string. Your application must |
| not modify that string. |
| |
| PORTABILITY |
| ANSI C requires <<strerror>>, but does not specify the strings used |
| for each error number. |
| |
| Although this implementation of <<strerror>> is reentrant (depending |
| on <<_user_strerror>>), ANSI C declares that subsequent calls to |
| <<strerror>> may overwrite the result string; therefore portable |
| code cannot depend on the reentrancy of this subroutine. |
| |
| Although this implementation of <<strerror>> guarantees a non-null |
| result with a NUL-terminator, some implementations return <<NULL>> |
| on failure. Although POSIX allows <<strerror>> to set <<errno>> |
| to EINVAL on failure, this implementation does not do so (unless |
| you provide <<_user_strerror>>). |
| |
| POSIX recommends that unknown <[errnum]> result in a message |
| including that value, however it is not a requirement and this |
| implementation does not provide that information (unless you |
| provide <<_user_strerror>>). |
| |
| This implementation of <<strerror>> provides for user-defined |
| extensibility. <<errno.h>> defines <[__ELASTERROR]>, which can be |
| used as a base for user-defined error values. If the user supplies a |
| routine named <<_user_strerror>>, and <[errnum]> passed to |
| <<strerror>> does not match any of the supported values, |
| <<_user_strerror>> is called with three arguments. The first is of |
| type <[int]>, and is the <[errnum]> value unknown to <<strerror>>. |
| The second is of type <[int]>, and matches the <[internal]> argument |
| of <<_strerror_r>>; this should be zero if called from <<strerror>> |
| and non-zero if called from any other function; <<_user_strerror>> can |
| use this information to satisfy the POSIX rule that no other |
| standardized function can overwrite a static buffer reused by |
| <<strerror>>. The third is of type <[int *]>, and matches the |
| <[error]> argument of <<_strerror_r>>; if a non-zero value is stored |
| into that location (usually <[EINVAL]>), then <<strerror>> will set |
| <<errno>> to that value, and the XPG variant of <<strerror_r>> will |
| return that value instead of zero or <[ERANGE]>. <<_user_strerror>> |
| returns a <[char *]> value; returning <[NULL]> implies that the user |
| function did not choose to handle <[errnum]>. The default |
| <<_user_strerror>> returns <[NULL]> for all input values. Note that |
| <<_user_sterror>> must be thread-safe, and only denote errors via the |
| third argument rather than modifying <<errno>>, if <<strerror>> and |
| <<strerror_r>> are are to comply with POSIX. |
| |
| <<strerror>> requires no supporting OS subroutines. |
| |
| QUICKREF |
| strerror ansi pure |
| */ |
| |
| #include <errno.h> |
| #include <string.h> |
| |
| char * |
| _DEFUN (_strerror_r, (ptr, errnum, internal, errptr), |
| struct _reent *ptr _AND |
| int errnum _AND |
| int internal _AND |
| int *errptr) |
| { |
| char *error; |
| extern char *_user_strerror _PARAMS ((int, int, int *)); |
| |
| switch (errnum) |
| { |
| case 0: |
| error = "Success"; |
| break; |
| /* go32 defines EPERM as EACCES */ |
| #if defined (EPERM) && (!defined (EACCES) || (EPERM != EACCES)) |
| case EPERM: |
| error = "Not owner"; |
| break; |
| #endif |
| #ifdef ENOENT |
| case ENOENT: |
| error = "No such file or directory"; |
| break; |
| #endif |
| #ifdef ESRCH |
| case ESRCH: |
| error = "No such process"; |
| break; |
| #endif |
| #ifdef EINTR |
| case EINTR: |
| error = "Interrupted system call"; |
| break; |
| #endif |
| #ifdef EIO |
| case EIO: |
| error = "I/O error"; |
| break; |
| #endif |
| /* go32 defines ENXIO as ENODEV */ |
| #if defined (ENXIO) && (!defined (ENODEV) || (ENXIO != ENODEV)) |
| case ENXIO: |
| error = "No such device or address"; |
| break; |
| #endif |
| #ifdef E2BIG |
| case E2BIG: |
| error = "Arg list too long"; |
| break; |
| #endif |
| #ifdef ENOEXEC |
| case ENOEXEC: |
| error = "Exec format error"; |
| break; |
| #endif |
| #ifdef EALREADY |
| case EALREADY: |
| error = "Socket already connected"; |
| break; |
| #endif |
| #ifdef EBADF |
| case EBADF: |
| error = "Bad file number"; |
| break; |
| #endif |
| #ifdef ECHILD |
| case ECHILD: |
| error = "No children"; |
| break; |
| #endif |
| #ifdef EDESTADDRREQ |
| case EDESTADDRREQ: |
| error = "Destination address required"; |
| break; |
| #endif |
| #ifdef EAGAIN |
| case EAGAIN: |
| error = "No more processes"; |
| break; |
| #endif |
| #ifdef ENOMEM |
| case ENOMEM: |
| error = "Not enough space"; |
| break; |
| #endif |
| #ifdef EACCES |
| case EACCES: |
| error = "Permission denied"; |
| break; |
| #endif |
| #ifdef EFAULT |
| case EFAULT: |
| error = "Bad address"; |
| break; |
| #endif |
| #ifdef ENOTBLK |
| case ENOTBLK: |
| error = "Block device required"; |
| break; |
| #endif |
| #ifdef EBUSY |
| case EBUSY: |
| error = "Device or resource busy"; |
| break; |
| #endif |
| #ifdef EEXIST |
| case EEXIST: |
| error = "File exists"; |
| break; |
| #endif |
| #ifdef EXDEV |
| case EXDEV: |
| error = "Cross-device link"; |
| break; |
| #endif |
| #ifdef ENODEV |
| case ENODEV: |
| error = "No such device"; |
| break; |
| #endif |
| #ifdef ENOTDIR |
| case ENOTDIR: |
| error = "Not a directory"; |
| break; |
| #endif |
| #ifdef EHOSTDOWN |
| case EHOSTDOWN: |
| error = "Host is down"; |
| break; |
| #endif |
| #ifdef EINPROGRESS |
| case EINPROGRESS: |
| error = "Connection already in progress"; |
| break; |
| #endif |
| #ifdef EISDIR |
| case EISDIR: |
| error = "Is a directory"; |
| break; |
| #endif |
| #ifdef EINVAL |
| case EINVAL: |
| error = "Invalid argument"; |
| break; |
| #endif |
| #ifdef ENETDOWN |
| case ENETDOWN: |
| error = "Network interface is not configured"; |
| break; |
| #endif |
| #ifdef ENFILE |
| case ENFILE: |
| error = "Too many open files in system"; |
| break; |
| #endif |
| #ifdef EMFILE |
| case EMFILE: |
| error = "Too many open files"; |
| break; |
| #endif |
| #ifdef ENOTTY |
| case ENOTTY: |
| error = "Not a character device"; |
| break; |
| #endif |
| #ifdef ETXTBSY |
| case ETXTBSY: |
| error = "Text file busy"; |
| break; |
| #endif |
| #ifdef EFBIG |
| case EFBIG: |
| error = "File too large"; |
| break; |
| #endif |
| #ifdef EHOSTUNREACH |
| case EHOSTUNREACH: |
| error = "Host is unreachable"; |
| break; |
| #endif |
| #ifdef ENOSPC |
| case ENOSPC: |
| error = "No space left on device"; |
| break; |
| #endif |
| #ifdef ENOTSUP |
| case ENOTSUP: |
| error = "Not supported"; |
| break; |
| #endif |
| #ifdef ESPIPE |
| case ESPIPE: |
| error = "Illegal seek"; |
| break; |
| #endif |
| #ifdef EROFS |
| case EROFS: |
| error = "Read-only file system"; |
| break; |
| #endif |
| #ifdef EMLINK |
| case EMLINK: |
| error = "Too many links"; |
| break; |
| #endif |
| #ifdef EPIPE |
| case EPIPE: |
| error = "Broken pipe"; |
| break; |
| #endif |
| #ifdef EDOM |
| case EDOM: |
| error = "Math argument"; |
| break; |
| #endif |
| #ifdef ERANGE |
| case ERANGE: |
| error = "Result too large"; |
| break; |
| #endif |
| #ifdef ENOMSG |
| case ENOMSG: |
| error = "No message of desired type"; |
| break; |
| #endif |
| #ifdef EIDRM |
| case EIDRM: |
| error = "Identifier removed"; |
| break; |
| #endif |
| #ifdef EDEADLK |
| case EDEADLK: |
| error = "Deadlock"; |
| break; |
| #endif |
| #ifdef ENETUNREACH |
| case ENETUNREACH: |
| error = "Network is unreachable"; |
| break; |
| #endif |
| #ifdef ENOLCK |
| case ENOLCK: |
| error = "No lock"; |
| break; |
| #endif |
| #ifdef ENOSTR |
| case ENOSTR: |
| error = "Not a stream"; |
| break; |
| #endif |
| #ifdef ETIME |
| case ETIME: |
| error = "Stream ioctl timeout"; |
| break; |
| #endif |
| #ifdef ENOSR |
| case ENOSR: |
| error = "No stream resources"; |
| break; |
| #endif |
| #ifdef ENONET |
| case ENONET: |
| error = "Machine is not on the network"; |
| break; |
| #endif |
| #ifdef ENOPKG |
| case ENOPKG: |
| error = "No package"; |
| break; |
| #endif |
| #ifdef EREMOTE |
| case EREMOTE: |
| error = "Resource is remote"; |
| break; |
| #endif |
| #ifdef ENOLINK |
| case ENOLINK: |
| error = "Virtual circuit is gone"; |
| break; |
| #endif |
| #ifdef EADV |
| case EADV: |
| error = "Advertise error"; |
| break; |
| #endif |
| #ifdef ESRMNT |
| case ESRMNT: |
| error = "Srmount error"; |
| break; |
| #endif |
| #ifdef ECOMM |
| case ECOMM: |
| error = "Communication error"; |
| break; |
| #endif |
| #ifdef EPROTO |
| case EPROTO: |
| error = "Protocol error"; |
| break; |
| #endif |
| #ifdef EPROTONOSUPPORT |
| case EPROTONOSUPPORT: |
| error = "Unknown protocol"; |
| break; |
| #endif |
| #ifdef EMULTIHOP |
| case EMULTIHOP: |
| error = "Multihop attempted"; |
| break; |
| #endif |
| #ifdef EBADMSG |
| case EBADMSG: |
| error = "Bad message"; |
| break; |
| #endif |
| #ifdef ELIBACC |
| case ELIBACC: |
| error = "Cannot access a needed shared library"; |
| break; |
| #endif |
| #ifdef ELIBBAD |
| case ELIBBAD: |
| error = "Accessing a corrupted shared library"; |
| break; |
| #endif |
| #ifdef ELIBSCN |
| case ELIBSCN: |
| error = ".lib section in a.out corrupted"; |
| break; |
| #endif |
| #ifdef ELIBMAX |
| case ELIBMAX: |
| error = "Attempting to link in more shared libraries than system limit"; |
| break; |
| #endif |
| #ifdef ELIBEXEC |
| case ELIBEXEC: |
| error = "Cannot exec a shared library directly"; |
| break; |
| #endif |
| #ifdef ENOSYS |
| case ENOSYS: |
| error = "Function not implemented"; |
| break; |
| #endif |
| #ifdef ENMFILE |
| case ENMFILE: |
| error = "No more files"; |
| break; |
| #endif |
| #ifdef ENOTEMPTY |
| case ENOTEMPTY: |
| error = "Directory not empty"; |
| break; |
| #endif |
| #ifdef ENAMETOOLONG |
| case ENAMETOOLONG: |
| error = "File or path name too long"; |
| break; |
| #endif |
| #ifdef ELOOP |
| case ELOOP: |
| error = "Too many symbolic links"; |
| break; |
| #endif |
| #ifdef ENOBUFS |
| case ENOBUFS: |
| error = "No buffer space available"; |
| break; |
| #endif |
| #ifdef EAFNOSUPPORT |
| case EAFNOSUPPORT: |
| error = "Address family not supported by protocol family"; |
| break; |
| #endif |
| #ifdef EPROTOTYPE |
| case EPROTOTYPE: |
| error = "Protocol wrong type for socket"; |
| break; |
| #endif |
| #ifdef ENOTSOCK |
| case ENOTSOCK: |
| error = "Socket operation on non-socket"; |
| break; |
| #endif |
| #ifdef ENOPROTOOPT |
| case ENOPROTOOPT: |
| error = "Protocol not available"; |
| break; |
| #endif |
| #ifdef ESHUTDOWN |
| case ESHUTDOWN: |
| error = "Can't send after socket shutdown"; |
| break; |
| #endif |
| #ifdef ECONNREFUSED |
| case ECONNREFUSED: |
| error = "Connection refused"; |
| break; |
| #endif |
| #ifdef EADDRINUSE |
| case EADDRINUSE: |
| error = "Address already in use"; |
| break; |
| #endif |
| #ifdef ECONNABORTED |
| case ECONNABORTED: |
| error = "Software caused connection abort"; |
| break; |
| #endif |
| #if (defined(EWOULDBLOCK) && (!defined (EAGAIN) || (EWOULDBLOCK != EAGAIN))) |
| case EWOULDBLOCK: |
| error = "Operation would block"; |
| break; |
| #endif |
| #ifdef ENOTCONN |
| case ENOTCONN: |
| error = "Socket is not connected"; |
| break; |
| #endif |
| #ifdef ESOCKTNOSUPPORT |
| case ESOCKTNOSUPPORT: |
| error = "Socket type not supported"; |
| break; |
| #endif |
| #ifdef EISCONN |
| case EISCONN: |
| error = "Socket is already connected"; |
| break; |
| #endif |
| #ifdef ECANCELED |
| case ECANCELED: |
| error = "Operation canceled"; |
| break; |
| #endif |
| #ifdef ENOTRECOVERABLE |
| case ENOTRECOVERABLE: |
| error = "State not recoverable"; |
| break; |
| #endif |
| #ifdef EOWNERDEAD |
| case EOWNERDEAD: |
| error = "Previous owner died"; |
| break; |
| #endif |
| #ifdef ESTRPIPE |
| case ESTRPIPE: |
| error = "Streams pipe error"; |
| break; |
| #endif |
| #if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP)) |
| case EOPNOTSUPP: |
| error = "Operation not supported on socket"; |
| break; |
| #endif |
| #ifdef EMSGSIZE |
| case EMSGSIZE: |
| error = "Message too long"; |
| break; |
| #endif |
| #ifdef ETIMEDOUT |
| case ETIMEDOUT: |
| error = "Connection timed out"; |
| break; |
| #endif |
| default: |
| if (!errptr) |
| errptr = &ptr->_errno; |
| if ((error = _user_strerror (errnum, internal, errptr)) == 0) |
| error = ""; |
| break; |
| } |
| |
| return error; |
| } |
| |
| char * |
| _DEFUN(strerror, (int), |
| int errnum) |
| { |
| return _strerror_r (_REENT, errnum, 0, NULL); |
| } |