]> Savannah Git Hosting - gnulib.git/commitdiff
renameatu: Work around a GNU/Hurd bug.
authorCollin Funk <collin.funk1@gmail.com>
Sun, 19 Jan 2025 05:06:49 +0000 (21:06 -0800)
committerCollin Funk <collin.funk1@gmail.com>
Sun, 19 Jan 2025 05:06:49 +0000 (21:06 -0800)
* m4/renameat.m4 (gl_FUNC_RENAMEAT): Check if renameat2 handles trailing
slashes.
* doc/glibc-functions/renameat2.texi: Mention the GNU/Hurd bug.

ChangeLog
doc/glibc-functions/renameat2.texi
m4/renameat.m4

index 2057a6da9a5231c7038ad91822b8bef4ebcd2486..283f98849d51e48079434e5646e119ac3b67de08 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2025-01-18  Collin Funk  <collin.funk1@gmail.com>
 
+       renameatu: Work around a GNU/Hurd bug.
+       * m4/renameat.m4 (gl_FUNC_RENAMEAT): Check if renameat2 handles trailing
+       slashes.
+       * doc/glibc-functions/renameat2.texi: Mention the GNU/Hurd bug.
+
        linkat tests: Revert the last change.
        * tests/test-linkat.c (main): Disallow EINVAL an alternative error
        value.
index d3f8c4e8a347e7a888c8554e954267738a76dd6d..5f281ee0a38592f3d1ed7c2a8a6c9847c7927027 100644 (file)
@@ -19,6 +19,12 @@ glibc 2.27, macOS 14, FreeBSD 14.0, NetBSD 10.0, OpenBSD 7.5, Minix 3.1.8, AIX 7
 This function succeeds when the @code{RENAME_NOREPLACE} flag is specified
 and the source and destination are the same file, on some platforms:
 Cygwin 3.4.6.
+@item
+@code{renameat2 (AT_FDCWD, "file", AT_FDCWD, "new/" ...)} succeeds
+instead of failing and setting @code{errno} to @code{ENOTDIR}, on some
+platforms:
+@c https://sourceware.org/bugzilla/show_bug.cgi?id=32570
+GNU/Hurd.
 @end itemize
 
 @mindex renameatu
index f967ae15932ea9c9736250fd12467e58dcf0009a..238412d7287464a67c3a6c9e122ae0213557c2d5 100644 (file)
@@ -31,14 +31,24 @@ AC_DEFUN([gl_FUNC_RENAMEAT],
       [gl_cv_func_renameat2_works],
       [AC_RUN_IFELSE(
          [AC_LANG_SOURCE([[
+            #include <unistd.h>
             #include <fcntl.h>
             #include <stdio.h>
             int main ()
             {
+              int fd;
               /* This test fails on Cygwin 3.4.6.  */
               if (renameat2 (AT_FDCWD, "conftest.c", AT_FDCWD, "conftest.c",
                              RENAME_NOREPLACE) == 0)
                 return 1;
+              fd = open ("conftest.a", O_CREAT | O_EXCL | O_WRONLY, 0600);
+              if (fd < 0)
+                return 1;
+              /* This test fails on GNU/Hurd.  */
+              if (renameat2 (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.b/", 0) == 0)
+                return 1;
+              if (close (fd) < 0)
+                return 1;
               return 0;
             }
          ]])],
@@ -47,12 +57,15 @@ AC_DEFUN([gl_FUNC_RENAMEAT],
          [case "$host_os" in
                      # Guess yes on Linux.
             linux*)  gl_cv_func_renameat2_works="guessing yes" ;;
+                     # Guess no on GNU/Hurd.
+            gnu*) gl_cv_func_renameat2_works="guessing no" ;;
                      # Guess no on Cygwin.
             cygwin*) gl_cv_func_renameat2_works="guessing no" ;;
                      # If we don't know, obey --enable-cross-guesses.
             *)       gl_cv_func_renameat2_works="$gl_cross_guess_normal" ;;
           esac
          ])
+        rm -rf conftest.a conftest.b
       ])
     case "$gl_cv_func_renameat2_works" in
       *yes)