New upstream version 1.8
[debian/gzip] / m4 / unlink.m4
1 # unlink.m4 serial 11
2 dnl Copyright (C) 2009-2016 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.
6
7 AC_DEFUN([gl_FUNC_UNLINK],
8 [
9   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
10   AC_REQUIRE([AC_CANONICAL_HOST])
11   AC_CHECK_HEADERS_ONCE([unistd.h])
12
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          ]],
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 glibc systems.
47          *-gnu*) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
48                  # If we don't know, assume the worst.
49          *)      gl_cv_func_unlink_honors_slashes="guessing no" ;;
50        esac
51       ])
52      rm -f conftest.file conftest.lnk])
53   case "$gl_cv_func_unlink_honors_slashes" in
54     *no)
55       REPLACE_UNLINK=1
56       ;;
57   esac
58
59   dnl Detect Mac OS X 10.5.6 bug: On read-write HFS mounts, unlink("..") or
60   dnl unlink("../..") succeeds without doing anything.
61   AC_CACHE_CHECK([whether unlink of a parent directory fails as it should],
62     [gl_cv_func_unlink_parent_fails],
63     [case "$host_os" in
64        darwin*)
65          dnl Try to unlink a subdirectory of /tmp, because /tmp is usually on a
66          dnl HFS mount on Mac OS X. Use a subdirectory, owned by the current
67          dnl user, because otherwise unlink() may fail due to permissions
68          dnl reasons, and because when running as root we don't want to risk
69          dnl destroying the entire /tmp.
70          if {
71               # Use the mktemp program if available. If not available, hide the error
72               # message.
73               tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
74               test -n "$tmp" && test -d "$tmp"
75             } ||
76             {
77               # Use a simple mkdir command. It is guaranteed to fail if the directory
78               # already exists.  $RANDOM is bash specific and expands to empty in shells
79               # other than bash, ksh and zsh.  Its use does not increase security;
80               # rather, it minimizes the probability of failure in a very cluttered /tmp
81               # directory.
82               tmp=/tmp/gt$$-$RANDOM
83               (umask 077 && mkdir "$tmp")
84             }; then
85            mkdir "$tmp/subdir"
86            GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
87            export GL_SUBDIR_FOR_UNLINK
88            AC_RUN_IFELSE(
89              [AC_LANG_SOURCE([[
90                 #include <stdlib.h>
91                 #if HAVE_UNISTD_H
92                 # include <unistd.h>
93                 #else /* on Windows with MSVC */
94                 # include <direct.h>
95                 # include <io.h>
96                 #endif
97                 int main ()
98                 {
99                   int result = 0;
100                   if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
101                     result |= 1;
102                   else if (unlink ("..") == 0)
103                     result |= 2;
104                   return result;
105                 }
106               ]])],
107              [gl_cv_func_unlink_parent_fails=yes],
108              [gl_cv_func_unlink_parent_fails=no],
109              [# If we don't know, assume the worst.
110               gl_cv_func_unlink_parent_fails="guessing no"
111              ])
112            unset GL_SUBDIR_FOR_UNLINK
113            rm -rf "$tmp"
114          else
115            gl_cv_func_unlink_parent_fails="guessing no"
116          fi
117          ;;
118        *)
119          gl_cv_func_unlink_parent_fails="guessing yes"
120          ;;
121      esac
122     ])
123   case "$gl_cv_func_unlink_parent_fails" in
124     *no)
125       REPLACE_UNLINK=1
126       AC_DEFINE([UNLINK_PARENT_BUG], [1],
127         [Define to 1 if unlink() on a parent directory may succeed])
128       ;;
129   esac
130 ])