@node Error Reporting, Memory, Introduction, Top
@chapter Error Reporting
@c %MENU% How library functions report errors
@cindex error reporting
@cindex reporting errors
@cindex error codes
@cindex status codes

Many functions in @theglibc{} detect and report error conditions,
and sometimes your programs need to check for these error conditions.
For example, when you open an input file, you should verify that the
file was actually opened correctly, and print an error message or take
other appropriate action if the call to the library function failed.

This chapter describes how the error reporting facility works.  Your
program should include the header file @file{errno.h} to use this
facility.
@pindex errno.h

@menu
* Checking for Errors::         How errors are reported by library functions.
* Error Codes::                 Error code macros; all of these expand
                                 into integer constant values.
* Error Messages::              Mapping error codes onto error messages.
@end menu

@node Checking for Errors, Error Codes,  , Error Reporting
@section Checking for Errors

Most library functions return a special value to indicate that they have
failed.  The special value is typically @code{-1}, a null pointer, or a
constant such as @code{EOF} that is defined for that purpose.  But this
return value tells you only that an error has occurred.  To find out
what kind of error it was, you need to look at the error code stored in the
variable @code{errno}.  This variable is declared in the header file
@file{errno.h}.
@pindex errno.h

@comment errno.h
@comment ISO
@deftypevr {Variable} {volatile int} errno
The variable @code{errno} contains the system error number.  You can
change the value of @code{errno}.

Since @code{errno} is declared @code{volatile}, it might be changed
asynchronously by a signal handler; see @ref{Defining Handlers}.
However, a properly written signal handler saves and restores the value
of @code{errno}, so you generally do not need to worry about this
possibility except when writing signal handlers.

The initial value of @code{errno} at program startup is zero.  Many
library functions are guaranteed to set it to certain nonzero values
when they encounter certain kinds of errors.  These error conditions are
listed for each function.  These functions do not change @code{errno}
when they succeed; thus, the value of @code{errno} after a successful
call is not necessarily zero, and you should not use @code{errno} to
determine @emph{whether} a call failed.  The proper way to do that is
documented for each function.  @emph{If} the call failed, you can
examine @code{errno}.

Many library functions can set @code{errno} to a nonzero value as a
result of calling other library functions which might fail.  You should
assume that any library function might alter @code{errno} when the
function returns an error.

@strong{Portability Note:} @w{ISO C} specifies @code{errno} as a
``modifiable lvalue'' rather than as a variable, permitting it to be
implemented as a macro.  For example, its expansion might involve a
function call, like @w{@code{*__errno_location ()}}.  In fact, that is
what it is
on @gnulinuxhurdsystems{}.  @Theglibc{}, on each system, does
whatever is right for the particular system.

There are a few library functions, like @code{sqrt} and @code{atan},
that return a perfectly legitimate value in case of an error, but also
set @code{errno}.  For these functions, if you want to check to see
whether an error occurred, the recommended method is to set @code{errno}
to zero before calling the function, and then check its value afterward.
@end deftypevr

@pindex errno.h
All the error codes have symbolic names; they are macros defined in
@file{errno.h}.  The names start with @samp{E} and an upper-case
letter or digit; you should consider names of this form to be
reserved names.  @xref{Reserved Names}.

The error code values are all positive integers and are all distinct,
with one exception: @code{EWOULDBLOCK} and @code{EAGAIN} are the same.
Since the values are distinct, you can use them as labels in a
@code{switch} statement; just don't use both @code{EWOULDBLOCK} and
@code{EAGAIN}.  Your program should not make any other assumptions about
the specific values of these symbolic constants.

The value of @code{errno} doesn't necessarily have to correspond to any
of these macros, since some library functions might return other error
codes of their own for other situations.  The only values that are
guaranteed to be meaningful for a particular library function are the
ones that this manual lists for that function.

Except on @gnuhurdsystems{}, almost any system call can return @code{EFAULT} if
it is given an invalid pointer as an argument.  Since this could only
happen as a result of a bug in your program, and since it will not
happen on @gnuhurdsystems{}, we have saved space by not mentioning
@code{EFAULT} in the descriptions of individual functions.

In some Unix systems, many system calls can also return @code{EFAULT} if
given as an argument a pointer into the stack, and the kernel for some
obscure reason fails in its attempt to extend the stack.  If this ever
happens, you should probably try using statically or dynamically
allocated memory instead of stack memory on that system.

@node Error Codes, Error Messages, Checking for Errors, Error Reporting
@section Error Codes

@pindex errno.h
The error code macros are defined in the header file @file{errno.h}.
All of them expand into integer constant values.  Some of these error
codes can't occur on @gnusystems{}, but they can occur using @theglibc{}
on other systems.

@comment errno.h
@comment POSIX.1: Operation not permitted
@deftypevr Macro int EPERM
@comment errno 1 @c DO NOT REMOVE
Operation not permitted; only the owner of the file (or other resource)
or processes with special privileges can perform the operation.
@end deftypevr

@comment errno.h
@comment POSIX.1: No such file or directory
@deftypevr Macro int ENOENT
@comment errno 2 @c DO NOT REMOVE
No such file or directory.  This is a ``file doesn't exist'' error
for ordinary files that are referenced in contexts where they are
expected to already exist.
@end deftypevr

@comment errno.h
@comment POSIX.1: No such process
@deftypevr Macro int ESRCH
@comment errno 3 @c DO NOT REMOVE
No process matches the specified process ID.
@end deftypevr

@comment errno.h
@comment POSIX.1: Interrupted system call
@deftypevr Macro int EINTR
@comment errno 4 @c DO NOT REMOVE
Interrupted function call; an asynchronous signal occurred and prevented
completion of the call.  When this happens, you should try the call
again.

You can choose to have functions resume after a signal that is handled,
rather than failing with @code{EINTR}; see @ref{Interrupted
Primitives}.
@end deftypevr

@comment errno.h
@comment POSIX.1: Input/output error
@deftypevr Macro int EIO
@comment errno 5 @c DO NOT REMOVE
Input/output error; usually used for physical read or write errors.
@end deftypevr

@comment errno.h
@comment POSIX.1: No such device or address
@deftypevr Macro int ENXIO
@comment errno 6 @c DO NOT REMOVE
No such device or address.  The system tried to use the device
represented by a file you specified, and it couldn't find the device.
This can mean that the device file was installed incorrectly, or that
the physical device is missing or not correctly attached to the
computer.
@end deftypevr

@comment errno.h
@comment POSIX.1: Argument list too long
@deftypevr Macro int E2BIG
@comment errno 7 @c DO NOT REMOVE
Argument list too long; used when the arguments passed to a new program
being executed with one of the @code{exec} functions (@pxref{Executing a
File}) occupy too much memory space.  This condition never arises on
@gnuhurdsystems{}.
@end deftypevr

