Mercurial > gnulib
changeset 30224:24f91ed1cb43
Override open more carefully.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sun, 28 Sep 2008 16:19:57 +0200 |
parents | d4c4e46404f1 |
children | 35bef5339516 |
files | ChangeLog lib/fcntl.in.h lib/open.c m4/open.m4 |
diffstat | 4 files changed, 42 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sun Sep 28 16:17:51 2008 +0200 +++ b/ChangeLog Sun Sep 28 16:19:57 2008 +0200 @@ -1,5 +1,12 @@ 2008-09-28 Bruno Haible <bruno@clisp.org> + Override open more carefully. + * lib/open.c (orig_open): New function. + (rpl_open): Use orig_open instead of open. + * lib/fcntl.in.h: Add special invocation convention. + * m4/open.m4 (gl_PREREQ_OPEN): New macro. + (gl_FUNC_OPEN): Invoke it. + Override freopen more carefully. * lib/freopen.c (orig_freopen): New function. (rpl_freopen): Use orig_freopen instead of freopen.
--- a/lib/fcntl.in.h Sun Sep 28 16:17:51 2008 +0200 +++ b/lib/fcntl.in.h Sun Sep 28 16:19:57 2008 +0200 @@ -17,9 +17,20 @@ /* written by Paul Eggert */ -#ifndef _GL_FCNTL_H +@PRAGMA_SYSTEM_HEADER@ + +#if defined __need_system_fcntl_h +/* Special invocation convention. */ -@PRAGMA_SYSTEM_HEADER@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _GL_FCNTL_H #include <sys/types.h> #include <sys/stat.h> @@ -121,3 +132,4 @@ #endif /* _GL_FCNTL_H */ #endif /* _GL_FCNTL_H */ +#endif
--- a/lib/open.c Sun Sep 28 16:17:51 2008 +0200 +++ b/lib/open.c Sun Sep 28 16:19:57 2008 +0200 @@ -18,6 +18,18 @@ #include <config.h> +/* Get the original definition of open. It might be defined as a macro. */ +#define __need_system_fcntl_h +#include <fcntl.h> +#undef __need_system_fcntl_h +#include <sys/types.h> + +static inline int +orig_open (const char *filename, int flags, mode_t mode) +{ + return open (filename, flags, mode); +} + /* Specification. */ #include <fcntl.h> @@ -32,7 +44,6 @@ int open (const char *filename, int flags, ...) -# undef open { mode_t mode; int fd; @@ -91,7 +102,7 @@ } # endif - fd = open (filename, flags, mode); + fd = orig_open (filename, flags, mode); # if OPEN_TRAILING_SLASH_BUG /* If the filename ends in a slash and fd does not refer to a directory,
--- a/m4/open.m4 Sun Sep 28 16:17:51 2008 +0200 +++ b/m4/open.m4 Sun Sep 28 16:19:57 2008 +0200 @@ -1,4 +1,4 @@ -# open.m4 serial 2 +# open.m4 serial 3 dnl Copyright (C) 2007-2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -45,8 +45,15 @@ [Define to 1 if open() fails to recognize a trailing slash.]) REPLACE_OPEN=1 AC_LIBOBJ([open]) + gl_PREREQ_OPEN ;; esac ;; esac ]) + +# Prerequisites of lib/open.c. +AC_DEFUN([gl_PREREQ_OPEN], +[ + AC_REQUIRE([AC_C_INLINE]) +])