diff --git a/lib/base/application.cpp b/lib/base/application.cpp index d8e040ce8..9cdc27779 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -45,8 +45,11 @@ Application::Application(const Dictionary::Ptr& serializedUpdate) SetErrorMode(SEM_FAILCRITICALERRORS); WSADATA wsaData; - if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) - BOOST_THROW_EXCEPTION(Win32Exception("WSAStartup failed", WSAGetLastError())); + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("WSAStartup") + << errinfo_win32_error(WSAGetLastError())); + } #endif /* _WIN32 */ #ifdef _WIN32 @@ -245,7 +248,9 @@ String Application::GetExePath(const String& argv0) char FullExePath[MAXPATHLEN]; if (!GetModuleFileName(NULL, FullExePath, sizeof(FullExePath))) - BOOST_THROW_EXCEPTION(Win32Exception("GetModuleFileName() failed", GetLastError())); + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("GetModuleFileName") + << errinfo_win32_error(GetLastError())); return FullExePath; #endif /* _WIN32 */ diff --git a/lib/base/exception.h b/lib/base/exception.h index 12f75c6a5..9d3901b57 100644 --- a/lib/base/exception.h +++ b/lib/base/exception.h @@ -43,6 +43,8 @@ typedef boost::error_info StackTraceErrorInfo; class I2_BASE_API posix_error : virtual public std::exception, virtual public boost::exception { }; #ifdef _WIN32 +class I2_BASE_API win32_error : virtual public std::exception, virtual public boost::exception { }; + typedef boost::error_info errinfo_win32_error; inline std::string to_string(const errinfo_win32_error& e) @@ -70,7 +72,7 @@ inline std::string to_string(const errinfo_win32_error& e) } #endif /* _WIN32 */ -class openssl_error : virtual public std::exception, virtual public boost::exception { }; +class I2_BASE_API openssl_error : virtual public std::exception, virtual public boost::exception { }; typedef boost::error_info errinfo_openssl_error; diff --git a/lib/base/socket.cpp b/lib/base/socket.cpp index ba8a74828..5c88e7e40 100644 --- a/lib/base/socket.cpp +++ b/lib/base/socket.cpp @@ -144,14 +144,15 @@ void Socket::HandleException(void) { ObjectLock olock(this); +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("select") -#ifndef _WIN32 - << errinfo_errno(GetError()) + << errinfo_errno(GetError())); #else /* _WIN32 */ - << errinfo_win32_error(GetError()) + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("select") + << errinfo_win32_error(GetError())); #endif /* _WIN32 */ - ); } /** @@ -166,14 +167,15 @@ String Socket::GetAddressFromSockaddr(sockaddr *address, socklen_t len) if (getnameinfo(address, len, host, sizeof(host), service, sizeof(service), NI_NUMERICHOST | NI_NUMERICSERV) < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("getnameinfo") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("getnameinfo") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } stringstream s; @@ -194,14 +196,15 @@ String Socket::GetClientAddress(void) socklen_t len = sizeof(sin); if (getsockname(GetFD(), (sockaddr *)&sin, &len) < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("getsockname") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("getsockname") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } return GetAddressFromSockaddr((sockaddr *)&sin, len); @@ -220,14 +223,15 @@ String Socket::GetPeerAddress(void) socklen_t len = sizeof(sin); if (getpeername(GetFD(), (sockaddr *)&sin, &len) < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("getpeername") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("getpeername") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } return GetAddressFromSockaddr((sockaddr *)&sin, len); @@ -271,14 +275,15 @@ void Socket::ReadThreadProc(void) try { if (rc < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("select") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("select") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } if (FD_ISSET(fd, &readfds)) @@ -337,14 +342,15 @@ void Socket::WriteThreadProc(void) try { if (rc < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("select") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("select") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } if (FD_ISSET(fd, &writefds)) @@ -466,14 +472,15 @@ void Socket::Write(const void *buffer, size_t size) void Socket::Listen(void) { if (listen(GetFD(), SOMAXCONN) < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("listen") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("listen") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } { @@ -523,14 +530,15 @@ void Socket::HandleWritableClient(void) rc = send(GetFD(), data, count, 0); if (rc <= 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("send") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("send") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } m_SendQueue->Read(NULL, rc); @@ -559,14 +567,15 @@ void Socket::HandleReadableClient(void) break; if (rc < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("recv") - #ifndef _WIN32 - << errinfo_errno(errno) - #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) - #endif /* _WIN32 */ - ); + << errinfo_errno(errno)); +#else /* _WIN32 */ + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("recv") + << errinfo_win32_error(WSAGetLastError())); +#endif /* _WIN32 */ } new_data = true; @@ -602,14 +611,15 @@ void Socket::HandleReadableServer(void) fd = accept(GetFD(), (sockaddr *)&addr, &addrlen); if (fd < 0) { + #ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("accept") - #ifndef _WIN32 - << errinfo_errno(errno) + << errinfo_errno(errno)); #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("accept") + << errinfo_win32_error(WSAGetLastError())); #endif /* _WIN32 */ - ); } Socket::Ptr client = boost::make_shared(); diff --git a/lib/base/tcpsocket.cpp b/lib/base/tcpsocket.cpp index ab891b2cd..bf36ca768 100644 --- a/lib/base/tcpsocket.cpp +++ b/lib/base/tcpsocket.cpp @@ -53,14 +53,15 @@ void TcpSocket::Bind(String node, String service, int family) if (getaddrinfo(node.IsEmpty() ? NULL : node.CStr(), service.CStr(), &hints, &result) < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("getaddrinfo") -#ifndef _WIN32 - << errinfo_errno(errno) + << errinfo_errno(errno)); #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("getaddrinfo") + << errinfo_win32_error(WSAGetLastError())); #endif /* _WIN32 */ - ); } int fd = INVALID_SOCKET; @@ -123,14 +124,15 @@ void TcpSocket::Connect(const String& node, const String& service) int rc = getaddrinfo(node.CStr(), service.CStr(), &hints, &result); if (rc < 0) { +#ifndef _WIN32 BOOST_THROW_EXCEPTION(socket_error() << errinfo_api_function("getaddrinfo") -#ifndef _WIN32 - << errinfo_errno(errno) + << errinfo_errno(errno)); #else /* _WIN32 */ - << errinfo_win32_error(WSAGetLastError()) + BOOST_THROW_EXCEPTION(socket_error() + << errinfo_api_function("getaddrinfo") + << errinfo_win32_error(WSAGetLastError())); #endif /* _WIN32 */ - ); } int fd = INVALID_SOCKET; diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index c9ee8ed71..eb2ee2af1 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -278,8 +278,10 @@ String Utility::DirName(const String& path) #else /* _WIN32 */ if (!PathRemoveFileSpec(dir)) { free(dir); - BOOST_THROW_EXCEPTION(Win32Exception("PathRemoveFileSpec() failed", - GetLastError())); + + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("PathRemoveFileSpec") + << errinfo_win32_error(GetLastError())); } result = dir; @@ -420,8 +422,12 @@ Utility::LoadIcingaLibrary(const String& library, bool module) #ifdef _WIN32 HMODULE hModule = LoadLibrary(path.CStr()); - if (hModule == NULL) - BOOST_THROW_EXCEPTION(Win32Exception("LoadLibrary('" + path + "') failed", GetLastError())); + if (hModule == NULL) { + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("LoadLibrary") + << errinfo_win32_error(GetLastError()) + << errinfo_file_name(path)); + } #else /* _WIN32 */ lt_dlhandle hModule = lt_dlopen(path.CStr()); @@ -463,15 +469,21 @@ bool Utility::Glob(const String& pathSpec, const function& if (errorCode == ERROR_FILE_NOT_FOUND) return false; - BOOST_THROW_EXCEPTION(Win32Exception("FindFirstFile() failed", errorCode)); + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("FindFirstFile") + << errinfo_win32_error(errorCode) + << errinfo_file_name(pathSpec)); } do { callback(DirName(pathSpec) + "/" + wfd.cFileName); } while (FindNextFile(handle, &wfd)); - if (!FindClose(handle)) - BOOST_THROW_EXCEPTION(Win32Exception("FindClose() failed", GetLastError())); + if (!FindClose(handle)) { + BOOST_THROW_EXCEPTION(win32_error() + << errinfo_api_function("FindClose") + << errinfo_win32_error(GetLastError())); + } return true; #else /* _WIN32 */