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 \
|
||||
sched_getaffinity sched_setaffinity sendfile pipe2 \
|
||||
posix_spawn_file_actions_addclosefrom_np \
|
||||
clearenv])
|
||||
clearenv freadlink])
|
||||
|
||||
# The newlib C library uses _NL_ prefixed locale langinfo constants.
|
||||
AC_CHECK_DECLS([_NL_NUMERIC_GROUPING], [], [], [[#include <langinfo.h>]])
|
||||
|
|
|
@ -1192,14 +1192,23 @@ SCM_DEFINE (scm_symlinkat, "symlinkat", 3, 0, 0,
|
|||
#undef FUNC_NAME
|
||||
#endif /* HAVE_SYMLINKAT */
|
||||
|
||||
/* Static helper function for choosing between readlink
|
||||
/* Static helper function for choosing between readlink, freadlink,
|
||||
and readlinkat. */
|
||||
static int
|
||||
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)
|
||||
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
|
||||
(void) fd;
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue