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