bug-gnulib
[Top][All Lists]
Advanced

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

getaddrinfo, netdb, canon-host


From: Simon Josefsson
Subject: getaddrinfo, netdb, canon-host
Date: Wed, 15 Oct 2008 15:33:59 +0200
User-agent: Gnus/5.110011 (No Gnus v0.11) Emacs/22.2 (gnu/linux)

This moves the getaddrinfo.h declarations to netdb.h.  Because this
involves changing canon-host, I haven't pushed this.  Jim, what do you
think of this approach?

The patch also fixes some problems with the netdb.h replacement: for
example, netdb.h needs to include sys/socket.h on MinGW to provide
typical netdb.h declarations such as 'struct hostent'.

/Simon

diff --git a/ChangeLog b/ChangeLog
index 721d69e..f0b4cd4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2008-10-15  Simon Josefsson  <address@hidden>
 
+       * lib/netdb.in.h: Add declarations from getaddrinfo.h.
+       * lib/getaddrinfo.h: Remove file.
+       * modules/getaddrinfo: Reflect move from getaddrinfo.h to netdb.h.
+       * modules/netdb: Likewise.  Depend on sys_socket for MinGW.
+       * m4/getaddrinfo.m4: Don't check for netdb.h.
+       * lib/canon-host.c: Include netdb.h instead of getaddrinfo.h.
+       * lib/getaddrinfo.c: Likewise.
+       * lib/gai_strerror.c: Likewise.  Drop HAVE_NETDB_H check.
+       * NEWS: Mention change.
+
+2008-10-15  Simon Josefsson  <address@hidden>
+
        * modules/netdb, modules/netdb-tests: New file.
        * m4/netdb_h.m4: New file.
        * lib/netdb.in.h: Add, currently just an empty file pending
diff --git a/NEWS b/NEWS
index ef04cf4..3ef6642 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ User visible incompatible changes
 
 Date        Modules         Changes
 
+2008-10-15  getaddrinfo     The include file is changed from "getaddrinfo.h"
+                            to <netdb.h>.
+
 2008-09-28  sockets         When using this module, you now need to link with
                             $(LIBSOCKET).
 
diff --git a/lib/canon-host.c b/lib/canon-host.c
index b5aa1b7..df9cbbf 100644
--- a/lib/canon-host.c
+++ b/lib/canon-host.c
@@ -1,6 +1,6 @@
 /* Host name canonicalization
 
-   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
    Written by Derek Price <address@hidden>.
 
@@ -22,8 +22,7 @@
 #include "canon-host.h"
 
 #include <string.h>
-
-#include "getaddrinfo.h"
+#include <netdb.h>
 
 /* Store the last error for the single-threaded version of this function.  */
 static int last_cherror;
diff --git a/lib/gai_strerror.c b/lib/gai_strerror.c
index aa733d6..60042e8 100644
--- a/lib/gai_strerror.c
+++ b/lib/gai_strerror.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, 
Inc.
+/* Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006, 2008 Free Software 
Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <address@hidden>, 1997.
 
@@ -18,13 +18,10 @@
 
 #ifndef _LIBC
 # include <config.h>
-# include "getaddrinfo.h"
 #endif
 
 #include <stdio.h>
-#ifdef HAVE_NETDB_H
-# include <netdb.h>
-#endif
+#include <netdb.h>
 
 #ifdef _LIBC
 # include <libintl.h>
diff --git a/lib/getaddrinfo.c b/lib/getaddrinfo.c
index e4ed821..6a36bf0 100644
--- a/lib/getaddrinfo.c
+++ b/lib/getaddrinfo.c
@@ -19,7 +19,7 @@
 
 #include <config.h>
 
-#include "getaddrinfo.h"
+#include <netdb.h>
 
 #if HAVE_NETINET_IN_H
 # include <netinet/in.h>
diff --git a/lib/netdb.in.h b/lib/netdb.in.h
index 0aa0691..8328411 100644
--- a/lib/netdb.in.h
+++ b/lib/netdb.in.h
@@ -1,5 +1,6 @@
 /* Provide a netdb.h header file for systems lacking it (read: MinGW).
-   Copyright (C) 2008 Free Software Foundation, Inc.
+   Copyright (C) 1996-2002, 2003, 2004, 2005, 2006, 2008
+   Free Software Foundation, Inc.
    Written by Simon Josefsson.
 
    This program is free software; you can redistribute it and/or modify
@@ -16,9 +17,10 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
-/* This file is supposed to be used on platforms that lack <netdb.h>.
-   It is intended to provide definitions and prototypes needed by an
-   application.  */
+/* This file is supposed to be used on platforms that lack <netdb.h>,
+   and on platforms where <sys/socket.h> does not provide all
+   necessary definitions.  It is intended to provide definitions and
+   prototypes needed by an application.  */
 
 #ifndef _GL_NETDB_H
 
