58 switch (WSAGetLastError())
61 case WSANOTINITIALISED:
62 case WSAEINVALIDPROVIDER:
63 case WSAEINVALIDPROCTABLE:
88 case WSAEPROTONOSUPPORT:
90 case WSAESOCKTNOSUPPORT:
120 case WSAEADDRNOTAVAIL:
123 case WSAEHOSTUNREACH:
125 case WSAHOST_NOT_FOUND:
138 (
errmsg_internal(
"unrecognized win32 socket error code: %d", WSAGetLastError())));
159 int typelen =
sizeof(
type);
161 if (getsockopt(s, SOL_SOCKET, SO_TYPE, (
char *) &type, &typelen))
164 return (type == SOCK_DGRAM) ? 1 : 0;
170 static HANDLE waitevent = INVALID_HANDLE_VALUE;
171 static SOCKET current_socket = INVALID_SOCKET;
172 static int isUDP = 0;
177 if (waitevent == INVALID_HANDLE_VALUE)
179 waitevent = CreateEvent(NULL, TRUE, FALSE, NULL);
181 if (waitevent == INVALID_HANDLE_VALUE)
183 (
errmsg_internal(
"could not create socket waiting event: error code %lu", GetLastError())));
185 else if (!ResetEvent(waitevent))
187 (
errmsg_internal(
"could not reset socket waiting event: error code %lu", GetLastError())));
194 if (current_socket != s)
203 if (WSAEventSelect(s, waitevent, what) != 0)
210 events[1] = waitevent;
219 if ((what & FD_WRITE) && isUDP)
223 r = WaitForMultipleObjectsEx(2, events, FALSE, 100, TRUE);
225 if (r == WAIT_TIMEOUT)
234 r = WSASend(s, &buf, 1, &sent, 0, NULL, NULL);
237 WSAEventSelect(s, NULL, 0);
240 else if (WSAGetLastError() != WSAEWOULDBLOCK)
243 WSAEventSelect(s, NULL, 0);
252 r = WaitForMultipleObjectsEx(2, events, FALSE, timeout, TRUE);
254 WSAEventSelect(s, NULL, 0);
256 if (r == WAIT_OBJECT_0 || r == WAIT_IO_COMPLETION)
262 if (r == WAIT_OBJECT_0 + 1)
264 if (r == WAIT_TIMEOUT)
270 (
errmsg_internal(
"unrecognized return value from WaitForMultipleObjects: %d (error code %lu)", r, GetLastError())));
281 unsigned long on = 1;
283 s = WSASocket(af, type, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
284 if (s == INVALID_SOCKET)
287 return INVALID_SOCKET;
290 if (ioctlsocket(s, FIONBIO, &on))
293 return INVALID_SOCKET;
305 res =
bind(s, addr, addrlen);
333 rs = WSAAccept(s, addr, addrlen, NULL, 0);
334 if (rs == INVALID_SOCKET)
337 return INVALID_SOCKET;
349 r = WSAConnect(s, addr, addrlen, NULL, NULL, NULL, NULL);
353 if (WSAGetLastError() != WSAEWOULDBLOCK)
382 r = WSARecv(s, &wbuf, 1, &b, &flags, NULL, NULL);
383 if (r != SOCKET_ERROR)
386 if (WSAGetLastError() != WSAEWOULDBLOCK)
404 for (n = 0; n < 5; n++)
410 r = WSARecv(s, &wbuf, 1, &b, &flags, NULL, NULL);
411 if (r != SOCKET_ERROR)
413 if (WSAGetLastError() != WSAEWOULDBLOCK)
429 (
errmsg_internal(
"could not read from ready socket (after retries)")));
455 wbuf.buf = (
char *) buf;
463 r = WSASend(s, &wbuf, 1, &b, flags, NULL, NULL);
464 if (r != SOCKET_ERROR && b > 0)
468 if (r == SOCKET_ERROR &&
469 WSAGetLastError() != WSAEWOULDBLOCK)
503 pgwin32_select(
int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
const struct timeval *timeout)
505 WSAEVENT events[FD_SETSIZE * 2];
508 SOCKET sockets[FD_SETSIZE * 2];
512 DWORD timeoutval = WSA_INFINITE;
517 Assert(exceptfds == NULL);
522 FD_ZERO(&outreadfds);
523 FD_ZERO(&outwritefds);
535 if (writefds != NULL)
537 for (i = 0; i < writefds->fd_count; i++)
546 r = WSASend(writefds->fd_array[i], &buf, 1, &sent, 0, NULL, NULL);
547 if (r == 0 || WSAGetLastError() != WSAEWOULDBLOCK)
548 FD_SET(writefds->fd_array[i], &outwritefds);
552 if (outwritefds.fd_count > 0)
554 memcpy(writefds, &outwritefds,
sizeof(fd_set));
557 return outwritefds.fd_count;
567 timeoutval = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
572 for (i = 0; i < readfds->fd_count; i++)
574 events[numevents] = WSACreateEvent();
575 sockets[numevents] = readfds->fd_array[
i];
579 if (writefds != NULL)
581 for (i = 0; i < writefds->fd_count; i++)
584 !FD_ISSET(writefds->fd_array[i], readfds))
587 events[numevents] = WSACreateEvent();
588 sockets[numevents] = writefds->fd_array[
i];
594 for (i = 0; i < numevents; i++)
598 if (readfds && FD_ISSET(sockets[i], readfds))
599 flags |= FD_READ | FD_ACCEPT | FD_CLOSE;
601 if (writefds && FD_ISSET(sockets[i], writefds))
602 flags |= FD_WRITE | FD_CLOSE;
604 if (WSAEventSelect(sockets[i], events[i], flags) != 0)
609 WSAEventSelect(sockets[i], NULL, 0);
610 for (i = 0; i < numevents; i++)
611 WSACloseEvent(events[i]);
617 r = WaitForMultipleObjectsEx(numevents + 1, events, FALSE, timeoutval, TRUE);
618 if (r != WAIT_TIMEOUT && r != WAIT_IO_COMPLETION && r != (WAIT_OBJECT_0 + numevents))
624 WSANETWORKEVENTS resEvents;
626 for (i = 0; i < numevents; i++)
628 ZeroMemory(&resEvents,
sizeof(resEvents));
629 if (WSAEnumNetworkEvents(sockets[i], events[i], &resEvents) != 0)
630 elog(
ERROR,
"failed to enumerate network events: error code %u",
633 if (readfds && FD_ISSET(sockets[i], readfds))
635 if ((resEvents.lNetworkEvents & FD_READ) ||
636 (resEvents.lNetworkEvents & FD_ACCEPT) ||
637 (resEvents.lNetworkEvents & FD_CLOSE))
639 FD_SET(sockets[i], &outreadfds);
645 if (writefds && FD_ISSET(sockets[i], writefds))
647 if ((resEvents.lNetworkEvents & FD_WRITE) ||
648 (resEvents.lNetworkEvents & FD_CLOSE))
650 FD_SET(sockets[i], &outwritefds);
659 for (i = 0; i < numevents; i++)
661 WSAEventSelect(sockets[i], NULL, 0);
662 WSACloseEvent(events[i]);
665 if (r == WSA_WAIT_TIMEOUT)
675 if (r == WAIT_OBJECT_0 + numevents || r == WAIT_IO_COMPLETION)
688 memcpy(readfds, &outreadfds,
sizeof(fd_set));
690 memcpy(writefds, &outwritefds,
sizeof(fd_set));
int pgwin32_recv(SOCKET s, char *buf, int len, int f)
int pgwin32_send(SOCKET s, const void *buf, int len, int flags)
SOCKET pgwin32_socket(int af, int type, int protocol)
#define bind(s, addr, addrlen)
#define UNBLOCKED_SIGNAL_QUEUE()
void pg_usleep(long microsec)
HANDLE pgwin32_signal_event
void pgwin32_dispatch_queued_signals(void)
static int pgwin32_poll_signals(void)
SOCKET pgwin32_accept(SOCKET s, struct sockaddr *addr, int *addrlen)
int pgwin32_waitforsinglesocket(SOCKET s, int what, int timeout)
#define ereport(elevel, rest)
static void TranslateSocketError(void)
#define listen(s, backlog)
int pgwin32_connect(SOCKET s, const struct sockaddr *addr, int addrlen)
static int isDataGram(SOCKET s)
int errmsg_internal(const char *fmt,...)
int pgwin32_bind(SOCKET s, struct sockaddr *addr, int addrlen)
#define Assert(condition)
int pgwin32_listen(SOCKET s, int backlog)
int pgwin32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout)