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