Added support for getaddrinfo() on POSIX.
This commit is contained in:
parent
d906896132
commit
69e0083549
@ -2,6 +2,11 @@
|
|||||||
VERSION 0.8.1cvs
|
VERSION 0.8.1cvs
|
||||||
================
|
================
|
||||||
|
|
||||||
|
2005-12-26 Vincent Richard <vincent@vincent-richard.net>
|
||||||
|
|
||||||
|
* posixSocket.cpp: use getaddrinfo() if available. This should bring
|
||||||
|
thread-safe DNS resolution and IPv6 support.
|
||||||
|
|
||||||
2005-12-18 Vincent Richard <vincent@vincent-richard.net>
|
2005-12-18 Vincent Richard <vincent@vincent-richard.net>
|
||||||
|
|
||||||
* IMAPParser.hpp: compatibility bugs + enhanced debugging trace.
|
* IMAPParser.hpp: compatibility bugs + enhanced debugging trace.
|
||||||
|
11
SConstruct
11
SConstruct
@ -827,6 +827,10 @@ if IsProtocolSupported(messaging_protocols, 'sendmail'):
|
|||||||
|
|
||||||
config_hpp.write("""
|
config_hpp.write("""
|
||||||
|
|
||||||
|
// Additional defines
|
||||||
|
#define VMIME_HAVE_GETADDRINFO 1
|
||||||
|
|
||||||
|
|
||||||
#endif // VMIME_CONFIG_HPP_INCLUDED
|
#endif // VMIME_CONFIG_HPP_INCLUDED
|
||||||
""")
|
""")
|
||||||
|
|
||||||
@ -1661,10 +1665,17 @@ AC_PATH_PROG(SENDMAIL, sendmail, /usr/sbin/sendmail, /usr/sbin:/usr/lib)
|
|||||||
# Detect some platform-specific stuff
|
# Detect some platform-specific stuff
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# -- MLang (Windows)
|
||||||
if test "x$VMIME_DETECT_PLATFORM" = "xwindows"; then
|
if test "x$VMIME_DETECT_PLATFORM" = "xwindows"; then
|
||||||
AC_CHECK_HEADER(mlang.h, [VMIME_ADDITIONAL_DEFINES="$VMIME_ADDITIONAL_DEFINES HAVE_MLANG_H"])
|
AC_CHECK_HEADER(mlang.h, [VMIME_ADDITIONAL_DEFINES="$VMIME_ADDITIONAL_DEFINES HAVE_MLANG_H"])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# -- getaddrinfo (POSIX)
|
||||||
|
if test "x$VMIME_DETECT_PLATFORM" = "xposix"; then
|
||||||
|
AC_CHECK_HEADERS(netdb.h sys/types.h sys/socket.h,)
|
||||||
|
AC_CHECK_FUNC(getaddrinfo, [VMIME_ADDITIONAL_DEFINES="$VMIME_ADDITIONAL_DEFINES HAVE_GETADDRINFO"])
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
@ -67,6 +67,65 @@ void posixSocket::connect(const vmime::string& address, const vmime::port_t port
|
|||||||
m_desc = -1;
|
m_desc = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if VMIME_HAVE_GETADDRINFO // use thread-safe and IPv6-aware getaddrinfo() if available
|
||||||
|
|
||||||
|
// Resolve address, if needed
|
||||||
|
struct ::addrinfo hints;
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
|
||||||
|
hints.ai_flags = AI_CANONNAME;
|
||||||
|
hints.ai_family = PF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
|
std::ostringstream portStr;
|
||||||
|
portStr << port;
|
||||||
|
|
||||||
|
struct ::addrinfo* res0;
|
||||||
|
|
||||||
|
if (::getaddrinfo(address.c_str(), portStr.str().c_str(), &hints, &res0) != 0)
|
||||||
|
{
|
||||||
|
// Error: cannot resolve address
|
||||||
|
throw vmime::exceptions::connection_error("Cannot resolve address.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to host
|
||||||
|
int sock = -1;
|
||||||
|
struct ::addrinfo* res = res0;
|
||||||
|
|
||||||
|
for ( ; sock == -1 && res != NULL ; res = res->ai_next)
|
||||||
|
{
|
||||||
|
sock = ::socket(res->ai_family, res->ai_socktype, res->ai_protocol);
|
||||||
|
|
||||||
|
if (sock < 0)
|
||||||
|
continue; // try next
|
||||||
|
|
||||||
|
if (::connect(sock, res->ai_addr, res->ai_addrlen) < 0)
|
||||||
|
{
|
||||||
|
::close(sock);
|
||||||
|
sock = -1;
|
||||||
|
continue; // try next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::freeaddrinfo(res0);
|
||||||
|
|
||||||
|
if (sock == -1)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
throwSocketError(errno);
|
||||||
|
}
|
||||||
|
catch (exceptions::socket_exception& e)
|
||||||
|
{
|
||||||
|
throw vmime::exceptions::connection_error
|
||||||
|
("Error while connecting socket.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_desc = sock;
|
||||||
|
|
||||||
|
#else // !VMIME_HAVE_GETADDRINFO
|
||||||
|
|
||||||
// Resolve address
|
// Resolve address
|
||||||
::sockaddr_in addr;
|
::sockaddr_in addr;
|
||||||
|
|
||||||
@ -123,6 +182,8 @@ void posixSocket::connect(const vmime::string& address, const vmime::port_t port
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // VMIME_HAVE_GETADDRINFO
|
||||||
|
|
||||||
::fcntl(m_desc, F_SETFL, ::fcntl(m_desc, F_GETFL) | O_NONBLOCK);
|
::fcntl(m_desc, F_SETFL, ::fcntl(m_desc, F_GETFL) | O_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user