@comment errno.h
@comment POSIX.1: Exec format error
@deftypevr Macro int ENOEXEC
@comment errno 8 @c DO NOT REMOVE
Invalid executable file format.  This condition is detected by the
@code{exec} functions; see @ref{Executing a File}.
@end deftypevr

@comment errno.h
@comment POSIX.1: Bad file descriptor
@deftypevr Macro int EBADF
@comment errno 9 @c DO NOT REMOVE
Bad file descriptor; for example, I/O on a descriptor that has been
closed or reading from a descriptor open only for writing (or vice
versa).
@end deftypevr

@comment errno.h
@comment POSIX.1: No child processes
@deftypevr Macro int ECHILD
@comment errno 10 @c DO NOT REMOVE
There are no child processes.  This error happens on operations that are
supposed to manipulate child processes, when there aren't any processes
to manipulate.
@end deftypevr

@comment errno.h
@comment POSIX.1: Resource deadlock avoided
@deftypevr Macro int EDEADLK
@comment errno 11 @c DO NOT REMOVE
Deadlock avoided; allocating a system resource would have resulted in a
deadlock situation.  The system does not guarantee that it will notice
all such situations.  This error means you got lucky and the system
noticed; it might just hang.  @xref{File Locks}, for an example.
@end deftypevr

@comment errno.h
@comment POSIX.1: Cannot allocate memory
@deftypevr Macro int ENOMEM
@comment errno 12 @c DO NOT REMOVE
No memory available.  The system cannot allocate more virtual memory
because its capacity is full.
@end deftypevr

@comment errno.h
@comment POSIX.1: Permission denied
@deftypevr Macro int EACCES
@comment errno 13 @c DO NOT REMOVE
Permission denied; the file permissions do not allow the attempted operation.
@end deftypevr

@comment errno.h
@comment POSIX.1: Bad address
@deftypevr Macro int EFAULT
@comment errno 14 @c DO NOT REMOVE
Bad address; an invalid pointer was detected.
On @gnuhurdsystems{}, this error never happens; you get a signal instead.
@end deftypevr

@comment errno.h
@comment BSD: Block device required
@deftypevr Macro int ENOTBLK
@comment errno 15 @c DO NOT REMOVE
A file that isn't a block special file was given in a situation that
requires one.  For example, trying to mount an ordinary file as a file
system in Unix gives this error.
@end deftypevr

@comment errno.h
@comment POSIX.1: Device or resource busy
@deftypevr Macro int EBUSY
@comment errno 16 @c DO NOT REMOVE
Resource busy; a system resource that can't be shared is already in use.
For example, if you try to delete a file that is the root of a currently
mounted filesystem, you get this error.
@end deftypevr

@comment errno.h
@comment POSIX.1: File exists
@deftypevr Macro int EEXIST
@comment errno 17 @c DO NOT REMOVE
File exists; an existing file was specified in a context where it only
makes sense to specify a new file.
@end deftypevr

@comment errno.h
@comment POSIX.1: Invalid cross-device link
@deftypevr Macro int EXDEV
@comment errno 18 @c DO NOT REMOVE
An attempt to make an improper link across file systems was detected.
This happens not only when you use @code{link} (@pxref{Hard Links}) but
also when you rename a file with @code{rename} (@pxref{Renaming Files}).
@end deftypevr

@comment errno.h
@comment POSIX.1: No such device
@deftypevr Macro int ENODEV
@comment errno 19 @c DO NOT REMOVE
The wrong type of device was given to a function that expects a
particular sort of device.
@end deftypevr

@comment errno.h
@comment POSIX.1: Not a directory
@deftypevr Macro int ENOTDIR
@comment errno 20 @c DO NOT REMOVE
A file that isn't a directory was specified when a directory is required.
@end deftypevr

@comment errno.h
@comment POSIX.1: Is a directory
@deftypevr Macro int EISDIR
@comment errno 21 @c DO NOT REMOVE
File is a directory; you cannot open a directory for writing,
or create or remove hard links to it.
@end deftypevr

@comment errno.h
@comment POSIX.1: Invalid argument
@deftypevr Macro int EINVAL
@comment errno 22 @c DO NOT REMOVE
Invalid argument.  This is used to indicate various kinds of problems
with passing the wrong argument to a library function.
@end deftypevr

@comment errno.h
@comment POSIX.1: Too many open files
@deftypevr Macro int EMFILE
@comment errno 24 @c DO NOT REMOVE
The current process has too many files open and can't open any more.
Duplicate descriptors do count toward this limit.

In BSD and GNU, the number of open files is controlled by a resource
limit that can usually be increased.  If you get this error, you might
want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited;
@pxref{Limits on Resources}.
@end deftypevr

@comment errno.h
@comment POSIX.1: Too many open files in system
@deftypevr Macro int ENFILE
@comment errno 23 @c DO NOT REMOVE
There are too many distinct file openings in the entire system.  Note
that any number of linked channels count as just one file opening; see
@ref{Linked Channels}.  This error never occurs on @gnuhurdsystems{}.
@end deftypevr

@comment errno.h
@comment POSIX.1: Inappropriate ioctl for device
@deftypevr Macro int ENOTTY
@comment errno 25 @c DO NOT REMOVE
Inappropriate I/O control operation, such as trying to set terminal
modes on an ordinary file.
@end deftypevr

@comment errno.h
@comment BSD: Text file busy
@deftypevr Macro int ETXTBSY
@comment errno 26 @c DO NOT REMOVE
An attempt to execute a file that is currently open for writing, or
write to a file that is currently being executed.  Often using a
debugger to run a program is considered having it open for writing and
will cause this error.  (The name stands for ``text file busy''.)  This
is not an error on @gnuhurdsystems{}; the text is copied as necessary.
@end deftypevr

@comment errno.h
@comment POSIX.1: File too large
@deftypevr Macro int EFBIG
@comment errno 27 @c DO NOT REMOVE
File too big; the size of a file would be larger than allowed by the system.
@end deftypevr

@comment errno.h
@comment POSIX.1: No space left on device
@deftypevr Macro int ENOSPC
@comment errno 28 @c DO NOT REMOVE
No space left on device; write operation on a file failed because the
disk is full.
@end deftypevr

@comment errno.h
@comment POSIX.1: Illegal seek
@deftypevr Macro int ESPIPE
@comment errno 29 @c DO NOT REMOVE
Invalid seek operation (such as on a pipe).
@end deftypevr

@comment errno.h
@comment POSIX.1: Read-only file system
@deftypevr Macro int EROFS
@comment errno 30 @c DO NOT REMOVE
An attempt was made to modify something on a read-only file system.
@end deftypevr

