1 #ifndef _SOCKET_CLIENT_H
2 #define _SOCKET_CLIENT_H
3 
4 #include <pthread.h>
5 #include <cutils/atomic.h>
6 #include <sys/types.h>
7 #include <sys/uio.h>
8 
9 class SocketClient {
10     int             mSocket;
11     bool            mSocketOwned;
12     pthread_mutex_t mWriteMutex;
13 
14     // Peer process ID
15     pid_t mPid;
16 
17     // Peer user ID
18     uid_t mUid;
19 
20     // Peer group ID
21     gid_t mGid;
22 
23     // Reference count (starts at 1)
24     pthread_mutex_t mRefCountMutex;
25     int mRefCount;
26 
27     int mCmdNum;
28 
29     bool mUseCmdNum;
30 
31 public:
32     SocketClient(int sock, bool owned);
33     SocketClient(int sock, bool owned, bool useCmdNum);
34     virtual ~SocketClient();
35 
getSocket()36     int getSocket() const { return mSocket; }
getPid()37     pid_t getPid() const { return mPid; }
getUid()38     uid_t getUid() const { return mUid; }
getGid()39     gid_t getGid() const { return mGid; }
setCmdNum(int cmdNum)40     void setCmdNum(int cmdNum) {
41         android_atomic_release_store(cmdNum, &mCmdNum);
42     }
getCmdNum()43     int getCmdNum() { return mCmdNum; }
44 
45     // Send null-terminated C strings:
46     int sendMsg(int code, const char *msg, bool addErrno);
47     int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum);
48     int sendMsg(const char *msg);
49 
50     // Provides a mechanism to send a response code to the client.
51     // Sends the code and a null character.
52     int sendCode(int code);
53 
54     // Provides a mechanism to send binary data to client.
55     // Sends the code and a null character, followed by 4 bytes of
56     // big-endian length, and the data.
57     int sendBinaryMsg(int code, const void *data, int len);
58 
59     // Sending binary data:
60     int sendData(const void *data, int len);
61     // iovec contents not preserved through call
62     int sendDatav(struct iovec *iov, int iovcnt);
63 
64     // Optional reference counting.  Reference count starts at 1.  If
65     // it's decremented to 0, it deletes itself.
66     // SocketListener creates a SocketClient (at refcount 1) and calls
67     // decRef() when it's done with the client.
68     void incRef();
69     bool decRef(); // returns true at 0 (but note: SocketClient already deleted)
70 
71     // return a new string in quotes with '\\' and '\"' escaped for "my arg"
72     // transmissions
73     static char *quoteArg(const char *arg);
74 
75 private:
76     void init(int socket, bool owned, bool useCmdNum);
77 
78     // Sending binary data. The caller should make sure this is protected
79     // from multiple threads entering simultaneously.
80     // returns 0 if successful, -1 if there is a 0 byte write or if any
81     // other error occurred (use errno to get the error)
82     int sendDataLockedv(struct iovec *iov, int iovcnt);
83 };
84 
85 #endif
86