You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2009/03/09 22:21:29 UTC

svn commit: r751844 - /qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp

Author: astitcher
Date: Mon Mar  9 21:21:27 2009
New Revision: 751844

URL: http://svn.apache.org/viewvc?rev=751844&view=rev
Log:
QPID-1722 Replace use of non thread safe gethostbyname()
with more useful getaddrinfo()

Modified:
    qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp?rev=751844&r1=751843&r2=751844&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp Mon Mar  9 21:21:27 2009
@@ -108,7 +108,7 @@
 {
     int& socket = impl->fd;
     if (socket != -1) Socket::close();
-    int s = ::socket (PF_INET, SOCK_STREAM, 0);
+    int s = ::socket (AF_INET, SOCK_STREAM, 0);
     if (s < 0) throw QPID_POSIX_ERROR(errno);
     socket = s;
 }
@@ -138,25 +138,30 @@
 }
 }
 
-void Socket::connect(const std::string& host, uint16_t port) const
+void Socket::connect(const std::string& host, uint16_t p) const
 {
-    std::stringstream namestream;
-    namestream << host << ":" << port;
-    connectname = namestream.str();
+    std::stringstream portstream;
+    portstream << p;
+    std::string port = portstream.str();
+    connectname = host + ":" + port;
 
     const int& socket = impl->fd;
-    struct sockaddr_in name;
-    name.sin_family = AF_INET;
-    name.sin_port = htons(port);
-    // TODO: Be good to make this work for IPv6 as well as IPv4
-    // Use more modern lookup functions
-    struct hostent* hp = gethostbyname ( host.c_str() );
-    if (hp == 0)
-        throw Exception(QPID_MSG("Cannot resolve " << host << ": " << h_errstr(h_errno)));
-    ::memcpy(&name.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
-    if ((::connect(socket, (struct sockaddr*)(&name), sizeof(name)) < 0) &&
-        (errno != EINPROGRESS))
+
+    ::addrinfo *res;
+    ::addrinfo hints;
+    ::memset(&hints, 0, sizeof(hints));
+    hints.ai_family = AF_INET; // In order to allow AF_INET6 we'd have to change createTcp() as well
+    hints.ai_socktype = SOCK_STREAM;
+    int n = ::getaddrinfo(host.c_str(), port.c_str(), &hints, &res);
+    if (n != 0)
+        throw Exception(QPID_MSG("Cannot resolve " << host << ": " << ::gai_strerror(n)));
+    // TODO the correct thing to do here is loop on failure until you've used all the returned addresses
+    if ((::connect(socket, res->ai_addr, res->ai_addrlen) < 0) &&
+        (errno != EINPROGRESS)) {
+        ::freeaddrinfo(res);
         throw qpid::Exception(QPID_MSG(strError(errno) << ": " << host << ":" << port));
+    }
+    ::freeaddrinfo(res);
 }
 
 void



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org