Home | History | Annotate | Line # | Download | only in m4
      1 # fstatat.m4 serial 4
      2 dnl Copyright (C) 2004-2022 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 # 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.
     11 AC_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