summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillem Jover <guillem@debian.org>2008-03-23 19:18:24 +0200
committerGuillem Jover <guillem@debian.org>2008-03-23 20:53:29 +0200
commite99aa8dce43e67f8e83b855a78ee9894c9038357 (patch)
treec0dced5e9c52c682dbc1cd10670e41362c2fd40a
parent75159aa48089b25f75a80464bdd198ce7f259c1a (diff)
downloaddpkg-e99aa8dce43e67f8e83b855a78ee9894c9038357.tar.gz
libcompat: Add strnlen
-rw-r--r--ChangeLog9
-rw-r--r--TODO1
-rw-r--r--configure.ac2
-rw-r--r--debian/changelog1
-rw-r--r--lib/tarfn.c2
-rw-r--r--libcompat/Makefile.am4
-rw-r--r--libcompat/strnlen.c33
-rw-r--r--libcompat/strnlen.h32
8 files changed, 82 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index db204d58c..1264c5152 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-03-23 Guillem Jover <guillem@debian.org>
+
+ * configure.ac (DPKG_CHECK_COMPAT_FUNCS): Add 'strnlen'.
+ * libcompat/Makefile.am [!HAVE_STRNLEN] (libcompat_a_SOURCES): Add
+ 'strnlen.c' and 'strnlen.h'.
+ * libcompat/strnlen.c: New file (import from Simon Josefsson).
+ * libcompat/strnlen.h: Likewise.
+ * lib/tarfn.c: Include "strnlen.h".
+
2008-03-22 Raphael Hertzog <hertzog@debian.org>
* scripts/t/200_Dpkg_Shlibs.t: Fix test suite to handle the
diff --git a/TODO b/TODO
index 024fa9da3..4fb96932b 100644
--- a/TODO
+++ b/TODO
@@ -36,7 +36,6 @@ lenny
* Cleanup libcompat:
- Add fnmatch, IRIX5 doesn't have it.
- - Add strnlen (GNU extension).
- Cut lib/compat.c into little pieces and move them here.
* Add Wig&Pen source package generation support.
diff --git a/configure.ac b/configure.ac
index 1f3972c10..beb38fc82 100644
--- a/configure.ac
+++ b/configure.ac
@@ -92,7 +92,7 @@ DPKG_C_ATTRIBUTE
# Checks for library functions.
DPKG_FUNC_VA_COPY
-DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free])
+DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long strnlen obstack_free])
AC_CHECK_FUNCS([vsnprintf snprintf strtoul strerror strsignal alphasort \
isascii bcopy memcpy scandir unsetenv lchown setsid \
getdtablesize])
diff --git a/debian/changelog b/debian/changelog
index 31d6cac4f..1c421ea0e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,7 @@ dpkg (1.14.17) UNRELEASED; urgency=low
* Add Raphael Hertzog to Uploaders, and remove Brendan O'Dea and
Christian Perrier with their permission.
* Use functions from libcompat when those are not provided by the system.
+ - Add strnlen to libcompat.
* Change dpkg-gencontrol to not output the Homapage field on udeb.
* Reintroduce 'no-debsig' back in dpkg.cfg to avoid failing to install any
package when debsig-verify is installed. Closes: #311843
diff --git a/lib/tarfn.c b/lib/tarfn.c
index 66b33f289..2aa8b9157 100644
--- a/lib/tarfn.c
+++ b/lib/tarfn.c
@@ -16,6 +16,8 @@
#include <tarfn.h>
#include <dpkg.h>
+#include "strnlen.h"
+
struct TarHeader {
char Name[100];
char Mode[8];
diff --git a/libcompat/Makefile.am b/libcompat/Makefile.am
index ecb89d0ba..ac0a656d2 100644
--- a/libcompat/Makefile.am
+++ b/libcompat/Makefile.am
@@ -20,3 +20,7 @@ if !HAVE_OBSTACK_FREE
libcompat_a_SOURCES += obstack.c obstack.h
endif
+if !HAVE_STRNLEN
+libcompat_a_SOURCES += strnlen.c strnlen.h
+endif
+
diff --git a/libcompat/strnlen.c b/libcompat/strnlen.c
new file mode 100644
index 000000000..09ba788ab
--- /dev/null
+++ b/libcompat/strnlen.c
@@ -0,0 +1,33 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program 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, or (at your option)
+ any later version.
+
+ This program 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "strnlen.h"
+
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
diff --git a/libcompat/strnlen.h b/libcompat/strnlen.h
new file mode 100644
index 000000000..ba74dba7b
--- /dev/null
+++ b/libcompat/strnlen.h
@@ -0,0 +1,32 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ This program 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, or (at your option)
+ any later version.
+
+ This program 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, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#ifndef STRNLEN_H
+#define STRNLEN_H
+
+/* Get strnlen declaration, if available. */
+#include <string.h>
+
+#if defined HAVE_DECL_STRNLEN && !HAVE_DECL_STRNLEN
+/* Find the length (number of bytes) of STRING, but scan at most
+ MAXLEN bytes. If no '\0' terminator is found in that many bytes,
+ return MAXLEN. */
+extern size_t strnlen(const char *string, size_t maxlen);
+#endif
+
+#endif /* STRNLEN_H */