Path: blob/main/sys/contrib/openzfs/lib/libspl/strlcat.c
48378 views
// SPDX-License-Identifier: CDDL-1.01/*2* CDDL HEADER START3*4* The contents of this file are subject to the terms of the5* Common Development and Distribution License (the "License").6* You may not use this file except in compliance with the License.7*8* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE9* or https://opensource.org/licenses/CDDL-1.0.10* See the License for the specific language governing permissions11* and limitations under the License.12*13* When distributing Covered Code, include this CDDL HEADER in each14* file and include the License file at usr/src/OPENSOLARIS.LICENSE.15* If applicable, add the following below this CDDL HEADER, with the16* fields enclosed by brackets "[]" replaced with your own identifying17* information: Portions Copyright [yyyy] [name of copyright owner]18*19* CDDL HEADER END20*/2122/*23* Copyright 2008 Sun Microsystems, Inc. All rights reserved.24* Use is subject to license terms.25*/26#ifndef HAVE_STRLCAT2728#include <string.h>29#include <sys/types.h>3031/*32* Appends src to the dstsize buffer at dst. The append will never33* overflow the destination buffer and the buffer will always be null34* terminated. Never reference beyond &dst[dstsize-1] when computing35* the length of the pre-existing string.36*/3738size_t39strlcat(char *dst, const char *src, size_t dstsize)40{41char *df = dst;42size_t left = dstsize;43size_t l1;44size_t l2 = strlen(src);45size_t copied;4647while (left-- != 0 && *df != '\0')48df++;49l1 = df - dst;50if (dstsize == l1)51return (l1 + l2);5253copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;54(void) memcpy(dst + l1, src, copied);55dst[l1+copied] = '\0';5657return (l1 + l2);58}5960#endif616263