diff options
Diffstat (limited to 'libsysutils/src/SocketClient.cpp')
-rw-r--r-- | libsysutils/src/SocketClient.cpp | 55 |
1 files changed, 41 insertions, 14 deletions
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 @@ SocketClient::SocketClient(int socket) { 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); -} - |