diff options
author | David 'Digit' Turner <digit@google.com> | 2011-01-17 02:34:15 +0100 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2011-01-19 02:18:40 +0100 |
commit | af61509b50bc110b0c7c4691e37873cc0987ab5c (patch) | |
tree | 9c9a2829e43dcdd2770e3a51ab145c83ae9635c0 | |
parent | af174f0039bf462c36b89fd1439a44c60c4b89c9 (diff) | |
download | system_core-af61509b50bc110b0c7c4691e37873cc0987ab5c.zip system_core-af61509b50bc110b0c7c4691e37873cc0987ab5c.tar.gz system_core-af61509b50bc110b0c7c4691e37873cc0987ab5c.tar.bz2 |
libsysutils: Handle EINTR in SocketClient::sendData()
+ Improve allocation code in sendMsg(code,msg,addErrno)
Change-Id: Ib5fe84bec1a167c369e7ba759acea395e832f6b5
-rw-r--r-- | libsysutils/src/SocketClient.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/libsysutils/src/SocketClient.cpp b/libsysutils/src/SocketClient.cpp index c9c7417..a6aed26 100644 --- a/libsysutils/src/SocketClient.cpp +++ b/libsysutils/src/SocketClient.cpp @@ -32,14 +32,24 @@ SocketClient::SocketClient(int socket) int SocketClient::sendMsg(int code, const char *msg, bool addErrno) { char *buf; + const char* arg; + const char* fmt; + char tmp[1]; + int len; if (addErrno) { - buf = (char *) alloca(strlen(msg) + strlen(strerror(errno)) + 8); - sprintf(buf, "%.3d %s (%s)", code, msg, strerror(errno)); + fmt = "%.3d %s (%s)"; + arg = strerror(errno); } else { - buf = (char *) alloca(strlen(msg) + strlen("XXX ")); - sprintf(buf, "%.3d %s", code, msg); + fmt = "%.3d %s"; + arg = NULL; } + /* Measure length of required buffer */ + len = snprintf(tmp, sizeof tmp, fmt, code, msg, arg); + /* Allocate in the stack, then write to it */ + buf = (char*)alloca(len+1); + snprintf(buf, len+1, fmt, code, msg, arg); + /* Send the zero-terminated message */ return sendMsg(buf); } @@ -68,18 +78,24 @@ int SocketClient::sendData(const void* data, int len) { pthread_mutex_lock(&mWriteMutex); while (brtw > 0) { - if ((rc = write(mSocket, p, brtw)) < 0) { - SLOGW("write error (%s)", strerror(errno)); - pthread_mutex_unlock(&mWriteMutex); - return -1; - } else if (!rc) { + rc = write(mSocket, p, brtw); + if (rc > 0) { + p += rc; + brtw -= rc; + continue; + } + + if (rc < 0 && errno == EINTR) + continue; + + pthread_mutex_unlock(&mWriteMutex); + if (rc == 0) { SLOGW("0 length write :("); errno = EIO; - pthread_mutex_unlock(&mWriteMutex); - return -1; + } else { + SLOGW("write error (%s)", strerror(errno)); } - p += rc; - brtw -= rc; + return -1; } pthread_mutex_unlock(&mWriteMutex); return 0; |