+2011-09-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ openat: port to AIX 7.1 with large files
+ AIX 7.1 does a "#define openat open64at" if large files are in use,
+ so we can't simply #undef openat. Use the orig_openat trick (similar
+ to orig_open in lib/open.c) to work around the problem. Problem
+ reported by Kevin Brott for GNU tar, in the thread containing
+ <http://lists.gnu.org/archive/html/bug-tar/2011-09/msg00032.html>.
+ * lib/openat.c (__need_system_fcntl_h): Define first.
+ Include <fcntl.h> and <sys/types.h> before undefining.
+ (orig_openat) [HAVE_OPENAT]: New inline function.
+ (openat) [HAVE_OPENAT]: Do not undef.
+ (rpl_openat): Use orig_openat, not openat.
+
2011-09-05 Joachim Schmitz <schmitz@hp.com> (tiny change)
Bruno Haible <bruno@clisp.org>
/* written by Jim Meyering */
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+ the system's <fcntl.h> here, so that orig_openat doesn't recurse to
+ rpl_openat. */
+#define __need_system_fcntl_h
#include <config.h>
+/* Get the original definition of open. It might be defined as a macro. */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+#if HAVE_OPENAT
+static inline int
+orig_openat (int fd, char const *filename, int flags, mode_t mode)
+{
+ return openat (fd, filename, flags, mode);
+}
+#endif
+
#include "openat.h"
#include <stdarg.h>
#if HAVE_OPENAT
-# undef openat
-
/* Like openat, but work around Solaris 9 bugs with trailing slash. */
int
rpl_openat (int dfd, char const *filename, int flags, ...)
}
# endif
- fd = openat (dfd, filename, flags, mode);
+ fd = orig_openat (dfd, filename, flags, mode);
# if OPEN_TRAILING_SLASH_BUG
/* If the filename ends in a slash and fd does not refer to a directory,