immutable: Add tests.
[gnulib.git] / m4 / unlink.m4
blob74e16682e8c59a8e921094199805b50b4070ba29
1 # unlink.m4 serial 15
2 dnl Copyright (C) 2009-2021 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
7 AC_DEFUN([gl_FUNC_UNLINK],
9   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
10   AC_REQUIRE([AC_CANONICAL_HOST])
11   AC_CHECK_HEADERS_ONCE([unistd.h])
13   dnl Detect FreeBSD 7.2, AIX 7.1, Solaris 9 bug.
14   AC_CACHE_CHECK([whether unlink honors trailing slashes],
15     [gl_cv_func_unlink_honors_slashes],
16     [touch conftest.file
17      # Assume that if we have lstat, we can also check symlinks.
18      if test $ac_cv_func_lstat = yes; then
19        ln -s conftest.file conftest.lnk
20      fi
21      AC_RUN_IFELSE(
22        [AC_LANG_PROGRAM(
23          [[#if HAVE_UNISTD_H
24            # include <unistd.h>
25            #else /* on Windows with MSVC */
26            # include <io.h>
27            #endif
28            #include <errno.h>
29          ]GL_MDA_DEFINES],
30          [[int result = 0;
31            if (!unlink ("conftest.file/"))
32              result |= 1;
33            else if (errno != ENOTDIR)
34              result |= 2;
35 #if HAVE_LSTAT
36            if (!unlink ("conftest.lnk/"))
37              result |= 4;
38            else if (errno != ENOTDIR)
39              result |= 8;
40 #endif
41            return result;
42          ]])],
43       [gl_cv_func_unlink_honors_slashes=yes],
44       [gl_cv_func_unlink_honors_slashes=no],
45       [case "$host_os" in
46                           # Guess yes on Linux systems.
47          linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
48                           # Guess yes on glibc systems.
49          *-gnu*)          gl_cv_func_unlink_honors_slashes="guessing yes" ;;
50                           # Guess no on native Windows.
51          mingw*)          gl_cv_func_unlink_honors_slashes="guessing no" ;;
52                           # If we don't know, obey --enable-cross-guesses.
53          *)               gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
54        esac
55       ])
56      rm -f conftest.file conftest.lnk])
57   case "$gl_cv_func_unlink_honors_slashes" in
58     *no)
59       REPLACE_UNLINK=1
60       ;;
61   esac
63   dnl Detect Mac OS X 10.5.6 bug: On read-write HFS mounts, unlink("..") or
64   dnl unlink("../..") succeeds without doing anything.
65   AC_CACHE_CHECK([whether unlink of a parent directory fails as it should],
66     [gl_cv_func_unlink_parent_fails],
67     [case "$host_os" in
68        darwin*)
69          dnl Try to unlink a subdirectory of /tmp, because /tmp is usually on a
70          dnl HFS mount on Mac OS X. Use a subdirectory, owned by the current
71          dnl user, because otherwise unlink() may fail due to permissions
72          dnl reasons, and because when running as root we don't want to risk
73          dnl destroying the entire /tmp.
74          if {
75               # Use the mktemp program if available. If not available, hide the error
76               # message.
77               tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
78               test -n "$tmp" && test -d "$tmp"
79             } ||
80             {
81               # Use a simple mkdir command. It is guaranteed to fail if the directory
82               # already exists.  $RANDOM is bash specific and expands to empty in shells
83               # other than bash, ksh and zsh.  Its use does not increase security;
84               # rather, it minimizes the probability of failure in a very cluttered /tmp
85               # directory.
86               tmp=/tmp/gt$$-$RANDOM
87               (umask 077 && mkdir "$tmp")
88             }; then
89            mkdir "$tmp/subdir"
90            GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
91            export GL_SUBDIR_FOR_UNLINK
92            AC_RUN_IFELSE(
93              [AC_LANG_SOURCE([[
94                 #include <stdlib.h>
95                 #if HAVE_UNISTD_H
96                 # include <unistd.h>
97                 #else /* on Windows with MSVC */
98                 # include <direct.h>
99                 # include <io.h>
100                 #endif
101                 ]GL_MDA_DEFINES[
102                 int main ()
103                 {
104                   int result = 0;
105                   if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
106                     result |= 1;
107                   else if (unlink ("..") == 0)
108                     result |= 2;
109                   return result;
110                 }
111               ]])],
112              [gl_cv_func_unlink_parent_fails=yes],
113              [gl_cv_func_unlink_parent_fails=no],
114              [# If we don't know, obey --enable-cross-guesses.
115               gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"
116              ])
117            unset GL_SUBDIR_FOR_UNLINK
118            rm -rf "$tmp"
119          else
120            gl_cv_func_unlink_parent_fails="guessing no"
121          fi
122          ;;
123        *)
124          gl_cv_func_unlink_parent_fails="guessing yes"
125          ;;
126      esac
127     ])
128   case "$gl_cv_func_unlink_parent_fails" in
129     *no)
130       REPLACE_UNLINK=1
131       AC_DEFINE([UNLINK_PARENT_BUG], [1],
132         [Define to 1 if unlink() on a parent directory may succeed])
133       ;;
134   esac