usr/src/lib/libc/port/gen/strlcat.c
author Jon Tibble <meths@btinternet.com>
Thu Dec 09 22:32:39 2010 +0100 (2010-12-09)
changeset 13255 4afa820d78b9
parent 0 68f95e015346
permissions -rw-r--r--
298 SPARC build fails in smt_pause.o
478 Build needs fixing for pkgdepend flag day
Reviewed by: gwr@nexenta.com
Reviewed by: trisk@nexenta.com
Reviewed by: richlowe@richlowe.net
Approved by: garrett@nexenta.com
     1 /*
     2  * CDDL HEADER START
     3  *
     4  * The contents of this file are subject to the terms of the
     5  * 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.LICENSE
     9  * or http://www.opensolaris.org/os/licensing.
    10  * See the License for the specific language governing permissions
    11  * and limitations under the License.
    12  *
    13  * When distributing Covered Code, include this CDDL HEADER in each
    14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
    15  * If applicable, add the following below this CDDL HEADER, with the
    16  * fields enclosed by brackets "[]" replaced with your own identifying
    17  * information: Portions Copyright [yyyy] [name of copyright owner]
    18  *
    19  * CDDL HEADER END
    20  */
    21 
    22 /*
    23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
    24  * Use is subject to license terms.
    25  */
    26 
    27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
    28 
    29 #include "lint.h"
    30 #include <string.h>
    31 #include <sys/types.h>
    32 
    33 /*
    34  * Appends src to the dstsize buffer at dst. The append will never
    35  * overflow the destination buffer and the buffer will always be null
    36  * terminated. Never reference beyond &dst[dstsize-1] when computing
    37  * the length of the pre-existing string.
    38  */
    39 
    40 size_t
    41 strlcat(char *dst, const char *src, size_t dstsize)
    42 {
    43 	char *df = dst;
    44 	size_t left = dstsize;
    45 	size_t l1;
    46 	size_t l2 = strlen(src);
    47 	size_t copied;
    48 
    49 	while (left-- != 0 && *df != '\0')
    50 		df++;
    51 	l1 = df - dst;
    52 	if (dstsize == l1)
    53 		return (l1 + l2);
    54 
    55 	copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
    56 	(void) memcpy(dst + l1, src, copied);
    57 	dst[l1+copied] = '\0';
    58 	return (l1 + l2);
    59 }