1# fstatat.m4 serial 4
2dnl Copyright (C) 2004-2021 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7# Written by Jim Meyering.
8
9# If we have the fstatat function, and it has the bug (in AIX 7.1)
10# that it does not fill in st_size correctly, use the replacement function.
11AC_DEFUN([gl_FUNC_FSTATAT],
12[
13  AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
14  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
15  AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
16  AC_REQUIRE([AC_CANONICAL_HOST])
17  AC_CHECK_FUNCS_ONCE([fstatat])
18
19  if test $ac_cv_func_fstatat = no; then
20    HAVE_FSTATAT=0
21  else
22    dnl Test for an AIX 7.1 bug; see
23    dnl <https://lists.gnu.org/r/bug-tar/2011-09/msg00015.html>.
24    AC_CACHE_CHECK([whether fstatat (..., 0) works],
25      [gl_cv_func_fstatat_zero_flag],
26      [AC_RUN_IFELSE(
27         [AC_LANG_SOURCE(
28            [[
29              #include <fcntl.h>
30              #include <sys/stat.h>
31              int
32              main (void)
33              {
34                struct stat a;
35                return fstatat (AT_FDCWD, ".", &a, 0) != 0;
36              }
37            ]])],
38         [gl_cv_func_fstatat_zero_flag=yes],
39         [gl_cv_func_fstatat_zero_flag=no],
40         [case "$host_os" in
41            aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
42            *)    gl_cv_func_fstatat_zero_flag="guessing yes";;
43          esac
44         ])
45      ])
46
47    case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
48    *yes+*yes) ;;
49    *) REPLACE_FSTATAT=1 ;;
50    esac
51
52    case $host_os in
53      solaris*)
54        REPLACE_FSTATAT=1 ;;
55    esac
56
57    case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
58      1,*yes)
59         AC_DEFINE([HAVE_WORKING_FSTATAT_ZERO_FLAG], [1],
60           [Define to 1 if fstatat (..., 0) works.
61            For example, it does not work in AIX 7.1.])
62         ;;
63    esac
64  fi
65])
66