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:
committed by
Iker Pedrosa
parent
e7a292ed4f
commit
3bf8d68f10
15
lib/strlcpy.c
Normal file
15
lib/strlcpy.c
Normal 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);
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user