#ifndef _SOCKET_CLIENT_H #define _SOCKET_CLIENT_H #include "List.h" #include <pthread.h> #include <cutils/atomic.h> #include <sys/types.h> #include <sys/uio.h> 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); int sendMsg(const char *msg); // 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); // iovec contents not preserved through call int sendDatav(struct iovec *iov, int iovcnt); // 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: void init(int socket, bool owned, bool useCmdNum); // Sending binary data. The caller should make sure this is protected // from multiple threads entering simultaneously. // returns 0 if successful, -1 if there is a 0 byte write or if any // other error occurred (use errno to get the error) int sendDataLockedv(struct iovec *iov, int iovcnt); }; typedef android::sysutils::List<SocketClient *> SocketClientCollection; #endif