summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/err.cpp2
-rw-r--r--src/surveyor.cpp12
2 files changed, 11 insertions, 3 deletions
diff --git a/src/err.cpp b/src/err.cpp
index e330ed2..a771030 100644
--- a/src/err.cpp
+++ b/src/err.cpp
@@ -157,7 +157,7 @@ const char *xs::wsa_error_no (int no_)
(no_ == WSAETOOMANYREFS) ?
"Too many references can't splice" :
(no_ == WSAETIMEDOUT) ?
- "Connection timed out" :
+ "Operation timed out" :
(no_ == WSAECONNREFUSED) ?
"Connection refused" :
(no_ == WSAELOOP) ?
diff --git a/src/surveyor.cpp b/src/surveyor.cpp
index b72b91b..bd19b8a 100644
--- a/src/surveyor.cpp
+++ b/src/surveyor.cpp
@@ -92,8 +92,16 @@ int xs::surveyor_t::xrecv (msg_t *msg_, int flags_)
// Get the first part of the response -- the survey ID.
rc = xsurveyor_t::xrecv (msg_, flags_);
- if (rc != 0)
- return rc;
+ if (rc != 0) {
+ if (errno != EAGAIN)
+ return -1;
+
+ // In case of AGAIN we should check whether the survey timeout expired.
+ // If so, we should return ETIMEDOUT so that user is able to
+ // distinguish survey timeout from RCVTIMEO-caused timeout.
+ errno = now_ms () >= timeout ? ETIMEDOUT : EAGAIN;
+ return -1;
+ }
// Check whether this is response for the onging survey. If not, we can
// drop the response.