From: Bruno Haible Date: Thu, 23 May 2024 13:15:40 +0000 (+0200) Subject: renameatu: Work around Cygwin 3.4.6 bug. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=d48e9bc3d0cfb5737c5283d5c2e744828bd48252;p=gnulib.git renameatu: Work around Cygwin 3.4.6 bug. * m4/renameat.m4 (gl_FUNC_RENAMEAT): Test whether renameat2 works, and define HAVE_WORKING_RENAMEAT2 if so. * lib/renameatu.c (renameatu): Test HAVE_WORKING_RENAMEAT2 instead of HAVE_RENAMEAT2. --- diff --git a/ChangeLog b/ChangeLog index 508d67dccb..ebbe06fe73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2024-05-23 Bruno Haible + + renameatu: Work around Cygwin 3.4.6 bug. + * m4/renameat.m4 (gl_FUNC_RENAMEAT): Test whether renameat2 works, and + define HAVE_WORKING_RENAMEAT2 if so. + * lib/renameatu.c (renameatu): Test HAVE_WORKING_RENAMEAT2 instead of + HAVE_RENAMEAT2. + 2024-05-23 Bruno Haible readlinkat, areadlinkat: Avoid test failures on Cygwin 3.4.6. diff --git a/lib/renameatu.c b/lib/renameatu.c index c9c84f27b8..6f48bc83d7 100644 --- a/lib/renameatu.c +++ b/lib/renameatu.c @@ -102,7 +102,7 @@ renameatu (int fd1, char const *src, int fd2, char const *dst, int ret_val = -1; int err = EINVAL; -#ifdef HAVE_RENAMEAT2 +#if HAVE_WORKING_RENAMEAT2 ret_val = renameat2 (fd1, src, fd2, dst, flags); err = errno; #elif defined SYS_renameat2 diff --git a/m4/renameat.m4 b/m4/renameat.m4 index 3780578663..be7848e4f9 100644 --- a/m4/renameat.m4 +++ b/m4/renameat.m4 @@ -1,7 +1,7 @@ -# serial 4 +# serial 5 # See if we need to provide renameat replacement. -dnl Copyright (C) 2009-2023 Free Software Foundation, Inc. +dnl Copyright (C) 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -13,6 +13,7 @@ AC_DEFUN([gl_FUNC_RENAMEAT], AC_REQUIRE([gl_FUNC_OPENAT]) AC_REQUIRE([gl_FUNC_RENAME]) AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_CHECK_HEADERS([linux/fs.h]) AC_CHECK_FUNCS_ONCE([renameat]) @@ -23,4 +24,39 @@ AC_DEFUN([gl_FUNC_RENAMEAT], REPLACE_RENAMEAT=1 fi gl_CHECK_FUNCS_ANDROID([renameat2], [[#include ]]) + if test $ac_cv_func_renameat2 = yes; then + AC_CACHE_CHECK([whether renameat2 works], + [gl_cv_func_renameat2_works], + [AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ + #include + #include + int main () + { + /* This test fails on Cygwin 3.4.6. */ + if (renameat2 (AT_FDCWD, "conftest.c", AT_FDCWD, "conftest.c", + RENAME_NOREPLACE) == 0) + return 1; + return 0; + } + ]])], + [gl_cv_func_renameat2_works=yes], + [gl_cv_func_renameat2_works=no], + [case "$host_os" in + # Guess yes on Linux. + linux*) gl_cv_func_renameat2_works="guessing yes" ;; + # 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 + ]) + ]) + case "$gl_cv_func_renameat2_works" in + *yes) + AC_DEFINE([HAVE_WORKING_RENAMEAT2], [1], + [Define if the renameat2 function exists and it works.]) + ;; + esac + fi ])