105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Like <fcntl.h>, but with non-working flags defined to 0.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2006-2012 Free Software Foundation, Inc.
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* written by Paul Eggert */
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#pragma GCC system_header
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __need_system_fcntl_h
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Special invocation convention.  */
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Needed before <sys/stat.h>.
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   May also define off_t to a 64-bit type on native Windows.  */
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <sys/types.h>
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <fcntl.h>.  On glibc systems, we would like to avoid namespace pollution.
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   extern "C" { ... } block, which leads to errors in C++ mode with the
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   overridden <sys/stat.h> from gnulib.  These errors are known to be gone
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   with g++ version >= 4.3.  */
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <sys/stat.h>
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include_next <fcntl.h>
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Normal invocation convention.  */
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_FCNTL_H
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Needed before <sys/stat.h>.
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   May also define off_t to a 64-bit type on native Windows.  */
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <sys/types.h>
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   <fcntl.h>.  On glibc systems, we would like to avoid namespace pollution.
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   extern "C" { ... } block, which leads to errors in C++ mode with the
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   overridden <sys/stat.h> from gnulib.  These errors are known to be gone
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   with g++ version >= 4.3.  */
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <sys/stat.h>
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The include_next requires a split double-inclusion guard.  */
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include_next <fcntl.h>
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_FCNTL_H
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FCNTL_H
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems.  */
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <unistd.h>
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Native Windows platforms declare open(), creat() in <io.h>.  */
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if (1 || defined GNULIB_POSIXCHECK) \
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <io.h>
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_CXXDEFS_H
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_CXXDEFS_H
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The three most frequent use cases of these macros are:
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * For providing a substitute for a function that is missing on some
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     platforms, but is declared and works fine on the platforms on which
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     it exists:
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #if @GNULIB_FOO@
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # if !@HAVE_FOO@
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_FUNCDECL_SYS (foo, ...);
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # endif
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIAS_SYS (foo, ...);
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIASWARN (foo);
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #elif defined GNULIB_POSIXCHECK
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ...
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #endif
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * For providing a replacement for a function that exists on all platforms,
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     but is broken/insufficient and needs to be replaced on some platforms:
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #if @GNULIB_FOO@
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # if @REPLACE_FOO@
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #   undef foo
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #   define foo rpl_foo
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  endif
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_FUNCDECL_RPL (foo, ...);
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIAS_RPL (foo, ...);
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # else
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIAS_SYS (foo, ...);
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # endif
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIASWARN (foo);
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #elif defined GNULIB_POSIXCHECK
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ...
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #endif
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * For providing a replacement for a function that exists on some platforms
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang     but is broken/insufficient and needs to be replaced on some of them and
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     is additionally either missing or undeclared on some other platforms:
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #if @GNULIB_FOO@
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # if @REPLACE_FOO@
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #   undef foo
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #   define foo rpl_foo
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  endif
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_FUNCDECL_RPL (foo, ...);
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIAS_RPL (foo, ...);
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # else
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_FUNCDECL_SYS (foo, ...);
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #  endif
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIAS_SYS (foo, ...);
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       # endif
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       _GL_CXXALIASWARN (foo);
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #elif defined GNULIB_POSIXCHECK
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       ...
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #endif
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang*/
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_EXTERN_C declaration;
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   performs the declaration with C linkage.  */
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_EXTERN_C extern "C"
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_EXTERN_C extern
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declares a replacement function, named rpl_func, with the given prototype,
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   consisting of return type, parameters, and attributes.
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Example:
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declares the system function, named func, with the given prototype,
16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   consisting of return type, parameters, and attributes.
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Example:
16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                  _GL_ARG_NONNULL ((1)));
16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _GL_EXTERN_C rettype func parameters_and_attributes
16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_RPL (func, rettype, parameters);
17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declares a C++ alias called GNULIB_NAMESPACE::func
17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Example:
17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
17505436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
17605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    namespace GNULIB_NAMESPACE                                \
18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                                         \
18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      rettype (*const func) parameters = ::rpl_func;          \
18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }                                                         \
18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   except that the C function rpl_func may have a slightly different
19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declaration.  A cast is used to silence the "invalid conversion" error
19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that would otherwise occur.  */
19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    namespace GNULIB_NAMESPACE                                     \
19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                                              \
19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      rettype (*const func) parameters =                           \
20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        reinterpret_cast<rettype(*)parameters>(::rpl_func);        \
20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }                                                              \
20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
20705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS (func, rettype, parameters);
20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declares a C++ alias called GNULIB_NAMESPACE::func
21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that redirects to the system provided function func, if GNULIB_NAMESPACE
21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is defined.
21205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Example:
21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
21405436638acc7c010349a69c3395f1a57c642dc62Ying Wang */
21505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* If we were to write
21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       rettype (*const func) parameters = ::func;
21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     better (remove an indirection through a 'static' pointer variable),
22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     but then the _GL_CXXALIASWARN macro below would cause a warning not only
22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     for uses of ::func but also for uses of GNULIB_NAMESPACE::func.  */
22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    namespace GNULIB_NAMESPACE                     \
22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                              \
22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      static rettype (*func) parameters = ::func;  \
22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }                                              \
22705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
22805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
23305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
23405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   except that the C function func may have a slightly different declaration.
23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   A cast is used to silence the "invalid conversion" error that would
23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   otherwise occur.  */
23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
23905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
24005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    namespace GNULIB_NAMESPACE                          \
24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                                   \
24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang      static rettype (*func) parameters =               \
24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        reinterpret_cast<rettype(*)parameters>(::func); \
24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }                                                   \
24505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
24605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
25105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
25205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   except that the C function is picked among a set of overloaded functions,
25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   namely the one with rettype2 and parameters2.  Two consecutive casts
25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   are used to silence the "cannot find a match" and "invalid conversion"
25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   errors that would otherwise occur.  */
25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
25805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* The outer cast must be a reinterpret_cast.
25905436638acc7c010349a69c3395f1a57c642dc62Ying Wang     The inner cast: When the function is defined as a set of overloaded
26005436638acc7c010349a69c3395f1a57c642dc62Ying Wang     functions, it works as a static_cast<>, choosing the designated variant.
26105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     When the function is defined as a single variant, it works as a
26205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
26305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
26405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    namespace GNULIB_NAMESPACE                                                \
26505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {                                                                         \
26605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      static rettype (*func) parameters =                                     \
26705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        reinterpret_cast<rettype(*)parameters>(                               \
26805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          (rettype2(*)parameters2)(::func));                                  \
26905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }                                                                         \
27005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
27105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
27205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
27305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
27405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
27505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
27605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIASWARN (func);
27705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   causes a warning to be emitted when ::func is used but not when
27805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
27905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   variants.  */
28005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
28105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN(func) \
28205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
28305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN_1(func,namespace) \
28405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   _GL_CXXALIASWARN_2 (func, namespace)
28505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
28605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   we enable the warning only when not optimizing.  */
28705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !__OPTIMIZE__
28805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN_2(func,namespace) \
28905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_WARN_ON_USE (func, \
29005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     "The symbol ::" #func " refers to the system function. " \
29105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     "Use " #namespace "::" #func " instead.")
29205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
29305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN_2(func,namespace) \
29405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     extern __typeof__ (func) func
29505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
29605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN_2(func,namespace) \
29705436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_EXTERN_C int _gl_cxxalias_dummy
29805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
29905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
30005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN(func) \
30105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
30205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
30305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
30405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
30505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   causes a warning to be emitted when the given overloaded variant of ::func
30605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is used but not when GNULIB_NAMESPACE::func is used.  */
30705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __cplusplus && defined GNULIB_NAMESPACE
30805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
30905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
31005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                        GNULIB_NAMESPACE)
31105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
31205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
31305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
31405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   we enable the warning only when not optimizing.  */
31505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !__OPTIMIZE__
31605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
31705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
31805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         "The symbol ::" #func " refers to the system function. " \
31905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                         "Use " #namespace "::" #func " instead.")
32005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
32105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
32205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     extern __typeof__ (func) func
32305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
32405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
32505436638acc7c010349a69c3395f1a57c642dc62Ying Wang     _GL_EXTERN_C int _gl_cxxalias_dummy
32605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
32705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
32805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
32905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    _GL_EXTERN_C int _gl_cxxalias_dummy
33005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
33105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _GL_CXXDEFS_H */
33305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
33405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_ARG_NONNULL is copied here.  */
33505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
33605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   that the values passed as arguments n, ..., m must be non-NULL pointers.
33705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
33805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_ARG_NONNULL
33905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
34005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
34105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
34205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_ARG_NONNULL(params)
34305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
34405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
34505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
34605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* The definition of _GL_WARN_ON_USE is copied here.  */
34705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_WARN_ON_USE
34805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
34905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
35005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
35105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE(function, message) \
35205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern __typeof__ (function) function __attribute__ ((__warning__ (message)))
35305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
35405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Verify the existence of the function.  */
35505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE(function, message) \
35605436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern __typeof__ (function) function
35705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else /* Unsupported.  */
35805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE(function, message) \
35905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_EXTERN_C int _gl_warn_on_use
36005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
36105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
36205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
36305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
36405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is like _GL_WARN_ON_USE (function, "string"), except that the function is
36505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   declared with the given prototype, consisting of return type, parameters,
36605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   and attributes.
36705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
36805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   not work in this case.  */
36905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_WARN_ON_USE_CXX
37005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
37105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
37205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern rettype function parameters_and_attributes \
37305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     __attribute__ ((__warning__ (msg)))
37405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
37505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Verify the existence of the function.  */
37605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
37705436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern rettype function parameters_and_attributes
37805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else /* Unsupported.  */
37905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
38005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_EXTERN_C int _gl_warn_on_use
38105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
38205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
38305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* _GL_WARN_EXTERN_C declaration;
38505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   performs the declaration with C linkage.  */
38605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef _GL_WARN_EXTERN_C
38705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if defined __cplusplus
38805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_EXTERN_C extern "C"
38905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
39005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define _GL_WARN_EXTERN_C extern
39105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
39205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
39305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Declare overridden functions.  */
39605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
39705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 1
39805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if 0
39905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
40005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef fcntl
40105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define fcntl rpl_fcntl
40205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
40305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
40405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
40505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
40605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !1
40705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
40805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
40905436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
41005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
41105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (fcntl);
41205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
41305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef fcntl
41405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_FCNTL
41505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
41605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module fcntl for portability");
41705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
41805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
41905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
42005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 1
42105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if 1
42205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
42305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef open
42405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define open rpl_open
42505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
42605436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
42705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             _GL_ARG_NONNULL ((1)));
42805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
42905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
43005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
43105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
43205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
43305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   default argument.  _GL_CXXALIASWARN does not work in this case.  */
43405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if !defined __hpux
43505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (open);
43605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
43705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
43805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef open
43905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Assume open is always declared.  */
44005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
44105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module open for portability");
44205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
44305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
44405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 0
44505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if 0
44605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
44705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   undef openat
44805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#   define openat rpl_openat
44905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
45005436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_RPL (openat, int,
45105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (int fd, char const *file, int flags, /* mode_t mode */ ...)
45205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((2)));
45305436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_RPL (openat, int,
45405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (int fd, char const *file, int flags, /* mode_t mode */ ...));
45505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
45605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  if !1
45705436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_FUNCDECL_SYS (openat, int,
45805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (int fd, char const *file, int flags, /* mode_t mode */ ...)
45905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  _GL_ARG_NONNULL ((2)));
46005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  endif
46105436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIAS_SYS (openat, int,
46205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  (int fd, char const *file, int flags, /* mode_t mode */ ...));
46305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
46405436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_CXXALIASWARN (openat);
46505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#elif defined GNULIB_POSIXCHECK
46605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef openat
46705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if HAVE_RAW_DECL_OPENAT
46805436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_WARN_ON_USE (openat, "openat is not portable - "
46905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 "use gnulib module openat for portability");
47005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
47105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
47205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Fix up the FD_* macros, only known to be missing on mingw.  */
47505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
47605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef FD_CLOEXEC
47705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define FD_CLOEXEC 1
47805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
47905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Fix up the supported F_* macros.  Intentionally leave other F_*
48105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   macros undefined.  Only known to be missing on mingw.  */
48205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
48305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef F_DUPFD_CLOEXEC
48405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define F_DUPFD_CLOEXEC 0x40000000
48505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise.  */
48605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define GNULIB_defined_F_DUPFD_CLOEXEC 1
48705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
48805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define GNULIB_defined_F_DUPFD_CLOEXEC 0
48905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
49005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef F_DUPFD
49205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define F_DUPFD 1
49305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
49405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef F_GETFD
49605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define F_GETFD 2
49705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
49805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
49905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Fix up the O_* macros.  */
50005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
50105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !defined O_DIRECT && defined O_DIRECTIO
50205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Tru64 spells it 'O_DIRECTIO'.  */
50305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_DIRECT O_DIRECTIO
50405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
50505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
50605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !defined O_CLOEXEC && defined O_NOINHERIT
50705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Mingw spells it 'O_NOINHERIT'.  */
50805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_CLOEXEC O_NOINHERIT
50905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
51005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_CLOEXEC
51205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_CLOEXEC 0
51305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
51405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_DIRECT
51605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_DIRECT 0
51705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
51805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
51905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_DIRECTORY
52005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_DIRECTORY 0
52105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
52205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_DSYNC
52405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_DSYNC 0
52505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
52605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
52705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_EXEC
52805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_EXEC O_RDONLY /* This is often close enough in older systems.  */
52905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
53005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_IGNORE_CTTY
53205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_IGNORE_CTTY 0
53305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
53405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NDELAY
53605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NDELAY 0
53705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
53805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
53905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOATIME
54005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOATIME 0
54105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
54205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
54305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NONBLOCK
54405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NONBLOCK O_NDELAY
54505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
54605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
54705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
54805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   value of O_NONBLOCK.  Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
54905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   or to 0 as fallback.  */
55005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 0
55105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# if O_NONBLOCK
55205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define GNULIB_defined_O_NONBLOCK 0
55305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# else
55405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define GNULIB_defined_O_NONBLOCK 1
55505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  undef O_NONBLOCK
55605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#  define O_NONBLOCK 0x40000000
55705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# endif
55805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
55905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOCTTY
56105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOCTTY 0
56205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
56305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOFOLLOW
56505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOFOLLOW 0
56605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
56705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
56805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOLINK
56905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOLINK 0
57005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
57105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOLINKS
57305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOLINKS 0
57405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
57505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
57605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_NOTRANS
57705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_NOTRANS 0
57805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
57905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
58005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_RSYNC
58105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_RSYNC 0
58205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
58305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
58405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_SEARCH
58505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_SEARCH O_RDONLY /* This is often close enough in older systems.  */
58605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
58705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
58805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_SYNC
58905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_SYNC 0
59005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
59105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_TTY_INIT
59305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_TTY_INIT 0
59405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
59505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
59605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
59705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef O_ACCMODE
59805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
59905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
60005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* For systems that distinguish between text and binary I/O.
60205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   O_BINARY is usually declared in fcntl.h  */
60305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if !defined O_BINARY && defined _O_BINARY
60405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* For MSC-compatible compilers.  */
60505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_BINARY _O_BINARY
60605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_TEXT _O_TEXT
60705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
60805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
60905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if defined __BEOS__ || defined __HAIKU__
61005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect.  */
61105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef O_BINARY
61205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef O_TEXT
61305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
61405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
61505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef O_BINARY
61605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_BINARY 0
61705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define O_TEXT 0
61805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
61905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
62005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Fix up the AT_* macros.  */
62105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
62205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive.  Its
62305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   value exceeds INT_MAX, so its use as an int doesn't conform to the
62405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   C standard, and GCC and Sun C complain in some cases.  If the bug
62505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   is present, undef AT_FDCWD here, so it can be redefined below.  */
62605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
62705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef AT_FDCWD
62805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
62905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
63005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Use the same bit pattern as Solaris 9, but with the proper
63105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   signedness.  The bit pattern is important, in case this actually is
63205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Solaris with the above workaround.  */
63305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef AT_FDCWD
63405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define AT_FDCWD (-3041965)
63505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
63605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
63705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Use the same values as Solaris 9.  This shouldn't matter, but
63805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   there's no real reason to differ.  */
63905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef AT_SYMLINK_NOFOLLOW
64005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define AT_SYMLINK_NOFOLLOW 4096
64105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
64205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
64305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef AT_REMOVEDIR
64405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define AT_REMOVEDIR 1
64505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
64605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
64705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Solaris 9 lacks these two, so just pick unique values.  */
64805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef AT_SYMLINK_FOLLOW
64905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define AT_SYMLINK_FOLLOW 2
65005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
65105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
65205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef AT_EACCESS
65305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define AT_EACCESS 4
65405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
65505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
65605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
65705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _GL_FCNTL_H */
65805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif /* _GL_FCNTL_H */
65905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
660