Mercurial > code
annotate port/extern/strlcpy.c @ 173:18ad49172e6c
Update documentation and add Unix sockets
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 12 Sep 2013 11:23:08 +0200 |
parents | 996337564c4d |
children |
rev | line source |
---|---|
157
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * Copyright (c) 2012 David Demelier <markand@malikania.fr> |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * Permission to use, copy, modify, and distribute this software for any |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * purpose with or without fee is hereby granted, provided that the above |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * copyright notice and this permission notice appear in all copies. |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 #include <stddef.h> |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 /* |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 * Copy src to string dst of size siz. At most siz-1 characters |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 * will be copied. Always NUL terminates (unless siz == 0). |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 * Returns strlen(src); if retval >= siz, truncation occurred. |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 size_t |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 strlcpy(char *dst, const char *src, size_t siz) |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 { |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 char *d = dst; |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 const char *s = src; |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 size_t n = siz; |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 /* Copy as many bytes as will fit */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 if (n != 0) { |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 while (--n != 0) { |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 if ((*d++ = *s++) == '\0') |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 break; |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 } |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 } |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 /* Not enough room in dst, add NUL and traverse rest of src */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 if (n == 0) { |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 if (siz != 0) |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 *d = '\0'; /* NUL-terminate dst */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 while (*s++) |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 ; |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 } |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 return(s - src - 1); /* count does not include NUL */ |
996337564c4d
Import OpenBSD strlcpy and strlcat
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |