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
17db017545796747115b8797f03e662b0f398a7c7bSan Mehatint SocketClient::sendMsg(int code, const char *msg, bool addErrno) {
18d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    char *buf;
1903f0d27f6c49530a91402ed42f8ca4b2fda04b9fSan 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
30db017545796747115b8797f03e662b0f398a7c7bSan Mehatint SocketClient::sendMsg(const char *msg) {
31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    if (mSocket < 0) {
32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        errno = EHOSTUNREACH;
33fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        return -1;
34fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
35fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
36c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat    // Send the message including null character
37d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    int rc = 0;
38c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat    const char *p = msg;
39c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat    int brtw = strlen(msg) + 1;
40d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat
41fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_lock(&mWriteMutex);
42d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    while(brtw) {
43d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        if ((rc = write(mSocket,p, brtw)) < 0) {
447e8529a8b528fd30586aa037f15a31b29582c537San Mehat            SLOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
45d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            pthread_mutex_unlock(&mWriteMutex);
46d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            return -1;
47d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        } else if (!rc) {
487e8529a8b528fd30586aa037f15a31b29582c537San Mehat            SLOGW("0 length write :(");
49d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            errno = EIO;
50d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            pthread_mutex_unlock(&mWriteMutex);
51d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            return -1;
52d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        }
53d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        p += rc;
54d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        brtw -= rc;
55fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
56fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_unlock(&mWriteMutex);
57fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    return 0;
58fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}
59