xref: /aosp_15_r20/external/arm-trusted-firmware/lib/libc/strlcpy.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*	$OpenBSD: strlcpy.c,v 1.12 2015/01/15 03:54:12 millert Exp $	*/
2*54fd6939SJiyong Park 
3*54fd6939SJiyong Park /*
4*54fd6939SJiyong Park  * SPDX-License-Identifier: ISC
5*54fd6939SJiyong Park  *
6*54fd6939SJiyong Park  * Copyright (c) 1998, 2015 Todd C. Miller <[email protected]>
7*54fd6939SJiyong Park  *
8*54fd6939SJiyong Park  * Permission to use, copy, modify, and distribute this software for any
9*54fd6939SJiyong Park  * purpose with or without fee is hereby granted, provided that the above
10*54fd6939SJiyong Park  * copyright notice and this permission notice appear in all copies.
11*54fd6939SJiyong Park  *
12*54fd6939SJiyong Park  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13*54fd6939SJiyong Park  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14*54fd6939SJiyong Park  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15*54fd6939SJiyong Park  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16*54fd6939SJiyong Park  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*54fd6939SJiyong Park  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*54fd6939SJiyong Park  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*54fd6939SJiyong Park  */
20*54fd6939SJiyong Park 
21*54fd6939SJiyong Park #include <stdint.h>
22*54fd6939SJiyong Park #include <string.h>
23*54fd6939SJiyong Park 
24*54fd6939SJiyong Park /*
25*54fd6939SJiyong Park  * Copy string src to buffer dst of size dsize.  At most dsize-1
26*54fd6939SJiyong Park  * chars will be copied.  Always NUL terminates (unless dsize == 0).
27*54fd6939SJiyong Park  * Returns strlen(src); if retval >= dsize, truncation occurred.
28*54fd6939SJiyong Park  */
29*54fd6939SJiyong Park size_t
strlcpy(char * dst,const char * src,size_t dsize)30*54fd6939SJiyong Park strlcpy(char * dst, const char * src, size_t dsize)
31*54fd6939SJiyong Park {
32*54fd6939SJiyong Park 	const char *osrc = src;
33*54fd6939SJiyong Park 	size_t nleft = dsize;
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park 	/* Copy as many bytes as will fit. */
36*54fd6939SJiyong Park 	if (nleft != 0) {
37*54fd6939SJiyong Park 		while (--nleft != 0) {
38*54fd6939SJiyong Park 			if ((*dst++ = *src++) == '\0')
39*54fd6939SJiyong Park 				break;
40*54fd6939SJiyong Park 		}
41*54fd6939SJiyong Park 	}
42*54fd6939SJiyong Park 
43*54fd6939SJiyong Park 	/* Not enough room in dst, add NUL and traverse rest of src. */
44*54fd6939SJiyong Park 	if (nleft == 0) {
45*54fd6939SJiyong Park 		if (dsize != 0)
46*54fd6939SJiyong Park 			*dst = '\0';		/* NUL-terminate dst */
47*54fd6939SJiyong Park 		while (*src++)
48*54fd6939SJiyong Park 			;
49*54fd6939SJiyong Park 	}
50*54fd6939SJiyong Park 
51*54fd6939SJiyong Park 	return(src - osrc - 1);	/* count does not include NUL */
52*54fd6939SJiyong Park }
53