@comment errno.h
@comment POSIX.1: Too many links
@deftypevr Macro int EMLINK
@comment errno 31 @c DO NOT REMOVE
Too many links; the link count of a single file would become too large.
@code{rename} can cause this error if the file being renamed already has
as many links as it can take (@pxref{Renaming Files}).
@end deftypevr

@comment errno.h
@comment POSIX.1: Broken pipe
@deftypevr Macro int EPIPE
@comment errno 32 @c DO NOT REMOVE
Broken pipe; there is no process reading from the other end of a pipe.
Every library function that returns this error code also generates a
@code{SIGPIPE} signal; this signal terminates the program if not handled
or blocked.  Thus, your program will never actually see @code{EPIPE}
unless it has handled or blocked @code{SIGPIPE}.
@end deftypevr

@comment errno.h
@comment ISO: Numerical argument out of domain
@deftypevr Macro int EDOM
@comment errno 33 @c DO NOT REMOVE
Domain error; used by mathematical functions when an argument value does
not fall into the domain over which the function is defined.
@end deftypevr

@comment errno.h
@comment ISO: Numerical result out of range
@deftypevr Macro int ERANGE
@comment errno 34 @c DO NOT REMOVE
Range error; used by mathematical functions when the result value is
not representable because of overflow or underflow.
@end deftypevr

@comment errno.h
@comment POSIX.1: Resource temporarily unavailable
@deftypevr Macro int EAGAIN
@comment errno 35 @c DO NOT REMOVE
Resource temporarily unavailable; the call might work if you try again
later.  The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN};
they are always the same in @theglibc{}.

This error can happen in a few different situations:

@itemize @bullet
@item
An operation that would block was attempted on an object that has
non-blocking mode selected.  Trying the same operation again will block
until some external condition makes it possible to read, write, or
connect (whatever the operation).  You can use @code{select} to find out
when the operation will be possible; @pxref{Waiting for I/O}.

@strong{Portability Note:} In many older Unix systems, this condition
was indicated by @code{EWOULDBLOCK}, which was a distinct error code
different from @code{EAGAIN}.  To make your program portable, you should
check for both codes and treat them the same.

@item
A temporary resource shortage made an operation impossible.  @code{fork}
can return this error.  It indicates that the shortage is expected to
pass, so your program can try the call again later and it may succeed.
It is probably a good idea to delay for a few seconds before trying it
again, to allow time for other processes to release scarce resources.
Such shortages are usually fairly serious and affect the whole system,
so usually an interactive program should report the error to the user
and return to its command loop.
@end itemize
@end deftypevr

@comment errno.h
@comment BSD: Operation would block
@deftypevr Macro int EWOULDBLOCK
@comment errno EAGAIN @c DO NOT REMOVE
In @theglibc{}, this is another name for @code{EAGAIN} (above).
The values are always the same, on every operating system.

C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
separate error code.
@end deftypevr

@comment errno.h
@comment BSD: Operation now in progress
@deftypevr Macro int EINPROGRESS
@comment errno 36 @c DO NOT REMOVE
An operation that cannot complete immediately was initiated on an object
that has non-blocking mode selected.  Some functions that must always
block (such as @code{connect}; @pxref{Connecting}) never return
@code{EAGAIN}.  Instead, they return @code{EINPROGRESS} to indicate that
the operation has begun and will take some time.  Attempts to manipulate
the object before the call completes return @code{EALREADY}.  You can
use the @code{select} function to find out when the pending operation
has completed; @pxref{Waiting for I/O}.
@end deftypevr

@comment errno.h
@comment BSD: Operation already in progress
@deftypevr Macro int EALREADY
@comment errno 37 @c DO NOT REMOVE
An operation is already in progress on an object that has non-blocking
mode selected.
@end deftypevr

@comment errno.h
@comment BSD: Socket operation on non-socket
@deftypevr Macro int ENOTSOCK
@comment errno 38 @c DO NOT REMOVE
A file that isn't a socket was specified when a socket is required.
@end deftypevr

@comment errno.h
@comment BSD: Message too long
@deftypevr Macro int EMSGSIZE
@comment errno 40 @c DO NOT REMOVE
The size of a message sent on a socket was larger than the supported
maximum size.
@end deftypevr

@comment errno.h
@comment BSD: Protocol wrong type for socket
@deftypevr Macro int EPROTOTYPE
@comment errno 41 @c DO NOT REMOVE
The socket type does not support the requested communications protocol.
@end deftypevr

@comment errno.h
@comment BSD: Protocol not available
@deftypevr Macro int ENOPROTOOPT
@comment errno 42 @c DO NOT REMOVE
You specified a socket option that doesn't make sense for the
particular protocol being used by the socket.  @xref{Socket Options}.
@end deftypevr

@comment errno.h
@comment BSD: Protocol not supported
@deftypevr Macro int EPROTONOSUPPORT
@comment errno 43 @c DO NOT REMOVE
The socket domain does not support the requested communications protocol
(perhaps because the requested protocol is completely invalid).
@xref{Creating a Socket}.
@end deftypevr

@comment errno.h
@comment BSD: Socket type not supported
@deftypevr Macro int ESOCKTNOSUPPORT
@comment errno 44 @c DO NOT REMOVE
The socket type is not supported.
@end deftypevr

@comment errno.h
@comment BSD: Operation not supported
@deftypevr Macro int EOPNOTSUPP
@comment errno 45 @c DO NOT REMOVE
The operation you requested is not supported.  Some socket functions
don't make sense for all types of sockets, and others may not be
implemented for all communications protocols.  On @gnuhurdsystems{}, this
error can happen for many calls when the object does not support the
particular operation; it is a generic indication that the server knows
nothing to do for that call.
@end deftypevr

@comment errno.h
@comment BSD: Protocol family not supported
@deftypevr Macro int EPFNOSUPPORT
@comment errno 46 @c DO NOT REMOVE
The socket communications protocol family you requested is not supported.
@end deftypevr

@comment errno.h
@comment BSD: Address family not supported by protocol
@deftypevr Macro int EAFNOSUPPORT
@comment errno 47 @c DO NOT REMOVE
The address family specified for a socket is not supported; it is
inconsistent with the protocol being used on the socket.  @xref{Sockets}.
@end deftypevr

@comment errno.h
@comment BSD: Address already in use
@deftypevr Macro int EADDRINUSE
@comment errno 48 @c DO NOT REMOVE
The requested socket address is already in use.  @xref{Socket Addresses}.
@end deftypevr

@comment errno.h
@comment BSD: Cannot assign requested address
@deftypevr Macro int EADDRNOTAVAIL
@comment errno 49 @c DO NOT REMOVE
The requested socket address is not available; for example, you tried
to give a socket a name that doesn't match the local host name.
@xref{Socket Addresses}.
@end deftypevr

