Mercurial > hg > octave-nkf > gnulib-hg
changeset 9238:6d715fbc981c
Change xreadlink module to use areadlink.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 30 Sep 2007 04:17:42 +0200 |
parents | aeb8e2d99afa |
children | efc89a591244 |
files | ChangeLog build-aux/install-reloc lib/relocwrapper.c lib/xreadlink.c modules/relocatable-prog-wrapper modules/xreadlink |
diffstat | 6 files changed, 21 insertions(+), 96 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-09-29 Bruno Haible <bruno@clisp.org> + + * 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 <bruno@clisp.org> * gnulib-tool (func_emit_initmacro_done): Indentation.
--- a/build-aux/install-reloc +++ b/build-aux/install-reloc @@ -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 \
--- a/lib/relocwrapper.c +++ b/lib/relocwrapper.c @@ -21,7 +21,8 @@ -> progname -> progreloc -> xreadlink - -> readlink + -> areadlink + -> readlink -> canonicalize-lgpl -> malloca -> relocatable
--- a/lib/xreadlink.c +++ b/lib/xreadlink.c @@ -25,107 +25,22 @@ /* Specification. */ #include "xreadlink.h" -#include <stdio.h> -#include <string.h> #include <errno.h> -#include <limits.h> -#include <sys/types.h> -#include <stdlib.h> -#include <unistd.h> -#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; }