1d95e11bfSDag-Erling Smørgrav /* $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $ */ 283d2307dSDag-Erling Smørgrav 383d2307dSDag-Erling Smørgrav /* 483d2307dSDag-Erling Smørgrav * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> 583d2307dSDag-Erling Smørgrav * 6d95e11bfSDag-Erling Smørgrav * Permission to use, copy, modify, and distribute this software for any 7d95e11bfSDag-Erling Smørgrav * purpose with or without fee is hereby granted, provided that the above 8d95e11bfSDag-Erling Smørgrav * copyright notice and this permission notice appear in all copies. 983d2307dSDag-Erling Smørgrav * 10d95e11bfSDag-Erling Smørgrav * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11d95e11bfSDag-Erling Smørgrav * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12d95e11bfSDag-Erling Smørgrav * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13d95e11bfSDag-Erling Smørgrav * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14d95e11bfSDag-Erling Smørgrav * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15d95e11bfSDag-Erling Smørgrav * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16d95e11bfSDag-Erling Smørgrav * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1783d2307dSDag-Erling Smørgrav */ 1883d2307dSDag-Erling Smørgrav 194b17dab0SDag-Erling Smørgrav #include "includes.h" 2083d2307dSDag-Erling Smørgrav #ifndef HAVE_STRLCPY 2183d2307dSDag-Erling Smørgrav 2283d2307dSDag-Erling Smørgrav #if defined(LIBC_SCCS) && !defined(lint) 23d95e11bfSDag-Erling Smørgrav static char *rcsid = "$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $"; 2483d2307dSDag-Erling Smørgrav #endif /* LIBC_SCCS and not lint */ 2583d2307dSDag-Erling Smørgrav 2683d2307dSDag-Erling Smørgrav #include <sys/types.h> 2783d2307dSDag-Erling Smørgrav #include <string.h> 2883d2307dSDag-Erling Smørgrav 2983d2307dSDag-Erling Smørgrav /* 3083d2307dSDag-Erling Smørgrav * Copy src to string dst of size siz. At most siz-1 characters 3183d2307dSDag-Erling Smørgrav * will be copied. Always NUL terminates (unless siz == 0). 3283d2307dSDag-Erling Smørgrav * Returns strlen(src); if retval >= siz, truncation occurred. 3383d2307dSDag-Erling Smørgrav */ 3483d2307dSDag-Erling Smørgrav size_t 35d95e11bfSDag-Erling Smørgrav strlcpy(char *dst, const char *src, size_t siz) 3683d2307dSDag-Erling Smørgrav { 3783d2307dSDag-Erling Smørgrav register char *d = dst; 3883d2307dSDag-Erling Smørgrav register const char *s = src; 3983d2307dSDag-Erling Smørgrav register size_t n = siz; 4083d2307dSDag-Erling Smørgrav 4183d2307dSDag-Erling Smørgrav /* Copy as many bytes as will fit */ 4283d2307dSDag-Erling Smørgrav if (n != 0 && --n != 0) { 4383d2307dSDag-Erling Smørgrav do { 4483d2307dSDag-Erling Smørgrav if ((*d++ = *s++) == 0) 4583d2307dSDag-Erling Smørgrav break; 4683d2307dSDag-Erling Smørgrav } while (--n != 0); 4783d2307dSDag-Erling Smørgrav } 4883d2307dSDag-Erling Smørgrav 4983d2307dSDag-Erling Smørgrav /* Not enough room in dst, add NUL and traverse rest of src */ 5083d2307dSDag-Erling Smørgrav if (n == 0) { 5183d2307dSDag-Erling Smørgrav if (siz != 0) 5283d2307dSDag-Erling Smørgrav *d = '\0'; /* NUL-terminate dst */ 5383d2307dSDag-Erling Smørgrav while (*s++) 5483d2307dSDag-Erling Smørgrav ; 5583d2307dSDag-Erling Smørgrav } 5683d2307dSDag-Erling Smørgrav 5783d2307dSDag-Erling Smørgrav return(s - src - 1); /* count does not include NUL */ 5883d2307dSDag-Erling Smørgrav } 5983d2307dSDag-Erling Smørgrav 6083d2307dSDag-Erling Smørgrav #endif /* !HAVE_STRLCPY */ 61