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 <alx@kernel.org>
This commit is contained in:
Alejandro Colomar
2023-08-26 15:28:24 +02:00
committed by Iker Pedrosa
parent e7a292ed4f
commit 3bf8d68f10
2 changed files with 31 additions and 9 deletions

15
lib/strlcpy.c Normal file
View File

@@ -0,0 +1,15 @@
/*
* SPDX-FileCopyrightText: 2022-2023, Alejandro Colomar <alx@kernel.org>
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <config.h>
#ident "$Id$"
#include "strlcpy.h"
extern inline size_t strlcpy_(char *restrict dst, const char *restrict src,
size_t size);

View File

@@ -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