Line data Source code
1 : /* Copy a null-terminated string to a fixed-size buffer, with length checking.
2 : * Copyright (C) 2016 Free Software Foundation, Inc.
3 : * This file is part of the GNU C Library.
4 : *
5 : * The GNU C Library is free software; you can redistribute it and/or
6 : * modify it under the terms of the GNU Lesser General Public
7 : * License as published by the Free Software Foundation; either
8 : * version 2.1 of the License, or (at your option) any later version.
9 : *
10 : * The GNU C Library is distributed in the hope that it will be useful,
11 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : * Lesser General Public License for more details.
14 : *
15 : * You should have received a copy of the GNU Lesser General Public
16 : * License along with the GNU C Library; if not, see
17 : * <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : /* adapted for Quagga from glibc patch submission originally from
21 : * Florian Weimer <fweimer@redhat.com>, 2016-05-18 */
22 :
23 : #ifdef HAVE_CONFIG_H
24 : #include "config.h"
25 : #endif
26 :
27 : #include <string.h>
28 :
29 : #ifndef HAVE_STRLCPY
30 : #undef strlcpy
31 :
32 : size_t strlcpy(char *__restrict dest,
33 : const char *__restrict src, size_t destsize);
34 :
35 2854 : size_t strlcpy(char *__restrict dest,
36 : const char *__restrict src, size_t destsize)
37 : {
38 2854 : size_t src_length = strlen(src);
39 :
40 2854 : if (__builtin_expect(src_length >= destsize, 0)) {
41 0 : if (destsize > 0) {
42 : /*
43 : * Copy the leading portion of the string. The last
44 : * character is subsequently overwritten with the NUL
45 : * terminator, but the destination destsize is usually
46 : * a multiple of a small power of two, so writing it
47 : * twice should be more efficient than copying an odd
48 : * number of bytes.
49 : */
50 0 : memcpy(dest, src, destsize);
51 0 : dest[destsize - 1] = '\0';
52 : }
53 : } else
54 : /* Copy the string and its terminating NUL character. */
55 2854 : memcpy(dest, src, src_length + 1);
56 2854 : return src_length;
57 : }
58 : #endif /* HAVE_STRLCPY */
|