summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid 'Digit' Turner <digit@google.com>2011-01-17 02:34:15 +0100
committerDavid 'Digit' Turner <digit@google.com>2011-01-19 02:18:40 +0100
commitaf61509b50bc110b0c7c4691e37873cc0987ab5c (patch)
tree9c9a2829e43dcdd2770e3a51ab145c83ae9635c0
parentaf174f0039bf462c36b89fd1439a44c60c4b89c9 (diff)
downloadsystem_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.cpp42
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;