# serial 33

# Copyright (C) 2001, 2003, 2005-2006, 2009-2021 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

dnl From Volker Borchert.
dnl Determine whether rename works for source file names with a trailing slash.
dnl The rename from SunOS 4.1.1_U1 doesn't.
dnl
dnl If it doesn't, then define RENAME_TRAILING_SLASH_BUG and arrange
dnl to compile the wrapper function.
dnl

AC_DEFUN([gl_FUNC_RENAME],
[
  AC_REQUIRE([AC_CANONICAL_HOST])
  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
  AC_CHECK_FUNCS_ONCE([lstat])

  dnl Solaris 11.3, AIX 7.1 mistakenly allow rename("file","name/").
  dnl NetBSD 1.6 mistakenly forbids rename("dir","name/").
  dnl FreeBSD 7.2 mistakenly allows rename("file","link-to-file/").
  dnl The Solaris bug can be worked around without stripping
  dnl trailing slash, while the NetBSD bug requires stripping;
  dnl the two conditions can be distinguished by whether hard
  dnl links are also broken.
  AC_CACHE_CHECK([whether rename honors trailing slash on destination],
    [gl_cv_func_rename_slash_dst_works],
    [rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
      AC_MSG_ERROR([cannot create temporary files])
    # Assume that if we have lstat, we can also check symlinks.
    if test $ac_cv_func_lstat = yes; then
      ln -s conftest.f conftest.lnk
    fi
    AC_RUN_IFELSE(
      [AC_LANG_PROGRAM([[
#        include <stdio.h>
#        include <stdlib.h>
         ]],
         [[int result = 0;
           if (rename ("conftest.f1", "conftest.f2/") == 0)
             result |= 1;
           if (rename ("conftest.d1", "conftest.d2/") != 0)
             result |= 2;
#if HAVE_LSTAT
           if (rename ("conftest.f", "conftest.lnk/") == 0)
             result |= 4;
#endif
           return result;
         ]])],
      [gl_cv_func_rename_slash_dst_works=yes],
      [gl_cv_func_rename_slash_dst_works=no],
      dnl When crosscompiling, assume rename is broken.
      [case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_slash_dst_works="guessing yes" ;;
                          # Guess no on native Windows.
         mingw*)          gl_cv_func_rename_slash_dst_works="guessing no" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;;
       esac
      ])
    rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
  ])
  case "$gl_cv_func_rename_slash_dst_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1
      AC_DEFINE([RENAME_TRAILING_SLASH_DEST_BUG], [1],
        [Define if rename does not correctly handle slashes on the destination
         argument, such as on Solaris 11 or NetBSD 1.6.])
      ;;
  esac

  dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name").
  dnl Solaris 9 mistakenly allows rename("file/","name").
  dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name").
  dnl These bugs require stripping trailing slash to avoid corrupting
  dnl symlinks with a trailing slash.
  AC_CACHE_CHECK([whether rename honors trailing slash on source],
    [gl_cv_func_rename_slash_src_works],
    [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
    touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
      AC_MSG_ERROR([cannot create temporary files])
    # Assume that if we have lstat, we can also check symlinks.
    if test $ac_cv_func_lstat = yes; then
      ln -s conftest.f conftest.lnk
    fi
    AC_RUN_IFELSE(
      [AC_LANG_PROGRAM([[
#        include <stdio.h>
#        include <stdlib.h>
         ]],
         [[int result = 0;
           if (rename ("conftest.f1/", "conftest.d3") == 0)
             result |= 1;
           if (rename ("conftest.d1/", "conftest.d2") != 0)
             result |= 2;
#if HAVE_LSTAT
           if (rename ("conftest.lnk/", "conftest.f") == 0)
             result |= 4;
#endif
           return result;
         ]])],
      [gl_cv_func_rename_slash_src_works=yes],
      [gl_cv_func_rename_slash_src_works=no],
      dnl When crosscompiling, assume rename is broken.
      [case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # Guess yes on native Windows.
         mingw*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;;
       esac
      ])
    rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
  ])
  case "$gl_cv_func_rename_slash_src_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1
      AC_DEFINE([RENAME_TRAILING_SLASH_SOURCE_BUG], [1],
        [Define if rename does not correctly handle slashes on the source
         argument, such as on Solaris 9 or cygwin 1.5.])
      ;;
  esac

  dnl NetBSD 1.6 and cygwin 1.5.x mistakenly reduce hard link count
  dnl on rename("h1","h2").
  dnl This bug requires stat'ting targets prior to attempting rename.
  AC_CHECK_FUNCS_ONCE([link])
  AC_CACHE_CHECK([whether rename manages hard links correctly],
    [gl_cv_func_rename_link_works],
    [if test $ac_cv_func_link = yes; then
       if test $cross_compiling != yes; then
         rm -rf conftest.f conftest.f1 conftest.f2
         if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
             set x `ls -i conftest.f conftest.f1` && test "$2" = "$4"; then
           AC_RUN_IFELSE(
             [AC_LANG_PROGRAM([[
#               include <errno.h>
#               include <stdio.h>
#               include <stdlib.h>
#               include <unistd.h>
                ]GL_MDA_DEFINES],
                [[int result = 0;
                  if (rename ("conftest.f", "conftest.f1"))
                    result |= 1;
                  if (unlink ("conftest.f1"))
                    result |= 2;

                  /* Allow either the POSIX-required behavior, where the
                     previous rename kept conftest.f, or the (better) NetBSD
                     behavior, where it removed conftest.f.  */
                  if (rename ("conftest.f", "conftest.f") != 0
                      && errno != ENOENT)
                    result |= 4;

                  if (rename ("conftest.f1", "conftest.f1") == 0)
                    result |= 8;
                  if (rename ("conftest.f2", "conftest.f2") != 0)
                    result |= 16;
                  return result;
                ]])],
             [gl_cv_func_rename_link_works=yes],
             [gl_cv_func_rename_link_works=no],
             [dnl We don't get here.
              :
             ])
         else
           gl_cv_func_rename_link_works="guessing no"
         fi
         rm -rf conftest.f conftest.f1 conftest.f2
       else
         dnl When crosscompiling, assume rename is broken.
         case "$host_os" in
                            # Guess yes on Linux systems.
           linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;;
                            # Guess yes on glibc systems.
           *-gnu*)          gl_cv_func_rename_link_works="guessing yes" ;;
                            # Guess yes on native Windows.
           mingw*)          gl_cv_func_rename_link_works="guessing yes" ;;
                            # If we don't know, obey --enable-cross-guesses.
           *)               gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;;
         esac
       fi
     else
       gl_cv_func_rename_link_works=yes
     fi
    ])
  case "$gl_cv_func_rename_link_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1
      AC_DEFINE([RENAME_HARD_LINK_BUG], [1],
        [Define if rename fails to leave hard links alone, as on NetBSD 1.6
         or Cygwin 1.5.])
      ;;
  esac

  dnl Cygwin 1.5.x mistakenly allows rename("dir","file").
  dnl mingw mistakenly forbids rename("dir1","dir2").
  dnl These bugs require stripping trailing slash to avoid corrupting
  dnl symlinks with a trailing slash.
  AC_CACHE_CHECK([whether rename manages existing destinations correctly],
    [gl_cv_func_rename_dest_works],
    [rm -rf conftest.f conftest.d1 conftest.d2
    touch conftest.f && mkdir conftest.d1 conftest.d2 ||
      AC_MSG_ERROR([cannot create temporary files])
    AC_RUN_IFELSE(
      [AC_LANG_PROGRAM([[
#        include <stdio.h>
#        include <stdlib.h>
         ]],
         [[int result = 0;
           if (rename ("conftest.d1", "conftest.d2") != 0)
             result |= 1;
           if (rename ("conftest.d2", "conftest.f") == 0)
             result |= 2;
           return result;
         ]])],
      [gl_cv_func_rename_dest_works=yes],
      [gl_cv_func_rename_dest_works=no],
      dnl When crosscompiling, assume rename is broken.
      [case "$host_os" in
                          # Guess yes on Linux systems.
         linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;;
                          # Guess yes on glibc systems.
         *-gnu*)          gl_cv_func_rename_dest_works="guessing yes" ;;
                          # Guess no on native Windows.
         mingw*)          gl_cv_func_rename_dest_works="guessing no" ;;
                          # If we don't know, obey --enable-cross-guesses.
         *)               gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;;
       esac
      ])
    rm -rf conftest.f conftest.d1 conftest.d2
  ])
  case "$gl_cv_func_rename_dest_works" in
    *yes) ;;
    *)
      REPLACE_RENAME=1
      AC_DEFINE([RENAME_DEST_EXISTS_BUG], [1],
        [Define if rename does not work when the destination file exists,
         as on Cygwin 1.5 or Windows.])
      ;;
  esac
])
