summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim@lrde.epita.fr>2012-06-18 11:41:32 +0200
committerAkim Demaille <akim@lrde.epita.fr>2012-06-18 13:35:59 +0200
commit131873dbae7479bc43b6cfd62aef9d53e539f967 (patch)
treed714e6d88c816d982a0f0f5c019d00e4b6e4d068
parent2005fbf739536a0f60bf970c24c1ecf3c9cc8a43 (diff)
downloadgnulib-akim/relpath.tar.gz
gnulib-akim/relpath.tar.bz2
relpath: do not depend on xalloc.h.akim/relpath
Suggested by Bruno Haible. * lib/relpath.c (convert_abs_rel): Embrace malloc failures. Simplify some conditionals. * lib/relpath.h: Adjust the documentation. * modules/relpath (Depends-on): Remove xalloc.
-rw-r--r--lib/relpath.c45
-rw-r--r--lib/relpath.h7
-rw-r--r--modules/relpath1
3 files changed, 36 insertions, 17 deletions
diff --git a/lib/relpath.c b/lib/relpath.c
index 18691782d3..36a17e07c9 100644
--- a/lib/relpath.c
+++ b/lib/relpath.c
@@ -31,7 +31,6 @@
#include "dirname.h"
#include "error.h"
#include "relpath.h"
-#include "xalloc.h"
#include "pathmax.h"
#ifndef PATH_MAX
@@ -98,8 +97,7 @@ buffer_or_output (const char* str, char **pbuf, size_t *plen)
return false;
}
-/* Output the relative representation if possible.
- If BUF is non NULL, write to that buffer rather than to stdout. */
+
bool
relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len)
{
@@ -138,8 +136,8 @@ relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len)
}
else
{
- buf_err |= buffer_or_output (*fname_suffix ? fname_suffix : ".",
- &buf, &len);
+ buf_err |= buffer_or_output (*fname_suffix ? fname_suffix : ".",
+ &buf, &len);
}
if (buf_err)
@@ -154,11 +152,27 @@ relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len)
char *
convert_abs_rel (const char *from, const char *target)
{
- char *realtarget = canonicalize_filename_mode (target, CAN_MISSING);
- char *realfrom = canonicalize_filename_mode (from, CAN_MISSING);
+ char *realtarget = NULL;
+ char *realfrom = NULL;
+ char *relative_from = NULL;
+ char *res = NULL;
+
+ realtarget = canonicalize_filename_mode (target, CAN_MISSING);
+ if (!realtarget)
+ goto end;
+ realfrom = canonicalize_filename_mode (from, CAN_MISSING);
+ if (!realfrom)
+ goto end;
/* Write to a PATH_MAX buffer. */
- char *relative_from = xmalloc (PATH_MAX);
+ relative_from = malloc (PATH_MAX);
+ if (!relative_from)
+ {
+ /* It's easier to set errno to ENOMEM than to rely on the
+ 'malloc-posix' gnulib module. */
+ errno = ENOMEM;
+ goto end;
+ }
/* Get dirname to generate paths relative to. */
realtarget[dir_len (realtarget)] = '\0';
@@ -168,9 +182,14 @@ convert_abs_rel (const char *from, const char *target)
free (relative_from);
relative_from = NULL;
}
-
- free (realtarget);
- free (realfrom);
-
- return relative_from ? relative_from : xstrdup (from);
+ res = relative_from ? relative_from : xstrdup (from);
+
+ end:
+ {
+ int saved_errno = errno;
+ free (realtarget);
+ free (realfrom);
+ errno = saved_errno;
+ }
+ return res;
}
diff --git a/lib/relpath.h b/lib/relpath.h
index ad499769c3..17b07de943 100644
--- a/lib/relpath.h
+++ b/lib/relpath.h
@@ -20,13 +20,14 @@
# define _RELPATH_H
/* Output the relative representation if possible.
- If BUF is non NULL, write to that buffer rather than to stdout. */
+ If BUF is non NULL, write to that buffer rather than to stdout.
+ Return true iff success. */
bool
relpath (const char *can_fname, const char *can_reldir, char *buf, size_t len);
-/* Return FROM represented as relative to the dir of TARGET.
- The result is malloced. */
+/* Return FROM represented as relative to the dir of TARGET. The
+ result is malloced, or NULL upon error (described by errno). */
char *
convert_abs_rel (const char *from, const char *target);
diff --git a/modules/relpath b/modules/relpath
index a250296b78..814d169c8e 100644
--- a/modules/relpath
+++ b/modules/relpath
@@ -11,7 +11,6 @@ dirname
error
pathmax
stdbool
-xalloc
configure.ac:

Return to:

Send suggestions and report system problems to the System administrator.