
Commit 5579388d removed code that supplied a fallback implementation of getaddrinfo(), which was dead code on modern systems. One tiny piece of the removed code was still doing something useful on Windows, though: that OS's own gai_strerror()/gai_strerrorA() function returns a pointer to a static buffer that it overwrites each time, so it's not thread-safe. In rare circumstances, a multi-threaded client program could get an incorrect or corrupted error message. Restore the replacement gai_strerror() function, though now that it's only for Windows we can put it into a win32-specific file and cut it down to the errors that Windows documents. The error messages here are taken from FreeBSD, because Windows' own messages seemed too verbose. Back-patch to 16. Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://postgr.es/m/CA%2BhUKGKz%2BF9d2PTiXwfYV7qJw%2BWg2jzACgSDgPizUw7UG%3Di58A%40mail.gmail.com
35 lines
746 B
C
35 lines
746 B
C
/*
|
|
* src/include/port/win32/sys/socket.h
|
|
*/
|
|
#ifndef WIN32_SYS_SOCKET_H
|
|
#define WIN32_SYS_SOCKET_H
|
|
|
|
/*
|
|
* Unfortunately, <wingdi.h> of VC++ also defines ERROR.
|
|
* To avoid the conflict, we include <windows.h> here and undefine ERROR
|
|
* immediately.
|
|
*
|
|
* Note: Don't include <wingdi.h> directly. It causes compile errors.
|
|
*/
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#include <windows.h>
|
|
|
|
#undef ERROR
|
|
#undef small
|
|
|
|
/* Restore old ERROR value */
|
|
#ifdef PGERROR
|
|
#define ERROR PGERROR
|
|
#endif
|
|
|
|
/*
|
|
* We don't use the Windows gai_strerror[A] function because it is not
|
|
* thread-safe. We define our own in src/port/win32gai_strerror.c.
|
|
*/
|
|
#undef gai_strerror
|
|
|
|
extern const char *gai_strerror(int ecode);
|
|
|
|
#endif /* WIN32_SYS_SOCKET_H */
|