From 3bf8d68f10f2426eda2dd27a21cc0f2a996d5693 Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sat, 26 Aug 2023 15:28:24 +0200 Subject: [PATCH] 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 --- lib/strlcpy.c | 15 +++++++++++++++ lib/strlcpy.h | 25 ++++++++++++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 lib/strlcpy.c diff --git a/lib/strlcpy.c b/lib/strlcpy.c new file mode 100644 index 00000000..fab04fed --- /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 5ef9b8a7..e725078b 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