New module 'fchmodat', split off from module 'openat'.
[gnulib.git] / m4 / openat.m4
1 # serial 39
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_FSTATAT=1
18   GNULIB_MKDIRAT=1
19
20   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
21   GNULIB_UNLINKAT=1
22
23   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
24   AC_CHECK_FUNCS_ONCE([mkdirat openat unlinkat])
25   AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
26   AC_REQUIRE([gl_FUNC_UNLINK])
27   case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink in
28   yes+yes)
29     # GNU/Hurd has unlinkat, but it has the same bug as unlink.
30     if test $REPLACE_UNLINK = 1; then
31       REPLACE_UNLINKAT=1
32     fi ;;
33   yes+*)
34     # Solaris 9 has *at functions, but uniformly mishandles trailing
35     # slash in all of them.
36     REPLACE_OPENAT=1
37     REPLACE_UNLINKAT=1
38     ;;
39   *)
40     HAVE_OPENAT=0
41     HAVE_UNLINKAT=0 # No known system with unlinkat but not openat
42     gl_PREREQ_OPENAT;;
43   esac
44   if test $ac_cv_func_mkdirat != yes; then
45     HAVE_MKDIRAT=0
46   fi
47   gl_FUNC_FSTATAT
48
49   dnl This is tested at least via getcwd.c.
50   gl_MODULE_INDICATOR([openat])
51 ])
52
53 # If we have the fstatat function, and it has the bug (in AIX 7.1)
54 # that it does not fill in st_size correctly, use the replacement function.
55 AC_DEFUN([gl_FUNC_FSTATAT],
56 [
57   AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
58   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
59   AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
60   AC_CHECK_FUNCS_ONCE([fstatat])
61
62   if test $ac_cv_func_fstatat = no; then
63     HAVE_FSTATAT=0
64   else
65     dnl Test for an AIX 7.1 bug; see
66     dnl <http://lists.gnu.org/archive/html/bug-tar/2011-09/msg00015.html>.
67     AC_CACHE_CHECK([whether fstatat (..., 0) works],
68       [gl_cv_func_fstatat_zero_flag],
69       [gl_cv_func_fstatat_zero_flag=no
70        AC_RUN_IFELSE(
71          [AC_LANG_SOURCE(
72             [[
73               #include <fcntl.h>
74               #include <sys/stat.h>
75               int
76               main (void)
77               {
78                 struct stat a;
79                 return fstatat (AT_FDCWD, ".", &a, 0) != 0;
80               }
81             ]])],
82          [gl_cv_func_fstatat_zero_flag=yes])])
83
84     case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
85     yes+yes) ;;
86     *) REPLACE_FSTATAT=1
87        if test $gl_cv_func_fstatat_zero_flag != yes; then
88          AC_DEFINE([FSTATAT_ZERO_FLAG_BROKEN], [1],
89            [Define to 1 if fstatat (..., 0) does not work,
90             as in AIX 7.1.])
91        fi
92        ;;
93     esac
94   fi
95 ])
96
97 AC_DEFUN([gl_PREREQ_OPENAT],
98 [
99   AC_REQUIRE([AC_C_INLINE])
100   AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
101   :
102 ])