@@ -34,15 +36,140 @@
 #ifndef _GL_NETDB_H
 #define _GL_NETDB_H
 
-#if @HAVE_NETDB_H@
-
-/* Declarations for a platform that has <netdb.h>.  */
-
-#else
-
-/* Declarations for a platform that has <netdb.h>.  */
-
-#endif /* HAVE_NETDB_H */
+/* Get netdb.h definitions such as struct hostent for MinGW.  */
+#include <sys/socket.h>
+
+#if @GNULIB_GETADDRINFO@
+
+# ifndef HAVE_STRUCT_ADDRINFO
+
+/* Structure to contain information about address of a service provider.  */
+struct addrinfo
+{
+  int ai_flags;                        /* Input flags.  */
+  int ai_family;               /* Protocol family for socket.  */
+  int ai_socktype;             /* Socket type.  */
+  int ai_protocol;             /* Protocol for socket.  */
+  socklen_t ai_addrlen;                /* Length of socket address.  */
+  struct sockaddr *ai_addr;    /* Socket address for socket.  */
+  char *ai_canonname;          /* Canonical name for service location.  */
+  struct addrinfo *ai_next;    /* Pointer to next in list.  */
+};
+# endif
+
+/* Possible values for `ai_flags' field in `addrinfo' structure.  */
+# ifndef AI_PASSIVE
+#  define AI_PASSIVE   0x0001  /* Socket address is intended for `bind'.  */
+# endif
+# ifndef AI_CANONNAME
+#  define AI_CANONNAME 0x0002  /* Request for canonical name.  */
+# endif
+# ifndef AI_NUMERICSERV
+#  define AI_NUMERICSERV       0x0400  /* Don't use name resolution.  */
+# endif
+
+# if 0
+/* The commented out definitions below are not yet implemented in the
+   GNULIB getaddrinfo() replacement, so are not yet needed and may, in fact,
+   cause conflicts on systems with a getaddrinfo() function which does not
+   define them.
+
+   If they are restored, be sure to protect the definitions with #ifndef.  */
+#  define AI_NUMERICHOST       0x0004  /* Don't use name resolution.  */
+#  define AI_V4MAPPED  0x0008  /* IPv4 mapped addresses are acceptable.  */
+#  define AI_ALL               0x0010  /* Return IPv4 mapped and IPv6 
addresses.  */
+#  define AI_ADDRCONFIG        0x0020  /* Use configuration of this host to 
choose
+                                  returned address type..  */
+# endif /* 0 */
+
+/* Error values for `getaddrinfo' function.  */
+# ifndef EAI_BADFLAGS
+#  define EAI_BADFLAGS   -1    /* Invalid value for `ai_flags' field.  */
+#  define EAI_NONAME     -2    /* NAME or SERVICE is unknown.  */
+#  define EAI_AGAIN      -3    /* Temporary failure in name resolution.  */
+#  define EAI_FAIL       -4    /* Non-recoverable failure in name res.  */
+#  define EAI_NODATA     -5    /* No address associated with NAME.  */
+#  define EAI_FAMILY     -6    /* `ai_family' not supported.  */
+#  define EAI_SOCKTYPE   -7    /* `ai_socktype' not supported.  */
+#  define EAI_SERVICE    -8    /* SERVICE not supported for `ai_socktype'.  */
+#  define EAI_MEMORY     -10   /* Memory allocation failure.  */
+# endif
+
+/* Since EAI_NODATA is deprecated by RFC3493, some systems (at least
+   FreeBSD, which does define EAI_BADFLAGS) have removed the definition
+   in favor of EAI_NONAME.  */
+# if !defined EAI_NODATA && defined EAI_NONAME
+#  define EAI_NODATA EAI_NONAME
+# endif
+
+# ifndef EAI_OVERFLOW
+/* Not defined on mingw32. */
+#  define EAI_OVERFLOW   -12   /* Argument buffer overflow.  */
+# endif
+# ifndef EAI_ADDRFAMILY
+/* Not defined on mingw32. */
+#  define EAI_ADDRFAMILY  -9   /* Address family for NAME not supported.  */
+# endif
+# ifndef EAI_SYSTEM
+/* Not defined on mingw32. */
+#  define EAI_SYSTEM     -11   /* System error returned in `errno'.  */
+# endif
+
+# ifdef __USE_GNU
+#  ifndef EAI_INPROGRESS
+#   define EAI_INPROGRESS      -100    /* Processing request in progress.  */
+#   define EAI_CANCELED                -101    /* Request canceled.  */
+#   define EAI_NOTCANCELED     -102    /* Request not canceled.  */
+#   define EAI_ALLDONE         -103    /* All requests done.  */
+#   define EAI_INTR            -104    /* Interrupted by a signal.  */
+#   define EAI_IDN_ENCODE      -105    /* IDN encoding failed.  */
+#  endif
+# endif
+
+# if !HAVE_DECL_GETADDRINFO
+/* Translate name of a service location and/or a service name to set of
+   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);
+# endif
+
+# 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);
+# endif
+
+# if !HAVE_DECL_GAI_STRERROR
+/* Convert error return from getaddrinfo() to a string.
+   For more details, see the POSIX:2001 specification
+   <http://www.opengroup.org/susv3xsh/gai_strerror.html>.  */
+extern const char *gai_strerror (int ecode);
+# endif
+
+# if !HAVE_DECL_GETNAMEINFO
+/* 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,
+                      char *restrict node, socklen_t nodelen,
+                      char *restrict service, socklen_t servicelen,
+                      int flags);
+# endif
+
+/* Possible flags for getnameinfo.  */
+# ifndef NI_NUMERICHOST
+#  define NI_NUMERICHOST 1
+# endif
+# ifndef NI_NUMERICSERV
+#  define NI_NUMERICSERV 2
+# endif
+
+#endif /* @GNULIB_GETADDRINFO@ */
 
 #endif /* _GL_NETDB_H */
 #endif /* _GL_NETDB_H */
