guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 07/13: filesys.c: Fix readlink for ports on Darwin.


From: Ludovic Courtès
Subject: [Guile-commits] 07/13: filesys.c: Fix readlink for ports on Darwin.
Date: Sun, 20 Oct 2024 15:23:22 -0400 (EDT)

civodul pushed a commit to branch main
in repository guile.

commit 0ceb0036c3a2efdd8d5b0da0c68d15b67fe24689
Author: Tomas Volf <~@wolfsden.cz>
AuthorDate: Sat Aug 10 00:54:30 2024 +0200

    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>
---
 configure.ac       |  2 +-
 libguile/filesys.c | 13 +++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index ce3ae0226..af9176b46 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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>]])
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 8657fedc3..6896e00ea 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -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



reply via email to

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