|
|
@@ -31,6 +31,9 @@ |
|
|
|
#include <tchar.h> |
|
|
|
#include <winsock2.h> |
|
|
|
#include <windows.h> |
|
|
|
#include <ws2tcpip.h> |
|
|
|
#else |
|
|
|
#include <netdb.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#include <string.h> |
|
|
@@ -49,38 +52,36 @@ Exception::Exception(const char *format, ...) { |
|
|
|
va_end(ap); |
|
|
|
} |
|
|
|
|
|
|
|
SystemException::SystemException(const char* s, int err_) |
|
|
|
: Exception("%s", s), err(err_) |
|
|
|
GAIException::GAIException(const char* s, int err) |
|
|
|
: Exception("%s", s) |
|
|
|
{ |
|
|
|
strncat(str_, ": ", len-1-strlen(str_)); |
|
|
|
#ifdef _WIN32 |
|
|
|
// Windows error messages are crap, so use unix ones for common errors. |
|
|
|
const char* msg = 0; |
|
|
|
switch (err) { |
|
|
|
case WSAECONNREFUSED: msg = "Connection refused"; break; |
|
|
|
case WSAETIMEDOUT: msg = "Connection timed out"; break; |
|
|
|
case WSAECONNRESET: msg = "Connection reset by peer"; break; |
|
|
|
case WSAECONNABORTED: msg = "Connection aborted"; break; |
|
|
|
} |
|
|
|
if (msg) { |
|
|
|
strncat(str_, msg, len-1-strlen(str_)); |
|
|
|
} else { |
|
|
|
#ifdef UNICODE |
|
|
|
WCHAR* tmsg = new WCHAR[len-strlen(str_)]; |
|
|
|
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
|
|
|
0, err, 0, tmsg, len-1-strlen(str_), 0); |
|
|
|
WideCharToMultiByte(CP_ACP, 0, tmsg, wcslen(tmsg)+1, |
|
|
|
str_+strlen(str_), len-strlen(str_), 0, 0); |
|
|
|
delete [] tmsg; |
|
|
|
wchar_t currStr[len-strlen(str_)]; |
|
|
|
wcsncpy(currStr, gai_strerrorW(err), len-1-strlen(str_)); |
|
|
|
WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_), |
|
|
|
len-1-strlen(str_), 0, 0); |
|
|
|
#else |
|
|
|
char* currStr = str_+strlen(str_); |
|
|
|
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
|
|
|
0, err, 0, currStr, len-1-strlen(str_), 0); |
|
|
|
//FIXME: perhaps print the error number (NNNN) |
|
|
|
strncat(str_, gai_strerror(err), len-1-strlen(str_)); |
|
|
|
#endif |
|
|
|
int l = strlen(str_); |
|
|
|
if ((l >= 2) && (str_[l-2] == '\r') && (str_[l-1] == '\n')) |
|
|
|
} |
|
|
|
|
|
|
|
SystemException::SystemException(const char* s, int err_) |
|
|
|
: Exception("%s", s), err(err_) |
|
|
|
{ |
|
|
|
strncat(str_, ": ", len-1-strlen(str_)); |
|
|
|
#ifdef _WIN32 |
|
|
|
wchar_t *currStr = new wchar_t[len-strlen(str_)]; |
|
|
|
FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
|
|
|
0, err, 0, currStr, len-1-strlen(str_), 0); |
|
|
|
WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_), |
|
|
|
len-1-strlen(str_), 0, 0); |
|
|
|
delete [] currStr; |
|
|
|
|
|
|
|
int l = strlen(str_); |
|
|
|
if ((l >= 2) && (str_[l-2] == '\r') && (str_[l-1] == '\n')) |
|
|
|
str_[l-2] = 0; |
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
strncat(str_, strerror(err), len-1-strlen(str_)); |