@comment errno.h
@comment BSD: Network is down
@deftypevr Macro int ENETDOWN
@comment errno 50 @c DO NOT REMOVE
A socket operation failed because the network was down.
@end deftypevr

@comment errno.h
@comment BSD: Network is unreachable
@deftypevr Macro int ENETUNREACH
@comment errno 51 @c DO NOT REMOVE
A socket operation failed because the subnet containing the remote host
was unreachable.
@end deftypevr

@comment errno.h
@comment BSD: Network dropped connection on reset
@deftypevr Macro int ENETRESET
@comment errno 52 @c DO NOT REMOVE
A network connection was reset because the remote host crashed.
@end deftypevr

@comment errno.h
@comment BSD: Software caused connection abort
@deftypevr Macro int ECONNABORTED
@comment errno 53 @c DO NOT REMOVE
A network connection was aborted locally.
@end deftypevr

@comment errno.h
@comment BSD: Connection reset by peer
@deftypevr Macro int ECONNRESET
@comment errno 54 @c DO NOT REMOVE
A network connection was closed for reasons outside the control of the
local host, such as by the remote machine rebooting or an unrecoverable
protocol violation.
@end deftypevr

@comment errno.h
@comment BSD: No buffer space available
@deftypevr Macro int ENOBUFS
@comment errno 55 @c DO NOT REMOVE
The kernel's buffers for I/O operations are all in use.  In GNU, this
error is always synonymous with @code{ENOMEM}; you may get one or the
other from network operations.
@end deftypevr

@comment errno.h
@comment BSD: Transport endpoint is already connected
@deftypevr Macro int EISCONN
@comment errno 56 @c DO NOT REMOVE
You tried to connect a socket that is already connected.
@xref{Connecting}.
@end deftypevr

@comment errno.h
@comment BSD: Transport endpoint is not connected
@deftypevr Macro int ENOTCONN
@comment errno 57 @c DO NOT REMOVE
The socket is not connected to anything.  You get this error when you
try to transmit data over a socket, without first specifying a
destination for the data.  For a connectionless socket (for datagram
protocols, such as UDP), you get @code{EDESTADDRREQ} instead.
@end deftypevr

@comment errno.h
@comment BSD: Destination address required
@deftypevr Macro int EDESTADDRREQ
@comment errno 39 @c DO NOT REMOVE
No default destination address was set for the socket.  You get this
error when you try to transmit data over a connectionless socket,
without first specifying a destination for the data with @code{connect}.
@end deftypevr

@comment errno.h
@comment BSD: Cannot send after transport endpoint shutdown
@deftypevr Macro int ESHUTDOWN
@comment errno 58 @c DO NOT REMOVE
The socket has already been shut down.
@end deftypevr

@comment errno.h
@comment BSD: Too many references: cannot splice
@deftypevr Macro int ETOOMANYREFS
@comment errno 59 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: Connection timed out
@deftypevr Macro int ETIMEDOUT
@comment errno 60 @c DO NOT REMOVE
A socket operation with a specified timeout received no response during
the timeout period.
@end deftypevr

@comment errno.h
@comment BSD: Connection refused
@deftypevr Macro int ECONNREFUSED
@comment errno 61 @c DO NOT REMOVE
A remote host refused to allow the network connection (typically because
it is not running the requested service).
@end deftypevr

@comment errno.h
@comment BSD: Too many levels of symbolic links
@deftypevr Macro int ELOOP
@comment errno 62 @c DO NOT REMOVE
Too many levels of symbolic links were encountered in looking up a file name.
This often indicates a cycle of symbolic links.
@end deftypevr

@comment errno.h
@comment POSIX.1: File name too long
@deftypevr Macro int ENAMETOOLONG
@comment errno 63 @c DO NOT REMOVE
Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for
Files}) or host name too long (in @code{gethostname} or
@code{sethostname}; @pxref{Host Identification}).
@end deftypevr

@comment errno.h
@comment BSD: Host is down
@deftypevr Macro int EHOSTDOWN
@comment errno 64 @c DO NOT REMOVE
The remote host for a requested network connection is down.
@end deftypevr

@comment errno.h
@comment BSD: No route to host
@deftypevr Macro int EHOSTUNREACH
@comment errno 65 @c DO NOT REMOVE
The remote host for a requested network connection is not reachable.
@end deftypevr

@comment errno.h
@comment POSIX.1: Directory not empty
@deftypevr Macro int ENOTEMPTY
@comment errno 66 @c DO NOT REMOVE
Directory not empty, where an empty directory was expected.  Typically,
this error occurs when you are trying to delete a directory.
@end deftypevr

@comment errno.h
@comment BSD: Too many processes
@deftypevr Macro int EPROCLIM
@comment errno 67 @c DO NOT REMOVE
This means that the per-user limit on new process would be exceeded by
an attempted @code{fork}.  @xref{Limits on Resources}, for details on
the @code{RLIMIT_NPROC} limit.
@end deftypevr

@comment errno.h
@comment BSD: Too many users
@deftypevr Macro int EUSERS
@comment errno 68 @c DO NOT REMOVE
The file quota system is confused because there are too many users.
@c This can probably happen in a GNU system when using NFS.
@end deftypevr

@comment errno.h
@comment BSD: Disk quota exceeded
@deftypevr Macro int EDQUOT
@comment errno 69 @c DO NOT REMOVE
The user's disk quota was exceeded.
@end deftypevr

@comment errno.h
@comment BSD: Stale file handle
@deftypevr Macro int ESTALE
@comment errno 70 @c DO NOT REMOVE
Stale file handle.  This indicates an internal confusion in the
file system which is due to file system rearrangements on the server host
for NFS file systems or corruption in other file systems.
Repairing this condition usually requires unmounting, possibly repairing
and remounting the file system.
@end deftypevr

@comment errno.h
@comment BSD: Object is remote
@deftypevr Macro int EREMOTE
@comment errno 71 @c DO NOT REMOVE
An attempt was made to NFS-mount a remote file system with a file name that
already specifies an NFS-mounted file.
(This is an error on some operating systems, but we expect it to work
properly on @gnuhurdsystems{}, making this error code impossible.)
@end deftypevr

@comment errno.h
@comment BSD: RPC struct is bad
@deftypevr Macro int EBADRPC
@comment errno 72 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: RPC version wrong
@deftypevr Macro int ERPCMISMATCH
@comment errno 73 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: RPC program not available
@deftypevr Macro int EPROGUNAVAIL
@comment errno 74 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: RPC program version wrong
@deftypevr Macro int EPROGMISMATCH
@comment errno 75 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: RPC bad procedure for program
@deftypevr Macro int EPROCUNAVAIL
@comment errno 76 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment POSIX.1: No locks available
@deftypevr Macro int ENOLCK
@comment errno 77 @c DO NOT REMOVE
No locks available.  This is used by the file locking facilities; see
@ref{File Locks}.  This error is never generated by @gnuhurdsystems{}, but
it can result from an operation to an NFS server running another
operating system.
@end deftypevr

