diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index b7fa795d5..8d0d4d038 100644 --- a/lib/libspl/Makefile.am +++ b/lib/libspl/Makefile.am @@ -22,9 +22,6 @@ USER_C = \ list.c \ mkdirp.c \ page.c \ - strlcat.c \ - strlcpy.c \ - strnlen.c \ timestamp.c \ zone.c \ include/sys/list.h \ diff --git a/lib/libspl/include/string.h b/lib/libspl/include/string.h index 9e5133e0e..8908ce228 100644 --- a/lib/libspl/include/string.h +++ b/lib/libspl/include/string.h @@ -28,9 +28,56 @@ #define _LIBSPL_STRING_H #include_next +#include -extern size_t strlcat(char *dst, const char *src, size_t dstsize); -extern size_t strlcpy(char *dst, const char *src, size_t len); -extern size_t strnlen(const char *str, size_t maxlen); +/* + * 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'; + + return (slen); +} #endif diff --git a/lib/libspl/strlcat.c b/lib/libspl/strlcat.c deleted file mode 100644 index a001df7b1..000000000 --- a/lib/libspl/strlcat.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -#include -#include - -/* - * 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); -} diff --git a/lib/libspl/strlcpy.c b/lib/libspl/strlcpy.c deleted file mode 100644 index 2d0daae05..000000000 --- a/lib/libspl/strlcpy.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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. - */ - -#include -#include - -/* - * 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); -} diff --git a/lib/libspl/strnlen.c b/lib/libspl/strnlen.c deleted file mode 100644 index 9fb8227b9..000000000 --- a/lib/libspl/strnlen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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. - */ - -#include -#include - -/* - * Returns the number of non-NULL bytes in string argument, - * but not more than maxlen. Does not look past str + maxlen. - */ -size_t -strnlen(const char *str, size_t maxlen) -{ - const char *ptr; - - ptr = memchr(str, 0, maxlen); - if (ptr == NULL) - return (maxlen); - - return (ptr - str); -} diff --git a/tests/zfs-tests/cmd/libzfs_input_check/libzfs_input_check.c b/tests/zfs-tests/cmd/libzfs_input_check/libzfs_input_check.c index 64066d419..3d5c7b64a 100644 --- a/tests/zfs-tests/cmd/libzfs_input_check/libzfs_input_check.c +++ b/tests/zfs-tests/cmd/libzfs_input_check/libzfs_input_check.c @@ -147,7 +147,7 @@ lzc_ioctl_run(zfs_ioc_t ioc, const char *name, nvlist_t *innvl, int expected) } packed = fnvlist_pack(innvl, &size); - (void) strncpy(zc.zc_name, name, sizeof (zc.zc_name)); + (void) strlcpy(zc.zc_name, name, sizeof (zc.zc_name)); zc.zc_name[sizeof (zc.zc_name) - 1] = '\0'; zc.zc_nvlist_src = (uint64_t)(uintptr_t)packed; zc.zc_nvlist_src_size = size; @@ -234,7 +234,7 @@ lzc_ioctl_test(zfs_ioc_t ioc, const char *name, nvlist_t *required, char pname[MAXNAMELEN]; data_type_t ptype; - strncpy(pname, nvpair_name(pair), sizeof (pname)); + strlcpy(pname, nvpair_name(pair), sizeof (pname)); pname[sizeof (pname) - 1] = '\0'; ptype = nvpair_type(pair); fnvlist_remove_nvpair(input, pair); @@ -648,7 +648,7 @@ zfs_destroy(const char *dataset) zfs_cmd_t zc = {"\0"}; int err; - (void) strncpy(zc.zc_name, dataset, sizeof (zc.zc_name)); + (void) strlcpy(zc.zc_name, dataset, sizeof (zc.zc_name)); zc.zc_name[sizeof (zc.zc_name) - 1] = '\0'; zc.zc_objset_type = DMU_OST_ZFS; err = ioctl(zfs_fd, ZFS_IOC_DESTROY, &zc); @@ -760,7 +760,7 @@ zfs_ioc_input_tests(const char *pool) ioc_tested[ioc_skip[i] - ZFS_IOC_FIRST] = B_TRUE; } - (void) strncpy(zc.zc_name, pool, sizeof (zc.zc_name)); + (void) strlcpy(zc.zc_name, pool, sizeof (zc.zc_name)); zc.zc_name[sizeof (zc.zc_name) - 1] = '\0'; for (unsigned ioc = ZFS_IOC_FIRST; ioc < ZFS_IOC_LAST; ioc++) {