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