Reviewed-by: Jeremy Huddleston <[email protected]> On Oct 28, 2011, at 17:34, Alan Coopersmith wrote:
> Signed-off-by: Alan Coopersmith <[email protected]> > --- > configure.ac | 2 + > include/dix-config.h.in | 3 ++ > include/os.h | 4 +++ > os/Makefile.am | 4 +++ > os/strndup.c | 49 ++++++++++++++++++++++++++++++++++++ > test/Makefile.am | 2 +- > test/string.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ > 7 files changed, 126 insertions(+), 1 deletions(-) > create mode 100644 os/strndup.c > create mode 100644 test/string.c > > diff --git a/configure.ac b/configure.ac > index 2d35046..852fead 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -234,6 +234,8 @@ AC_CHECK_FUNCS([geteuid getuid link memmove memset > mkstemp strchr strrchr \ > strtol getopt getopt_long vsnprintf walkcontext backtrace \ > getisax getzoneid shmctl64 strcasestr ffs vasprintf]) > AC_FUNC_ALLOCA > +AC_CHECK_FUNCS([strndup], [HAVE_STRNDUP=yes], [HAVE_STRNDUP=no]) > +AM_CONDITIONAL(NEED_STRNDUP, [test x$HAVE_STRNDUP = xno]) > dnl Old HAS_* names used in os/*.c. > AC_CHECK_FUNC([getdtablesize], > AC_DEFINE(HAS_GETDTABLESIZE, 1, [Have the 'getdtablesize' function.])) > diff --git a/include/dix-config.h.in b/include/dix-config.h.in > index 7d6cb96..e1d3a9e 100644 > --- a/include/dix-config.h.in > +++ b/include/dix-config.h.in > @@ -190,6 +190,9 @@ > /* Define to 1 if you have the <string.h> header file. */ > #undef HAVE_STRING_H > > +/* Define to 1 if you have the `strndup' function. */ > +#undef HAVE_STRNDUP > + > /* Define to 1 if you have the `strrchr' function. */ > #undef HAVE_STRRCHR > > diff --git a/include/os.h b/include/os.h > index b489211..53c0f7c 100644 > --- a/include/os.h > +++ b/include/os.h > @@ -491,6 +491,10 @@ extern _X_EXPORT size_t strlcpy(char *dst, const char > *src, size_t siz); > extern _X_EXPORT size_t strlcat(char *dst, const char *src, size_t siz); > #endif > > +#ifndef HAVE_STRNDUP > +extern _X_EXPORT char * strndup(const char *str, size_t n); > +#endif > + > /* Logging. */ > typedef enum _LogParameter { > XLOG_FLUSH, > diff --git a/os/Makefile.am b/os/Makefile.am > index ef9ecdd..8dd8095 100644 > --- a/os/Makefile.am > +++ b/os/Makefile.am > @@ -41,6 +41,10 @@ if NEED_STRLCAT > libos_la_SOURCES += $(STRLCAT_SRCS) > endif > > +if NEED_STRNDUP > +libos_la_SOURCES += $(STRNDUP_SRCS) > +endif > + > EXTRA_DIST = $(SECURERPC_SRCS) $(INTERNALMALLOC_SRCS) \ > $(XDMCP_SRCS) $(STRLCAT_SRCS) > > diff --git a/os/strndup.c b/os/strndup.c > new file mode 100644 > index 0000000..bf8e982 > --- /dev/null > +++ b/os/strndup.c > @@ -0,0 +1,49 @@ > +/* > + * Copyright (c) 1988, 1993 > + * The Regents of the University of California. All rights reserved. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * 4. Neither the name of the University nor the names of its contributors > + * may be used to endorse or promote products derived from this software > + * without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. > + */ > + > +#include <stddef.h> > +#include <stdlib.h> > +#include <string.h> > +#include "os.h" > + > +char * > +strndup(const char *str, size_t n) > +{ > + size_t len; > + char *copy; > + > + for (len = 0; len < n && str[len]; len++) > + continue; > + > + if ((copy = malloc(len + 1)) == NULL) > + return (NULL); > + memcpy(copy, str, len); > + copy[len] = '\0'; > + return (copy); > +} > diff --git a/test/Makefile.am b/test/Makefile.am > index 6da1af6..9b1a341 100644 > --- a/test/Makefile.am > +++ b/test/Makefile.am > @@ -1,6 +1,6 @@ > if ENABLE_UNIT_TESTS > SUBDIRS= . xi2 > -noinst_PROGRAMS = xkb input xtest list misc fixes xfree86 > +noinst_PROGRAMS = xkb input xtest list misc fixes xfree86 string > check_LTLIBRARIES = libxservertest.la > > TESTS=$(noinst_PROGRAMS) > diff --git a/test/string.c b/test/string.c > new file mode 100644 > index 0000000..42a5e9c > --- /dev/null > +++ b/test/string.c > @@ -0,0 +1,63 @@ > +/* > + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > + * DEALINGS IN THE SOFTWARE. > + */ > + > +/** > + * Tests for fallback implementations of string handling routines > + * provided in os/ subdirectory for some platforms. > + */ > + > +#ifdef HAVE_DIX_CONFIG_H > +#include <dix-config.h> > +#endif > + > +#include <assert.h> > +#include "os.h" > + > +/* Ensure we're testing our functions, even on platforms with libc versions > */ > +#include "../os/strndup.c" > + > +static void strndup_checks(void) > +{ > + int rc; > + const char *sample="0123456789abcdef"; > + > + char *firsthalf = strndup(sample, 8); > + char *secondhalf = strndup(sample + 8, 8); > + > + assert(strcmp(firsthalf, "01234567") == 0); > + assert(strcmp(secondhalf, "89abcdef") == 0); > + > + free(firsthalf); > + free(secondhalf); > + > + char *allofit = strndup(sample, 20); > + assert(strcmp(allofit, sample) == 0); > + free(allofit); > +} > + > +int main(int argc, char** argv) > +{ > + strndup_checks(); > + > + return 0; > +} > -- > 1.7.3.2 > > _______________________________________________ > [email protected]: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
