Index: src/platform-posix.cc |
diff --git a/src/platform-posix.cc b/src/platform-posix.cc |
index 3e143d2f6441f78929c4784384e20fbfca85b47b..d942d78a55760ef1c178aaac004100a040d48006 100644 |
--- a/src/platform-posix.cc |
+++ b/src/platform-posix.cc |
@@ -421,7 +421,11 @@ Socket* POSIXSocket::Accept() const { |
return NULL; |
} |
- int socket = accept(socket_, NULL, NULL); |
+ int socket; |
+ do { |
+ socket = accept(socket_, NULL, NULL); |
+ } while (socket == -1 && errno == EINTR); |
+ |
if (socket == -1) { |
return NULL; |
} else { |
@@ -448,7 +452,9 @@ bool POSIXSocket::Connect(const char* host, const char* port) { |
} |
// Connect. |
- status = connect(socket_, result->ai_addr, result->ai_addrlen); |
+ do { |
+ status = connect(socket_, result->ai_addr, result->ai_addrlen); |
+ } while (status == -1 && errno == EINTR); |
freeaddrinfo(result); |
return status == 0; |
} |
@@ -468,14 +474,27 @@ bool POSIXSocket::Shutdown() { |
int POSIXSocket::Send(const char* data, int len) const { |
if (len <= 0) return 0; |
- int status = send(socket_, data, len, 0); |
- return (status < 0) ? 0 : status; |
+ int written = 0; |
+ while (written < len) { |
+ int status = send(socket_, data + written, len - written, 0); |
+ if (status == 0) { |
+ break; |
+ } else if (status > 0) { |
+ written += status; |
+ } else if (errno != EINTR) { |
+ return 0; |
+ } |
+ } |
+ return written; |
} |
int POSIXSocket::Receive(char* data, int len) const { |
if (len <= 0) return 0; |
- int status = recv(socket_, data, len, 0); |
+ int status; |
+ do { |
+ status = recv(socket_, data, len, 0); |
+ } while (status == -1 && errno == EINTR); |
return (status < 0) ? 0 : status; |
} |