[Top][All Lists]
[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: