summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2011-11-11 05:10:20 +0100
committerGuillem Jover <guillem@debian.org>2011-11-12 20:48:59 +0100
commit514b67de00c11709b8103d80b7e2cd18e786c69f (patch)
tree7f6eb86c214f12a5515e20414705a3866f91ac4a
parentec35d763c042bb13b466734375b720009dbc6692 (diff)
downloaddpkg-514b67de00c11709b8103d80b7e2cd18e786c69f.tar.gz
libcompat: Add new strndup()
-rw-r--r--configure.ac2
-rw-r--r--lib/compat/Makefile.am4
-rw-r--r--lib/compat/compat.h7
-rw-r--r--lib/compat/strndup.c45
4 files changed, 57 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 6dd552974..7edcd2620 100644
--- a/configure.ac
+++ b/configure.ac
@@ -86,7 +86,7 @@ DPKG_CHECK_DECL([WCOREDUMP], [sys/wait.h])
DPKG_CHECK_DECL([TIOCNOTTY], [sys/ioctl.h])
DPKG_CHECK_PROGNAME
DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
- strnlen strerror strsignal asprintf \
+ strnlen strndup strerror strsignal asprintf \
scandir alphasort unsetenv])
AC_CHECK_DECLS([strnlen], [[#include <string.h>]])
AC_CHECK_FUNCS([memcpy lchown],
diff --git a/lib/compat/Makefile.am b/lib/compat/Makefile.am
index cb3224a32..33da1bd19 100644
--- a/lib/compat/Makefile.am
+++ b/lib/compat/Makefile.am
@@ -28,6 +28,10 @@ if !HAVE_STRNLEN
libcompat_a_SOURCES += strnlen.c strnlen.h
endif
+if !HAVE_STRNDUP
+libcompat_a_SOURCES += strndup.c
+endif
+
if !HAVE_STRERROR
libcompat_a_SOURCES += strerror.c
endif
diff --git a/lib/compat/compat.h b/lib/compat/compat.h
index daf9cc7f7..4086bddfe 100644
--- a/lib/compat/compat.h
+++ b/lib/compat/compat.h
@@ -64,6 +64,13 @@ int asprintf(char *str, char const *fmt, ...);
int vasprintf(char *str, const char *fmt, va_list args);
#endif
+#ifndef HAVE_STRNDUP
+#include <stddef.h>
+
+#undef strndup
+char *strndup(const char *s, size_t n);
+#endif
+
#ifndef HAVE_STRERROR
const char *strerror(int);
#endif
diff --git a/lib/compat/strndup.c b/lib/compat/strndup.c
new file mode 100644
index 000000000..2159a4694
--- /dev/null
+++ b/lib/compat/strndup.c
@@ -0,0 +1,45 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 2011 Guillem Jover <guillem@debian.org>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <compat.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef HAVE_STRNDUP
+#undef strndup
+
+char *
+strndup(const char *s, size_t n)
+{
+ size_t len;
+ char *str;
+
+ len = strnlen(s, n);
+ str = malloc(len + 1);
+ if (str == NULL)
+ return NULL;
+
+ memcpy(str, s, len);
+ str[len] = '\0';
+
+ return str;
+}
+#endif