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