From: Bruno Haible Date: Sun, 30 Sep 2007 02:17:42 +0000 (+0200) Subject: Change xreadlink module to use areadlink. X-Git-Tag: v0.0~186 X-Git-Url: https://erislabs.net/gitweb/?a=commitdiff_plain;h=c88c4b13124fa7df985fe52cd51b0c96a7826446;hp=e2403441c0109eb9c0d23887543a854858c8bdd0;p=gnulib.git Change xreadlink module to use areadlink. --- diff --git a/ChangeLog b/ChangeLog index e17707f4f..13c922fba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2007-09-29 Bruno Haible + * lib/xreadlink.c (xreadlink): Simplify to a wrapper around areadlink. + * modules/xreadlink (Depends-on): Add areadlink, remove readlink etc. + * build-aux/install-reloc: Compile also areadlink.c. + * modules/relocatable-prog-wrapper (Files): Add lib/areadlink.[hc]. + +2007-09-29 Bruno Haible + * gnulib-tool (func_emit_initmacro_done): Indentation. 2007-09-29 Bruno Haible diff --git a/build-aux/install-reloc b/build-aux/install-reloc index 2d25e75fc..9a64087e3 100755 --- a/build-aux/install-reloc +++ b/build-aux/install-reloc @@ -133,6 +133,7 @@ func_verbose $compile_command \ "$srcdir"/progname.c \ "$srcdir"/progreloc.c \ "$srcdir"/xreadlink.c \ + "$srcdir"/areadlink.c \ "$srcdir"/readlink.c \ "$srcdir"/canonicalize-lgpl.c \ "$srcdir"/malloca.c \ @@ -148,6 +149,7 @@ rm -f relocwrapper.o \ progname.o \ progreloc.o \ xreadlink.o \ + areadlink.o \ canonicalize-lgpl.o \ malloca.o \ relocatable.o \ diff --git a/lib/relocwrapper.c b/lib/relocwrapper.c index 57e8bbb16..73136cfeb 100644 --- a/lib/relocwrapper.c +++ b/lib/relocwrapper.c @@ -21,7 +21,8 @@ -> progname -> progreloc -> xreadlink - -> readlink + -> areadlink + -> readlink -> canonicalize-lgpl -> malloca -> relocatable diff --git a/lib/xreadlink.c b/lib/xreadlink.c index 2aba26547..48523a776 100644 --- a/lib/xreadlink.c +++ b/lib/xreadlink.c @@ -25,107 +25,22 @@ /* Specification. */ #include "xreadlink.h" -#include -#include #include -#include -#include -#include -#include -#ifndef SIZE_MAX -# define SIZE_MAX ((size_t) -1) -#endif -#ifndef SSIZE_MAX -# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) -#endif - -#ifdef NO_XMALLOC -# define xmalloc malloc -#else -# include "xalloc.h" -#endif +#include "areadlink.h" +#include "xalloc.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 (caller may use errno to diagnose). + If readlink fails, return NULL and set errno. If realloc fails, or if the link value is longer than SIZE_MAX :-), give a diagnostic and exit. */ char * xreadlink (char const *filename) { - /* The initial buffer size for the link value. A power of 2 - detects arithmetic overflow earlier, but is not required. */ -#define INITIAL_BUF_SIZE 1024 - - /* Allocate the initial buffer on the stack. This way, in the common - case of a symlink of small size, we get away with a single small malloc() - instead of a big malloc() followed by a shrinking realloc(). */ - char initial_buf[INITIAL_BUF_SIZE]; - - char *buffer = initial_buf; - size_t buf_size = sizeof (initial_buf); - - while (1) - { - /* Attempt to read the link into the current buffer. */ - ssize_t link_length = readlink (filename, buffer, buf_size); - - /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1 - with errno == ERANGE if the buffer is too small. */ - if (link_length < 0 && errno != ERANGE) - { - if (buffer != initial_buf) - { - int saved_errno = errno; - free (buffer); - errno = saved_errno; - } - return NULL; - } - - if ((size_t) link_length < buf_size) - { - buffer[link_length++] = '\0'; - - /* Return it in a chunk of memory as small as possible. */ - if (buffer == initial_buf) - { - buffer = (char *) xmalloc (link_length); -#ifdef NO_XMALLOC - if (buffer == NULL) - return NULL; -#endif - memcpy (buffer, initial_buf, link_length); - } - else - { - /* Shrink buffer before returning it. */ - if ((size_t) link_length < buf_size) - { - char *smaller_buffer = (char *) realloc (buffer, link_length); - - if (smaller_buffer != NULL) - buffer = smaller_buffer; - } - } - return buffer; - } - - if (buffer != initial_buf) - free (buffer); - buf_size *= 2; - if (SSIZE_MAX < buf_size || (SIZE_MAX / 2 < SSIZE_MAX && buf_size == 0)) -#ifdef NO_XMALLOC - return NULL; -#else - xalloc_die (); -#endif - buffer = (char *) xmalloc (buf_size); -#ifdef NO_XMALLOC - if (buffer == NULL) - return NULL; -#endif - } + char *result = areadlink (filename); + if (result == NULL && errno == ENOMEM) + xalloc_die (); + return result; } diff --git a/modules/relocatable-prog-wrapper b/modules/relocatable-prog-wrapper index 186a606e6..0002774d9 100644 --- a/modules/relocatable-prog-wrapper +++ b/modules/relocatable-prog-wrapper @@ -10,6 +10,8 @@ lib/progname.c lib/progreloc.c lib/xreadlink.h lib/xreadlink.c +lib/areadlink.h +lib/areadlink.c lib/readlink.c lib/canonicalize.h lib/canonicalize-lgpl.c diff --git a/modules/xreadlink b/modules/xreadlink index 4fb0a6d8a..36c0acf69 100644 --- a/modules/xreadlink +++ b/modules/xreadlink @@ -6,9 +6,7 @@ lib/xreadlink.h lib/xreadlink.c Depends-on: -readlink -ssize_t -unistd +areadlink xalloc configure.ac: