Next: strerror_r, Previous: strcspn, Up: Strings

### 5.20 `strerror`—convert error number to string

Synopsis

         #include <string.h>
         char *strerror(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`':

`E2BIG`
  Arg list too long
`EACCES`
  Permission denied
`EADDRINUSE`
  Address already in use
`EADV`
  Advertise error
`EAFNOSUPPORT`
  Address family not supported by protocol family
`EAGAIN`
  No more processes
`EALREADY`
  Socket already connected
`EBADF`
  Bad file number
`EBADMSG`
  Bad message
`EBUSY`
  Device or resource busy
`ECHILD`
  No children
`ECOMM`
  Communication error
`ECONNABORTED`
  Software caused connection abort
`ECONNREFUSED`
  Connection refused
`EDEADLK`
  Deadlock
`EDESTADDRREQ`
  Destination address required
`EEXIST`
  File exists
`EDOM`
  Math argument
`EFAULT`
  Bad address
`EFBIG`
  File too large
`EHOSTDOWN`
  Host is down
`EHOSTUNREACH`
  Host is unreachable
`EIDRM`
  Identifier removed
`EINPROGRESS`
  Connection already in progress
`EINTR`
  Interrupted system call
`EINVAL`
  Invalid argument
`EIO`
  I/O error
`EISCONN`
  Socket is already connected
`EISDIR`
  Is a directory
`ELIBACC`
  Cannot access a needed shared library
`ELIBBAD`
  Accessing a corrupted shared library
`ELIBEXEC`
  Cannot exec a shared library directly
`ELIBMAX`
  Attempting to link in more shared libraries than system limit
`ELIBSCN`
  `.lib` section in a.out corrupted
`EMFILE`
  Too many open files
`EMLINK`
  Too many links
`EMSGSIZE`
  Message too long
`EMULTIHOP`
  Multihop attempted
`ENAMETOOLONG`
  File or path name too long
`ENETDOWN`
  Network interface not configured
`ENETUNREACH`
  Network is unreachable
`ENFILE`
  Too many open files in system
`ENODEV`
  No such device
`ENOENT`
  No such file or directory
`ENOEXEC`
  Exec format error
`ENOLCK`
  No lock
`ENOLINK`
  Virtual circuit is gone
`ENOMEM`
  Not enough space
`ENOMSG`
  No message of desired type
`ENONET`
  Machine is not on the network
`ENOPKG`
  No package
`ENOPROTOOPT`
  Protocol not available
`ENOSPC`
  No space left on device
`ENOSR`
  No stream resources
`ENOSTR`
  Not a stream
`ENOSYS`
  Function not implemented
`ENOTBLK`
  Block device required
`ENOTCONN`
  Socket is not connected
`ENOTDIR`
  Not a directory
`ENOTEMPTY`
  Directory not empty
`ENOTSOCK`
  Socket operation on non-socket
`ENOTSUP`
  Not supported
`ENOTTY`
  Not a character device
`ENXIO`
  No such device or address
`EPERM`
  Not owner
`EPIPE`
  Broken pipe
`EPROTO`
  Protocol error
`EPROTOTYPE`
  Protocol wrong type for socket
`EPROTONOSUPPORT`
  Unknown protocol
`ERANGE`
  Result too large
`EREMOTE`
  Resource is remote
`EROFS`
  Read-only file system
`ESHUTDOWN`
  Can't send after socket shutdown
`ESOCKTNOSUPPORT`
  Socket type not supported
`ESPIPE`
  Illegal seek
`ESRCH`
  No such process
`ESRMNT`
  Srmount error
`ETIME`
  Stream ioctl timeout
`ETIMEDOUT`
  Connection timed out
`ETXTBSY`
  Text file busy
`EXDEV`
  Cross-device link

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, ANSI C declares that subsequent calls to `strerror` may overwrite the result string; therefore portable code cannot depend on the reentrancy of this subroutine.

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 errnum as its argument.

`_user_strerror` takes one argument of type int, and returns a character pointer. If errnum is unknown to `_user_strerror`, `_user_strerror` returns NULL. The default `_user_strerror` returns NULL for all input values.

`strerror` requires no supporting OS subroutines.