summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-03-03 09:52:21 +0100
committerStef Walter <stefw@gnome.org>2013-03-03 10:07:14 +0100
commit66ee55e5947682d10eed7a36b9da72a8cf6a40f2 (patch)
treec31d63c6149d67470f928151344643bbe4f3d194
parentae76545a0094114ef29dba52df97e69ab28b3dbc (diff)
downloadp11-kit-66ee55e5947682d10eed7a36b9da72a8cf6a40f2.tar.gz
Add compat strndup() function
Not available on Win32 and ancient unixes
-rw-r--r--common/compat.c22
-rw-r--r--common/compat.h7
-rw-r--r--configure.ac1
3 files changed, 30 insertions, 0 deletions
diff --git a/common/compat.c b/common/compat.c
index af28e1d..ff8ee08 100644
--- a/common/compat.c
+++ b/common/compat.c
@@ -424,6 +424,28 @@ memdup (const void *data,
#endif /* HAVE_MEMDUP */
+#ifndef HAVE_STRNDUP
+
+char *
+strndup (const char *data,
+ size_t length)
+{
+ char *ret;
+ size_t len;
+
+ len = strlen (data);
+ if (length > len)
+ length = len;
+
+ ret = memdup (data, length + 1);
+ if (ret != NULL)
+ ret[length] = 0;
+
+ return ret;
+}
+
+#endif /* HAVE_STRDUP */
+
#ifndef HAVE_STRCONCAT
#include <stdarg.h>
diff --git a/common/compat.h b/common/compat.h
index ad80ca5..27e4403 100644
--- a/common/compat.h
+++ b/common/compat.h
@@ -223,6 +223,13 @@ void * memdup (const void *data,
#endif /* HAVE_MEMDUP */
+#ifndef HAVE_STRNDUP
+
+char * strndup (const char *data,
+ size_t length);
+
+#endif /* HAVE_STRDUP */
+
#ifdef HAVE_STDBOOL_H
#include <stdbool.h>
#else
diff --git a/configure.ac b/configure.ac
index ef6f06f..11ac492 100644
--- a/configure.ac
+++ b/configure.ac
@@ -76,6 +76,7 @@ if test "$os_unix" = "yes"; then
# These are thngs we can work around
AC_CHECK_MEMBERS([struct dirent.d_type],,,[#include <dirent.h>])
AC_CHECK_FUNCS([getprogname getexecname basename mkstemp mkdtemp])
+ AC_CHECK_FUNCS([strnstr memdup strndup])
# Check if these are declared and/or available to link against
AC_CHECK_DECLS([program_invocation_short_name])