bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: new module 'areadlink'


From: Bruno Haible
Subject: Re: new module 'areadlink'
Date: Wed, 19 Sep 2007 00:10:49 +0200
User-agent: KMail/1.5.4

There were no comments, so I committed this:

> 2007-09-15  Bruno Haible  <address@hidden>
> 
>       * modules/areadlink: New file.
>       * lib/areadlink.h (areadlink): New declaration.
>       * lib/areadlink.c: New file, based on lib/xreadlink.c.

Next comes a change that will rebase xreadlink on top of areadlink:


2007-09-18  Bruno Haible  <address@hidden>

        * 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].

*** build-aux/install-reloc     9 Jun 2007 11:27:29 -0000       1.5
--- build-aux/install-reloc     18 Sep 2007 22:06:10 -0000
***************
*** 133,138 ****
--- 133,139 ----
               "$srcdir"/progname.c \
               "$srcdir"/progreloc.c \
               "$srcdir"/xreadlink.c \
+              "$srcdir"/areadlink.c \
               "$srcdir"/readlink.c \
               "$srcdir"/canonicalize-lgpl.c \
               "$srcdir"/malloca.c \
***************
*** 148,153 ****
--- 149,155 ----
        progname.o \
        progreloc.o \
        xreadlink.o \
+       areadlink.o \
        canonicalize-lgpl.o \
        malloca.o \
        relocatable.o \
*** lib/relocwrapper.c  9 Jun 2007 11:15:23 -0000       1.4
--- lib/relocwrapper.c  18 Sep 2007 22:06:10 -0000
***************
*** 21,27 ****
      -> progname
      -> progreloc
          -> xreadlink
!            -> readlink
          -> canonicalize-lgpl
             -> malloca
      -> relocatable
--- 21,28 ----
      -> progname
      -> progreloc
          -> xreadlink
!            -> areadlink
!               -> readlink
          -> canonicalize-lgpl
             -> malloca
      -> relocatable
*** lib/xreadlink.c     3 Mar 2007 19:20:41 -0000       1.26
--- lib/xreadlink.c     18 Sep 2007 22:06:10 -0000
***************
*** 25,131 ****
  /* 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
  
  /* 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 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
!     }
  }
--- 25,46 ----
  /* Specification.  */
  #include "xreadlink.h"
  
  #include <errno.h>
  
! #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 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)
  {
!   char *result = areadlink (filename);
!   if (result == NULL && errno == ENOMEM)
!     xalloc_die ();
!   return result;
  }
*** modules/relocatable-prog-wrapper    14 Jun 2007 14:35:52 -0000      1.6
--- modules/relocatable-prog-wrapper    18 Sep 2007 22:06:11 -0000
***************
*** 10,15 ****
--- 10,17 ----
  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
*** modules/xreadlink   3 Mar 2007 19:20:41 -0000       1.15
--- modules/xreadlink   18 Sep 2007 22:06:11 -0000
***************
*** 6,14 ****
  lib/xreadlink.c
  
  Depends-on:
! readlink
! ssize_t
! unistd
  xalloc
  
  configure.ac:
--- 6,12 ----
  lib/xreadlink.c
  
  Depends-on:
! areadlink
  xalloc
  
  configure.ac:





reply via email to

[Prev in Thread] Current Thread [Next in Thread]