summaryrefslogtreecommitdiff
path: root/lib/libc/string
diff options
context:
space:
mode:
authorMarco S Hyman <marc@cvs.openbsd.org>2002-11-21 20:45:06 +0000
committerMarco S Hyman <marc@cvs.openbsd.org>2002-11-21 20:45:06 +0000
commit2b6e7ee637e81d7410a00f51653c5f66645a1a98 (patch)
tree3e5d7c3c0efea17365d7afbb369ad2f182b7712c /lib/libc/string
parent63a69e9d797ee37b46cc53233eeb398d8d67b544 (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.inc4
-rw-r--r--lib/libc/string/strerror.322
-rw-r--r--lib/libc/string/strerror_r.c30
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);
+}