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