diff options
Diffstat (limited to 'lib/libspl/include/string.h')
-rw-r--r-- | lib/libspl/include/string.h | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/lib/libspl/include/string.h b/lib/libspl/include/string.h index 9e5133e0e..8908ce228 100644 --- a/lib/libspl/include/string.h +++ b/lib/libspl/include/string.h @@ -28,9 +28,56 @@ #define _LIBSPL_STRING_H #include_next <string.h> +#include <sys/types.h> -extern size_t strlcat(char *dst, const char *src, size_t dstsize); -extern size_t strlcpy(char *dst, const char *src, size_t len); -extern size_t strnlen(const char *str, size_t maxlen); +/* + * Appends src to the dstsize buffer at dst. The append will never + * overflow the destination buffer and the buffer will always be null + * terminated. Never reference beyond &dst[dstsize-1] when computing + * the length of the pre-existing string. + */ +static inline size_t +strlcat(char *dst, const char *src, size_t dstsize) +{ + char *df = dst; + size_t left = dstsize; + size_t l1; + size_t l2 = strlen(src); + size_t copied; + + while (left-- != 0 && *df != '\0') + df++; + + l1 = df - dst; + + if (dstsize == l1) + return (l1 + l2); + + copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2; + (void) memcpy(dst + l1, src, copied); + dst[l1+copied] = '\0'; + + return (l1 + l2); +} + +/* + * Copies src to the dstsize buffer at dst. The copy will never + * overflow the destination buffer and the buffer will always be null + * terminated. + */ +static inline size_t +strlcpy(char *dst, const char *src, size_t len) +{ + size_t slen = strlen(src); + + if (len == 0) + return (slen); + + size_t copied = (slen >= len) ? len - 1 : slen; + (void) memcpy(dst, src, copied); + dst[copied] = '\0'; + + return (slen); +} #endif |