New module 'fchownat', split off from module 'openat'.
[gnulib.git] / m4 / openat.m4
1 # serial 38
2 # See if we need to use our replacement for Solaris' openat et al functions.
3
4 dnl Copyright (C) 2004-2011 Free Software Foundation, Inc.
5 dnl This file is free software; the Free Software Foundation
6 dnl gives unlimited permission to copy and/or distribute it,
7 dnl with or without modifications, as long as this notice is preserved.
8
9 # Written by Jim Meyering.
10
11 AC_DEFUN([gl_FUNC_OPENAT],
12 [
13   AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
14   GNULIB_OPENAT=1
15
16   AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
17   GNULIB_FCHMODAT=1
18   GNULIB_FSTATAT=1
19   GNULIB_MKDIRAT=1
20
21   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
22   GNULIB_UNLINKAT=1
23
24   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
25   AC_CHECK_FUNCS_ONCE([fchmodat lchmod mkdirat openat unlinkat])
26   AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
27   AC_REQUIRE([gl_FUNC_UNLINK])
28   case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink in
29   yes+yes)
30     # GNU/Hurd has unlinkat, but it has the same bug as unlink.
31     if test $REPLACE_UNLINK = 1; then
32       REPLACE_UNLINKAT=1
33     fi ;;
34   yes+*)
35     # Solaris 9 has *at functions, but uniformly mishandles trailing
36     # slash in all of them.
37     REPLACE_OPENAT=1
38     REPLACE_UNLINKAT=1
39     ;;
40   *)
41     HAVE_OPENAT=0
42     HAVE_UNLINKAT=0 # No known system with unlinkat but not openat
43     gl_PREREQ_OPENAT;;
44   esac
45   if test $ac_cv_func_fchmodat != yes; then
46     HAVE_FCHMODAT=0
47   fi
48   if test $ac_cv_func_mkdirat != yes; then
49     HAVE_MKDIRAT=0
50   fi
51   gl_FUNC_FSTATAT
52
53   dnl This is tested at least via getcwd.c.
54   gl_MODULE_INDICATOR([openat])
55 ])
56
57 # If we have the fstatat function, and it has the bug (in AIX 7.1)
58 # that it does not fill in st_size correctly, use the replacement function.
59 AC_DEFUN([gl_FUNC_FSTATAT],
60 [
61   AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
62   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
63   AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
64   AC_CHECK_FUNCS_ONCE([fstatat])
65
66   if test $ac_cv_func_fstatat = no; then
67     HAVE_FSTATAT=0
68   else
69     dnl Test for an AIX 7.1 bug; see
70     dnl <http://lists.gnu.org/archive/html/bug-tar/2011-09/msg00015.html>.
71     AC_CACHE_CHECK([whether fstatat (..., 0) works],
72       [gl_cv_func_fstatat_zero_flag],
73       [gl_cv_func_fstatat_zero_flag=no
74        AC_RUN_IFELSE(
75          [AC_LANG_SOURCE(
76             [[
77               #include <fcntl.h>
78               #include <sys/stat.h>
79               int
80               main (void)
81               {
82                 struct stat a;
83                 return fstatat (AT_FDCWD, ".", &a, 0) != 0;
84               }
85             ]])],
86          [gl_cv_func_fstatat_zero_flag=yes])])
87
88     case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
89     yes+yes) ;;
90     *) REPLACE_FSTATAT=1
91        if test $gl_cv_func_fstatat_zero_flag != yes; then
92          AC_DEFINE([FSTATAT_ZERO_FLAG_BROKEN], [1],
93            [Define to 1 if fstatat (..., 0) does not work,
94             as in AIX 7.1.])
95        fi
96        ;;
97     esac
98   fi
99 ])
100
101 AC_DEFUN([gl_PREREQ_OPENAT],
102 [
103   AC_REQUIRE([AC_C_INLINE])
104   AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
105   :
106 ])