Even though strnlen(3) is required by POSIX 2008,
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 4 Jan 2014 13:40:01 +0000 (13:40 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 4 Jan 2014 13:40:01 +0000 (13:40 +0000)
Matthias Scheler reports than Solaris 10 lacks it.
While here, sort the declarations in config.h
and move the headers to the top.

Makefile
compat_strnlen.c [new file with mode: 0644]
config.h.post
config.h.pre
configure
test-strnlen.c [new file with mode: 0644]

index 0dbc07704aae1873b0ef3f6b68241a264cbf57c7..314be62dcf746fbb75f6358f5404317d14cae80d 100644 (file)
--- 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 (file)
index 0000000..386c489
--- /dev/null
@@ -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
index 0a7004268355387edc7c0cb2ad3ffda8f39b3f14..fe8f015e6e4df7759c07e82f75377650e9b8d3c0 100644 (file)
@@ -1,5 +1,3 @@
-#include <sys/types.h>
-
 #if !defined(__BEGIN_DECLS)
 #  ifdef __cplusplus
 #  define      __BEGIN_DECLS           extern "C" {
 #  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 */
index bc594784856cd598cca63adea445f21790f6ea4f..52a8159adb0c2f459fc99e35ff14ff34c8a9b554 100644 (file)
@@ -5,4 +5,5 @@
 # define _GNU_SOURCE /* strptime(), getsubopt() */
 #endif
 
+#include <sys/types.h>
 #include <stdio.h>
index 1d164697d00c1faabc4b0d38e7dce2ad23f1e0f9..5a24bb585062b3541189a1e77a2b8d3ecc3665c9 100755 (executable)
--- 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 (file)
index 0000000..0bb6979
--- /dev/null
@@ -0,0 +1,8 @@
+#include <string.h>
+
+int
+main(void)
+{
+       const char s[1] = { 'a' };
+       return(1 != strnlen(s, 1));
+}