diff -cr postgresql-newsignal/src/backend/port/win32/socket.c postgresql-errcodefix/src/backend/port/win32/socket.c *** postgresql-newsignal/src/backend/port/win32/socket.c Mon Apr 19 21:49:34 2004 --- postgresql-errcodefix/src/backend/port/win32/socket.c Mon Apr 19 21:33:16 2004 *************** *** 431,433 **** --- 431,466 ---- memcpy(writefds, &outwritefds, sizeof(fd_set)); return nummatches; } + + + + /* + * Return win32 error string, since strerror can't + * handle winsock codes + */ + static char wserrbuf[256]; + const char * + pgwin32_socket_strerror(int err) + { + static HANDLE handleDLL = INVALID_HANDLE_VALUE; + + if (handleDLL == INVALID_HANDLE_VALUE) { + handleDLL = LoadLibraryEx("netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); + if (handleDLL == NULL) + ereport(FATAL, + (errmsg_internal("Failed to load netmsg.dll: %i",(int)GetLastError()))); + } + + ZeroMemory(&wserrbuf, sizeof(wserrbuf)); + if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE, + handleDLL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + wserrbuf, + sizeof(wserrbuf)-1, + NULL) == 0) { + /* Failed to get id */ + sprintf(wserrbuf,"Unknown winsock error %i",err); + } + return wserrbuf; + } diff -cr postgresql-newsignal/src/backend/utils/error/elog.c postgresql-errcodefix/src/backend/utils/error/elog.c *** postgresql-newsignal/src/backend/utils/error/elog.c Mon Apr 19 21:49:12 2004 --- postgresql-errcodefix/src/backend/utils/error/elog.c Mon Apr 19 21:19:50 2004 *************** *** 1604,1609 **** --- 1604,1614 ---- static char errorstr_buf[48]; const char *str; + #ifdef WIN32 + /* Winsock error code range, per WinError.h */ + if (errnum >= 10000 && errnum <= 11999) + return pgwin32_socket_strerror(errnum); + #endif str = strerror(errnum); /* diff -cr postgresql-newsignal/src/include/port/win32.h postgresql-errcodefix/src/include/port/win32.h *** postgresql-newsignal/src/include/port/win32.h Mon Apr 19 21:50:24 2004 --- postgresql-errcodefix/src/include/port/win32.h Mon Apr 19 21:34:15 2004 *************** *** 138,143 **** --- 138,145 ---- int pgwin32_select(int nfds, fd_set* readfs, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout); int pgwin32_recv(SOCKET s, char* buf, int len, int flags); int pgwin32_send(SOCKET s, char* buf, int len, int flags); + + const char *pgwin32_socket_strerror(int err); #endif