From: Alejandro Colomar Date: Sat, 26 Aug 2023 13:28:24 +0000 (+0200) Subject: strlcpy.[ch]: Add strlcpy_() X-Git-Tag: 4.15.0-rc1~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3bf8d68f10f2426eda2dd27a21cc0f2a996d5693;p=thirdparty%2Fshadow.git strlcpy.[ch]: Add strlcpy_() This function is like strlcpy(3), but returns -1 on truncation, which makes it much easier to test. strlcpy(3) is useful in two cases: - We don't care if the output is truncated. strlcpy(3) is fine for those, and the return value can be ignored. - Truncation is bad. In that case, we just want to signal truncation, and the length of the original string is quite useless. Return the length iff no truncation so that we can use it if necessary. This simplifies the definition of the STRLCPY() macro. Signed-off-by: Alejandro Colomar --- diff --git a/lib/strlcpy.c b/lib/strlcpy.c new file mode 100644 index 000000000..fab04feda --- /dev/null +++ b/lib/strlcpy.c @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2022-2023, Alejandro Colomar + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#include + +#ident "$Id$" + +#include "strlcpy.h" + + +extern inline size_t strlcpy_(char *restrict dst, const char *restrict src, + size_t size); diff --git a/lib/strlcpy.h b/lib/strlcpy.h index 5ef9b8a76..e725078b4 100644 --- a/lib/strlcpy.h +++ b/lib/strlcpy.h @@ -42,15 +42,22 @@ */ -#define STRLCPY(dst, src) \ -({ \ - size_t sz_, len_; \ - \ - sz_ = SIZEOF_ARRAY(dst); \ - len_ = strlcpy(dst, src, sz_); \ - \ - (len_ >= sz_) ? -1 : len_; \ -}) +#define STRLCPY(dst, src) strlcpy_(dst, src, SIZEOF_ARRAY(dst)) + + +inline size_t strlcpy_(char *restrict dst, const char *restrict src, + size_t size); + + +inline size_t +strlcpy_(char *restrict dst, const char *restrict src, size_t size) +{ + size_t len; + + len = strlcpy(dst, src, size); + + return (len >= size) ? -1 : len; +} #endif // include guard