@comment errno.h
@comment BSD: Inappropriate file type or format
@deftypevr Macro int EFTYPE
@comment errno 79 @c DO NOT REMOVE
Inappropriate file type or format.  The file was the wrong type for the
operation, or a data file had the wrong format.

On some systems @code{chmod} returns this error if you try to set the
sticky bit on a non-directory file; @pxref{Setting Permissions}.
@end deftypevr

@comment errno.h
@comment BSD: Authentication error
@deftypevr Macro int EAUTH
@comment errno 80 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment BSD: Need authenticator
@deftypevr Macro int ENEEDAUTH
@comment errno 81 @c DO NOT REMOVE
???
@end deftypevr

@comment errno.h
@comment POSIX.1: Function not implemented
@deftypevr Macro int ENOSYS
@comment errno 78 @c DO NOT REMOVE
Function not implemented.  This indicates that the function called is
not implemented at all, either in the C library itself or in the
operating system.  When you get this error, you can be sure that this
particular function will always fail with @code{ENOSYS} unless you
install a new version of the C library or the operating system.
@end deftypevr

@comment errno.h
@comment POSIX.1: Not supported
@deftypevr Macro int ENOTSUP
@comment errno 118 @c DO NOT REMOVE
Not supported.  A function returns this error when certain parameter
values are valid, but the functionality they request is not available.
This can mean that the function does not implement a particular command
or option value or flag bit at all.  For functions that operate on some
object given in a parameter, such as a file descriptor or a port, it
might instead mean that only @emph{that specific object} (file
descriptor, port, etc.) is unable to support the other parameters given;
different file descriptors might support different ranges of parameter
values.

If the entire function is not available at all in the implementation,
it returns @code{ENOSYS} instead.
@end deftypevr

@comment errno.h
@comment ISO: Invalid or incomplete multibyte or wide character
@deftypevr Macro int EILSEQ
@comment errno 106 @c DO NOT REMOVE
While decoding a multibyte character the function came along an invalid
or an incomplete sequence of bytes or the given wide character is invalid.
@end deftypevr

@comment errno.h
@comment GNU: Inappropriate operation for background process
@deftypevr Macro int EBACKGROUND
@comment errno 100 @c DO NOT REMOVE
On @gnuhurdsystems{}, servers supporting the @code{term} protocol return
this error for certain operations when the caller is not in the
foreground process group of the terminal.  Users do not usually see this
error because functions such as @code{read} and @code{write} translate
it into a @code{SIGTTIN} or @code{SIGTTOU} signal.  @xref{Job Control},
for information on process groups and these signals.
@end deftypevr

@comment errno.h
@comment GNU: Translator died
@deftypevr Macro int EDIED
@comment errno 101 @c DO NOT REMOVE
On @gnuhurdsystems{}, opening a file returns this error when the file is
translated by a program and the translator program dies while starting
up, before it has connected to the file.
@end deftypevr

@comment errno.h
@comment GNU: ?
@deftypevr Macro int ED
@comment errno 102 @c DO NOT REMOVE
The experienced user will know what is wrong.
@c This error code is a joke.  Its perror text is part of the joke.
@c Don't change it.
@end deftypevr

@comment errno.h
@comment GNU: You really blew it this time
@deftypevr Macro int EGREGIOUS
@comment errno 103 @c DO NOT REMOVE
You did @strong{what}?
@end deftypevr

@comment errno.h
@comment GNU: Computer bought the farm
@deftypevr Macro int EIEIO
@comment errno 104 @c DO NOT REMOVE
Go home and have a glass of warm, dairy-fresh milk.
@end deftypevr

@comment errno.h
@comment GNU: Gratuitous error
@deftypevr Macro int EGRATUITOUS
@comment errno 105 @c DO NOT REMOVE
This error code has no purpose.
@end deftypevr

@comment errno.h
@comment XOPEN: Bad message
@deftypevr Macro int EBADMSG
@comment errno 107
@end deftypevr

@comment errno.h
@comment XOPEN: Identifier removed
@deftypevr Macro int EIDRM
@comment errno 108
@end deftypevr

@comment errno.h
@comment XOPEN: Multihop attempted
@deftypevr Macro int EMULTIHOP
@comment errno 109
@end deftypevr

@comment errno.h
@comment XOPEN: No data available
@deftypevr Macro int ENODATA
@comment errno 110
@end deftypevr

@comment errno.h
@comment XOPEN: Link has been severed
@deftypevr Macro int ENOLINK
@comment errno 111
@end deftypevr

@comment errno.h
@comment XOPEN: No message of desired type
@deftypevr Macro int ENOMSG
@comment errno 112
@end deftypevr

@comment errno.h
@comment XOPEN: Out of streams resources
@deftypevr Macro int ENOSR
@comment errno 113
@end deftypevr

@comment errno.h
@comment XOPEN: Device not a stream
@deftypevr Macro int ENOSTR
@comment errno 114
@end deftypevr

@comment errno.h
@comment XOPEN: Value too large for defined data type
@deftypevr Macro int EOVERFLOW
@comment errno 115
@end deftypevr

@comment errno.h
@comment XOPEN: Protocol error
@deftypevr Macro int EPROTO
@comment errno 116
@end deftypevr

@comment errno.h
@comment XOPEN: Timer expired
@deftypevr Macro int ETIME
@comment errno 117
@end deftypevr

@comment errno.h
@comment POSIX.1: Operation canceled
@deftypevr Macro int ECANCELED
@comment errno 119
Operation canceled; an asynchronous operation was canceled before it
completed.  @xref{Asynchronous I/O}.  When you call @code{aio_cancel},
the normal result is for the operations affected to complete with this
error; @pxref{Cancel AIO Operations}.
@end deftypevr


@emph{The following error codes are defined by the Linux/i386 kernel.
They are not yet documented.}

@comment errno.h
@comment Linux???: Interrupted system call should be restarted
@deftypevr Macro int ERESTART
@comment errno ???/85
@end deftypevr

@comment errno.h
@comment Linux???: Channel number out of range
@deftypevr Macro int ECHRNG
@comment errno ???/44
@end deftypevr

@comment errno.h
@comment Obsolete: Level 2 not synchronized
@deftypevr Macro int EL2NSYNC
@comment errno ???/45
@end deftypevr

@comment errno.h
@comment Obsolete: Level 3 halted
@deftypevr Macro int EL3HLT
@comment errno ???/46
@end deftypevr

@comment errno.h
@comment Obsolete: Level 3 reset
@deftypevr Macro int EL3RST
@comment errno ???/47
@end deftypevr

@comment errno.h
@comment Linux???: Link number out of range
@deftypevr Macro int ELNRNG
@comment errno ???/48
@end deftypevr

