xref: /freebsd/lib/libc/amd64/string/strlcat.c (revision cf8e5289a110954600f135024d1515a77d0ae34d)
1  /*-
2   * SPDX-License-Identifier: BSD-2-Clause
3   *
4   * Copyright (c) 2023 Robert Clausecker
5   */
6  
7  #include <sys/cdefs.h>
8  
9  #include <string.h>
10  
11  #undef strlcat	/* FORTIFY_SOURCE */
12  
13  void *__memchr(const void *, int, size_t);
14  size_t __strlcpy(char *restrict, const char *restrict, size_t);
15  
16  size_t
strlcat(char * restrict dst,const char * restrict src,size_t dstsize)17  strlcat(char *restrict dst, const char *restrict src, size_t dstsize)
18  {
19  	char *loc = __memchr(dst, '\0', dstsize);
20  
21  	if (loc != NULL) {
22  		size_t dstlen = (size_t)(loc - dst);
23  
24  		return (dstlen + __strlcpy(loc, src, dstsize - dstlen));
25  	} else
26  		return (dstsize + strlen(src));
27  }
28