summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile3
-rw-r--r--compat_strnlen.c43
-rw-r--r--config.h.post19
-rw-r--r--config.h.pre1
-rwxr-xr-xconfigure1
-rw-r--r--test-strnlen.c8
6 files changed, 66 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 0dbc0770..314be62d 100644
--- a/Makefile
+++ b/Makefile
@@ -59,6 +59,7 @@ TESTSRCS = test-fgetln.c \
test-ohash.c \
test-strlcat.c \
test-strlcpy.c \
+ test-strnlen.c \
test-strptime.c
SRCS = Makefile \
@@ -78,6 +79,7 @@ SRCS = Makefile \
compat_strcasestr.c \
compat_strlcat.c \
compat_strlcpy.c \
+ compat_strnlen.c \
compat_strsep.c \
config.h.post \
config.h.pre \
@@ -197,6 +199,7 @@ COMPAT_OBJS = compat_fgetln.o \
compat_strcasestr.o \
compat_strlcat.o \
compat_strlcpy.o \
+ compat_strnlen.o \
compat_strsep.o
arch.o: arch.in
diff --git a/compat_strnlen.c b/compat_strnlen.c
new file mode 100644
index 00000000..386c4898
--- /dev/null
+++ b/compat_strnlen.c
@@ -0,0 +1,43 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_STRNLEN
+
+int dummy;
+
+#else
+
+/* ($)OpenBSD: strnlen.c,v 1.4 2012/04/26 01:22:31 matthew Exp $ */
+
+/*
+ * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <string.h>
+
+size_t
+strnlen(const char *str, size_t maxlen)
+{
+ const char *cp;
+
+ for (cp = str; maxlen != 0 && *cp != '\0'; cp++, maxlen--)
+ ;
+
+ return (size_t)(cp - str);
+}
+
+#endif
diff --git a/config.h.post b/config.h.post
index 0a700426..fe8f015e 100644
--- a/config.h.post
+++ b/config.h.post
@@ -1,5 +1,3 @@
-#include <sys/types.h>
-
#if !defined(__BEGIN_DECLS)
# ifdef __cplusplus
# define __BEGIN_DECLS extern "C" {
@@ -15,6 +13,13 @@
# endif
#endif
+#ifndef HAVE_FGETLN
+extern char *fgetln(FILE *, size_t *);
+#endif
+#ifndef HAVE_GETSUBOPT
+extern int getsubopt(char **, char * const *, char **);
+extern char *suboptarg;
+#endif
#ifndef HAVE_STRCASESTR
extern char *strcasestr(const char *, const char *);
#endif
@@ -24,15 +29,11 @@ extern size_t strlcat(char *, const char *, size_t);
#ifndef HAVE_STRLCPY
extern size_t strlcpy(char *, const char *, size_t);
#endif
+#ifndef HAVE_STRNLEN
+extern size_t strnlen(const char *, size_t);
+#endif
#ifndef HAVE_STRSEP
extern char *strsep(char **, const char *);
#endif
-#ifndef HAVE_GETSUBOPT
-extern int getsubopt(char **, char * const *, char **);
-extern char *suboptarg;
-#endif
-#ifndef HAVE_FGETLN
-extern char *fgetln(FILE *, size_t *);
-#endif
#endif /* MANDOC_CONFIG_H */
diff --git a/config.h.pre b/config.h.pre
index bc594784..52a8159a 100644
--- a/config.h.pre
+++ b/config.h.pre
@@ -5,4 +5,5 @@
# define _GNU_SOURCE /* strptime(), getsubopt() */
#endif
+#include <sys/types.h>
#include <stdio.h>
diff --git a/configure b/configure
index 1d164697..5a24bb58 100755
--- a/configure
+++ b/configure
@@ -37,6 +37,7 @@ runtest ohash OHASH
runtest strcasestr STRCASESTR
runtest strlcat STRLCAT
runtest strlcpy STRLCPY
+runtest strnlen STRNLEN
runtest strptime STRPTIME
runtest strsep STRSEP
echo
diff --git a/test-strnlen.c b/test-strnlen.c
new file mode 100644
index 00000000..0bb69791
--- /dev/null
+++ b/test-strnlen.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int
+main(void)
+{
+ const char s[1] = { 'a' };
+ return(1 != strnlen(s, 1));
+}