diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2020-10-28 11:24:09 +0100 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2020-10-28 11:24:09 +0100 |
commit | 04e1872b5373a4b0bde548e9e42a6c2fc74c7e5d (patch) | |
tree | 545756853af063238b61e86c6166f895cf3cda0f /lib | |
parent | 425d891ad3d04085d9e16893d6e5e580eb68982b (diff) | |
download | dabmod-04e1872b5373a4b0bde548e9e42a6c2fc74c7e5d.tar.gz dabmod-04e1872b5373a4b0bde548e9e42a6c2fc74c7e5d.tar.bz2 dabmod-04e1872b5373a4b0bde548e9e42a6c2fc74c7e5d.zip |
common 81f518d: TCPSocket: let recv throw Interrupted on EINTR
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Socket.cpp | 9 | ||||
-rw-r--r-- | lib/Socket.h | 6 |
2 files changed, 10 insertions, 5 deletions
diff --git a/lib/Socket.cpp b/lib/Socket.cpp index bc1b179..d41ed1c 100644 --- a/lib/Socket.cpp +++ b/lib/Socket.cpp @@ -630,8 +630,13 @@ ssize_t TCPSocket::recv(void *buffer, size_t length, int flags) { ssize_t ret = ::recv(m_sock, buffer, length, flags); if (ret == -1) { - std::string errstr(strerror(errno)); - throw std::runtime_error("TCP receive error: " + errstr); + if (errno == EINTR) { + throw Interrupted(); + } + else { + std::string errstr(strerror(errno)); + throw std::runtime_error("TCP receive error: " + errstr); + } } return ret; } diff --git a/lib/Socket.h b/lib/Socket.h index 8c6f8a9..8881be3 100644 --- a/lib/Socket.h +++ b/lib/Socket.h @@ -180,12 +180,12 @@ class TCPSocket { */ ssize_t send(const void* data, size_t size, int timeout_ms=0); - /* Returns number of bytes read, 0 on disconnect. Throws a - * runtime_error on error */ + class Interrupted {}; + /* Returns number of bytes read, 0 on disconnect. + * Throws Interrupted on EINTR, runtime_error on error */ ssize_t recv(void *buffer, size_t length, int flags); class Timeout {}; - class Interrupted {}; /* Returns number of bytes read, 0 on disconnect or refused connection. * Throws a Timeout on timeout, Interrupted on EINTR, a runtime_error * on error |