1*eda14cbcSMatt Macy /* 2*eda14cbcSMatt Macy * CDDL HEADER START 3*eda14cbcSMatt Macy * 4*eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5*eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6*eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7*eda14cbcSMatt Macy * 8*eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 10*eda14cbcSMatt Macy * See the License for the specific language governing permissions 11*eda14cbcSMatt Macy * and limitations under the License. 12*eda14cbcSMatt Macy * 13*eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14*eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16*eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17*eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18*eda14cbcSMatt Macy * 19*eda14cbcSMatt Macy * CDDL HEADER END 20*eda14cbcSMatt Macy */ 21*eda14cbcSMatt Macy 22*eda14cbcSMatt Macy /* 23*eda14cbcSMatt Macy * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24*eda14cbcSMatt Macy * Use is subject to license terms. 25*eda14cbcSMatt Macy */ 26*eda14cbcSMatt Macy #ifndef HAVE_STRLCAT 27*eda14cbcSMatt Macy 28*eda14cbcSMatt Macy #include <string.h> 29*eda14cbcSMatt Macy #include <sys/types.h> 30*eda14cbcSMatt Macy 31*eda14cbcSMatt Macy /* 32*eda14cbcSMatt Macy * Appends src to the dstsize buffer at dst. The append will never 33*eda14cbcSMatt Macy * overflow the destination buffer and the buffer will always be null 34*eda14cbcSMatt Macy * terminated. Never reference beyond &dst[dstsize-1] when computing 35*eda14cbcSMatt Macy * the length of the pre-existing string. 36*eda14cbcSMatt Macy */ 37*eda14cbcSMatt Macy 38*eda14cbcSMatt Macy size_t 39*eda14cbcSMatt Macy strlcat(char *dst, const char *src, size_t dstsize) 40*eda14cbcSMatt Macy { 41*eda14cbcSMatt Macy char *df = dst; 42*eda14cbcSMatt Macy size_t left = dstsize; 43*eda14cbcSMatt Macy size_t l1; 44*eda14cbcSMatt Macy size_t l2 = strlen(src); 45*eda14cbcSMatt Macy size_t copied; 46*eda14cbcSMatt Macy 47*eda14cbcSMatt Macy while (left-- != 0 && *df != '\0') 48*eda14cbcSMatt Macy df++; 49*eda14cbcSMatt Macy l1 = df - dst; 50*eda14cbcSMatt Macy if (dstsize == l1) 51*eda14cbcSMatt Macy return (l1 + l2); 52*eda14cbcSMatt Macy 53*eda14cbcSMatt Macy copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2; 54*eda14cbcSMatt Macy (void) memcpy(dst + l1, src, copied); 55*eda14cbcSMatt Macy dst[l1+copied] = '\0'; 56*eda14cbcSMatt Macy 57*eda14cbcSMatt Macy return (l1 + l2); 58*eda14cbcSMatt Macy } 59*eda14cbcSMatt Macy 60*eda14cbcSMatt Macy #endif 61