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