doc: Update for Solaris 11.4.
[gnulib.git] / m4 / rename.m4
blobfcf230eb0bb41f2c8631ca7f74fe803630bfe6e5
1 # serial 31
3 # Copyright (C) 2001, 2003, 2005-2006, 2009-2018 Free Software Foundation, Inc.
4 # This file is free software; the Free Software Foundation
5 # gives unlimited permission to copy and/or distribute it,
6 # 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.
11 dnl
12 dnl If it doesn't, then define RENAME_TRAILING_SLASH_BUG and arrange
13 dnl to compile the wrapper function.
14 dnl
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
37     fi
38     AC_RUN_IFELSE(
39       [AC_LANG_PROGRAM([[
40 #        include <stdio.h>
41 #        include <stdlib.h>
42          ]],
43          [[int result = 0;
44            if (rename ("conftest.f1", "conftest.f2/") == 0)
45              result |= 1;
46            if (rename ("conftest.d1", "conftest.d2/") != 0)
47              result |= 2;
48 #if HAVE_LSTAT
49            if (rename ("conftest.f", "conftest.lnk/") == 0)
50              result |= 4;
51 #endif
52            return result;
53          ]])],
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.
57       [case "$host_os" in
58                           # Guess yes on Linux systems.
59          linux-* | linux) gl_cv_func_rename_slash_dst_works="guessing yes" ;;
60                           # Guess yes on glibc systems.
61          *-gnu*)          gl_cv_func_rename_slash_dst_works="guessing yes" ;;
62                           # Guess no on native Windows.
63          mingw*)          gl_cv_func_rename_slash_dst_works="guessing no" ;;
64                           # If we don't know, assume the worst.
65          *)               gl_cv_func_rename_slash_dst_works="guessing no" ;;
66        esac
67       ])
68     rm -rf conftest.f conftest.f1 conftest.f2 conftest.d1 conftest.d2 conftest.lnk
69   ])
70   case "$gl_cv_func_rename_slash_dst_works" in
71     *yes) ;;
72     *)
73       REPLACE_RENAME=1
74       AC_DEFINE([RENAME_TRAILING_SLASH_DEST_BUG], [1],
75         [Define if rename does not correctly handle slashes on the destination
76          argument, such as on Solaris 11 or NetBSD 1.6.])
77       ;;
78   esac
80   dnl SunOS 4.1.1_U1 mistakenly forbids rename("dir/","name").
81   dnl Solaris 9 mistakenly allows rename("file/","name").
82   dnl FreeBSD 7.2 mistakenly allows rename("link-to-file/","name").
83   dnl These bugs require stripping trailing slash to avoid corrupting
84   dnl symlinks with a trailing slash.
85   AC_CACHE_CHECK([whether rename honors trailing slash on source],
86     [gl_cv_func_rename_slash_src_works],
87     [rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
88     touch conftest.f && touch conftest.f1 && mkdir conftest.d1 ||
89       AC_MSG_ERROR([cannot create temporary files])
90     # Assume that if we have lstat, we can also check symlinks.
91     if test $ac_cv_func_lstat = yes; then
92       ln -s conftest.f conftest.lnk
93     fi
94     AC_RUN_IFELSE(
95       [AC_LANG_PROGRAM([[
96 #        include <stdio.h>
97 #        include <stdlib.h>
98          ]],
99          [[int result = 0;
100            if (rename ("conftest.f1/", "conftest.d3") == 0)
101              result |= 1;
102            if (rename ("conftest.d1/", "conftest.d2") != 0)
103              result |= 2;
104 #if HAVE_LSTAT
105            if (rename ("conftest.lnk/", "conftest.f") == 0)
106              result |= 4;
107 #endif
108            return result;
109          ]])],
110       [gl_cv_func_rename_slash_src_works=yes],
111       [gl_cv_func_rename_slash_src_works=no],
112       dnl When crosscompiling, assume rename is broken.
113       [case "$host_os" in
114                           # Guess yes on Linux systems.
115          linux-* | linux) gl_cv_func_rename_slash_src_works="guessing yes" ;;
116                           # Guess yes on glibc systems.
117          *-gnu*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
118                           # Guess yes on native Windows.
119          mingw*)          gl_cv_func_rename_slash_src_works="guessing yes" ;;
120                           # If we don't know, assume the worst.
121          *)               gl_cv_func_rename_slash_src_works="guessing no" ;;
122        esac
123       ])
124     rm -rf conftest.f conftest.f1 conftest.d1 conftest.d2 conftest.d3 conftest.lnk
125   ])
126   case "$gl_cv_func_rename_slash_src_works" in
127     *yes) ;;
128     *)
129       REPLACE_RENAME=1
130       AC_DEFINE([RENAME_TRAILING_SLASH_SOURCE_BUG], [1],
131         [Define if rename does not correctly handle slashes on the source
132          argument, such as on Solaris 9 or cygwin 1.5.])
133       ;;
134   esac
136   dnl NetBSD 1.6 and cygwin 1.5.x mistakenly reduce hard link count
137   dnl on rename("h1","h2").
138   dnl This bug requires stat'ting targets prior to attempting rename.
139   AC_CHECK_FUNCS_ONCE([link])
140   AC_CACHE_CHECK([whether rename manages hard links correctly],
141     [gl_cv_func_rename_link_works],
142     [if test $ac_cv_func_link = yes; then
143        rm -rf conftest.f conftest.f1 conftest.f2
144        if touch conftest.f conftest.f2 && ln conftest.f conftest.f1 &&
145            set x `ls -i conftest.f conftest.f1` && test "$2" = "$4"; then
146          AC_RUN_IFELSE(
147            [AC_LANG_PROGRAM([[
148 #             include <errno.h>
149 #             include <stdio.h>
150 #             include <stdlib.h>
151 #             include <unistd.h>
152               ]],
153               [[int result = 0;
154                 if (rename ("conftest.f", "conftest.f1"))
155                   result |= 1;
156                 if (unlink ("conftest.f1"))
157                   result |= 2;
159                 /* Allow either the POSIX-required behavior, where the
160                    previous rename kept conftest.f, or the (better) NetBSD
161                    behavior, where it removed conftest.f.  */
162                 if (rename ("conftest.f", "conftest.f") != 0
163                     && errno != ENOENT)
164                   result |= 4;
166                 if (rename ("conftest.f1", "conftest.f1") == 0)
167                   result |= 8;
168                 if (rename ("conftest.f2", "conftest.f2") != 0)
169                   result |= 16;
170                 return result;
171               ]])],
172            [gl_cv_func_rename_link_works=yes],
173            [gl_cv_func_rename_link_works=no],
174            dnl When crosscompiling, assume rename is broken.
175            [case "$host_os" in
176                                # Guess yes on Linux systems.
177               linux-* | linux) gl_cv_func_rename_link_works="guessing yes" ;;
178                                # Guess yes on glibc systems.
179               *-gnu*)          gl_cv_func_rename_link_works="guessing yes" ;;
180                                # Guess yes on native Windows.
181               mingw*)          gl_cv_func_rename_link_works="guessing yes" ;;
182                                # If we don't know, assume the worst.
183               *)               gl_cv_func_rename_link_works="guessing no" ;;
184             esac
185            ])
186        else
187          gl_cv_func_rename_link_works="guessing no"
188        fi
189        rm -rf conftest.f conftest.f1 conftest.f2
190      else
191        gl_cv_func_rename_link_works=yes
192      fi
193     ])
194   case "$gl_cv_func_rename_link_works" in
195     *yes) ;;
196     *)
197       REPLACE_RENAME=1
198       AC_DEFINE([RENAME_HARD_LINK_BUG], [1],
199         [Define if rename fails to leave hard links alone, as on NetBSD 1.6
200          or Cygwin 1.5.])
201       ;;
202   esac
204   dnl Cygwin 1.5.x mistakenly allows rename("dir","file").
205   dnl mingw mistakenly forbids rename("dir1","dir2").
206   dnl These bugs require stripping trailing slash to avoid corrupting
207   dnl symlinks with a trailing slash.
208   AC_CACHE_CHECK([whether rename manages existing destinations correctly],
209     [gl_cv_func_rename_dest_works],
210     [rm -rf conftest.f conftest.d1 conftest.d2
211     touch conftest.f && mkdir conftest.d1 conftest.d2 ||
212       AC_MSG_ERROR([cannot create temporary files])
213     AC_RUN_IFELSE(
214       [AC_LANG_PROGRAM([[
215 #        include <stdio.h>
216 #        include <stdlib.h>
217          ]],
218          [[int result = 0;
219            if (rename ("conftest.d1", "conftest.d2") != 0)
220              result |= 1;
221            if (rename ("conftest.d2", "conftest.f") == 0)
222              result |= 2;
223            return result;
224          ]])],
225       [gl_cv_func_rename_dest_works=yes],
226       [gl_cv_func_rename_dest_works=no],
227       dnl When crosscompiling, assume rename is broken.
228       [case "$host_os" in
229                           # Guess yes on Linux systems.
230          linux-* | linux) gl_cv_func_rename_dest_works="guessing yes" ;;
231                           # Guess yes on glibc systems.
232          *-gnu*)          gl_cv_func_rename_dest_works="guessing yes" ;;
233                           # Guess no on native Windows.
234          mingw*)          gl_cv_func_rename_dest_works="guessing no" ;;
235                           # If we don't know, assume the worst.
236          *)               gl_cv_func_rename_dest_works="guessing no" ;;
237        esac
238       ])
239     rm -rf conftest.f conftest.d1 conftest.d2
240   ])
241   case "$gl_cv_func_rename_dest_works" in
242     *yes) ;;
243     *)
244       REPLACE_RENAME=1
245       AC_DEFINE([RENAME_DEST_EXISTS_BUG], [1],
246         [Define if rename does not work when the destination file exists,
247          as on Cygwin 1.5 or Windows.])
248       ;;
249   esac