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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy