| 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;
|
| }
|
|
|
|
|