Skip to content

Commit b00d50d

Browse files
committed
Per discussion earlier today, here is a fix that lets ereport() on win32
report socket errors. Magnus Hagander
1 parent a4d9d3e commit b00d50d

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

src/backend/port/win32/socket.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
77
*
88
* IDENTIFICATION
9-
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.1 2004/04/12 16:19:18 momjian Exp $
9+
* $PostgreSQL: pgsql/src/backend/port/win32/socket.c,v 1.2 2004/04/22 03:50:54 momjian Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -432,3 +432,35 @@ int pgwin32_select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfd
432432
return nummatches;
433433
}
434434

435+
436+
/*
437+
* Return win32 error string, since strerror can't
438+
* handle winsock codes
439+
*/
440+
static char wserrbuf[256];
441+
const char *
442+
pgwin32_socket_strerror(int err)
443+
{
444+
static HANDLE handleDLL = INVALID_HANDLE_VALUE;
445+
446+
if (handleDLL == INVALID_HANDLE_VALUE) {
447+
handleDLL = LoadLibraryEx("netmsg.dll", NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE);
448+
if (handleDLL == NULL)
449+
ereport(FATAL,
450+
(errmsg_internal("Failed to load netmsg.dll: %i",(int)GetLastError())));
451+
}
452+
453+
ZeroMemory(&wserrbuf, sizeof(wserrbuf));
454+
if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE,
455+
handleDLL,
456+
err,
457+
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
458+
wserrbuf,
459+
sizeof(wserrbuf)-1,
460+
NULL) == 0) {
461+
/* Failed to get id */
462+
sprintf(wserrbuf,"Unknown winsock error %i",err);
463+
}
464+
return wserrbuf;
465+
}
466+

src/backend/utils/error/elog.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*
3838
*
3939
* IDENTIFICATION
40-
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.134 2004/04/16 12:59:05 momjian Exp $
40+
* $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.135 2004/04/22 03:51:09 momjian Exp $
4141
*
4242
*-------------------------------------------------------------------------
4343
*/
@@ -1661,6 +1661,11 @@ useful_strerror(int errnum)
16611661
static char errorstr_buf[48];
16621662
const char *str;
16631663

1664+
#ifdef WIN32
1665+
/* Winsock error code range, per WinError.h */
1666+
if (errnum >= 10000 && errnum <= 11999)
1667+
return pgwin32_socket_strerror(errnum);
1668+
#endif
16641669
str = strerror(errnum);
16651670

16661671
/*

src/include/port/win32.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.22 2004/04/19 17:42:59 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.23 2004/04/22 03:51:24 momjian Exp $ */
22

33
/* undefine and redefine after #include */
44
#undef mkdir
@@ -139,6 +139,8 @@ int pgwin32_connect(SOCKET s, const struct sockaddr* name, int namelen);
139139
int pgwin32_select(int nfds, fd_set* readfs, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout);
140140
int pgwin32_recv(SOCKET s, char* buf, int len, int flags);
141141
int pgwin32_send(SOCKET s, char* buf, int len, int flags);
142+
143+
const char *pgwin32_socket_strerror(int err);
142144
#endif
143145

144146

0 commit comments

Comments
 (0)