blob: 1004f061159290c4ffeb546b017d5bb366909170 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#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