SocketClient.cpp revision d768066ef54270a0d3ccfccd50ae8238db5a2cdd
1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <alloca.h> 2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <errno.h> 3fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sys/types.h> 4fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h> 5d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat#include <string.h> 6fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 7fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define LOG_TAG "SocketClient" 8fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <cutils/log.h> 9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sysutils/SocketClient.h> 11fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 12fa644ffe944c01a9b00f8d7676d58394fabee285San MehatSocketClient::SocketClient(int socket) { 13fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat mSocket = socket; 14fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_init(&mWriteMutex, NULL); 15fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat} 16fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 17d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehatint SocketClient::sendMsg(int code, char *msg, bool addErrno) { 18d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat char *buf; 19d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 20d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat if (addErrno) { 21d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat buf = (char *) alloca(strlen(msg) + strlen(strerror(errno)) + 8); 22d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat sprintf(buf, "%.3d %s (%s)", code, msg, strerror(errno)); 23d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } else { 24d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat buf = (char *) alloca(strlen(msg) + strlen("XXX ")); 25d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat sprintf(buf, "%.3d %s", code, msg); 26d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } 27d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return sendMsg(buf); 28d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat} 29d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 30fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatint SocketClient::sendMsg(char *msg) { 31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat LOGD("SocketClient::sendMsg(%s)", msg); 32d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 33fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat if (mSocket < 0) { 34fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat errno = EHOSTUNREACH; 35fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat return -1; 36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat } 37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 38d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat char *bp; 39d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 40d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat if (msg[strlen(msg)] != '\n') { 41d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat bp = (char *) alloca(strlen(msg) + 1); 42d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat strcpy(bp, msg); 43d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat strcat(bp, "\n"); 44d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } else 45d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat bp = msg; 46d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 47d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat int rc = 0; 48d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat char *p = bp; 49d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat int brtw = strlen(bp); 50d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 51fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_lock(&mWriteMutex); 52d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat while(brtw) { 53d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat if ((rc = write(mSocket,p, brtw)) < 0) { 54d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat LOGW("Unable to send msg '%s' (%s)", msg, strerror(errno)); 55d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat pthread_mutex_unlock(&mWriteMutex); 56d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return -1; 57d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } else if (!rc) { 58d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat LOGW("0 length write :("); 59d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat errno = EIO; 60d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat pthread_mutex_unlock(&mWriteMutex); 61d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return -1; 62d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } 63d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat p += rc; 64d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat brtw -= rc; 65fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat } 66fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_unlock(&mWriteMutex); 67fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat return 0; 68fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat} 69