Now that we have a function substitute in <netdb.h>, let me add a test of it in C++ mode.
#if GNULIB_TEST_GETADDRINFO SIGNATURE_CHECK (GNULIB_NAMESPACE::getaddrinfo, int, (const char *, const char *, const struct addrinfo *, struct addrinfo **)); SIGNATURE_CHECK (GNULIB_NAMESPACE::freeaddrinfo, void, (struct addrinfo *)); SIGNATURE_CHECK (GNULIB_NAMESPACE::gai_strerror, const char *, (int)); SIGNATURE_CHECK (GNULIB_NAMESPACE::getnameinfo, int, (const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int)); #endif However, this fails already on a glibc system: test-netdb-c++.cc:28: error: 'getaddrinfo' is not a member of 'gnulib' test-netdb-c++.cc:31: error: 'freeaddrinfo' is not a member of 'gnulib' test-netdb-c++.cc:33: error: 'getnameinfo' is not a member of 'gnulib' This patch fixes it. Tested on FreeBSD 6.4, OpenBSD 4.4, AIX 5.1, HP-UX 11.00, IRIX 6.5, Solaris 7, OSF/1 5.1, Cygwin, mingw. 2011-04-30 Bruno Haible <br...@clisp.org> netdb: Make it work in C++ mode. * lib/netdb.in.h (struct addrinfo): In C++, define as a C struct. (getaddrinfo, freeaddrinfo, getnameinfo): Use macros from c++defs module. * m4/netdb_h.m4 (gl_NETDB_MODULE_INDICATOR): Invoke gl_MODULE_INDICATOR_FOR_TESTS. * modules/netdb-tests (Depends-on): Add netdb-c++-tests. * modules/netdb-c++-tests: New file. * tests/test-netdb-c++.cc: New file. =========================== modules/netdb-c++-tests =========================== Files: tests/test-netdb-c++.cc tests/signature.h Status: c++-test Depends-on: ansi-c++-opt configure.ac: Makefile.am: if ANSICXX TESTS += test-netdb-c++ check_PROGRAMS += test-netdb-c++ test_netdb_c___SOURCES = test-netdb-c++.cc test_netdb_c___LDADD = $(LDADD) $(GETADDRINFO_LIB) endif =========================== tests/test-netdb-c++.cc =========================== /* Test of <netdb.h> substitute in C++ mode. Copyright (C) 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Written by Bruno Haible <br...@clisp.org>, 2011. */ #define GNULIB_NAMESPACE gnulib #include <config.h> #include <netdb.h> #include "signature.h" #if GNULIB_TEST_GETADDRINFO SIGNATURE_CHECK (GNULIB_NAMESPACE::getaddrinfo, int, (const char *, const char *, const struct addrinfo *, struct addrinfo **)); SIGNATURE_CHECK (GNULIB_NAMESPACE::freeaddrinfo, void, (struct addrinfo *)); SIGNATURE_CHECK (GNULIB_NAMESPACE::gai_strerror, const char *, (int)); SIGNATURE_CHECK (GNULIB_NAMESPACE::getnameinfo, int, (const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int)); #endif int main () { } =============================================================================== --- lib/netdb.in.h.orig Sat Apr 30 14:56:02 2011 +++ lib/netdb.in.h Sat Apr 30 13:23:10 2011 @@ -54,6 +54,10 @@ # if !@HAVE_STRUCT_ADDRINFO@ +# ifdef __cplusplus +extern "C" { +# endif + # if !GNULIB_defined_struct_addrinfo /* Structure to contain information about address of a service provider. */ struct addrinfo @@ -69,6 +73,11 @@ }; # define GNULIB_defined_struct_addrinfo 1 # endif + +# ifdef __cplusplus +} +# endif + # endif /* Possible values for `ai_flags' field in `addrinfo' structure. */ @@ -155,19 +164,29 @@ socket addresses. For more details, see the POSIX:2001 specification <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ -extern int getaddrinfo (const char *restrict nodename, - const char *restrict servname, - const struct addrinfo *restrict hints, - struct addrinfo **restrict res) - _GL_ARG_NONNULL ((4)); -# endif +_GL_FUNCDECL_SYS (getaddrinfo, int, + (const char *restrict nodename, + const char *restrict servname, + const struct addrinfo *restrict hints, + struct addrinfo **restrict res) + _GL_ARG_NONNULL ((4))); +# endif +_GL_CXXALIAS_SYS (getaddrinfo, int, + (const char *restrict nodename, + const char *restrict servname, + const struct addrinfo *restrict hints, + struct addrinfo **restrict res)); +_GL_CXXALIASWARN (getaddrinfo); # if !@HAVE_DECL_FREEADDRINFO@ /* Free `addrinfo' structure AI including associated storage. For more details, see the POSIX:2001 specification <http://www.opengroup.org/susv3xsh/getaddrinfo.html>. */ -extern void freeaddrinfo (struct addrinfo *ai) _GL_ARG_NONNULL ((1)); +_GL_FUNCDECL_SYS (freeaddrinfo, void, (struct addrinfo *ai) + _GL_ARG_NONNULL ((1))); # endif +_GL_CXXALIAS_SYS (freeaddrinfo, void, (struct addrinfo *ai)); +_GL_CXXALIASWARN (freeaddrinfo); # if @REPLACE_GAI_STRERROR@ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) @@ -191,12 +210,21 @@ /* Convert socket address to printable node and service names. For more details, see the POSIX:2001 specification <http://www.opengroup.org/susv3xsh/getnameinfo.html>. */ -extern int getnameinfo (const struct sockaddr *restrict sa, socklen_t salen, +_GL_FUNCDECL_SYS (getnameinfo, int, + (const struct sockaddr *restrict sa, socklen_t salen, + char *restrict node, socklen_t nodelen, + char *restrict service, socklen_t servicelen, + int flags) + _GL_ARG_NONNULL ((1))); +# endif +/* Need to cast, because on glibc systems, the seventh parameter is + unsigned int flags. */ +_GL_CXXALIAS_SYS_CAST (getnameinfo, int, + (const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, - int flags) - _GL_ARG_NONNULL ((1)); -# endif + int flags)); +_GL_CXXALIASWARN (getnameinfo); /* Possible flags for getnameinfo. */ # ifndef NI_NUMERICHOST --- m4/netdb_h.m4.orig Sat Apr 30 14:56:02 2011 +++ m4/netdb_h.m4 Sat Apr 30 13:23:10 2011 @@ -1,4 +1,4 @@ -# netdb_h.m4 serial 10 +# netdb_h.m4 serial 11 dnl Copyright (C) 2008-2011 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -26,6 +26,8 @@ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. AC_REQUIRE([gl_NETDB_H_DEFAULTS]) gl_MODULE_INDICATOR_SET_VARIABLE([$1]) + dnl Define it also as a C macro, for the benefit of the unit tests. + gl_MODULE_INDICATOR_FOR_TESTS([$1]) ]) AC_DEFUN([gl_NETDB_H_DEFAULTS], --- modules/netdb-tests.orig Sat Apr 30 14:56:02 2011 +++ modules/netdb-tests Sat Apr 30 13:23:10 2011 @@ -2,6 +2,7 @@ tests/test-netdb.c Depends-on: +netdb-c++-tests configure.ac: -- In memoriam Casey Jones <http://en.wikipedia.org/wiki/Casey_Jones>