3 dnl Copyright (C) 2001, 2003, 2005-2006, 2009-2024 Free Software Foundation, Inc.
4 dnl This file is free software; the Free Software Foundation
5 dnl gives unlimited permission to copy and/or distribute it,
6 dnl with or without modifications, as long as this notice is preserved.
8 dnl From Volker Borchert.
9 dnl Determine whether rename works for source file names with a trailing slash.
10 dnl The rename from SunOS 4.1.1_U1 doesn't.
12 dnl If it doesn't, arrange to compile the wrapper function and define
13 dnl macros for use by that function.
16 AC_DEFUN([gl_FUNC_RENAME],
18 AC_REQUIRE([AC_CANONICAL_HOST])
19 AC_REQUIRE([gl_STDIO_H_DEFAULTS])
20 AC_CHECK_FUNCS_ONCE([lstat])
22 dnl Solaris 11.3, AIX 7.1 mistakenly allow rename("file","name/").
23 dnl NetBSD 1.6 mistakenly forbids rename("dir","name/").
24 dnl FreeBSD 7.2 mistakenly allows rename("file","link-to-file/").
25 dnl The Solaris bug can be worked around without stripping
26 dnl trailing slash, while the NetBSD bug requires stripping;
27 dnl the two conditions can be distinguished by whether hard
28 dnl links are also broken.
29 AC_CACHE_CHECK([whether rename honors trailing slash on destination],
30 [gl_cv_func_rename_slash_dst_works],
31 [rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
32 touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
33 AC_MSG_ERROR([cannot create temporary files])
34 # Assume that if we have lstat, we can also check symlinks.
35 if test $ac_cv_func_lstat = yes; then
36 ln -s conftest.f conftest.lnk
44 if (rename ("conftest.f1", "conftest.f2/") == 0)
46 if (rename ("conftest.d1", "conftest.d2/") != 0)
49 if (rename ("conftest.f", "conftest.lnk/") == 0)
54 [gl_cv_func_rename_slash_dst_works=yes],
55 [gl_cv_func_rename_slash_dst_works=no],
56 dnl When crosscompiling, assume rename is broken.
58 # Guess yes on Linux systems
59 # and on systems that emulate the Linux system calls.
60 linux* | midipix*) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
61 # Guess yes on glibc systems.
62 *-gnu*) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
63 # Guess no on native Windows.
64 mingw* | windows*) gl_cv_func_rename_slash_dst_works="guessing no" ;;
65 # If we don't know, obey --enable-cross-guesses.
66 *) gl_cv_func_rename_slash_dst_works="$gl_cross_guess_normal" ;;
69 rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
71 case "$gl_cv_func_rename_slash_dst_works" in
75 AC_DEFINE([RENAME_TRAILING_SLASH_DEST_BUG], [1],
76 [Define if rename does not correctly handle slashes on the destination
77 argument, such as on Solaris 11 or NetBSD 1.6.])
81 dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name").
82 dnl Solaris 9 mistakenly allows rename("file/","name").
83 dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name").
84 dnl These bugs require stripping trailing slash to avoid corrupting
85 dnl symlinks with a trailing slash.
86 AC_CACHE_CHECK([whether rename honors trailing slash on source],
87 [gl_cv_func_rename_slash_src_works],
88 [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
89 touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
90 AC_MSG_ERROR([cannot create temporary files])
91 # Assume that if we have lstat, we can also check symlinks.
92 if test $ac_cv_func_lstat = yes; then
93 ln -s conftest.f conftest.lnk
101 if (rename ("conftest.f1/", "conftest.d3") == 0)
103 if (rename ("conftest.d1/", "conftest.d2") != 0)
106 if (rename ("conftest.lnk/", "conftest.f") == 0)
111 [gl_cv_func_rename_slash_src_works=yes],
112 [gl_cv_func_rename_slash_src_works=no],
113 dnl When crosscompiling, assume rename is broken.
115 # Guess yes on Linux systems
116 # and on systems that emulate the Linux system calls.
117 linux* | midipix*) gl_cv_func_rename_slash_src_works="guessing yes" ;;
118 # Guess yes on glibc systems.
119 *-gnu*) gl_cv_func_rename_slash_src_works="guessing yes" ;;
120 # Guess yes on native Windows.
121 mingw* | windows*) gl_cv_func_rename_slash_src_works="guessing yes" ;;
122 # If we don't know, obey --enable-cross-guesses.
123 *) gl_cv_func_rename_slash_src_works="$gl_cross_guess_normal" ;;
126 rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
128 case "$gl_cv_func_rename_slash_src_works" in
132 AC_DEFINE([RENAME_TRAILING_SLASH_SOURCE_BUG], [1],
133 [Define if rename does not correctly handle slashes on the source
134 argument, such as on Solaris 9 or cygwin 1.5.])
138 dnl NetBSD 1.6 and cygwin 1.5.x mistakenly reduce hard link count
139 dnl on rename("h1","h2").
140 dnl This bug requires stat'ting targets prior to attempting rename.
141 AC_CHECK_FUNCS_ONCE([link])
142 AC_CACHE_CHECK([whether rename manages hard links correctly],
143 [gl_cv_func_rename_link_works],
144 [if test $ac_cv_func_link = yes; then
145 if test $cross_compiling != yes; then
146 rm -rf conftest.f conftest.f1 conftest.f2
147 if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
148 set x `ls -i conftest.f conftest.f1` && test "$2" = "$4"; then
157 if (rename ("conftest.f", "conftest.f1"))
159 if (unlink ("conftest.f1"))
162 /* Allow either the POSIX-required behavior, where the
163 previous rename kept conftest.f, or the (better) NetBSD
164 behavior, where it removed conftest.f. */
165 if (rename ("conftest.f", "conftest.f") != 0
169 if (rename ("conftest.f1", "conftest.f1") == 0)
171 if (rename ("conftest.f2", "conftest.f2") != 0)
175 [gl_cv_func_rename_link_works=yes],
176 [gl_cv_func_rename_link_works=no],
177 [dnl We don't get here.
181 gl_cv_func_rename_link_works="guessing no"
183 rm -rf conftest.f conftest.f1 conftest.f2
185 dnl When crosscompiling, assume rename is broken.
187 # Guess yes on Linux systems
188 # and on systems that emulate the Linux system calls.
189 linux* | midipix*) gl_cv_func_rename_link_works="guessing yes" ;;
190 # Guess yes on glibc systems.
191 *-gnu*) gl_cv_func_rename_link_works="guessing yes" ;;
192 # Guess yes on native Windows.
193 mingw* | windows*) gl_cv_func_rename_link_works="guessing yes" ;;
194 # If we don't know, obey --enable-cross-guesses.
195 *) gl_cv_func_rename_link_works="$gl_cross_guess_normal" ;;
199 gl_cv_func_rename_link_works=yes
202 case "$gl_cv_func_rename_link_works" in
206 AC_DEFINE([RENAME_HARD_LINK_BUG], [1],
207 [Define if rename fails to leave hard links alone, as on NetBSD 1.6
212 dnl Cygwin 1.5.x mistakenly allows rename("dir","file").
213 dnl mingw mistakenly forbids rename("dir1","dir2").
214 dnl These bugs require stripping trailing slash to avoid corrupting
215 dnl symlinks with a trailing slash.
216 AC_CACHE_CHECK([whether rename manages existing destinations correctly],
217 [gl_cv_func_rename_dest_works],
218 [rm -rf conftest.f conftest.d1 conftest.d2
219 touch conftest.f && mkdir conftest.d1 conftest.d2 ||
220 AC_MSG_ERROR([cannot create temporary files])
227 if (rename ("conftest.d1", "conftest.d2") != 0)
229 if (rename ("conftest.d2", "conftest.f") == 0)
233 [gl_cv_func_rename_dest_works=yes],
234 [gl_cv_func_rename_dest_works=no],
235 dnl When crosscompiling, assume rename is broken.
237 # Guess yes on Linux systems
238 # and on systems that emulate the Linux system calls.
239 linux* | midipix*) gl_cv_func_rename_dest_works="guessing yes" ;;
240 # Guess yes on glibc systems.
241 *-gnu*) gl_cv_func_rename_dest_works="guessing yes" ;;
242 # Guess no on native Windows.
243 mingw* | windows*) gl_cv_func_rename_dest_works="guessing no" ;;
244 # If we don't know, obey --enable-cross-guesses.
245 *) gl_cv_func_rename_dest_works="$gl_cross_guess_normal" ;;
248 rm -rf conftest.f conftest.d1 conftest.d2
250 case "$gl_cv_func_rename_dest_works" in
254 AC_DEFINE([RENAME_DEST_EXISTS_BUG], [1],
255 [Define if rename does not work when the destination file exists,
256 as on Cygwin 1.5 or Windows.])