summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/user.m42
-rw-r--r--lib/libspl/Makefile.am2
-rw-r--r--lib/libspl/include/string.h55
-rw-r--r--lib/libspl/strlcat.c60
-rw-r--r--lib/libspl/strlcpy.c56
-rw-r--r--tests/zfs-tests/cmd/libzfs_input_check/Makefile.am1
6 files changed, 126 insertions, 50 deletions
diff --git a/config/user.m4 b/config/user.m4
index 8c4655719..ca50823d8 100644
--- a/config/user.m4
+++ b/config/user.m4
@@ -21,7 +21,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
ZFS_AC_TEST_FRAMEWORK
- AC_CHECK_FUNCS([mlockall])
+ AC_CHECK_FUNCS([mlockall strlcat strlcpy])
])
dnl #
diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am
index 8d0d4d038..5fceaf6a5 100644
--- a/lib/libspl/Makefile.am
+++ b/lib/libspl/Makefile.am
@@ -22,6 +22,8 @@ USER_C = \
list.c \
mkdirp.c \
page.c \
+ strlcat.c \
+ strlcpy.c \
timestamp.c \
zone.c \
include/sys/list.h \
diff --git a/lib/libspl/include/string.h b/lib/libspl/include/string.h
index 8908ce228..a7d40fa61 100644
--- a/lib/libspl/include/string.h
+++ b/lib/libspl/include/string.h
@@ -28,56 +28,13 @@
#define _LIBSPL_STRING_H
#include_next <string.h>
-#include <sys/types.h>
-/*
- * Appends src to the dstsize buffer at dst. The append will never
- * overflow the destination buffer and the buffer will always be null
- * terminated. Never reference beyond &dst[dstsize-1] when computing
- * the length of the pre-existing string.
- */
-static inline size_t
-strlcat(char *dst, const char *src, size_t dstsize)
-{
- char *df = dst;
- size_t left = dstsize;
- size_t l1;
- size_t l2 = strlen(src);
- size_t copied;
-
- while (left-- != 0 && *df != '\0')
- df++;
-
- l1 = df - dst;
-
- if (dstsize == l1)
- return (l1 + l2);
-
- copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
- (void) memcpy(dst + l1, src, copied);
- dst[l1+copied] = '\0';
-
- return (l1 + l2);
-}
-
-/*
- * Copies src to the dstsize buffer at dst. The copy will never
- * overflow the destination buffer and the buffer will always be null
- * terminated.
- */
-static inline size_t
-strlcpy(char *dst, const char *src, size_t len)
-{
- size_t slen = strlen(src);
-
- if (len == 0)
- return (slen);
-
- size_t copied = (slen >= len) ? len - 1 : slen;
- (void) memcpy(dst, src, copied);
- dst[copied] = '\0';
+#ifndef HAVE_STRLCAT
+extern size_t strlcat(char *dst, const char *src, size_t dstsize);
+#endif
- return (slen);
-}
+#ifndef HAVE_STRLCPY
+extern size_t strlcpy(char *dst, const char *src, size_t len);
+#endif
#endif
diff --git a/lib/libspl/strlcat.c b/lib/libspl/strlcat.c
new file mode 100644
index 000000000..4528d875e
--- /dev/null
+++ b/lib/libspl/strlcat.c
@@ -0,0 +1,60 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+#ifndef HAVE_STRLCAT
+
+#include <string.h>
+#include <sys/types.h>
+
+/*
+ * Appends src to the dstsize buffer at dst. The append will never
+ * overflow the destination buffer and the buffer will always be null
+ * terminated. Never reference beyond &dst[dstsize-1] when computing
+ * the length of the pre-existing string.
+ */
+
+size_t
+strlcat(char *dst, const char *src, size_t dstsize)
+{
+ char *df = dst;
+ size_t left = dstsize;
+ size_t l1;
+ size_t l2 = strlen(src);
+ size_t copied;
+
+ while (left-- != 0 && *df != '\0')
+ df++;
+ l1 = df - dst;
+ if (dstsize == l1)
+ return (l1 + l2);
+
+ copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
+ (void) memcpy(dst + l1, src, copied);
+ dst[l1+copied] = '\0';
+
+ return (l1 + l2);
+}
+
+#endif
diff --git a/lib/libspl/strlcpy.c b/lib/libspl/strlcpy.c
new file mode 100644
index 000000000..d483b91f6
--- /dev/null
+++ b/lib/libspl/strlcpy.c
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef HAVE_STRLCPY
+
+#include <string.h>
+#include <sys/types.h>
+
+/*
+ * Copies src to the dstsize buffer at dst. The copy will never
+ * overflow the destination buffer and the buffer will always be null
+ * terminated.
+ */
+
+size_t
+strlcpy(char *dst, const char *src, size_t len)
+{
+ size_t slen = strlen(src);
+ size_t copied;
+
+ if (len == 0)
+ return (slen);
+
+ if (slen >= len)
+ copied = len - 1;
+ else
+ copied = slen;
+ (void) memcpy(dst, src, copied);
+ dst[copied] = '\0';
+ return (slen);
+}
+
+#endif /* HAVE_STRLCPY */
diff --git a/tests/zfs-tests/cmd/libzfs_input_check/Makefile.am b/tests/zfs-tests/cmd/libzfs_input_check/Makefile.am
index 0152d526e..b62a6bb0f 100644
--- a/tests/zfs-tests/cmd/libzfs_input_check/Makefile.am
+++ b/tests/zfs-tests/cmd/libzfs_input_check/Makefile.am
@@ -10,5 +10,6 @@ pkgexec_PROGRAMS = libzfs_input_check
libzfs_input_check_SOURCES = libzfs_input_check.c
libzfs_input_check_LDADD = \
+ $(top_builddir)/lib/libspl/libspl.la \
$(top_builddir)/lib/libnvpair/libnvpair.la \
$(top_builddir)/lib/libzfs_core/libzfs_core.la