summaryrefslogtreecommitdiffstats
path: root/lib/str.c
diff options
context:
space:
mode:
authorhasso <hasso>2005-09-19 09:53:21 +0000
committerhasso <hasso>2005-09-19 09:53:21 +0000
commit7569e114fd5bc8a44895e511eda136840810dbec (patch)
treea4449b94de5fdb6e32c7a9cbe4d44dce5f50bb27 /lib/str.c
parent37b6d1450097ac3bf3a41be21bb576f257a3f0ff (diff)
downloadquagga-7569e114fd5bc8a44895e511eda136840810dbec.tar.bz2
quagga-7569e114fd5bc8a44895e511eda136840810dbec.tar.xz
* configure.ac: Test existance of strndup.
* lib/str.[ch]: Add strndup() from glibc.
Diffstat (limited to 'lib/str.c')
-rw-r--r--lib/str.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/str.c b/lib/str.c
index 00d03194..4ab71e19 100644
--- a/lib/str.c
+++ b/lib/str.c
@@ -11,6 +11,9 @@
Note that these are not terribly efficient, since they make more than one
pass over the argument strings. At some point, they should be optimized.
+
+ The implementation of strndup is copied from glibc-2.3.5:
+ Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
*/
@@ -89,3 +92,18 @@ strnlen(const char *s, size_t maxlen)
return (p = (const char *)memchr(s, '\0', maxlen)) ? (size_t)(p-s) : maxlen;
}
#endif
+
+#ifndef HAVE_STRNDUP
+char *
+strndup (const char *s, size_t maxlen)
+{
+ size_t len = strnlen (s, maxlen);
+ char *new = (char *) malloc (len + 1);
+
+ if (new == NULL)
+ return NULL;
+
+ new[len] = '\0';
+ return (char *) memcpy (new, s, len);
+}
+#endif