Hoi, this patch adds strndup(3) and makes strdup(3) use it.
-- Andy http://ftp.fortunaty.net/DragonFly/inofficial/patches/strndup.patch diff -r 818115c3be2b lib/libc/string/Makefile.inc --- a/lib/libc/string/Makefile.inc Sun Jun 11 22:54:18 2006 +0000 +++ b/lib/libc/string/Makefile.inc Tue Jun 20 21:37:50 2006 +0200 @@ -34,6 +34,7 @@ MLINKS+=strcat.3 strncat.3 MLINKS+=strcat.3 strncat.3 MLINKS+=strcmp.3 strncmp.3 MLINKS+=strcpy.3 strncpy.3 +MLINKS+=strdup.3 strndup.3 MLINKS+=strerror.3 perror.3 strerror.3 sys_errlist.3 strerror.3 sys_nerr.3 MLINKS+=strerror.3 strerror_r.3 MLINKS+=strlcpy.3 strlcat.3 diff -r 818115c3be2b lib/libc/string/strdup.3 --- a/lib/libc/string/strdup.3 Sun Jun 11 22:54:18 2006 +0000 +++ b/lib/libc/string/strdup.3 Tue Jun 20 21:37:50 2006 +0200 @@ -38,6 +38,7 @@ .Os .Sh NAME .Nm strdup +.Nm strndup .Nd save a copy of a string .Sh LIBRARY .Lb libc @@ -45,14 +46,22 @@ .In string.h .Ft char * .Fn strdup "const char *str" +.Ft char * +.Fn strdup "const char *str" "size_t len" .Sh DESCRIPTION The .Fn strdup -function -allocates sufficient memory for a copy +and +.Fn strndup +functions +allocate sufficient memory for a copy of the string .Fa str , -does the copy, and returns a pointer to it. +do the copy, and return a pointer to it. The +.Fn strndup +function copies +.Fa len +characters. The pointer may subsequently be used as an argument to the function .Xr free 3 . diff -r 818115c3be2b lib/libc/string/strdup.c --- a/lib/libc/string/strdup.c Sun Jun 11 22:54:18 2006 +0000 +++ b/lib/libc/string/strdup.c Tue Jun 20 21:37:50 2006 +0200 @@ -40,14 +40,20 @@ #include <string.h> char * +strndup(const char *str, size_t len) +{ + char *copy; + + if ((copy = malloc(len + 1)) == NULL) + return (NULL); + memcpy(copy, str, len); + copy[len + 1] = '\0'; + return (copy); +} + +char * strdup(const char *str) { - size_t len; - char *copy; + return strndup(str, strlen(str)); +} - len = strlen(str) + 1; - if ((copy = malloc(len)) == NULL) - return (NULL); - memcpy(copy, str, len); - return (copy); -}
