#ifndef _SOCKET_CLIENT_H #define _SOCKET_CLIENT_H #include "List.h" #include #include #include class SocketClient { int mSocket; bool mSocketOwned; pthread_mutex_t mWriteMutex; /* Peer process ID */ pid_t mPid; /* Peer user ID */ uid_t mUid; /* Peer group ID */ gid_t mGid; /* Reference count (starts at 1) */ pthread_mutex_t mRefCountMutex; int mRefCount; int mCmdNum; bool mUseCmdNum; public: SocketClient(int sock, bool owned); SocketClient(int sock, bool owned, bool useCmdNum); virtual ~SocketClient(); int getSocket() { return mSocket; } pid_t getPid() const { return mPid; } uid_t getUid() const { return mUid; } gid_t getGid() const { return mGid; } void setCmdNum(int cmdNum) { android_atomic_release_store(cmdNum, &mCmdNum); } int getCmdNum() { return mCmdNum; } // Send null-terminated C strings: int sendMsg(int code, const char *msg, bool addErrno); int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum); // Provides a mechanism to send a response code to the client. // Sends the code and a null character. int sendCode(int code); // Provides a mechanism to send binary data to client. // Sends the code and a null character, followed by 4 bytes of // big-endian length, and the data. int sendBinaryMsg(int code, const void *data, int len); // Sending binary data: int sendData(const void *data, int len); // Optional reference counting. Reference count starts at 1. If // it's decremented to 0, it deletes itself. // SocketListener creates a SocketClient (at refcount 1) and calls // decRef() when it's done with the client. void incRef(); bool decRef(); // returns true at 0 (but note: SocketClient already deleted) // return a new string in quotes with '\\' and '\"' escaped for "my arg" transmissions static char *quoteArg(const char *arg); private: // Send null-terminated C strings int sendMsg(const char *msg); void init(int socket, bool owned, bool useCmdNum); // Sending binary data. The caller should use make sure this is protected // from multiple threads entering simultaneously. // returns 0 if successful, -1 if there is a 0 byte write and -2 if any other // error occurred (use errno to get the error) int sendDataLocked(const void *data, int len); }; typedef android::sysutils::List SocketClientCollection; #endif