diff options
author | Marco S Hyman <marc@cvs.openbsd.org> | 2002-11-21 20:45:06 +0000 |
---|---|---|
committer | Marco S Hyman <marc@cvs.openbsd.org> | 2002-11-21 20:45:06 +0000 |
commit | 2b6e7ee637e81d7410a00f51653c5f66645a1a98 (patch) | |
tree | 3e5d7c3c0efea17365d7afbb369ad2f182b7712c /lib/libc/string | |
parent | 63a69e9d797ee37b46cc53233eeb398d8d67b544 (diff) |
Add strerror_r and functions versions of getchar_unlocked and
putchar_unlocked. Crank the minor on related libs. OK fgs@, deraadt@
Diffstat (limited to 'lib/libc/string')
-rw-r--r-- | lib/libc/string/Makefile.inc | 4 | ||||
-rw-r--r-- | lib/libc/string/strerror.3 | 22 | ||||
-rw-r--r-- | lib/libc/string/strerror_r.c | 30 |
3 files changed, 53 insertions, 3 deletions
diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc index e7b81d0c43f..3cd172287b7 100644 --- a/lib/libc/string/Makefile.inc +++ b/lib/libc/string/Makefile.inc @@ -1,10 +1,10 @@ -# $OpenBSD: Makefile.inc,v 1.10 2001/09/05 16:27:01 mickey Exp $ +# $OpenBSD: Makefile.inc,v 1.11 2002/11/21 20:45:05 marc Exp $ # string sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_ARCH}/string ${LIBCSRCDIR}/string SRCS+= bm.c memccpy.c strcasecmp.c strcoll.c strdup.c strerror.c \ - strlcat.c strmode.c strsignal.c strtok.c strxfrm.c \ + strerror_r.c strlcat.c strmode.c strsignal.c strtok.c strxfrm.c \ __strerror.c __strsignal.c # machine-dependent net sources diff --git a/lib/libc/string/strerror.3 b/lib/libc/string/strerror.3 index 11bacd313e9..05cb7e9d9c9 100644 --- a/lib/libc/string/strerror.3 +++ b/lib/libc/string/strerror.3 @@ -33,7 +33,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: strerror.3,v 1.4 2000/10/23 19:14:41 aaron Exp $ +.\" $OpenBSD: strerror.3,v 1.5 2002/11/21 20:45:05 marc Exp $ .\" .Dd June 29, 1991 .Dt STRERROR 3 @@ -45,6 +45,8 @@ .Fd #include <string.h> .Ft char * .Fn strerror "int errnum" +.Ft int +.Fn strerror_r "int errnum" "char *strerrbuf" "size_t buflen" .Sh DESCRIPTION The .Fn strerror @@ -58,6 +60,20 @@ characters, including the trailing NUL. The array pointed to is not to be modified by the program, but may be overwritten by subsequent calls to .Fn strerror . +.Pp +.Fn strerror_r +is a thread safe version of +.Fn strerror +that places the error message in the given buffer +.Fa strerrbuf . +If the error message is larger then +.Fa buflen +the message will be truncated to fit within buflen and +.Er ERANGE +is returned. +.Fn strerror_r +returns zero upon successful completion. +An error number is returned, otherwise. .Sh SEE ALSO .Xr intro 2 , .Xr perror 3 , @@ -67,3 +83,7 @@ The .Fn strerror function conforms to .St -ansiC . +The +.Fn strerror_r +function conforms to +.St -p1003.1 . diff --git a/lib/libc/string/strerror_r.c b/lib/libc/string/strerror_r.c new file mode 100644 index 00000000000..aab6db5303c --- /dev/null +++ b/lib/libc/string/strerror_r.c @@ -0,0 +1,30 @@ +/* $OpenBSD: strerror_r.c,v 1.1 2002/11/21 20:45:05 marc Exp $ */ +/* Public Domain <marc@snafu.org> */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char *rcsid = "$OpenBSD: strerror_r.c,v 1.1 2002/11/21 20:45:05 marc Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include <errno.h> +#include <limits.h> +#include <string.h> + +extern char *__strerror(int, char *); + +int +strerror_r(int errnum, char *strerrbuf, size_t buflen) +{ + int save_errno; + int ret_errno; + char buf[NL_TEXTMAX]; + + save_errno = errno; + errno = 0; + __strerror(errnum, buf); + if (strlcpy(strerrbuf, buf, buflen) >= buflen) + errno = ERANGE; + ret_errno = errno; + errno = save_errno; + + return (ret_errno); +} |