@comment errno.h
@comment Linux???: Protocol driver not attached
@deftypevr Macro int EUNATCH
@comment errno ???/49
@end deftypevr

@comment errno.h
@comment Linux???: No CSI structure available
@deftypevr Macro int ENOCSI
@comment errno ???/50
@end deftypevr

@comment errno.h
@comment Obsolete: Level 2 halted
@deftypevr Macro int EL2HLT
@comment errno ???/51
@end deftypevr

@comment errno.h
@comment Linux???: Invalid exchange
@deftypevr Macro int EBADE
@comment errno ???/52
@end deftypevr

@comment errno.h
@comment Linux???: Invalid request descriptor
@deftypevr Macro int EBADR
@comment errno ???/53
@end deftypevr

@comment errno.h
@comment Linux???: Exchange full
@deftypevr Macro int EXFULL
@comment errno ???/54
@end deftypevr

@comment errno.h
@comment Linux???: No anode
@deftypevr Macro int ENOANO
@comment errno ???/55
@end deftypevr

@comment errno.h
@comment Linux???: Invalid request code
@deftypevr Macro int EBADRQC
@comment errno ???/56
@end deftypevr

@comment errno.h
@comment Linux???: Invalid slot
@deftypevr Macro int EBADSLT
@comment errno ???/57
@end deftypevr

@comment errno.h
@comment Linux???: File locking deadlock error
@deftypevr Macro int EDEADLOCK
@comment errno ???/58
@end deftypevr

@comment errno.h
@comment Linux???: Bad font file format
@deftypevr Macro int EBFONT
@comment errno ???/59
@end deftypevr

@comment errno.h
@comment Linux???: Machine is not on the network
@deftypevr Macro int ENONET
@comment errno ???/64
@end deftypevr

@comment errno.h
@comment Linux???: Package not installed
@deftypevr Macro int ENOPKG
@comment errno ???/65
@end deftypevr

@comment errno.h
@comment Linux???: Advertise error
@deftypevr Macro int EADV
@comment errno ???/68
@end deftypevr

@comment errno.h
@comment Linux???: Srmount error
@deftypevr Macro int ESRMNT
@comment errno ???/69
@end deftypevr

@comment errno.h
@comment Linux???: Communication error on send
@deftypevr Macro int ECOMM
@comment errno ???/70
@end deftypevr

@comment errno.h
@comment Linux???: RFS specific error
@deftypevr Macro int EDOTDOT
@comment errno ???/73
@end deftypevr

@comment errno.h
@comment Linux???: Name not unique on network
@deftypevr Macro int ENOTUNIQ
@comment errno ???/76
@end deftypevr

@comment errno.h
@comment Linux???: File descriptor in bad state
@deftypevr Macro int EBADFD
@comment errno ???/77
@end deftypevr

@comment errno.h
@comment Linux???: Remote address changed
@deftypevr Macro int EREMCHG
@comment errno ???/78
@end deftypevr

@comment errno.h
@comment Linux???: Can not access a needed shared library
@deftypevr Macro int ELIBACC
@comment errno ???/79
@end deftypevr

@comment errno.h
@comment Linux???: Accessing a corrupted shared library
@deftypevr Macro int ELIBBAD
@comment errno ???/80
@end deftypevr

@comment errno.h
@comment Linux???: .lib section in a.out corrupted
@deftypevr Macro int ELIBSCN
@comment errno ???/81
@end deftypevr

@comment errno.h
@comment Linux???: Attempting to link in too many shared libraries
@deftypevr Macro int ELIBMAX
@comment errno ???/82
@end deftypevr

@comment errno.h
@comment Linux???: Cannot exec a shared library directly
@deftypevr Macro int ELIBEXEC
@comment errno ???/83
@end deftypevr

@comment errno.h
@comment Linux???: Streams pipe error
@deftypevr Macro int ESTRPIPE
@comment errno ???/86
@end deftypevr

@comment errno.h
@comment Linux???: Structure needs cleaning
@deftypevr Macro int EUCLEAN
@comment errno ???/117
@end deftypevr

@comment errno.h
@comment Linux???: Not a XENIX named type file
@deftypevr Macro int ENOTNAM
@comment errno ???/118
@end deftypevr

@comment errno.h
@comment Linux???: No XENIX semaphores available
@deftypevr Macro int ENAVAIL
@comment errno ???/119
@end deftypevr

@comment errno.h
@comment Linux???: Is a named type file
@deftypevr Macro int EISNAM
@comment errno ???/120
@end deftypevr

@comment errno.h
@comment Linux???: Remote I/O error
@deftypevr Macro int EREMOTEIO
@comment errno ???/121
@end deftypevr

@comment errno.h
@comment Linux???: No medium found
@deftypevr Macro int ENOMEDIUM
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux???: Wrong medium type
@deftypevr Macro int EMEDIUMTYPE
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Required key not available
@deftypevr Macro int ENOKEY
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Key has expired
@deftypevr Macro int EKEYEXPIRED
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Key has been revoked
@deftypevr Macro int EKEYREVOKED
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Key was rejected by service
@deftypevr Macro int EKEYREJECTED
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Owner died
@deftypevr Macro int EOWNERDEAD
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: State not recoverable
@deftypevr Macro int ENOTRECOVERABLE
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Operation not possible due to RF-kill
@deftypevr Macro int ERFKILL
@comment errno ???/???
@end deftypevr

@comment errno.h
@comment Linux: Memory page has hardware error
@deftypevr Macro int EHWPOISON
@comment errno ???/???
@end deftypevr

@node Error Messages,  , Error Codes, Error Reporting
@section Error Messages

The library has functions and variables designed to make it easy for
your program to report informative error messages in the customary
format about the failure of a library call.  The functions
@code{strerror} and @code{perror} give you the standard error message
for a given error code; the variable
@w{@code{program_invocation_short_name}} gives you convenient access to the
name of the program that encountered the error.

@comment string.h
@comment ISO
@deftypefun {char *} strerror (int @var{errnum})
@safety{@prelim{}@mtunsafe{@mtasurace{:strerror}}@asunsafe{@ascuheap{} @ascuintl{}}@acunsafe{@acsmem{}}}
@c Calls strerror_r with a static buffer allocated with malloc on the
@c first use.
The @code{strerror} function maps the error code (@pxref{Checking for
Errors}) specified by the @var{errnum} argument to a descriptive error
message string.  The return value is a pointer to this string.

The value @var{errnum} normally comes from the variable @code{errno}.

You should not modify the string returned by @code{strerror}.  Also, if
you make subsequent calls to @code{strerror}, the string might be
overwritten.  (But it's guaranteed that no library function ever calls
@code{strerror} behind your back.)

