diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2016-11-15 17:15:49 +0900 |
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2016-11-15 17:35:36 +0900 |
| commit | c5d9d3bb361a7ccf58c3a75ce20d48dcde51210a (patch) | |
| tree | 5838aaa1ea55338690ac2d78aab924d91e5d4c30 /lib/strlcpy.c | |
| parent | 8ce70b1f5efd049ea23cdbc0929274eaa64cf0f5 (diff) | |
lib: replace strlcpy & strlcat with glibc versions
It seems these two were at some point copied in from rsync; replace with
more recent versions that will hopefully become available in glibc as
well.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'lib/strlcpy.c')
| -rw-r--r-- | lib/strlcpy.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/strlcpy.c b/lib/strlcpy.c new file mode 100644 index 0000000000..41bab97ea7 --- /dev/null +++ b/lib/strlcpy.c @@ -0,0 +1,56 @@ +/* Copy a null-terminated string to a fixed-size buffer, with length checking. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* adapted for Quagga from glibc patch submission originally from + * Florian Weimer <fweimer@redhat.com>, 2016-05-18 */ + +#include <string.h> + +#include "config.h" + +#ifndef HAVE_STRLCPY +#undef strlcpy + +size_t +strlcpy (char *__restrict dest, const char *__restrict src, size_t size); + +size_t +strlcpy (char *__restrict dest, const char *__restrict src, size_t size) +{ + size_t src_length = strlen (src); + + if (__builtin_expect (src_length >= size, 0)) + { + if (size > 0) + { + /* Copy the leading portion of the string. The last + character is subsequently overwritten with the NUL + terminator, but the destination size is usually a + multiple of a small power of two, so writing it twice + should be more efficient than copying an odd number of + bytes. */ + memcpy (dest, src, size); + dest[size - 1] = '\0'; + } + } + else + /* Copy the string and its terminating NUL character. */ + memcpy (dest, src, src_length + 1); + return src_length; +} +#endif /* HAVE_STRLCPY */ |
