Files
shadow/lib/strlcpy.h
Alejandro Colomar 33abc8bcd9 strlcpy.h: Add STRLCPY() macro
It wraps strlcpy(3bsd) so that it performs some steps that one might
forget, or might be prone to accidents:

-  It calculates the size of the destination buffer, and makes sure it's
   an array (otherwise, using sizeof(dst) would be very bad).

-  It calculates if there's truncation, returning an easy-to-use value.

BTW, this macro doesn't have any issues of double evaluation, because
sizeof() doesn't evaluate its argument (unless it's a VLA, but then
the static_assert(3) within SIZEOF_ARRAY() makes sure VLAs are not
allowed).

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
2023-09-01 09:39:23 +02:00

57 lines
1.5 KiB
C

/*
* SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef SHADOW_INCLUDE_LIB_STRLCPY_H_
#define SHADOW_INCLUDE_LIB_STRLCPY_H_
#include <config.h>
#include <stddef.h>
#include <string.h>
#include "sizeof.h"
/*
* SYNOPSIS
* int STRLCPY(char dst[restrict], const char *restrict src);
*
* ARGUMENTS
* dst Destination buffer where to copy a string.
* src Source string to be copied into dst.
*
* DESCRIPTION
* This macro copies the string pointed to by src, into a string
* at the buffer pointed to by dst. If the destination buffer,
* isn't large enough to hold the copy, the resulting string is
* truncated. The size of the buffer is calculated internally via
* SIZEOF_ARRAY().
*
* RETURN VALUE
* -1 If this call truncated the resulting string.
*
* strlen(dst)
* On success.
*
* ERRORS
* This function doesn't set errno.
*/
#define STRLCPY(dst, src) \
({ \
size_t sz_, len_; \
\
sz_ = SIZEOF_ARRAY(dst); \
len_ = strlcpy(dst, src, sz_); \
\
(len_ >= sz_) ? -1 : len_; \
})
#endif // include guard