The function @code{strerror} is declared in @file{string.h}.
@end deftypefun

@comment string.h
@comment GNU
@deftypefun {char *} strerror_r (int @var{errnum}, char *@var{buf}, size_t @var{n})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuintl{}}@acunsafe{}}
The @code{strerror_r} function works like @code{strerror} but instead of
returning the error message in a statically allocated buffer shared by
all threads in the process, it returns a private copy for the
thread. This might be either some permanent global data or a message
string in the user supplied buffer starting at @var{buf} with the
length of @var{n} bytes.

At most @var{n} characters are written (including the NUL byte) so it is
up to the user to select the buffer large enough.

This function should always be used in multi-threaded programs since
there is no way to guarantee the string returned by @code{strerror}
really belongs to the last call of the current thread.

This function @code{strerror_r} is a GNU extension and it is declared in
@file{string.h}.
@end deftypefun

@comment stdio.h
@comment ISO
@deftypefun void perror (const char *@var{message})
@safety{@prelim{}@mtsafe{@mtasurace{:stderr}}@asunsafe{@asucorrupt{} @ascuintl{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
@c Besides strerror_r's and some of fprintf's issues, if stderr is not
@c oriented yet, create a new stream with a dup of stderr's fd and write
@c to that instead of stderr, to avoid orienting it.
This function prints an error message to the stream @code{stderr};
see @ref{Standard Streams}.  The orientation of @code{stderr} is not
changed.

If you call @code{perror} with a @var{message} that is either a null
pointer or an empty string, @code{perror} just prints the error message
corresponding to @code{errno}, adding a trailing newline.

If you supply a non-null @var{message} argument, then @code{perror}
prefixes its output with this string.  It adds a colon and a space
character to separate the @var{message} from the error string corresponding
to @code{errno}.

The function @code{perror} is declared in @file{stdio.h}.
@end deftypefun

@code{strerror} and @code{perror} produce the exact same message for any
given error code; the precise text varies from system to system.  With
@theglibc{}, the messages are fairly short; there are no multi-line
messages or embedded newlines.  Each error message begins with a capital
letter and does not include any terminating punctuation.

@strong{Compatibility Note:} The @code{strerror} function was introduced
in @w{ISO C89}.  Many older C systems do not support this function yet.

@cindex program name
@cindex name of running program
Many programs that don't read input from the terminal are designed to
exit if any system call fails.  By convention, the error message from
such a program should start with the program's name, sans directories.
You can find that name in the variable
@code{program_invocation_short_name}; the full file name is stored the
variable @code{program_invocation_name}.

@comment errno.h
@comment GNU
@deftypevar {char *} program_invocation_name
This variable's value is the name that was used to invoke the program
running in the current process.  It is the same as @code{argv[0]}.  Note
that this is not necessarily a useful file name; often it contains no
directory names.  @xref{Program Arguments}.
@end deftypevar

@comment errno.h
@comment GNU
@deftypevar {char *} program_invocation_short_name
This variable's value is the name that was used to invoke the program
running in the current process, with directory names removed.  (That is
to say, it is the same as @code{program_invocation_name} minus
everything up to the last slash, if any.)
@end deftypevar

The library initialization code sets up both of these variables before
calling @code{main}.

@strong{Portability Note:} These two variables are GNU extensions.  If
you want your program to work with non-GNU libraries, you must save the
value of @code{argv[0]} in @code{main}, and then strip off the directory
names yourself.  We added these extensions to make it possible to write
self-contained error-reporting subroutines that require no explicit
cooperation from @code{main}.

Here is an example showing how to handle failure to open a file
correctly.  The function @code{open_sesame} tries to open the named file
for reading and returns a stream if successful.  The @code{fopen}
library function returns a null pointer if it couldn't open the file for
some reason.  In that situation, @code{open_sesame} constructs an
appropriate error message using the @code{strerror} function, and
terminates the program.  If we were going to make some other library
calls before passing the error code to @code{strerror}, we'd have to
save it in a local variable instead, because those other library
functions might overwrite @code{errno} in the meantime.

@smallexample
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *
open_sesame (char *name)
@{
  FILE *stream;

  errno = 0;
  stream = fopen (name, "r");
  if (stream == NULL)
    @{
      fprintf (stderr, "%s: Couldn't open file %s; %s\n",
               program_invocation_short_name, name, strerror (errno));
      exit (EXIT_FAILURE);
    @}
  else
    return stream;
@}
@end smallexample

Using @code{perror} has the advantage that the function is portable and
available on all systems implementing @w{ISO C}.  But often the text
@code{perror} generates is not what is wanted and there is no way to
extend or change what @code{perror} does.  The GNU coding standard, for
instance, requires error messages to be preceded by the program name and
programs which read some input files should provide information
about the input file name and the line number in case an error is
encountered while reading the file.  For these occasions there are two
functions available which are widely used throughout the GNU project.
These functions are declared in @file{error.h}.

@comment error.h
@comment GNU
@deftypefun void error (int @var{status}, int @var{errnum}, const char *@var{format}, @dots{})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @asuheap{} @asuintl{}}@acsafe{}}
@c Cancellation is disabled throughout the execution.  It flushes stdout
@c and then holds a lock on stderr while printing the program name and
@c then running error_tail.  The non-wide case just runs vfprintf; the
@c wide case converts the message to an alloca/malloc-allocated buffer
@c with mbsrtowcs, then prints it with vfwprintf.  Afterwards,
@c print_errno_message calls strerror_r and fxprintf.
The @code{error} function can be used to report general problems during
program execution.  The @var{format} argument is a format string just
like those given to the @code{printf} family of functions.  The
arguments required for the format can follow the @var{format} parameter.
Just like @code{perror}, @code{error} also can report an error code in
textual form.  But unlike @code{perror} the error value is explicitly
passed to the function in the @var{errnum} parameter.  This eliminates
the problem mentioned above that the error reporting function must be
called immediately after the function causing the error since otherwise
@code{errno} might have a different value.

The @code{error} prints first the program name.  If the application
defined a global variable @code{error_print_progname} and points it to a
function this function will be called to print the program name.
Otherwise the string from the global variable @code{program_name} is
used.  The program name is followed by a colon and a space which in turn
is followed by the output produced by the format string.  If the
@var{errnum} parameter is non-zero the format string output is followed
by a colon and a space, followed by the error message for the error code
@var{errnum}.  In any case is the output terminated with a newline.

The output is directed to the @code{stderr} stream.  If the
@code{stderr} wasn't oriented before the call it will be narrow-oriented
afterwards.

The function will return unless the @var{status} parameter has a
non-zero value.  In this case the function will call @code{exit} with
the @var{status} value for its parameter and therefore never return.  If
@code{error} returns the global variable @code{error_message_count} is
incremented by one to keep track of the number of errors reported.
@end deftypefun

@comment error.h
@comment GNU
@deftypefun void error_at_line (int @var{status}, int @var{errnum}, const char *@var{fname}, unsigned int @var{lineno}, const char *@var{format}, @dots{})
@safety{@prelim{}@mtunsafe{@mtasurace{:error_at_line/error_one_per_line} @mtslocale{}}@asunsafe{@asucorrupt{} @asuheap{} @asuintl{}}@acunsafe{@acucorrupt{/error_one_per_line}}}
@c The error_one_per_line variable is accessed (without any form of
@c synchronization, but since it's an int used once, it should be safe
@c enough) and, if this mode is enabled, static variables used to hold
@c the last printed file name and line number are accessed and modified
@c without synchronization; the update is not atomic and it occurs
@c before disabling cancellation, so it can be interrupted after only
@c one of the two variables is modified.  After that, it's very much
@c like error.

The @code{error_at_line} function is very similar to the @code{error}
function.  The only difference are the additional parameters @var{fname}
and @var{lineno}.  The handling of the other parameters is identical to
that of @code{error} except that between the program name and the string
generated by the format string additional text is inserted.

Directly following the program name a colon, followed by the file name
pointer to by @var{fname}, another colon, and a value of @var{lineno} is
printed.

This additional output of course is meant to be used to locate an error
in an input file (like a programming language source code file etc).

If the global variable @code{error_one_per_line} is set to a non-zero
value @code{error_at_line} will avoid printing consecutive messages for
the same file and line.  Repetition which are not directly following
each other are not caught.

Just like @code{error} this function only returned if @var{status} is
zero.  Otherwise @code{exit} is called with the non-zero value.  If
@code{error} returns the global variable @code{error_message_count} is
incremented by one to keep track of the number of errors reported.
@end deftypefun

As mentioned above the @code{error} and @code{error_at_line} functions
can be customized by defining a variable named
@code{error_print_progname}.

@comment error.h
@comment GNU
@deftypevar {void (*error_print_progname)} (void)
If the @code{error_print_progname} variable is defined to a non-zero
value the function pointed to is called by @code{error} or
@code{error_at_line}.  It is expected to print the program name or do
something similarly useful.

The function is expected to be print to the @code{stderr} stream and
must be able to handle whatever orientation the stream has.

The variable is global and shared by all threads.
@end deftypevar

@comment error.h
@comment GNU
@deftypevar {unsigned int} error_message_count
The @code{error_message_count} variable is incremented whenever one of
the functions @code{error} or @code{error_at_line} returns.  The
variable is global and shared by all threads.
@end deftypevar

@comment error.h
@comment GNU
@deftypevar int error_one_per_line
The @code{error_one_per_line} variable influences only
@code{error_at_line}.  Normally the @code{error_at_line} function
creates output for every invocation.  If @code{error_one_per_line} is
set to a non-zero value @code{error_at_line} keeps track of the last
file name and line number for which an error was reported and avoid
directly following messages for the same file and line.  This variable
is global and shared by all threads.
@end deftypevar

@noindent
A program which read some input file and reports errors in it could look
like this:

@smallexample
@{
  char *line = NULL;
  size_t len = 0;
  unsigned int lineno = 0;

  error_message_count = 0;
  while (! feof_unlocked (fp))
    @{
      ssize_t n = getline (&line, &len, fp);
      if (n <= 0)
        /* @r{End of file or error.}  */
        break;
      ++lineno;

      /* @r{Process the line.}  */
      @dots{}

      if (@r{Detect error in line})
        error_at_line (0, errval, filename, lineno,
                       "some error text %s", some_variable);
    @}

  if (error_message_count != 0)
    error (EXIT_FAILURE, 0, "%u errors found", error_message_count);
@}
@end smallexample

@code{error} and @code{error_at_line} are clearly the functions of
choice and enable the programmer to write applications which follow the
GNU coding standard.  @Theglibc{} additionally contains functions which
are used in BSD for the same purpose.  These functions are declared in
@file{err.h}.  It is generally advised to not use these functions.  They
are included only for compatibility.

@comment err.h
@comment BSD
@deftypefun void warn (const char *@var{format}, @dots{})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Just calls vwarn with the va_list.
The @code{warn} function is roughly equivalent to a call like
@smallexample
  error (0, errno, format, @r{the parameters})
@end smallexample
@noindent
except that the global variables @code{error} respects and modifies
are not used.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void vwarn (const char *@var{format}, va_list @var{ap})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c While holding stderr's recursive lock, it prints the programname, the
@c given message, and the error string with fw?printf's %m.  When the
@c stream is wide, convert_and_print converts the format string to an
@c alloca/malloc-created buffer using mbsrtowcs and then calls fwprintf.
The @code{vwarn} function is just like @code{warn} except that the
parameters for the handling of the format string @var{format} are passed
in as a value of type @code{va_list}.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void warnx (const char *@var{format}, @dots{})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as warn, but without the strerror translation issues.
The @code{warnx} function is roughly equivalent to a call like
@smallexample
  error (0, 0, format, @r{the parameters})
@end smallexample
@noindent
except that the global variables @code{error} respects and modifies
are not used.  The difference to @code{warn} is that no error number
string is printed.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void vwarnx (const char *@var{format}, va_list @var{ap})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as vwarn, but without the strerror translation issues.
The @code{vwarnx} function is just like @code{warnx} except that the
parameters for the handling of the format string @var{format} are passed
in as a value of type @code{va_list}.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void err (int @var{status}, const char *@var{format}, @dots{})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as warn followed by exit.
The @code{err} function is roughly equivalent to a call like
@smallexample
  error (status, errno, format, @r{the parameters})
@end smallexample
@noindent
except that the global variables @code{error} respects and modifies
are not used and that the program is exited even if @var{status} is zero.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void verr (int @var{status}, const char *@var{format}, va_list @var{ap})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @ascuintl{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as vwarn followed by exit.
The @code{verr} function is just like @code{err} except that the
parameters for the handling of the format string @var{format} are passed
in as a value of type @code{va_list}.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void errx (int @var{status}, const char *@var{format}, @dots{})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as warnx followed by exit.
The @code{errx} function is roughly equivalent to a call like
@smallexample
  error (status, 0, format, @r{the parameters})
@end smallexample
@noindent
except that the global variables @code{error} respects and modifies
are not used and that the program is exited even if @var{status}
is zero.  The difference to @code{err} is that no error number
string is printed.
@end deftypefun

@comment err.h
@comment BSD
@deftypefun void verrx (int @var{status}, const char *@var{format}, va_list @var{ap})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{}}}
@c Same as vwarnx followed by exit.
The @code{verrx} function is just like @code{errx} except that the
parameters for the handling of the format string @var{format} are passed
in as a value of type @code{va_list}.
@end deftypefun
