libsysutils: Tweak SocketListener and friends
Signed-off-by: San Mehat <san@google.com>
diff --git a/libsysutils/src/SocketClient.cpp b/libsysutils/src/SocketClient.cpp
index 6db62b3..930fa4c 100644
--- a/libsysutils/src/SocketClient.cpp
+++ b/libsysutils/src/SocketClient.cpp
@@ -2,6 +2,7 @@
#include <errno.h>
#include <sys/types.h>
#include <pthread.h>
+#include <string.h>
#define LOG_TAG "SocketClient"
#include <cutils/log.h>
@@ -13,29 +14,55 @@
pthread_mutex_init(&mWriteMutex, NULL);
}
+int SocketClient::sendMsg(int code, char *msg, bool addErrno) {
+ char *buf;
+
+ if (addErrno) {
+ buf = (char *) alloca(strlen(msg) + strlen(strerror(errno)) + 8);
+ sprintf(buf, "%.3d %s (%s)", code, msg, strerror(errno));
+ } else {
+ buf = (char *) alloca(strlen(msg) + strlen("XXX "));
+ sprintf(buf, "%.3d %s", code, msg);
+ }
+ return sendMsg(buf);
+}
+
int SocketClient::sendMsg(char *msg) {
LOGD("SocketClient::sendMsg(%s)", msg);
+
if (mSocket < 0) {
errno = EHOSTUNREACH;
return -1;
}
+ char *bp;
+
+ if (msg[strlen(msg)] != '\n') {
+ bp = (char *) alloca(strlen(msg) + 1);
+ strcpy(bp, msg);
+ strcat(bp, "\n");
+ } else
+ bp = msg;
+
+ int rc = 0;
+ char *p = bp;
+ int brtw = strlen(bp);
+
pthread_mutex_lock(&mWriteMutex);
- if (write(mSocket, msg, strlen(msg) +1) < 0) {
- LOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
+ while(brtw) {
+ if ((rc = write(mSocket,p, brtw)) < 0) {
+ LOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
+ pthread_mutex_unlock(&mWriteMutex);
+ return -1;
+ } else if (!rc) {
+ LOGW("0 length write :(");
+ errno = EIO;
+ pthread_mutex_unlock(&mWriteMutex);
+ return -1;
+ }
+ p += rc;
+ brtw -= rc;
}
pthread_mutex_unlock(&mWriteMutex);
return 0;
}
-
-int SocketClient::sendMsg(char *msg, char *data) {
- char *buffer = (char *) alloca(strlen(msg) + strlen(data) + 1);
- if (!buffer) {
- errno = -ENOMEM;
- return -1;
- }
- strcpy(buffer, msg);
- strcat(buffer, data);
- return sendMsg(buffer);
-}
-