Misc fixes in error handling.
This commit is contained in:
parent
fed1469ade
commit
08a3ba2ba1
@ -978,6 +978,8 @@ CHECK_SYMBOL_EXISTS(SYS_gettid sys/syscall.h VMIME_HAVE_SYSCALL_GETTID)
|
|||||||
|
|
||||||
CHECK_SYMBOL_EXISTS(SO_KEEPALIVE sys/socket.h VMIME_HAVE_SO_KEEPALIVE)
|
CHECK_SYMBOL_EXISTS(SO_KEEPALIVE sys/socket.h VMIME_HAVE_SO_KEEPALIVE)
|
||||||
|
|
||||||
|
CHECK_SYMBOL_EXISTS(strerror_r string.h VMIME_HAVE_STRERROR_R)
|
||||||
|
|
||||||
FIND_PACKAGE(Threads)
|
FIND_PACKAGE(Threads)
|
||||||
|
|
||||||
IF(VMIME_BUILD_SHARED_LIBRARY)
|
IF(VMIME_BUILD_SHARED_LIBRARY)
|
||||||
|
@ -84,6 +84,7 @@ typedef unsigned @VMIME_64BIT_TYPE@ vmime_uint64;
|
|||||||
#cmakedefine01 VMIME_HAVE_GMTIME_R
|
#cmakedefine01 VMIME_HAVE_GMTIME_R
|
||||||
#cmakedefine01 VMIME_HAVE_LOCALTIME_S
|
#cmakedefine01 VMIME_HAVE_LOCALTIME_S
|
||||||
#cmakedefine01 VMIME_HAVE_LOCALTIME_R
|
#cmakedefine01 VMIME_HAVE_LOCALTIME_R
|
||||||
|
#cmakedefine01 VMIME_HAVE_STRERROR_R
|
||||||
#cmakedefine01 VMIME_HAVE_MLANG
|
#cmakedefine01 VMIME_HAVE_MLANG
|
||||||
#cmakedefine01 VMIME_HAVE_SO_KEEPALIVE
|
#cmakedefine01 VMIME_HAVE_SO_KEEPALIVE
|
||||||
#cmakedefine01 VMIME_SHARED_PTR_USE_CXX
|
#cmakedefine01 VMIME_SHARED_PTR_USE_CXX
|
||||||
|
@ -421,10 +421,28 @@ void posixSocket::resolve(struct ::addrinfo** addrInfo, const vmime::string& add
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (gaiError != EAI_AGAIN)
|
else if (gaiError != EAI_AGAIN)
|
||||||
|
{
|
||||||
|
if (gaiError == EAI_SYSTEM)
|
||||||
|
{
|
||||||
|
if (errno != 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
throwSocketError(errno);
|
||||||
|
}
|
||||||
|
catch (exceptions::socket_exception& e)
|
||||||
|
{
|
||||||
|
throw vmime::exceptions::connection_error
|
||||||
|
("Error while connecting socket.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
throw vmime::exceptions::connection_error
|
throw vmime::exceptions::connection_error
|
||||||
("gai_suspend() failed: " + std::string(gai_strerror(gaiError)));
|
("gai_suspend() failed: " + std::string(gai_strerror(gaiError)));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check for timeout
|
// Check for timeout
|
||||||
if (m_timeoutHandler && m_timeoutHandler->isTimeOut())
|
if (m_timeoutHandler && m_timeoutHandler->isTimeOut())
|
||||||
@ -797,7 +815,7 @@ size_t posixSocket::sendRawNonBlocking(const byte_t* buffer, const size_t count)
|
|||||||
|
|
||||||
void posixSocket::throwSocketError(const int err)
|
void posixSocket::throwSocketError(const int err)
|
||||||
{
|
{
|
||||||
string msg;
|
const char* msg = NULL;
|
||||||
|
|
||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
@ -815,19 +833,46 @@ void posixSocket::throwSocketError(const int err)
|
|||||||
case EMSGSIZE: msg = "EMSGSIZE: message cannot be sent atomically"; break;
|
case EMSGSIZE: msg = "EMSGSIZE: message cannot be sent atomically"; break;
|
||||||
case ENOBUFS: msg = "ENOBUFS: output queue is full"; break;
|
case ENOBUFS: msg = "ENOBUFS: output queue is full"; break;
|
||||||
case ENOMEM: msg = "ENOMEM: out of memory"; break;
|
case ENOMEM: msg = "ENOMEM: out of memory"; break;
|
||||||
case EPIPE:
|
case EPIPE: msg = "EPIPE: broken pipe"; break;
|
||||||
case ENOTCONN: msg = "ENOTCONN: not connected"; break;
|
case ENOTCONN: msg = "ENOTCONN: not connected"; break;
|
||||||
case ECONNREFUSED: msg = "ECONNREFUSED: connection refused"; break;
|
case ECONNREFUSED: msg = "ECONNREFUSED: connection refused"; break;
|
||||||
default:
|
|
||||||
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << ::strerror(err);
|
|
||||||
|
|
||||||
msg = oss.str();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (msg)
|
||||||
|
{
|
||||||
throw exceptions::socket_exception(msg);
|
throw exceptions::socket_exception(msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
// Use strerror() to get string describing error number
|
||||||
|
|
||||||
|
#if VMIME_HAVE_STRERROR_R
|
||||||
|
|
||||||
|
char errbuf[512];
|
||||||
|
|
||||||
|
#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE
|
||||||
|
|
||||||
|
// XSI-compliant strerror_r()
|
||||||
|
strerror_r(err, errbuf, sizeof(errbuf));
|
||||||
|
throw exceptions::socket_exception(errbuf);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// GNU-specific strerror_r()
|
||||||
|
const std::string strmsg(strerror_r(err, errbuf, sizeof(errbuf)));
|
||||||
|
throw exceptions::socket_exception(strmsg);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else // !VMIME_HAVE_STRERROR_R
|
||||||
|
|
||||||
|
const std::string strmsg(strerror(err));
|
||||||
|
throw exceptions::socket_exception(strmsg);
|
||||||
|
|
||||||
|
#endif // VMIME_HAVE_STRERROR_R
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user