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	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  <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	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 \
--- 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
--- 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 <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;
 }
--- 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
--- 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: