# HG changeset patch # User Bruno Haible # Date 1191118662 -7200 # Node ID 6d715fbc981c4c2ebd5d86bfa505e0a191c02ae3 # Parent aeb8e2d99afa634408e45d07a2d4a2ce8f456bd2 Change xreadlink module to use areadlink. diff -r aeb8e2d99afa -r 6d715fbc981c ChangeLog --- a/ChangeLog Sun Sep 30 01:23:51 2007 +0200 +++ b/ChangeLog Sun Sep 30 04:17:42 2007 +0200 @@ -1,3 +1,10 @@ +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. diff -r aeb8e2d99afa -r 6d715fbc981c build-aux/install-reloc --- a/build-aux/install-reloc Sun Sep 30 01:23:51 2007 +0200 +++ b/build-aux/install-reloc Sun Sep 30 04:17:42 2007 +0200 @@ -133,6 +133,7 @@ "$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 @@ progname.o \ progreloc.o \ xreadlink.o \ + areadlink.o \ canonicalize-lgpl.o \ malloca.o \ relocatable.o \ diff -r aeb8e2d99afa -r 6d715fbc981c lib/relocwrapper.c --- a/lib/relocwrapper.c Sun Sep 30 01:23:51 2007 +0200 +++ b/lib/relocwrapper.c Sun Sep 30 04:17:42 2007 +0200 @@ -21,7 +21,8 @@ -> progname -> progreloc -> xreadlink - -> readlink + -> areadlink + -> readlink -> canonicalize-lgpl -> malloca -> relocatable diff -r aeb8e2d99afa -r 6d715fbc981c lib/xreadlink.c --- a/lib/xreadlink.c Sun Sep 30 01:23:51 2007 +0200 +++ b/lib/xreadlink.c Sun Sep 30 04:17:42 2007 +0200 @@ -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 -r aeb8e2d99afa -r 6d715fbc981c modules/relocatable-prog-wrapper --- a/modules/relocatable-prog-wrapper Sun Sep 30 01:23:51 2007 +0200 +++ b/modules/relocatable-prog-wrapper Sun Sep 30 04:17:42 2007 +0200 @@ -10,6 +10,8 @@ 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 -r aeb8e2d99afa -r 6d715fbc981c modules/xreadlink --- a/modules/xreadlink Sun Sep 30 01:23:51 2007 +0200 +++ b/modules/xreadlink Sun Sep 30 04:17:42 2007 +0200 @@ -6,9 +6,7 @@ lib/xreadlink.c Depends-on: -readlink -ssize_t -unistd +areadlink xalloc configure.ac: