diff --git a/iio-private.h b/iio-private.h index 41872d154..6938a9e9c 100644 --- a/iio-private.h +++ b/iio-private.h @@ -260,6 +260,7 @@ void iio_channel_init_finalize(struct iio_channel *chn); unsigned int find_channel_modifier(const char *s, size_t *len_p); char *iio_strdup(const char *str); +char *iio_strndup(const char *str, size_t n); size_t iio_strlcpy(char * __restrict dst, const char * __restrict src, size_t dsize); char * iio_getenv (char * envvar); diff --git a/utilities.c b/utilities.c index 579555d50..132c75845 100644 --- a/utilities.c +++ b/utilities.c @@ -229,6 +229,24 @@ char *iio_strdup(const char *str) #endif } +/* strndup conforms to POSIX.1-2008; but Windows does not provided it + */ +char *iio_strndup(const char *str, size_t n) +{ +#ifdef HAS_STRNDUP + return strndup(str, n); +#else + size_t len = strnlen(str, n + 1); + char *buf = malloc(len + 1); + if (buf) { + /* len = size of buf, so memcpy is OK */ + memcpy(buf, str, len); /* Flawfinder: ignore */ + buf[len] = 0; + } + return buf; +#endif +} + /* strlcpy is designed to be safer, more consistent, and less error prone * replacements for strncpy, since it guarantees to NUL-terminate the result. *