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