You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by no...@apache.org on 2017/01/23 18:04:59 UTC

[trafficserver] branch master updated: Replace gethostbyname_r() and gethostbyaddr_r()

This is an automated email from the ASF dual-hosted git repository.

nottheoilrig pushed a commit to branch master
in repository https://git-dual.apache.org/repos/asf/trafficserver.git

The following commit(s) were added to refs/heads/master by this push:
       new  582e049   Replace gethostbyname_r() and gethostbyaddr_r()
582e049 is described below

commit 582e0492df6052c7e45d213f011741126a9876d5
Author: Jack Bates <ja...@nottheoilrig.com>
AuthorDate: Fri Jan 13 14:17:48 2017 -0700

    Replace gethostbyname_r() and gethostbyaddr_r()
    
    Fixes #1312
---
 build/network.m4                     | 69 ------------------------------------
 cmd/traffic_layout/traffic_layout.cc |  1 -
 configure.ac                         |  1 -
 iocore/cluster/ClusterMachine.cc     | 33 ++++++++++-------
 lib/ts/ink_config.h.in               |  1 -
 lib/ts/ink_inet.cc                   | 53 ---------------------------
 lib/ts/ink_inet.h                    | 39 --------------------
 7 files changed, 20 insertions(+), 177 deletions(-)

diff --git a/build/network.m4 b/build/network.m4
index a71390e..78dae1c 100644
--- a/build/network.m4
+++ b/build/network.m4
@@ -19,75 +19,6 @@ dnl network.m4: Trafficserver's autoconf macros for testing network support
 dnl
 
 dnl
