From: Vladimir Marek vlmarek@volny.cz
Solaris 10 FCS (first release) does not have strndup implementation.
Signed-off-by: Vladimir Marek vlmarek@volny.cz --- configure.ac | 2 +- strndup.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 strndup.c
diff --git a/configure.ac b/configure.ac index a92e81c..5d20cd9 100644 --- a/configure.ac +++ b/configure.ac @@ -371,7 +371,7 @@ AC_CHECK_TYPE(ssize_t, int)
AC_CHECK_FUNCS(fgetpos memmove setegid srand48 strerror)
-AC_REPLACE_FUNCS([setenv strcasecmp strdup strsep strtok_r wcscasecmp]) +AC_REPLACE_FUNCS([setenv strcasecmp strdup strsep strtok_r wcscasecmp strndup]) AC_REPLACE_FUNCS([strcasestr mkdtemp])
AC_CHECK_FUNC(getopt) diff --git a/strndup.c b/strndup.c new file mode 100644 index 0000000..81557ba --- /dev/null +++ b/strndup.c @@ -0,0 +1,23 @@ +/* Solaris 10 FCS does not have strndup */ + +#include <string.h> +#include <stdlib.h> + +char * +strndup(const char *s, size_t n) +{ + size_t len; + char *ret; + + if (!s) + return (char *)NULL; + + len = strlen(s); + if (n < len) + len = n; + + ret = malloc(len + 1); /* To store '\0' */ + memcpy(ret, s, len); + ret[len] = '\0'; + return ret; +}
On Tue, Apr 16, 2013 at 03:22:18PM +0200, Vladimir.Marek@oracle.com wrote:
+char * +strndup(const char *s, size_t n) +{
- size_t len;
- char *ret;
- if (!s)
return (char *)NULL;
- len = strlen(s);
It would be better to use strnlen() otherwise you cannot use the strndup() for unterminated strings.
- if (n < len)
len = n;
- ret = malloc(len + 1); /* To store '\0' */
if (!ret) return NULL;
- memcpy(ret, s, len);
- ret[len] = '\0';
- return ret;
+}
I have applied a little bit different implementation. Please, git pull and test it. Thanks for your report!
Karel
I have applied a little bit different implementation. Please, git pull and test it. Thanks for your report!
Oh yes, your implementation is clearly better and I can confirm it works.
In the meantime mutt started to use mkdtemp ... But that's up to 'official' mutt to handle.
Thank you
mutt-kz@lists.fedoraproject.org