platform_system_core/include/sysutils/SocketClient.h
Robert Greenwalt 594947793c Add ability to quote responses as needed.
It's up to the protocol to know when quotes are required.  In the future
the response should probably all be binary blobs with lengths.

bug:6353048
Change-Id: I3f9b48ab0f4e6746d75cdc9c0c84d33f38f63661
2012-04-20 17:41:42 -07:00

83 lines
2.5 KiB
C++

#ifndef _SOCKET_CLIENT_H
#define _SOCKET_CLIENT_H
#include "List.h"
#include <pthread.h>
#include <cutils/atomic.h>
#include <sys/types.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);
// 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);
// 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:
// Send null-terminated C strings
int sendMsg(const char *msg);
void init(int socket, bool owned, bool useCmdNum);
// Sending binary data. The caller should use make sure this is protected
// from multiple threads entering simultaneously.
// returns 0 if successful, -1 if there is a 0 byte write and -2 if any other
// error occurred (use errno to get the error)
int sendDataLocked(const void *data, int len);
};
typedef android::sysutils::List<SocketClient *> SocketClientCollection;
#endif