SocketClient.cpp revision 30abb7234de2a9caa1add4b00a189436f0b24560
1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <alloca.h> 2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <errno.h> 330abb7234de2a9caa1add4b00a189436f0b24560Kenny Root#include <sys/socket.h> 4fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sys/types.h> 5fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h> 6d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat#include <string.h> 7fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 8fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define LOG_TAG "SocketClient" 9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <cutils/log.h> 10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 11fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <sysutils/SocketClient.h> 12fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 1330abb7234de2a9caa1add4b00a189436f0b24560Kenny RootSocketClient::SocketClient(int socket) 1430abb7234de2a9caa1add4b00a189436f0b24560Kenny Root : mSocket(socket) 1530abb7234de2a9caa1add4b00a189436f0b24560Kenny Root , mPid(-1) 1630abb7234de2a9caa1add4b00a189436f0b24560Kenny Root , mUid(-1) 1730abb7234de2a9caa1add4b00a189436f0b24560Kenny Root , mGid(-1) 1830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root{ 19fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_init(&mWriteMutex, NULL); 2030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 2130abb7234de2a9caa1add4b00a189436f0b24560Kenny Root struct ucred creds; 2230abb7234de2a9caa1add4b00a189436f0b24560Kenny Root socklen_t szCreds = sizeof(creds); 2330abb7234de2a9caa1add4b00a189436f0b24560Kenny Root memset(&creds, 0, szCreds); 2430abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 2530abb7234de2a9caa1add4b00a189436f0b24560Kenny Root int err = getsockopt(socket, SOL_SOCKET, SO_PEERCRED, &creds, &szCreds); 2630abb7234de2a9caa1add4b00a189436f0b24560Kenny Root if (err == 0) { 2730abb7234de2a9caa1add4b00a189436f0b24560Kenny Root mPid = creds.pid; 2830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root mUid = creds.uid; 2930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root mGid = creds.gid; 3030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root } 31fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat} 32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 33db017545796747115b8797f03e662b0f398a7c7bSan Mehatint SocketClient::sendMsg(int code, const char *msg, bool addErrno) { 34d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat char *buf; 3503f0d27f6c49530a91402ed42f8ca4b2fda04b9fSan Mehat 36d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat if (addErrno) { 37d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat buf = (char *) alloca(strlen(msg) + strlen(strerror(errno)) + 8); 38d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat sprintf(buf, "%.3d %s (%s)", code, msg, strerror(errno)); 39d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } else { 40d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat buf = (char *) alloca(strlen(msg) + strlen("XXX ")); 41d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat sprintf(buf, "%.3d %s", code, msg); 42d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } 43d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return sendMsg(buf); 44d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat} 45d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 46db017545796747115b8797f03e662b0f398a7c7bSan Mehatint SocketClient::sendMsg(const char *msg) { 47fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat if (mSocket < 0) { 48fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat errno = EHOSTUNREACH; 49fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat return -1; 50fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat } 51fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 52c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat // Send the message including null character 53d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat int rc = 0; 54c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat const char *p = msg; 55c73a3a5771a2d29d1bae666bfde12f751d66fc96San Mehat int brtw = strlen(msg) + 1; 56d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat 57fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_lock(&mWriteMutex); 58d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat while(brtw) { 59d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat if ((rc = write(mSocket,p, brtw)) < 0) { 607e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Unable to send msg '%s' (%s)", msg, strerror(errno)); 61d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat pthread_mutex_unlock(&mWriteMutex); 62d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return -1; 63d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } else if (!rc) { 647e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("0 length write :("); 65d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat errno = EIO; 66d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat pthread_mutex_unlock(&mWriteMutex); 67d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat return -1; 68d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat } 69d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat p += rc; 70d768066ef54270a0d3ccfccd50ae8238db5a2cddSan Mehat brtw -= rc; 71fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat } 72fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_unlock(&mWriteMutex); 73fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat return 0; 74fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat} 75