bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

netdb.h in C++ mode


From: Bruno Haible
Subject: netdb.h in C++ mode
Date: Sat, 30 Apr 2011 15:04:09 +0200
User-agent: KMail/1.9.9

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  <address@hidden>

        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 <address@hidden>, 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 address@hidden@
 
+#  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 address@hidden@
 /* 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>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]