15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* $OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $ */ 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met: 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * documentation and/or other materials provided with the distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * derived from this software without specific prior written permission. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(LIBC_SCCS) && !defined(lint) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *rcsid = "$OpenBSD: strlcpy.c,v 1.5 2001/05/13 15:40:16 deraadt Exp $"; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* LIBC_SCCS and not lint */ 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CONFIG_H 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_CONFIG_H */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_STRLCPY 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "strlcpy-internal.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy src to string dst of size siz. At most siz-1 characters 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be copied. Always NUL terminates (unless siz == 0). 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns strlen(src); if retval >= siz, truncation occurred. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_event_strlcpy(dst, src, siz) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *dst; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *src; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t siz; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register char *d = dst; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register const char *s = src; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) register size_t n = siz; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Copy as many bytes as will fit */ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n != 0 && --n != 0) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*d++ = *s++) == 0) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (--n != 0); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Not enough room in dst, add NUL and traverse rest of src */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (n == 0) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (siz != 0) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *d = '\0'; /* NUL-terminate dst */ 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*s++) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(s - src - 1); /* count does not include NUL */ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 77