diff --git a/m4/getaddrinfo.m4 b/m4/getaddrinfo.m4
index 52135ba..c184c6f 100644
--- a/m4/getaddrinfo.m4
+++ b/m4/getaddrinfo.m4
@@ -1,5 +1,5 @@
-# getaddrinfo.m4 serial 15
-dnl Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+# getaddrinfo.m4 serial 16
+dnl Copyright (C) 2004, 2005, 2006, 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,
 dnl with or without modifications, as long as this notice is preserved.
@@ -7,10 +7,9 @@ dnl with or without modifications, as long as this notice is 
preserved.
 AC_DEFUN([gl_GETADDRINFO],
 [
   AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+  AC_REQUIRE([gl_HEADER_NETDB])dnl for HAVE_NETDB_H
   AC_MSG_NOTICE([checking how to do getaddrinfo, freeaddrinfo and getnameinfo])
 
-  AC_CHECK_HEADERS_ONCE(netdb.h)
-
   AC_SEARCH_LIBS(getaddrinfo, [nsl socket])
   AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [
     AC_TRY_LINK([
@@ -72,7 +71,7 @@ AC_DEFUN([gl_GETADDRINFO],
   gl_PREREQ_GETADDRINFO
 ])
 
-# Prerequisites of lib/getaddrinfo.h and lib/getaddrinfo.c.
+# Prerequisites of lib/getaddrinfo.c.
 AC_DEFUN([gl_PREREQ_GETADDRINFO], [
   AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
   AC_SEARCH_LIBS(gethostbyname, [inet nsl])
@@ -104,7 +103,7 @@ AC_DEFUN([gl_PREREQ_GETADDRINFO], [
   dnl have sa_len so the result is correct anyway.
   AC_CHECK_MEMBERS([struct sockaddr.sa_len], , , [#include <sys/socket.h>])
 
-  AC_CHECK_HEADERS_ONCE(netinet/in.h netdb.h)
+  AC_CHECK_HEADERS_ONCE(netinet/in.h)
   AC_CHECK_DECLS([getaddrinfo, freeaddrinfo, gai_strerror, getnameinfo],,,[
   /* sys/types.h is not needed according to POSIX, but the
      sys/socket.h in i386-unknown-freebsd4.10 and
diff --git a/m4/netdb_h.m4 b/m4/netdb_h.m4
index d6d729f..f365145 100644
--- a/m4/netdb_h.m4
+++ b/m4/netdb_h.m4
@@ -39,5 +39,5 @@ AC_DEFUN([gl_NETDB_MODULE_INDICATOR],
 
 AC_DEFUN([gl_NETDB_H_DEFAULTS],
 [
-  :
+  GNULIB_GETADDRINFO=0; AC_SUBST([GNULIB_GETADDRINFO])
 ])
diff --git a/modules/getaddrinfo b/modules/getaddrinfo
index 84a9a96..1abd4e5 100644
--- a/modules/getaddrinfo
+++ b/modules/getaddrinfo
@@ -2,7 +2,6 @@ Description:
 getaddrinfo() function: Get address information.
 
 Files:
-lib/getaddrinfo.h
 lib/getaddrinfo.c
 lib/gai_strerror.c
 m4/getaddrinfo.m4
@@ -15,14 +14,16 @@ snprintf
 socklen
 stdbool
 sys_socket
+netdb
 
 configure.ac:
 gl_GETADDRINFO
+gl_NETDB_MODULE_INDICATOR([getaddrinfo])
 
 Makefile.am:
 
 Include:
-"getaddrinfo.h"
+<netdb.h>
 
 License:
 LGPLv2+
diff --git a/modules/netdb b/modules/netdb
index 21e4ff4..5165b56 100644
--- a/modules/netdb
+++ b/modules/netdb
@@ -7,6 +7,7 @@ m4/netdb_h.m4
 
 Depends-on:
 include_next
+sys_socket
 
 configure.ac:
 gl_HEADER_NETDB
@@ -23,6 +24,7 @@ netdb.h: netdb.in.h
              -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
              -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \
              -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \
+             -e 's|@''GNULIB_GETADDRINFO''@|$(GNULIB_GETADDRINFO)|g' \
              < $(srcdir)/netdb.in.h; \
        } > address@hidden
        mv address@hidden $@
diff --git a/tests/test-getaddrinfo.c b/tests/test-getaddrinfo.c
index bfdb9cf..a887cb1 100644
--- a/tests/test-getaddrinfo.c
+++ b/tests/test-getaddrinfo.c
@@ -18,7 +18,7 @@
 /* Written by Simon Josefsson.  */
 
 #include <config.h>
-#include "getaddrinfo.h"
+#include <netdb.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <stdio.h>




reply via email to

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