SocketClient.cpp revision db017545796747115b8797f03e662b0f398a7c7b
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;
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
30db017545796747115b8797f03e662b0f398a7c7bSan Mehatint SocketClient::sendMsg(const char *msg) {
31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    if (mSocket < 0) {
32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        errno = EHOSTUNREACH;
33fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        return -1;
34fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
35fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
36db017545796747115b8797f03e662b0f398a7c7bSan Mehat    char *tmp;
37db017545796747115b8797f03e662b0f398a7c7bSan Mehat    const char *bp = msg;
38db017545796747115b8797f03e662b0f398a7c7bSan Mehat
39d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    if (msg[strlen(msg)] != '\n') {
40db017545796747115b8797f03e662b0f398a7c7bSan Mehat        tmp = (char *) alloca(strlen(msg) + 1);
41db017545796747115b8797f03e662b0f398a7c7bSan Mehat        strcpy(tmp, msg);
42db017545796747115b8797f03e662b0f398a7c7bSan Mehat        strcat(tmp, "\n");
43db017545796747115b8797f03e662b0f398a7c7bSan Mehat        bp = tmp;
44db017545796747115b8797f03e662b0f398a7c7bSan Mehat    }
45d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat
46d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    int rc = 0;
47db017545796747115b8797f03e662b0f398a7c7bSan Mehat    const char *p = bp;
48d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    int brtw = strlen(bp);
49d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat
50fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_lock(&mWriteMutex);
51d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat    while(brtw) {
52d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        if ((rc = write(mSocket,p, brtw)) < 0) {
53d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            LOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
54d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            pthread_mutex_unlock(&mWriteMutex);
55d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            return -1;
56d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        } else if (!rc) {
57d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            LOGW("0 length write :(");
58d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            errno = EIO;
59d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            pthread_mutex_unlock(&mWriteMutex);
60d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat            return -1;
61d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        }
62d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        p += rc;
63d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat        brtw -= rc;
64fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
65fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_unlock(&mWriteMutex);
66fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    return 0;
67fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}
68