Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * strlcpy.c 4 : * strncpy done right 5 : * 6 : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group 7 : * 8 : * 9 : * IDENTIFICATION 10 : * src/port/strlcpy.c 11 : * 12 : * This file was taken from OpenBSD and is used on platforms that don't 13 : * provide strlcpy(). The OpenBSD copyright terms follow. 14 : *------------------------------------------------------------------------- 15 : */ 16 : 17 : /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ 18 : 19 : /* 20 : * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> 21 : * 22 : * Permission to use, copy, modify, and distribute this software for any 23 : * purpose with or without fee is hereby granted, provided that the above 24 : * copyright notice and this permission notice appear in all copies. 25 : * 26 : * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 27 : * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 28 : * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 29 : * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 30 : * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 31 : * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 32 : * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 33 : */ 34 : 35 : #include "c.h" 36 : 37 : 38 : /* 39 : * Copy src to string dst of size siz. At most siz-1 characters 40 : * will be copied. Always NUL terminates (unless siz == 0). 41 : * Returns strlen(src); if retval >= siz, truncation occurred. 42 : * Function creation history: http://www.gratisoft.us/todd/papers/strlcpy.html 43 : */ 44 : size_t 45 6768390 : strlcpy(char *dst, const char *src, size_t siz) 46 : { 47 6768390 : char *d = dst; 48 6768390 : const char *s = src; 49 6768390 : size_t n = siz; 50 : 51 : /* Copy as many bytes as will fit */ 52 6768390 : if (n != 0) 53 : { 54 56335856 : while (--n != 0) 55 : { 56 55948618 : if ((*d++ = *s++) == '\0') 57 6381156 : break; 58 : } 59 : } 60 : 61 : /* Not enough room in dst, add NUL and traverse rest of src */ 62 6768390 : if (n == 0) 63 : { 64 387248 : if (siz != 0) 65 387248 : *d = '\0'; /* NUL-terminate dst */ 66 2452980 : while (*s++) 67 : ; 68 : } 69 : 70 6768390 : return (s - src - 1); /* count does not include NUL */ 71 : }