aboutsummaryrefslogtreecommitdiff
path: root/src/util/sock.cpp
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2021-05-04 12:06:44 +0200
committerVasil Dimov <vd@FreeBSD.org>2022-06-09 13:34:27 +0200
commitcc74459768063a923fb6220a4f420eaf211aee7b (patch)
treed0d044422b29af67de3f064963024210f66c89d5 /src/util/sock.cpp
parente18fd4763e77d1e19208effa9f1a08c5b29fea8e (diff)
downloadbitcoin-cc74459768063a923fb6220a4f420eaf211aee7b.tar.xz
net: also wait for exceptional events in Sock::Wait()
This mimics closely `CConnman::SocketEvents()` and the underlying `poll(2)`.
Diffstat (limited to 'src/util/sock.cpp')
-rw-r--r--src/util/sock.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/util/sock.cpp b/src/util/sock.cpp
index 3579af4458..8b86cf74ab 100644
--- a/src/util/sock.cpp
+++ b/src/util/sock.cpp
@@ -136,6 +136,9 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occur
if (fd.revents & POLLOUT) {
*occurred |= SEND;
}
+ if (fd.revents & (POLLERR | POLLHUP)) {
+ *occurred |= ERR;
+ }
}
return true;
@@ -146,8 +149,10 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occur
fd_set fdset_recv;
fd_set fdset_send;
+ fd_set fdset_err;
FD_ZERO(&fdset_recv);
FD_ZERO(&fdset_send);
+ FD_ZERO(&fdset_err);
if (requested & RECV) {
FD_SET(m_socket, &fdset_recv);
@@ -157,9 +162,11 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occur
FD_SET(m_socket, &fdset_send);
}
+ FD_SET(m_socket, &fdset_err);
+
timeval timeout_struct = MillisToTimeval(timeout);
- if (select(m_socket + 1, &fdset_recv, &fdset_send, nullptr, &timeout_struct) == SOCKET_ERROR) {
+ if (select(m_socket + 1, &fdset_recv, &fdset_send, &fdset_err, &timeout_struct) == SOCKET_ERROR) {
return false;
}
@@ -171,6 +178,9 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, Event* occur
if (FD_ISSET(m_socket, &fdset_send)) {
*occurred |= SEND;
}
+ if (FD_ISSET(m_socket, &fdset_err)) {
+ *occurred |= ERR;
+ }
}
return true;