Browse Source

libcompat: Add new strndup()

Guillem Jover 14 years ago
parent
commit
514b67de00
4 changed files with 57 additions and 1 deletions
  1. 1 1
      configure.ac
  2. 4 0
      lib/compat/Makefile.am
  3. 7 0
      lib/compat/compat.h
  4. 45 0
      lib/compat/strndup.c

+ 1 - 1
configure.ac

@@ -86,7 +86,7 @@ DPKG_CHECK_DECL([WCOREDUMP], [sys/wait.h])
 DPKG_CHECK_DECL([TIOCNOTTY], [sys/ioctl.h])
 DPKG_CHECK_DECL([TIOCNOTTY], [sys/ioctl.h])
 DPKG_CHECK_PROGNAME
 DPKG_CHECK_PROGNAME
 DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
 DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
-                         strnlen strerror strsignal asprintf \
+                         strnlen strndup strerror strsignal asprintf \
                          scandir alphasort unsetenv])
                          scandir alphasort unsetenv])
 AC_CHECK_DECLS([strnlen], [[#include <string.h>]])
 AC_CHECK_DECLS([strnlen], [[#include <string.h>]])
 AC_CHECK_FUNCS([memcpy lchown],
 AC_CHECK_FUNCS([memcpy lchown],

+ 4 - 0
lib/compat/Makefile.am

@@ -28,6 +28,10 @@ if !HAVE_STRNLEN
 libcompat_a_SOURCES += strnlen.c strnlen.h
 libcompat_a_SOURCES += strnlen.c strnlen.h
 endif
 endif
 
 
+if !HAVE_STRNDUP
+libcompat_a_SOURCES += strndup.c
+endif
+
 if !HAVE_STRERROR
 if !HAVE_STRERROR
 libcompat_a_SOURCES += strerror.c
 libcompat_a_SOURCES += strerror.c
 endif
 endif

+ 7 - 0
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);
 int vasprintf(char *str, const char *fmt, va_list args);
 #endif
 #endif
 
 
+#ifndef HAVE_STRNDUP
+#include <stddef.h>
+
+#undef strndup
+char *strndup(const char *s, size_t n);
+#endif
+
 #ifndef HAVE_STRERROR
 #ifndef HAVE_STRERROR
 const char *strerror(int);
 const char *strerror(int);
 #endif
 #endif

+ 45 - 0
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