-dnl Checks the definition of gethostbyname_r and gethostbyaddr_r
-dnl which are different for glibc, solaris and assorted other operating
-dnl systems
-dnl
-dnl Note that this test is executed too early to see if we have all of
-dnl the headers.
-AC_DEFUN([TS_CHECK_GETHOSTBYNAME_R_STYLE], [
-
-dnl Try and compile a glibc2 gethostbyname_r piece of code, and set the
-dnl style of the routines to glibc2 on success
-AC_CACHE_CHECK([style of gethostbyname_r routine], ac_cv_gethostbyname_r_style,
-TS_TRY_COMPILE_NO_WARNING([
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-],[
-int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0,
-                          (char *) 0, 0, (struct hostent **) 0, &tmp);
-/* use tmp to suppress the warning */
-tmp=0;
-], ac_cv_gethostbyname_r_style=glibc2, ac_cv_gethostbyname_r_style=none))
-
-if test "$ac_cv_gethostbyname_r_style" = "glibc2"; then
-  gethostbyname_r_glibc2=1
-  AC_DEFINE(GETHOSTBYNAME_R_GLIBC2, 1, [Define if gethostbyname_r has the glibc style])
-else
-  gethostbyname_r_glibc2=0
-fi
-
-AC_CACHE_CHECK([3rd argument to the gethostbyname_r routines], ac_cv_gethostbyname_r_arg,
-TS_TRY_COMPILE_NO_WARNING([
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
-#endif
-#ifdef HAVE_NETDB_H
-#include <netdb.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-],[
-int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0,
-                          (struct hostent_data *) 0);
-/* use tmp to suppress the warning */
-tmp=0;
-], ac_cv_gethostbyname_r_arg=hostent_data, ac_cv_gethostbyname_r_arg=char))
-
-AC_SUBST(gethostbyname_r_glibc2)
-])
-
-dnl
 dnl TS_CHECK_LOOPBACK_IFACE: try to figure out default loopback interface
 dnl
 AC_DEFUN([TS_CHECK_LOOPBACK_IFACE], [
diff --git a/cmd/traffic_layout/traffic_layout.cc b/cmd/traffic_layout/traffic_layout.cc
index f10fc17..463e079 100644
--- a/cmd/traffic_layout/traffic_layout.cc
+++ b/cmd/traffic_layout/traffic_layout.cc
@@ -103,7 +103,6 @@ produce_features(bool json)
   print_feature("TS_USE_LINUX_NATIVE_AIO", TS_USE_LINUX_NATIVE_AIO, json);
   print_feature("TS_HAS_SO_PEERCRED", TS_HAS_SO_PEERCRED, json);
   print_feature("TS_USE_REMOTE_UNWINDING", TS_USE_REMOTE_UNWINDING, json);
-  print_feature("GETHOSTBYNAME_R_GLIBC2", GETHOSTBYNAME_R_GLIBC2, json);
   print_feature("SIZEOF_VOID_POINTER", SIZEOF_VOID_POINTER, json);
   print_feature("TS_IP_TRANSPARENT", TS_IP_TRANSPARENT, json);
   print_feature("TS_HAS_128BIT_CAS", TS_HAS_128BIT_CAS, json);
diff --git a/configure.ac b/configure.ac
index e7b29ed..0bb4bcf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1811,7 +1811,6 @@ AC_SUBST(has_ip_tos)
 AC_SUBST(has_so_peercred)
 
 TS_CHECK_LOOPBACK_IFACE
-TS_CHECK_GETHOSTBYNAME_R_STYLE
 TS_CHECK_MACRO_IN6_IS_ADDR_UNSPECIFIED
 
 AC_CHECK_TYPE([struct tcp_info],
diff --git a/iocore/cluster/ClusterMachine.cc b/iocore/cluster/ClusterMachine.cc
index f809b25..c1b3de5 100644
--- a/iocore/cluster/ClusterMachine.cc
+++ b/iocore/cluster/ClusterMachine.cc
@@ -104,20 +104,24 @@ ClusterMachine::ClusterMachine(char *ahostname, unsigned int aip, int aport)
       Debug("cluster_note", "[Machine::Machine] Cluster IP addr: %s", clusterIP);
       ip = inet_addr(clusterIP);
     } else {
-      ink_gethostbyname_r_data data;
-      struct hostent *r = ink_gethostbyname_r(ahostname, &data);
-      if (!r) {
-        Warning("unable to DNS %s: %d", ahostname, data.herrno);
+      struct addrinfo hints;
+      memset(&hints, 0, sizeof(hints));
+      hints.ai_family = AF_INET;
+      struct addrinfo *result, *rp;
+      int err = getaddrinfo(ahostname, nullptr, &hints, &result);
+      if (err != 0) {
+        Warning("unable to DNS %s: %s", ahostname, gai_strerror(err));
         ip = 0;
       } else {
         // lowest IP address
 
         ip = (unsigned int)-1; // 0xFFFFFFFF
-        for (int i = 0; r->h_addr_list[i]; i++)
-          if (ip > *(unsigned int *)r->h_addr_list[i])
-            ip = *(unsigned int *)r->h_addr_list[i];
+        for (rp = result; rp != nullptr; rp = rp->ai_next)
+          if (ip > reinterpret_cast<sockaddr_in *>(rp->ai_addr)->sin_addr.s_addr)
+            ip = reinterpret_cast<sockaddr_in *>(rp->ai_addr)->sin_addr.s_addr;
         if (ip == (unsigned int)-1)
           ip = 0;
+        freeaddrinfo(result);
       }
       // ip = htonl(ip); for the alpha!
     }
@@ -125,15 +129,18 @@ ClusterMachine::ClusterMachine(char *ahostname, unsigned int aip, int aport)
   } else {
     ip = aip;
 
-    ink_gethostbyaddr_r_data data;
-    struct hostent *r = ink_gethostbyaddr_r((char *)&ip, sizeof(int), AF_INET, &data);
-
-    if (r == nullptr) {
+    struct sockaddr_in addr;
+    memset(&addr, 0, sizeof(addr));
+    addr.sin_addr.s_addr = ip;
+    char hbuf[NI_MAXHOST];
+    int err = getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(addr), hbuf, sizeof(hbuf), nullptr, 0, 0);
+    if (err != 0) {
       Alias32 x;
       memcpy(&x.u32, &ip, sizeof(x.u32));
-      Debug("machine_debug", "unable to reverse DNS %u.%u.%u.%u: %d", x.byte[0], x.byte[1], x.byte[2], x.byte[3], data.herrno);
+      Debug("machine_debug", "unable to reverse DNS %u.%u.%u.%u: %s", x.byte[0], x.byte[1], x.byte[2], x.byte[3],
+            gai_strerror(err));
     } else
-      hostname = ats_strdup(r->h_name);
+      hostname = ats_strdup(hbuf);
   }
   if (hostname)
     hostname_len = strlen(hostname);
diff --git a/lib/ts/ink_config.h.in b/lib/ts/ink_config.h.in
index 9e93687..45cfbcc 100644
--- a/lib/ts/ink_config.h.in
+++ b/lib/ts/ink_config.h.in
@@ -84,7 +84,6 @@
 #define TS_HAS_SO_PEERCRED @has_so_peercred@
 
 /* OS API definitions */
-#define GETHOSTBYNAME_R_GLIBC2 @gethostbyname_r_glibc2@
 #define SIZEOF_VOID_POINTER @ac_cv_sizeof_voidp@
 #define TS_IP_TRANSPARENT @ip_transparent@
 #define TS_HAS_128BIT_CAS @has_128bit_cas@
diff --git a/lib/ts/ink_inet.cc b/lib/ts/ink_inet.cc
index b5791b3..2e67e2e 100644
--- a/lib/ts/ink_inet.cc
+++ b/lib/ts/ink_inet.cc
@@ -30,61 +30,8 @@
 #include "ts/TestBox.h"
 #include "ts/TextBuffer.h"
 
-#if defined(darwin)
-extern "C" {
-struct hostent *gethostbyname_r(const char *name, struct hostent *result, char *buffer, int buflen, int *h_errnop);
-struct hostent *gethostbyaddr_r(const char *name, size_t size, int type, struct hostent *result, char *buffer, int buflen,
-                                int *h_errnop);
-}
-#endif
-
 IpAddr const IpAddr::INVALID;
 
-struct hostent *
-ink_gethostbyname_r(char *hostname, ink_gethostbyname_r_data *data)
-{
-#ifdef RENTRENT_GETHOSTBYNAME
-  struct hostent *r = gethostbyname(hostname);
-  if (r)
-    data->ent  = *r;
-  data->herrno = errno;
-
-#else // RENTRENT_GETHOSTBYNAME
-#if GETHOSTBYNAME_R_GLIBC2
-
-  struct hostent *addrp = nullptr;
-  int res               = gethostbyname_r(hostname, &data->ent, data->buf, INK_GETHOSTBYNAME_R_DATA_SIZE, &addrp, &data->herrno);
-  struct hostent *r     = nullptr;
-  if (!res && addrp)
-    r               = addrp;
-
-#else
-  struct hostent *r = gethostbyname_r(hostname, &data->ent, data->buf, INK_GETHOSTBYNAME_R_DATA_SIZE, &data->herrno);
-#endif
-#endif
-  return r;
-}
-
-struct hostent *
-ink_gethostbyaddr_r(char *ip, int len, int type, ink_gethostbyaddr_r_data *data)
-{
-#if GETHOSTBYNAME_R_GLIBC2
-  struct hostent *r     = nullptr;
-  struct hostent *addrp = nullptr;
-  int res = gethostbyaddr_r((char *)ip, len, type, &data->ent, data->buf, INK_GETHOSTBYNAME_R_DATA_SIZE, &addrp, &data->herrno);
-  if (!res && addrp)
-    r = addrp;
-#else
-#ifdef RENTRENT_GETHOSTBYADDR
-  struct hostent *r = gethostbyaddr((const void *)ip, len, type);
-
-#else
-  struct hostent *r = gethostbyaddr_r((char *)ip, len, type, &data->ent, data->buf, INK_GETHOSTBYNAME_R_DATA_SIZE, &data->herrno);
-#endif
-#endif // LINUX
-  return r;
-}
-
 uint32_t
 ink_inet_addr(const char *s)
 {
diff --git a/lib/ts/ink_inet.h b/lib/ts/ink_inet.h
index 7264e50..ce1b132 100644
--- a/lib/ts/ink_inet.h
+++ b/lib/ts/ink_inet.h
@@ -32,9 +32,6 @@
 #include "ts/ink_apidefs.h"
 #include "ts/TsBuffer.h"
 
-#define INK_GETHOSTBYNAME_R_DATA_SIZE 1024
-#define INK_GETHOSTBYADDR_R_DATA_SIZE 1024
-
 #if !TS_HAS_IN6_IS_ADDR_UNSPECIFIED
 #if defined(IN6_IS_ADDR_UNSPECIFIED)
 #undef IN6_IS_ADDR_UNSPECIFIED
@@ -112,42 +109,6 @@ union IpEndpoint {
   operator sockaddr const *() const { return &sa; }
 };
 
-struct ink_gethostbyname_r_data {
-  int herrno;
-  struct hostent ent;
-  char buf[INK_GETHOSTBYNAME_R_DATA_SIZE];
-};
-
-struct ink_gethostbyaddr_r_data {
-  int herrno;
-  struct hostent ent;
-  char buf[INK_GETHOSTBYADDR_R_DATA_SIZE];
-};
-
-/**
-  Wrapper for gethostbyname_r(). If successful, returns a pointer
-  to the hostent structure. Returns nullptr and sets data->herrno to
-  the appropriate error code on failure.
-
-  @param hostname null-terminated host name string
-  @param data pointer to ink_gethostbyname_r_data allocated by the caller
-
-*/
-struct hostent *ink_gethostbyname_r(char *hostname, ink_gethostbyname_r_data *data);
-
-/**
-  Wrapper for gethostbyaddr_r(). If successful, returns a pointer
-  to the hostent structure. Returns nullptr and sets data->herrno to
-  the appropriate error code on failure.
-
-  @param ip IP address of the host
-  @param len length of the buffer indicated by ip
-  @param type family of the address
-  @param data pointer to ink_gethostbyname_r_data allocated by the caller
-
-*/
-struct hostent *ink_gethostbyaddr_r(char *ip, int len, int type, ink_gethostbyaddr_r_data *data);
-
 /** Return the detected maximum listen(2) backlog for TCP. */
 int ats_tcp_somaxconn();
 

-- 
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].