SocketClient.h revision 594947793c98e8e7f58f0e9b2cb962c9ef23adeb
1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#ifndef _SOCKET_CLIENT_H 2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define _SOCKET_CLIENT_H 3fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 4b7286aa02e1e554a1ef21a957fabe593f05c1260Mathias Agopian#include "List.h" 5fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 6fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h> 78702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt#include <cutils/atomic.h> 830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root#include <sys/types.h> 9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatclass SocketClient { 11fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int mSocket; 124520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang bool mSocketOwned; 13fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat pthread_mutex_t mWriteMutex; 14fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 1530abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer process ID */ 1630abb7234de2a9caa1add4b00a189436f0b24560Kenny Root pid_t mPid; 1730abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 1830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer user ID */ 1930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root uid_t mUid; 2030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 2130abb7234de2a9caa1add4b00a189436f0b24560Kenny Root /* Peer group ID */ 2230abb7234de2a9caa1add4b00a189436f0b24560Kenny Root gid_t mGid; 2330abb7234de2a9caa1add4b00a189436f0b24560Kenny Root 24648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick /* Reference count (starts at 1) */ 25648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick pthread_mutex_t mRefCountMutex; 26648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick int mRefCount; 27648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick 288702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int mCmdNum; 298702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 308702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt bool mUseCmdNum; 318702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatpublic: 334520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang SocketClient(int sock, bool owned); 348702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt SocketClient(int sock, bool owned, bool useCmdNum); 354520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang virtual ~SocketClient(); 36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat int getSocket() { return mSocket; } 3830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root pid_t getPid() const { return mPid; } 3930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root uid_t getUid() const { return mUid; } 4030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root gid_t getGid() const { return mGid; } 418702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt void setCmdNum(int cmdNum) { android_atomic_release_store(cmdNum, &mCmdNum); } 428702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int getCmdNum() { return mCmdNum; } 43fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 448c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick // Send null-terminated C strings: 45db017545796747115b8797f03e662b0f398a7c7bSan Mehat int sendMsg(int code, const char *msg, bool addErrno); 468702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum); 478c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick 487599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt // Provides a mechanism to send a response code to the client. 497599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt // Sends the code and a null character. 507bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun int sendCode(int code); 517bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun 527599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt // Provides a mechanism to send binary data to client. 537599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt // Sends the code and a null character, followed by 4 bytes of 547bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // big-endian length, and the data. 557bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun int sendBinaryMsg(int code, const void *data, int len); 567bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun 577bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // Sending binary data: 588c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick int sendData(const void *data, int len); 59648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick 60648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // Optional reference counting. Reference count starts at 1. If 61648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // it's decremented to 0, it deletes itself. 62648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // SocketListener creates a SocketClient (at refcount 1) and calls 63648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick // decRef() when it's done with the client. 64648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick void incRef(); 654be4e69f0128b7d9b0a29651ef4b79d806ae3ce7Brad Fitzpatrick bool decRef(); // returns true at 0 (but note: SocketClient already deleted) 668702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt 67594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt // return a new string in quotes with '\\' and '\"' escaped for "my arg" transmissions 68594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt static char *quoteArg(const char *arg); 69594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt 708702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwaltprivate: 718702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt // Send null-terminated C strings 728702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt int sendMsg(const char *msg); 738702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt void init(int socket, bool owned, bool useCmdNum); 747bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun 757bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // Sending binary data. The caller should use make sure this is protected 767bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // from multiple threads entering simultaneously. 777bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // returns 0 if successful, -1 if there is a 0 byte write and -2 if any other 787bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun // error occurred (use errno to get the error) 797bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun int sendDataLocked(const void *data, int len); 80fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat}; 81fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat 82b7286aa02e1e554a1ef21a957fabe593f05c1260Mathias Agopiantypedef android::sysutils::List<SocketClient *> SocketClientCollection; 83fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#endif 84