| #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 |