From 119b912773e3c41a95f31656ccbd59bbc307c915 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Thu, 17 Apr 2008 17:33:57 +0300 Subject: [PATCH] Add rstrlcpy() string helper function - adopted from strlcpy() function of OpenBSD originally developed by Todd C. Miller --- rpmio/rpmstring.c | 28 ++++++++++++++++++++++++++++ rpmio/rpmstring.h | 12 ++++++++++++ 2 files changed, 40 insertions(+) diff --git a/rpmio/rpmstring.c b/rpmio/rpmstring.c index 8b1cd78..ac9b5cf 100644 --- a/rpmio/rpmstring.c +++ b/rpmio/rpmstring.c @@ -288,3 +288,31 @@ char *rstrscat(char **dest, const char *arg, ...) return dst; } +/* + * Adapted from OpenBSD, strlcpy() originally developed by + * Todd C. Miller + */ +size_t rstrlcpy(char *dest, const char *src, size_t n) +{ + char *d = dest; + const char *s = src; + size_t len = n; + + /* Copy as many bytes as will fit */ + if (len != 0) { + while (--len != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (len == 0) { + if (n != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ +} diff --git a/rpmio/rpmstring.h b/rpmio/rpmstring.h index 54eeaf1..79eaccc 100644 --- a/rpmio/rpmstring.h +++ b/rpmio/rpmstring.h @@ -125,6 +125,18 @@ char *rstrcat(char **dest, const char *src); char *rstrscat(char **dest, const char *arg, ...) RPM_GNUC_NULL_TERMINATED; /** \ingroup rpmstring + * strlcpy() clone: + * Copy src to string dest of size n. At most n-1 characters + * will be copied. Always zero-terminates (unless n == 0). + * Length of src is returned; if retval >= n, truncation occurred. + * @param dest destination buffer + * @param src string to copy + * @param n destination buffer size + * @return length of src string + */ +size_t rstrlcpy(char *dest, const char *src, size_t n); + +/** \ingroup rpmstring * Split string into fields separated by a character. * @param str string * @param length length of string -- 2.7.4