diff options
-rw-r--r-- | config/user.m4 | 2 | ||||
-rw-r--r-- | lib/libspl/Makefile.am | 2 | ||||
-rw-r--r-- | lib/libspl/include/string.h | 55 | ||||
-rw-r--r-- | lib/libspl/strlcat.c | 60 | ||||
-rw-r--r-- | lib/libspl/strlcpy.c | 56 | ||||
-rw-r--r-- | tests/zfs-tests/cmd/libzfs_input_check/Makefile.am | 1 |
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 |