Collin Funk wrote: > The renameatu and rename tests fail on GNU/Hurd since renameat2 on that > platform does not properly handle trailing slashes. I've reported that > bug with a test case [1]. > > Applied the attached patch which adds a configure check and documents > the bug.
Thanks. Let me tweak the configure test: - It is confusing that the test has an open file descriptor to the file being renamed. - It is useful for the test to return a bit mask, instead of having two 'return 1;' cases. Namely, if the test fails on some new platform, we would like to document the bug on that platform. If each possible bug corresponds to a distinct exit code, we can determine the bug by looking into config.log — no need to run a modified test program manually. 2025-01-19 Bruno Haible <br...@clisp.org> renameatu: Simplify configure test. * m4/renameat.m4 (gl_FUNC_RENAMEAT): Prepare the test scenario outside of the test program. Use a bit mask as the test program's exit code. diff --git a/m4/renameat.m4 b/m4/renameat.m4 index 238412d728..129e7fe067 100644 --- a/m4/renameat.m4 +++ b/m4/renameat.m4 @@ -1,5 +1,5 @@ # renameat.m4 -# serial 5 +# serial 6 dnl Copyright (C) 2009-2025 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -29,27 +29,25 @@ AC_DEFUN([gl_FUNC_RENAMEAT] if test $ac_cv_func_renameat2 = yes; then AC_CACHE_CHECK([whether renameat2 works], [gl_cv_func_renameat2_works], - [AC_RUN_IFELSE( + [rm -rf conftest.a conftest.b + touch conftest.a + AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include <unistd.h> #include <fcntl.h> #include <stdio.h> int main () { - int fd; + int result = 0; /* 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; + result |= 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; + if (renameat2 (AT_FDCWD, "conftest.a", AT_FDCWD, "conftest.b/", 0) + == 0) + result |= 2; + return result; } ]])], [gl_cv_func_renameat2_works=yes], @@ -58,14 +56,14 @@ AC_DEFUN([gl_FUNC_RENAMEAT] # 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" ;; + 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 + rm -rf conftest.a conftest.b ]) case "$gl_cv_func_renameat2_works" in *yes)