GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libc/string/strlcpy.c Lines: 5 8 62.5 %
Date: 2017-11-13 Branches: 5 12 41.7 %

Line Branch Exec Source
1
/*	$OpenBSD: strlcpy.c,v 1.15 2016/10/16 17:37:39 dtucker Exp $	*/
2
3
/*
4
 * Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <sys/types.h>
20
#include <string.h>
21
22
/*
23
 * Copy string src to buffer dst of size dsize.  At most dsize-1
24
 * chars will be copied.  Always NUL terminates (unless dsize == 0).
25
 * Returns strlen(src); if retval >= dsize, truncation occurred.
26
 */
27
size_t
28
strlcpy(char *dst, const char *src, size_t dsize)
29
{
30
	const char *osrc = src;
31
	size_t nleft = dsize;
32
33
	/* Copy as many bytes as will fit. */
34
30
	if (nleft != 0) {
35
336
		while (--nleft != 0) {
36
168
			if ((*dst++ = *src++) == '\0')
37
				break;
38
		}
39
	}
40
41
	/* Not enough room in dst, add NUL and traverse rest of src. */
42
15
	if (nleft == 0) {
43
		if (dsize != 0)
44
			*dst = '\0';		/* NUL-terminate dst */
45
		while (*src++)
46
			;
47
	}
48
49
15
	return(src - osrc - 1);	/* count does not include NUL */
50
}
51
DEF_WEAK(strlcpy);