From e99aa8dce43e67f8e83b855a78ee9894c9038357 Mon Sep 17 00:00:00 2001 From: Guillem Jover Date: Sun, 23 Mar 2008 19:18:24 +0200 Subject: [PATCH] libcompat: Add strnlen --- ChangeLog | 9 +++++++++ TODO | 1 - configure.ac | 2 +- debian/changelog | 1 + lib/tarfn.c | 2 ++ libcompat/Makefile.am | 4 ++++ libcompat/strnlen.c | 33 +++++++++++++++++++++++++++++++++ libcompat/strnlen.h | 32 ++++++++++++++++++++++++++++++++ 8 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 libcompat/strnlen.c create mode 100644 libcompat/strnlen.h diff --git a/ChangeLog b/ChangeLog index db204d58..1264c515 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-03-23 Guillem Jover + + * 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 * scripts/t/200_Dpkg_Shlibs.t: Fix test suite to handle the diff --git a/TODO b/TODO index 024fa9da..4fb96932 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 1f3972c1..beb38fc8 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 31d6cac4..1c421ea0 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 66b33f28..2aa8b915 100644 --- a/lib/tarfn.c +++ b/lib/tarfn.c @@ -16,6 +16,8 @@ #include #include +#include "strnlen.h" + struct TarHeader { char Name[100]; char Mode[8]; diff --git a/libcompat/Makefile.am b/libcompat/Makefile.am index ecb89d0b..ac0a656d 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 00000000..09ba788a --- /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 +#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 00000000..ba74dba7 --- /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 + +#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 */ -- 2.39.5