From: Jim Meyering Date: Sat, 1 Sep 2001 09:50:48 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: cvs-readonly~5731 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=7d7fb7355d5c231ef7b954d5f28f550efa16eaf5;p=gnulib.git *** empty log message *** --- diff --git a/lib/ChangeLog b/lib/ChangeLog index 5a1d26951..418263ff1 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,9 @@ 2001-09-01 Jim Meyering + * xreadlink.c: New file. + * xreadlink.h: New file. + * Makefile.am (libfetish_a_SOURCES): Add xreadlink.c and xreadlink.h. + * regex.c (uintptr_t) [!_LIBC]: Define to private_uintptr_t, so it doesn't conflict with sparc-sun-solaris2.7's definition in /usr/include/sys/int_types.h. diff --git a/lib/xreadlink.c b/lib/xreadlink.c new file mode 100644 index 000000000..333551fed --- /dev/null +++ b/lib/xreadlink.c @@ -0,0 +1,72 @@ +/* exclude.c -- exclude file names + + Copyright 2001 Free Software Foundation, Inc. + + 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; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Jim Meyering */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_STDLIB_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif + +#include "xalloc.h" +#include "xreadlink.h" + +/* Call readlink to get the symbolic link value of FILENAME. + Return a pointer to that NUL-terminated string in malloc'd storage. + If readlink fails, return NULL (use errno to diagnose). + If realloc fails, or if the link value is longer than SIZE_MAX :-), + give a diagnostic and exit. */ + +char * +xreadlink (char const *filename, size_t *link_length_arg) +{ + size_t buf_size = 128; /* must be a power of 2 */ + char *buffer = NULL; + + while (1) + { + int link_length; + buffer = (char *) xrealloc (buffer, buf_size); + link_length = readlink (filename, buffer, buf_size); + if (link_length < 0) + { + free (buffer); + return NULL; + } + if (link_length < buf_size) + { + *link_length_arg = link_length; + buffer[link_length] = 0; + return buffer; + } + buf_size *= 2; + if (buf_size == 0) + xalloc_die (); + } +} diff --git a/lib/xreadlink.h b/lib/xreadlink.h new file mode 100644 index 000000000..4fe13ab9a --- /dev/null +++ b/lib/xreadlink.h @@ -0,0 +1,9 @@ +#ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +char *xreadlink PARAMS ((char const *, size_t *));