diff options
Diffstat (limited to 'libsysutils/include/sysutils/SocketClient.h')
| -rw-r--r-- | libsysutils/include/sysutils/SocketClient.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/libsysutils/include/sysutils/SocketClient.h b/libsysutils/include/sysutils/SocketClient.h new file mode 100644 index 000000000..1004f0611 --- /dev/null +++ b/libsysutils/include/sysutils/SocketClient.h @@ -0,0 +1,88 @@ +#ifndef _SOCKET_CLIENT_H +#define _SOCKET_CLIENT_H + +#include "List.h" + +#include <pthread.h> +#include <cutils/atomic.h> +#include <sys/types.h> +#include <sys/uio.h> + +class SocketClient { + int mSocket; + bool mSocketOwned; + pthread_mutex_t mWriteMutex; + + // Peer process ID + pid_t mPid; + + // Peer user ID + uid_t mUid; + + // Peer group ID + gid_t mGid; + + // Reference count (starts at 1) + pthread_mutex_t mRefCountMutex; + int mRefCount; + + int mCmdNum; + + bool mUseCmdNum; + +public: + SocketClient(int sock, bool owned); + SocketClient(int sock, bool owned, bool useCmdNum); + virtual ~SocketClient(); + + int getSocket() { return mSocket; } + pid_t getPid() const { return mPid; } + uid_t getUid() const { return mUid; } + gid_t getGid() const { return mGid; } + void setCmdNum(int cmdNum) { + android_atomic_release_store(cmdNum, &mCmdNum); + } + int getCmdNum() { return mCmdNum; } + + // Send null-terminated C strings: + int sendMsg(int code, const char *msg, bool addErrno); + int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum); + int sendMsg(const char *msg); + + // Provides a mechanism to send a response code to the client. + // Sends the code and a null character. + int sendCode(int code); + + // Provides a mechanism to send binary data to client. + // Sends the code and a null character, followed by 4 bytes of + // big-endian length, and the data. + int sendBinaryMsg(int code, const void *data, int len); + + // Sending binary data: + int sendData(const void *data, int len); + // iovec contents not preserved through call + int sendDatav(struct iovec *iov, int iovcnt); + + // Optional reference counting. Reference count starts at 1. If + // it's decremented to 0, it deletes itself. + // SocketListener creates a SocketClient (at refcount 1) and calls + // decRef() when it's done with the client. + void incRef(); + bool decRef(); // returns true at 0 (but note: SocketClient already deleted) + + // return a new string in quotes with '\\' and '\"' escaped for "my arg" + // transmissions + static char *quoteArg(const char *arg); + +private: + void init(int socket, bool owned, bool useCmdNum); + + // Sending binary data. The caller should make sure this is protected + // from multiple threads entering simultaneously. + // returns 0 if successful, -1 if there is a 0 byte write or if any + // other error occurred (use errno to get the error) + int sendDataLockedv(struct iovec *iov, int iovcnt); +}; + +typedef android::sysutils::List<SocketClient *> SocketClientCollection; +#endif |
