xref: /freebsd/lib/libc/string/strerror.3 (revision f7c32ed617858bcd22f8d1b03199099d50125721)
1.\" Copyright (c) 1980, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" the American National Standards Committee X3, on Information
6.\" Processing Systems.
7.\"
8.\" Redistribution and use in source and binary forms, with or without
9.\" modification, are permitted provided that the following conditions
10.\" are met:
11.\" 1. Redistributions of source code must retain the above copyright
12.\"    notice, this list of conditions and the following disclaimer.
13.\" 2. Redistributions in binary form must reproduce the above copyright
14.\"    notice, this list of conditions and the following disclaimer in the
15.\"    documentation and/or other materials provided with the distribution.
16.\" 3. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\"     @(#)strerror.3	8.1 (Berkeley) 6/9/93
33.\" $FreeBSD$
34.\"
35.Dd December 17, 2020
36.Dt STRERROR 3
37.Os
38.Sh NAME
39.Nm perror ,
40.Nm strerror ,
41.Nm strerror_l ,
42.Nm strerror_r ,
43.Nm sys_errlist ,
44.Nm sys_nerr
45.Nd system error messages
46.Sh LIBRARY
47.Lb libc
48.Sh SYNOPSIS
49.In stdio.h
50.Ft void
51.Fn perror "const char *string"
52.Vt extern const char * const sys_errlist[] ;
53.Vt extern const int sys_nerr ;
54.In string.h
55.Ft "char *"
56.Fn strerror "int errnum"
57.Ft "char *"
58.Fn strerror_l "int errnum" "locale_t"
59.Ft int
60.Fn strerror_r "int errnum" "char *strerrbuf" "size_t buflen"
61.Sh DESCRIPTION
62The
63.Fn strerror ,
64.Fn strerror_l ,
65.Fn strerror_r ,
66and
67.Fn perror
68functions look up the error message string corresponding to an
69error number.
70.Pp
71The
72.Fn strerror
73function accepts an error number argument
74.Fa errnum
75and returns a pointer to the corresponding message string
76in the current locale.
77.Fn strerror
78is not thread-safe.
79It returns a pointer to an internal static buffer that could be
80overwritten by a
81.Fn strerror
82call from another thread.
83.Pp
84The
85.Fn strerror_l
86function accepts
87.Fa errnum
88error number and
89.Fa locale
90locale handle arguments and returns a pointer to a string
91corresponding to the specified error in the given locale.
92.Fn strerror_l
93is thread-safe, its result can be only overwritten by
94another call to
95.Fn strerror_l
96from the current thread.
97.Pp
98The
99.Fn strerror_r
100function renders the same result into
101.Fa strerrbuf
102for a maximum of
103.Fa buflen
104characters and returns 0 upon success.
105.Pp
106The
107.Fn perror
108function finds the error message corresponding to the current
109value of the global variable
110.Va errno
111.Pq Xr intro 2
112and writes it, followed by a newline, to the
113standard error file descriptor.
114If the argument
115.Fa string
116is
117.Pf non- Dv NULL
118and does not point to the null character,
119this string is prepended to the message
120string and separated from it by
121a colon and space
122.Pq Dq Li ":\ " ;
123otherwise, only the error message string is printed.
124.Pp
125If the error number is not recognized, these functions return an error message
126string containing
127.Dq Li "Unknown error:\ "
128followed by the error number in decimal.
129The
130.Fn strerror
131and
132.Fn strerror_r
133functions return
134.Er EINVAL
135as a warning.
136Error numbers recognized by this implementation fall in
137the range 0 <
138.Fa errnum
139<
140.Fa sys_nerr .
141The number 0 is also recognized, although applications that take advantage of
142this are likely to use unspecified values of
143.Va errno .
144.Pp
145If insufficient storage is provided in
146.Fa strerrbuf
147(as specified in
148.Fa buflen )
149to contain the error string,
150.Fn strerror_r
151returns
152.Er ERANGE
153and
154.Fa strerrbuf
155will contain an error message that has been truncated and
156.Dv NUL
157terminated to fit the length specified by
158.Fa buflen .
159.Pp
160The message strings can be accessed directly using the external
161array
162.Va sys_errlist .
163The external value
164.Va sys_nerr
165contains a count of the messages in
166.Va sys_errlist .
167The use of these variables is deprecated;
168.Fn strerror ,
169.Fn strerror_l ,
170or
171.Fn strerror_r
172should be used instead.
173.Sh EXAMPLES
174The following example shows how to use
175.Fn perror
176to report an error.
177.Bd -literal -offset 2n
178#include <fcntl.h>
179#include <stdio.h>
180#include <stdlib.h>
181
182int
183main(void)
184{
185	int fd;
186
187	if ((fd = open("/nonexistent", O_RDONLY)) == -1) {
188		perror("open()");
189		exit(1);
190	}
191	printf("File descriptor: %d\en", fd);
192	return (0);
193}
194.Ed
195.Pp
196When executed, the program will print an error message along the lines of
197.Ql "open(): No such file or directory" .
198.Sh SEE ALSO
199.Xr intro 2 ,
200.Xr err 3 ,
201.Xr psignal 3
202.Sh STANDARDS
203The
204.Fn perror
205and
206.Fn strerror
207functions conform to
208.St -isoC-99 .
209The
210.Fn strerror_r
211function conforms to
212.St -p1003.1-2001 .
213The
214.Fn strerror_l
215function conforms to
216.St -p1003.1-2008 .
217.Sh HISTORY
218The
219.Fn strerror
220and
221.Fn perror
222functions first appeared in
223.Bx 4.4 .
224The
225.Fn strerror_r
226function was implemented in
227.Fx 4.4
228by
229.An Wes Peters Aq Mt wes@FreeBSD.org .
230The
231.Fn strerror_l
232function was added in
233.Fx 13.0 .
234.Sh BUGS
235The
236.Fn strerror
237function returns its result in a static buffer which
238will be overwritten by subsequent calls.
239.Pp
240Programs that use the deprecated
241.Va sys_errlist
242variable often fail to compile because they declare it
243inconsistently.
244Size of the
245.Va sys_errlist
246object might increase during FreeBSD lifetime,
247breaking some ABI stability guarantees.
248