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