mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
filesys.c: Fix readlink for ports on Darwin.
When passed a port, `readlink' relies on the Linux specific behavior of empty c_path meaning "the fd itself". That does not work on Darwin. Since there is no branch that would yield both fd and c_path, fallback to freadlink when __APPLE__ is defined. * libguile/filesys.c (do_readlink): Call freadlink for !__APPLE__. * configure.ac (AC_CHECK_FUNCS): Add freadlink. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
21e3e1c420
commit
0ceb0036c3
2 changed files with 12 additions and 3 deletions
|
@ -556,7 +556,7 @@ AC_CHECK_FUNCS([DINFINITY DQNAN cexp chsize clog clog10 ctermid \
|
||||||
fstatat futimens openat \
|
fstatat futimens openat \
|
||||||
sched_getaffinity sched_setaffinity sendfile pipe2 \
|
sched_getaffinity sched_setaffinity sendfile pipe2 \
|
||||||
posix_spawn_file_actions_addclosefrom_np \
|
posix_spawn_file_actions_addclosefrom_np \
|
||||||
clearenv])
|
clearenv freadlink])
|
||||||
|
|
||||||
# The newlib C library uses _NL_ prefixed locale langinfo constants.
|
# The newlib C library uses _NL_ prefixed locale langinfo constants.
|
||||||
AC_CHECK_DECLS([_NL_NUMERIC_GROUPING], [], [], [[#include <langinfo.h>]])
|
AC_CHECK_DECLS([_NL_NUMERIC_GROUPING], [], [], [[#include <langinfo.h>]])
|
||||||
|
|
|
@ -1192,14 +1192,23 @@ SCM_DEFINE (scm_symlinkat, "symlinkat", 3, 0, 0,
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
#endif /* HAVE_SYMLINKAT */
|
#endif /* HAVE_SYMLINKAT */
|
||||||
|
|
||||||
/* Static helper function for choosing between readlink
|
/* Static helper function for choosing between readlink, freadlink,
|
||||||
and readlinkat. */
|
and readlinkat. */
|
||||||
static int
|
static int
|
||||||
do_readlink (int fd, const char *c_path, char *buf, size_t size)
|
do_readlink (int fd, const char *c_path, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_READLINKAT
|
/* Darwin does not accept empty c_path. */
|
||||||
|
#if HAVE_READLINKAT && !__APPLE__
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
return readlinkat (fd, c_path, buf, size);
|
return readlinkat (fd, c_path, buf, size);
|
||||||
|
#elif HAVE_FREADLINK
|
||||||
|
/* There is no branch in s_scm_readlink that would lead to having both
|
||||||
|
FD and non-empty C_PATH. Therefore if FD is set, we (on Darwin
|
||||||
|
only) use freadlink and ignore C_PATH. On Linux this case is
|
||||||
|
already handled by readlinkat, but Darwin does not understand empty
|
||||||
|
C_PATH to mean "the fd itself" the way Linux does. */
|
||||||
|
if (fd != -1)
|
||||||
|
return freadlink (fd, buf, size);
|
||||||
#else
|
#else
|
||||||
(void) fd;
|
(void) fd;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue