1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <alloca.h>
2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <errno.h>
3fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sys/types.h>
4fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h>
5fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
6fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define LOG_TAG "FrameworkClient"
7fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <cutils/log.h>
8fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sysutils/FrameworkClient.h>
10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
11fa644ffe944c01a9b00f8d7676d58394fabee285San MehatFrameworkClient::FrameworkClient(int socket) {
12fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    mSocket = socket;
13fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_init(&mWriteMutex, NULL);
14fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}
15fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
16db017545796747115b8797f03e662b0f398a7c7bSan Mehatint FrameworkClient::sendMsg(const char *msg) {
17af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    int ret;
18fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    if (mSocket < 0) {
19fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        errno = EHOSTUNREACH;
20fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        return -1;
21fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
22fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
23fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_lock(&mWriteMutex);
24af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    ret = TEMP_FAILURE_RETRY(write(mSocket, msg, strlen(msg) +1));
25af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    if (ret < 0) {
267e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
27fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
28fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_unlock(&mWriteMutex);
29fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    return 0;
30fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}
31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
32db017545796747115b8797f03e662b0f398a7c7bSan Mehatint FrameworkClient::sendMsg(const char *msg, const char *data) {
33af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    size_t bufflen = strlen(msg) + strlen(data) + 1;
34af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    char *buffer = (char *) alloca(bufflen);
35fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    if (!buffer) {
36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        errno = -ENOMEM;
37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat        return -1;
38fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    }
39af91e4ef095d2c770f1aeceafc1c2e66b645a3c4David 'Digit' Turner    snprintf(buffer, bufflen, "%s%s", msg, data);
40fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    return sendMsg(buffer);
41fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}
42fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
43