From 17f0ec612b2c1e946d6ade17c8a944b578702d6a Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 1 Sep 2011 12:53:10 -0700 Subject: [PATCH] openat: work around AIX 7.1 fstatat issue This should fix the problem that was not properly fixed in the previous change, dated 2011-08-30. * lib/fstatat.c: Include twice, the first with __need_system_stat_h defined. (orig_fstatat) [HAVE_FSTATAT]: New function. (rpl_fstatat): Go back to the old way of doing things, except call orig_fstatat instead of fstatat. * m4/openat.m4 (gl_FUNC_FSTATAT): Remove unnecessary check for openat. Remove unnecessary check whether fstatat fills in st_size etc. (cherry picked from commit de1fa2ac9aeb9f70a042ee3faa2b7712e65a278b) --- ChangeLog | 13 +++++++++++++ lib/fstatat.c | 29 ++++++++++++++++++++--------- m4/openat.m4 | 51 ++++----------------------------------------------- 3 files changed, 37 insertions(+), 56 deletions(-) diff --git a/ChangeLog b/ChangeLog index cfab565de..0a2351e81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2011-09-01 Paul Eggert + + openat: work around AIX 7.1 fstatat issue + This should fix the problem that was not properly fixed + in the previous change, dated 2011-08-30. + * lib/fstatat.c: Include twice, the first with + __need_system_stat_h defined. + (orig_fstatat) [HAVE_FSTATAT]: New function. + (rpl_fstatat): Go back to the old way of doing things, + except call orig_fstatat instead of fstatat. + * m4/openat.m4 (gl_FUNC_FSTATAT): Remove unnecessary check for openat. + Remove unnecessary check whether fstatat fills in st_size etc. + 2011-09-01 Bruno Haible sys_select: Avoid a syntax error regarding timespec_t on IRIX 6.5. diff --git a/lib/fstatat.c b/lib/fstatat.c index b217126be..d592d60fc 100644 --- a/lib/fstatat.c +++ b/lib/fstatat.c @@ -17,15 +17,31 @@ /* Written by Paul Eggert and Jim Meyering. */ +/* If the user's config.h happens to include , let it include only + the system's here, so that orig_fstatat doesn't recurse to + rpl_fstatat. */ +#define __need_system_sys_stat_h #include +/* Get the original definition of fstatat. It might be defined as a macro. */ +#include +#undef __need_system_sys_stat_h + +#if HAVE_FSTATAT +static inline int +orig_fstatat (int fd, char const *filename, struct stat *buf, int flags) +{ + return fstatat (fd, filename, buf, flags); +} +#endif + #include #include #include #include -#if HAVE_FSTATAT && ! FSTATAT_ST_SIZE_ETC_BROKEN +#if HAVE_FSTATAT # undef fstatat @@ -38,7 +54,7 @@ int rpl_fstatat (int fd, char const *file, struct stat *st, int flag) { - int result = fstatat (fd, file, st, flag); + int result = orig_fstatat (fd, file, st, flag); size_t len; if (result != 0) @@ -65,12 +81,7 @@ rpl_fstatat (int fd, char const *file, struct stat *st, int flag) return result; } -#else /* ! (HAVE_FSTATAT && ! FSTATAT_ST_SIZE_ETC_BROKEN) */ - -# if HAVE_FSTATAT -# undef fstatat -# define fstatat rpl_fstatat -# endif +#else /* !HAVE_FSTATAT */ /* On mingw, the gnulib defines `stat' as a function-like macro; but using it in AT_FUNC_F2 causes compilation failure @@ -112,4 +123,4 @@ stat_func (char const *name, struct stat *st) # undef AT_FUNC_POST_FILE_PARAM_DECLS # undef AT_FUNC_POST_FILE_ARGS -#endif /* ! (HAVE_FSTATAT && ! FSTATAT_ST_SIZE_ETC_BROKEN) */ +#endif /* !HAVE_FSTATAT */ diff --git a/m4/openat.m4 b/m4/openat.m4 index aa6838dcf..5683650d0 100644 --- a/m4/openat.m4 +++ b/m4/openat.m4 @@ -1,4 +1,4 @@ -# serial 34 +# serial 35 # See if we need to use our replacement for Solaris' openat et al functions. dnl Copyright (C) 2004-2011 Free Software Foundation, Inc. @@ -160,55 +160,12 @@ AC_DEFUN([gl_FUNC_FSTATAT], AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK]) - AC_CHECK_FUNCS_ONCE([fstatat openat]) + AC_CHECK_FUNCS_ONCE([fstatat]) if test $ac_cv_func_fstatat = no; then HAVE_FSTATAT=0 - else - AC_CACHE_CHECK([whether fstatat fills in st_size etc.], - [gl_cv_func_fstatat_st_size_etc], - [gl_cv_func_fstatat_st_size_etc=no - echo xxx >conftest.file - AC_RUN_IFELSE( - [AC_LANG_SOURCE( - [[ - #include - #include - - int - main (void) - { - struct stat a; - struct stat b; - if (fstatat (AT_FDCWD, "conftest.file", &a, - AT_SYMLINK_NOFOLLOW) - != 0) - return 1; - if (lstat ("conftest.file", &b) != 0) - return 2; - if (a.st_size != b.st_size) return 3; - if (a.st_dev != b.st_dev) return 4; - if (a.st_ino != b.st_ino) return 5; - if (a.st_mode != b.st_mode) return 6; - if (a.st_nlink != b.st_nlink) return 7; - if (a.st_uid != b.st_uid) return 8; - if (a.st_gid != b.st_gid) return 9; - /* Don't check time members, to avoid caching issues. */ - return 0; - } - ]])], - [gl_cv_func_fstatat_st_size_etc=yes])]) - - case $gl_cv_func_fstatat_st_size_etc+$gl_cv_func_lstat_dereferences_slashed_symlink in - yes+yes) ;; - *) REPLACE_FSTATAT=1 - if test $gl_cv_func_fstatat_st_size_etc != yes; then - AC_DEFINE([FSTATAT_ST_SIZE_ETC_BROKEN], [1], - [Define to 1 if fstatat does not fill in st_size etc., - as in AIX 7.1.]) - fi - ;; - esac + elif test $gl_cv_func_lstat_dereferences_slashed_symlink != yes; then + REPLACE_FSTATAT=1 fi ]) -- 2.11.0