| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 1 | #ifndef _SOCKET_CLIENT_H | 
 | 2 | #define _SOCKET_CLIENT_H | 
 | 3 |  | 
| Mathias Agopian | b7286aa | 2012-03-05 16:45:55 -0800 | [diff] [blame] | 4 | #include "List.h" | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 5 |  | 
 | 6 | #include <pthread.h> | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 7 | #include <cutils/atomic.h> | 
| Kenny Root | 30abb72 | 2010-09-14 14:26:12 -0700 | [diff] [blame] | 8 | #include <sys/types.h> | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 9 | #include <sys/uio.h> | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 10 |  | 
 | 11 | class SocketClient { | 
 | 12 |     int             mSocket; | 
| Xianzhu Wang | 4520246 | 2011-09-29 12:59:55 +0800 | [diff] [blame] | 13 |     bool            mSocketOwned; | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 14 |     pthread_mutex_t mWriteMutex; | 
 | 15 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 16 |     // Peer process ID | 
| Kenny Root | 30abb72 | 2010-09-14 14:26:12 -0700 | [diff] [blame] | 17 |     pid_t mPid; | 
 | 18 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 19 |     // Peer user ID | 
| Kenny Root | 30abb72 | 2010-09-14 14:26:12 -0700 | [diff] [blame] | 20 |     uid_t mUid; | 
 | 21 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 22 |     // Peer group ID | 
| Kenny Root | 30abb72 | 2010-09-14 14:26:12 -0700 | [diff] [blame] | 23 |     gid_t mGid; | 
 | 24 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 25 |     // Reference count (starts at 1) | 
| Brad Fitzpatrick | 648ebad | 2011-03-17 15:41:20 -0700 | [diff] [blame] | 26 |     pthread_mutex_t mRefCountMutex; | 
 | 27 |     int mRefCount; | 
 | 28 |  | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 29 |     int mCmdNum; | 
 | 30 |  | 
 | 31 |     bool mUseCmdNum; | 
 | 32 |  | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 33 | public: | 
| Xianzhu Wang | 4520246 | 2011-09-29 12:59:55 +0800 | [diff] [blame] | 34 |     SocketClient(int sock, bool owned); | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 35 |     SocketClient(int sock, bool owned, bool useCmdNum); | 
| Xianzhu Wang | 4520246 | 2011-09-29 12:59:55 +0800 | [diff] [blame] | 36 |     virtual ~SocketClient(); | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 37 |  | 
 | 38 |     int getSocket() { return mSocket; } | 
| Kenny Root | 30abb72 | 2010-09-14 14:26:12 -0700 | [diff] [blame] | 39 |     pid_t getPid() const { return mPid; } | 
 | 40 |     uid_t getUid() const { return mUid; } | 
 | 41 |     gid_t getGid() const { return mGid; } | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 42 |     void setCmdNum(int cmdNum) { | 
 | 43 |         android_atomic_release_store(cmdNum, &mCmdNum); | 
 | 44 |     } | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 45 |     int getCmdNum() { return mCmdNum; } | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 46 |  | 
| Brad Fitzpatrick | 8c5669f | 2010-10-27 10:23:16 -0700 | [diff] [blame] | 47 |     // Send null-terminated C strings: | 
| San Mehat | db01754 | 2009-05-20 15:27:14 -0700 | [diff] [blame] | 48 |     int sendMsg(int code, const char *msg, bool addErrno); | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 49 |     int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum); | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 50 |     int sendMsg(const char *msg); | 
| Brad Fitzpatrick | 8c5669f | 2010-10-27 10:23:16 -0700 | [diff] [blame] | 51 |  | 
| Robert Greenwalt | 7599bfc | 2012-03-08 16:10:06 -0800 | [diff] [blame] | 52 |     // Provides a mechanism to send a response code to the client. | 
 | 53 |     // Sends the code and a null character. | 
| Selim Gurun | 7bf4c45 | 2012-02-27 16:04:37 -0800 | [diff] [blame] | 54 |     int sendCode(int code); | 
 | 55 |  | 
| Robert Greenwalt | 7599bfc | 2012-03-08 16:10:06 -0800 | [diff] [blame] | 56 |     // Provides a mechanism to send binary data to client. | 
 | 57 |     // Sends the code and a null character, followed by 4 bytes of | 
| Selim Gurun | 7bf4c45 | 2012-02-27 16:04:37 -0800 | [diff] [blame] | 58 |     // big-endian length, and the data. | 
 | 59 |     int sendBinaryMsg(int code, const void *data, int len); | 
 | 60 |  | 
 | 61 |     // Sending binary data: | 
| Brad Fitzpatrick | 8c5669f | 2010-10-27 10:23:16 -0700 | [diff] [blame] | 62 |     int sendData(const void *data, int len); | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 63 |     // iovec contents not preserved through call | 
 | 64 |     int sendDatav(struct iovec *iov, int iovcnt); | 
| Brad Fitzpatrick | 648ebad | 2011-03-17 15:41:20 -0700 | [diff] [blame] | 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(); | 
| Brad Fitzpatrick | 4be4e69 | 2011-03-17 17:14:46 -0700 | [diff] [blame] | 71 |     bool decRef(); // returns true at 0 (but note: SocketClient already deleted) | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 72 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 73 |     // return a new string in quotes with '\\' and '\"' escaped for "my arg" | 
 | 74 |     // transmissions | 
| Robert Greenwalt | 5949477 | 2012-04-20 15:21:07 -0700 | [diff] [blame] | 75 |     static char *quoteArg(const char *arg); | 
 | 76 |  | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 77 | private: | 
| Robert Greenwalt | 8702bb1 | 2012-02-07 12:23:14 -0800 | [diff] [blame] | 78 |     void init(int socket, bool owned, bool useCmdNum); | 
| Selim Gurun | 7bf4c45 | 2012-02-27 16:04:37 -0800 | [diff] [blame] | 79 |  | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 80 |     // Sending binary data. The caller should make sure this is protected | 
| Selim Gurun | 7bf4c45 | 2012-02-27 16:04:37 -0800 | [diff] [blame] | 81 |     // from multiple threads entering simultaneously. | 
| Mark Salyzyn | a6e9655 | 2012-01-24 20:30:10 -0800 | [diff] [blame] | 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); | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 85 | }; | 
 | 86 |  | 
| Mathias Agopian | b7286aa | 2012-03-05 16:45:55 -0800 | [diff] [blame] | 87 | typedef android::sysutils::List<SocketClient *> SocketClientCollection; | 
| San Mehat | fa644ff | 2009-05-08 11:15:53 -0700 | [diff] [blame] | 88 | #endif |