b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 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 | |
| 11 | class 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 | |
| 33 | public: |
| 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 | |
| 77 | private: |
| 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 | |
| 87 | typedef android::sysutils::List<SocketClient *> SocketClientCollection; |
| 88 | #endif |