Mercurial > hg > octave-nkf > gnulib-hg
changeset 15574:6f5e8052a3a9
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.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Mon, 05 Sep 2011 17:40:58 -0700 |
parents | 132ec6dff66c |
children | 3e19c8849877 |
files | ChangeLog lib/openat.c |
diffstat | 2 files changed, 32 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +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>
--- a/lib/openat.c +++ b/lib/openat.c @@ -16,8 +16,25 @@ /* 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> @@ -31,8 +48,6 @@ #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, ...) @@ -86,7 +101,7 @@ } # 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,