1*2b15cb3dSCy Schubert /*
2*2b15cb3dSCy Schubert * Why use strlcpy()/strlcat() instead of standard strncpy()/strncat()?
3*2b15cb3dSCy Schubert * To reduce likelihood of bugs and avoid wasteful zero fills. See:
4*2b15cb3dSCy Schubert * http://www.gratisoft.us/todd/papers/strlcpy.html
5*2b15cb3dSCy Schubert */
6*2b15cb3dSCy Schubert
7*2b15cb3dSCy Schubert /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */
8*2b15cb3dSCy Schubert
9*2b15cb3dSCy Schubert /*
10*2b15cb3dSCy Schubert * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
11*2b15cb3dSCy Schubert *
12*2b15cb3dSCy Schubert * Permission to use, copy, modify, and distribute this software for any
13*2b15cb3dSCy Schubert * purpose with or without fee is hereby granted, provided that the above
14*2b15cb3dSCy Schubert * copyright notice and this permission notice appear in all copies.
15*2b15cb3dSCy Schubert *
16*2b15cb3dSCy Schubert * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17*2b15cb3dSCy Schubert * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18*2b15cb3dSCy Schubert * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
19*2b15cb3dSCy Schubert * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20*2b15cb3dSCy Schubert * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21*2b15cb3dSCy Schubert * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22*2b15cb3dSCy Schubert * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23*2b15cb3dSCy Schubert */
24*2b15cb3dSCy Schubert
25*2b15cb3dSCy Schubert #include <config.h> /* + marks local changes */
26*2b15cb3dSCy Schubert #ifdef HAVE_SYS_TYPES_H /* + */
27*2b15cb3dSCy Schubert #include <sys/types.h>
28*2b15cb3dSCy Schubert #endif /* + */
29*2b15cb3dSCy Schubert #include <string.h>
30*2b15cb3dSCy Schubert
31*2b15cb3dSCy Schubert #include "ntp_stdlib.h" /* + strlcpy, strlcat prototypes */
32*2b15cb3dSCy Schubert
33*2b15cb3dSCy Schubert #ifndef HAVE_STRLCPY /* + */
34*2b15cb3dSCy Schubert /*
35*2b15cb3dSCy Schubert * Copy src to string dst of size siz. At most siz-1 characters
36*2b15cb3dSCy Schubert * will be copied. Always NUL terminates (unless siz == 0).
37*2b15cb3dSCy Schubert * Returns strlen(src); if retval >= siz, truncation occurred.
38*2b15cb3dSCy Schubert */
39*2b15cb3dSCy Schubert size_t
strlcpy(char * dst,const char * src,size_t siz)40*2b15cb3dSCy Schubert strlcpy(char *dst, const char *src, size_t siz)
41*2b15cb3dSCy Schubert {
42*2b15cb3dSCy Schubert char *d = dst;
43*2b15cb3dSCy Schubert const char *s = src;
44*2b15cb3dSCy Schubert size_t n = siz;
45*2b15cb3dSCy Schubert
46*2b15cb3dSCy Schubert /* Copy as many bytes as will fit */
47*2b15cb3dSCy Schubert if (n != 0) {
48*2b15cb3dSCy Schubert while (--n != 0) {
49*2b15cb3dSCy Schubert if ((*d++ = *s++) == '\0')
50*2b15cb3dSCy Schubert break;
51*2b15cb3dSCy Schubert }
52*2b15cb3dSCy Schubert }
53*2b15cb3dSCy Schubert
54*2b15cb3dSCy Schubert /* Not enough room in dst, add NUL and traverse rest of src */
55*2b15cb3dSCy Schubert if (n == 0) {
56*2b15cb3dSCy Schubert if (siz != 0)
57*2b15cb3dSCy Schubert *d = '\0'; /* NUL-terminate dst */
58*2b15cb3dSCy Schubert while (*s++)
59*2b15cb3dSCy Schubert ;
60*2b15cb3dSCy Schubert }
61*2b15cb3dSCy Schubert
62*2b15cb3dSCy Schubert return(s - src - 1); /* count does not include NUL */
63*2b15cb3dSCy Schubert }
64*2b15cb3dSCy Schubert #endif /* + */
65*2b15cb3dSCy Schubert
66*2b15cb3dSCy Schubert
67*2b15cb3dSCy Schubert /* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */
68*2b15cb3dSCy Schubert
69*2b15cb3dSCy Schubert /*
70*2b15cb3dSCy Schubert * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
71*2b15cb3dSCy Schubert *
72*2b15cb3dSCy Schubert * Permission to use, copy, modify, and distribute this software for any
73*2b15cb3dSCy Schubert * purpose with or without fee is hereby granted, provided that the above
74*2b15cb3dSCy Schubert * copyright notice and this permission notice appear in all copies.
75*2b15cb3dSCy Schubert *
76*2b15cb3dSCy Schubert * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
77*2b15cb3dSCy Schubert * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
78*2b15cb3dSCy Schubert * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
79*2b15cb3dSCy Schubert * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
80*2b15cb3dSCy Schubert * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
81*2b15cb3dSCy Schubert * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
82*2b15cb3dSCy Schubert * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
83*2b15cb3dSCy Schubert */
84*2b15cb3dSCy Schubert
85*2b15cb3dSCy Schubert /* #include <sys/types.h> */ /* + */
86*2b15cb3dSCy Schubert /* #include <string.h> */ /* + */
87*2b15cb3dSCy Schubert
88*2b15cb3dSCy Schubert #ifndef HAVE_STRLCAT /* + */
89*2b15cb3dSCy Schubert /*
90*2b15cb3dSCy Schubert * Appends src to string dst of size siz (unlike strncat, siz is the
91*2b15cb3dSCy Schubert * full size of dst, not space left). At most siz-1 characters
92*2b15cb3dSCy Schubert * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
93*2b15cb3dSCy Schubert * Returns strlen(src) + MIN(siz, strlen(initial dst)).
94*2b15cb3dSCy Schubert * If retval >= siz, truncation occurred.
95*2b15cb3dSCy Schubert */
96*2b15cb3dSCy Schubert size_t
strlcat(char * dst,const char * src,size_t siz)97*2b15cb3dSCy Schubert strlcat(char *dst, const char *src, size_t siz)
98*2b15cb3dSCy Schubert {
99*2b15cb3dSCy Schubert char *d = dst;
100*2b15cb3dSCy Schubert const char *s = src;
101*2b15cb3dSCy Schubert size_t n = siz;
102*2b15cb3dSCy Schubert size_t dlen;
103*2b15cb3dSCy Schubert
104*2b15cb3dSCy Schubert /* Find the end of dst and adjust bytes left but don't go past end */
105*2b15cb3dSCy Schubert while (n-- != 0 && *d != '\0')
106*2b15cb3dSCy Schubert d++;
107*2b15cb3dSCy Schubert dlen = d - dst;
108*2b15cb3dSCy Schubert n = siz - dlen;
109*2b15cb3dSCy Schubert
110*2b15cb3dSCy Schubert if (n == 0)
111*2b15cb3dSCy Schubert return(dlen + strlen(s));
112*2b15cb3dSCy Schubert while (*s != '\0') {
113*2b15cb3dSCy Schubert if (n != 1) {
114*2b15cb3dSCy Schubert *d++ = *s;
115*2b15cb3dSCy Schubert n--;
116*2b15cb3dSCy Schubert }
117*2b15cb3dSCy Schubert s++;
118*2b15cb3dSCy Schubert }
119*2b15cb3dSCy Schubert *d = '\0';
120*2b15cb3dSCy Schubert
121*2b15cb3dSCy Schubert return(dlen + (s - src)); /* count does not include NUL */
122*2b15cb3dSCy Schubert }
123*2b15cb3dSCy Schubert #endif /* + */
124