13dc54291SGetz Mikalsen /*-
23dc54291SGetz Mikalsen * SPDX-License-Identifier: BSD-2-Clause
33dc54291SGetz Mikalsen *
43dc54291SGetz Mikalsen * Copyright (c) 2023 Robert Clausecker
53dc54291SGetz Mikalsen */
63dc54291SGetz Mikalsen
73dc54291SGetz Mikalsen #include <sys/cdefs.h>
83dc54291SGetz Mikalsen
93dc54291SGetz Mikalsen #include <string.h>
103dc54291SGetz Mikalsen
11*429b03a0SKyle Evans #undef strncat /* _FORTIFY_SOURCE */
12*429b03a0SKyle Evans
133dc54291SGetz Mikalsen void *__memccpy(void *restrict, const void *restrict, int, size_t);
143dc54291SGetz Mikalsen
153dc54291SGetz Mikalsen char *
strncat(char * dest,const char * src,size_t n)163dc54291SGetz Mikalsen strncat(char *dest, const char *src, size_t n)
173dc54291SGetz Mikalsen {
183dc54291SGetz Mikalsen size_t len;
193dc54291SGetz Mikalsen char *endptr;
203dc54291SGetz Mikalsen
213dc54291SGetz Mikalsen len = strlen(dest);
223dc54291SGetz Mikalsen endptr = __memccpy(dest + len, src, '\0', n);
233dc54291SGetz Mikalsen
243dc54291SGetz Mikalsen /* avoid an extra branch */
253dc54291SGetz Mikalsen if (endptr == NULL)
263dc54291SGetz Mikalsen endptr = dest + len + n + 1;
273dc54291SGetz Mikalsen
283dc54291SGetz Mikalsen endptr[-1] = '\0';
293dc54291SGetz Mikalsen
303dc54291SGetz Mikalsen return (dest);
313dc54291SGetz Mikalsen }
32