Blob Blame History Raw
From 9df652778fc92db9eb371c78bc7d1691417f3a60 Mon Sep 17 00:00:00 2001
From: Rafik Zurob <rzurob@ca.ibm.com>
Date: Fri, 22 Jan 2021 06:51:19 -0600
Subject: [PATCH] [llvm-jitlink] Replace use of deprecated gethostbyname by
 getaddrinfo.

This patch replaces use of deprecated gethostbyname by getaddrinfo.

Author: Rafik Zurob

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D95477
---
 llvm/tools/llvm-jitlink/llvm-jitlink.cpp | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index da4a164..108dd61 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -690,15 +690,35 @@ LLVMJITLinkRemoteTargetProcessControl::ConnectToExecutor() {
                                        " is not a valid integer",
                                    inconvertibleErrorCode());
 
+  addrinfo *AI;
+  addrinfo Hints{};
+  Hints.ai_family = AF_INET;
+  Hints.ai_socktype = SOCK_STREAM;
+  Hints.ai_protocol = PF_INET;
+  Hints.ai_flags = AI_NUMERICSERV;
+  if (getaddrinfo(HostName.c_str(), PortStr.str().c_str(), &Hints, &AI) != 0)
+    return make_error<StringError>("Failed to resolve " + HostName + ":" +
+                                       Twine(Port),
+                                   inconvertibleErrorCode());
+
   int SockFD = socket(PF_INET, SOCK_STREAM, 0);
-  hostent *Server = gethostbyname(HostName.c_str());
   sockaddr_in ServAddr;
   memset(&ServAddr, 0, sizeof(ServAddr));
   ServAddr.sin_family = PF_INET;
-  memmove(&Server->h_addr, &ServAddr.sin_addr.s_addr, Server->h_length);
   ServAddr.sin_port = htons(Port);
-  if (connect(SockFD, reinterpret_cast<sockaddr *>(&ServAddr),
-              sizeof(ServAddr)) < 0)
+
+  // getaddrinfo returns a list of address structures.  Go through the list
+  // to find one we can connect to.
+  int ConnectRC = -1;
+  for (addrinfo *Server = AI; Server; Server = Server->ai_next) {
+    memmove(&Server->ai_addr, &ServAddr.sin_addr.s_addr, Server->ai_addrlen);
+    ConnectRC = connect(SockFD, reinterpret_cast<sockaddr *>(&ServAddr),
+                        sizeof(ServAddr));
+    if (ConnectRC == 0)
+      break;
+  }
+  freeaddrinfo(AI);
+  if (ConnectRC == -1)
     return make_error<StringError>("Failed to connect to " + HostName + ":" +
                                        Twine(Port),
                                    inconvertibleErrorCode());
-- 
1.8.3.1