SocketClient.h revision 594947793c98e8e7f58f0e9b2cb962c9ef23adeb
1fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#ifndef _SOCKET_CLIENT_H
2fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#define _SOCKET_CLIENT_H
3fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
4b7286aa02e1e554a1ef21a957fabe593f05c1260Mathias Agopian#include "List.h"
5fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
6fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#include <pthread.h>
78702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt#include <cutils/atomic.h>
830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root#include <sys/types.h>
9fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
10fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatclass SocketClient {
11fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    int             mSocket;
124520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang    bool            mSocketOwned;
13fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    pthread_mutex_t mWriteMutex;
14fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
1530abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    /* Peer process ID */
1630abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    pid_t mPid;
1730abb7234de2a9caa1add4b00a189436f0b24560Kenny Root
1830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    /* Peer user ID */
1930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    uid_t mUid;
2030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root
2130abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    /* Peer group ID */
2230abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    gid_t mGid;
2330abb7234de2a9caa1add4b00a189436f0b24560Kenny Root
24648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    /* Reference count (starts at 1) */
25648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    pthread_mutex_t mRefCountMutex;
26648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    int mRefCount;
27648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick
288702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    int mCmdNum;
298702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt
308702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    bool mUseCmdNum;
318702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt
32fa644ffe944c01a9b00f8d7676d58394fabee285San Mehatpublic:
334520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang    SocketClient(int sock, bool owned);
348702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    SocketClient(int sock, bool owned, bool useCmdNum);
354520246d3534c087f3e9253c34f99dd1e45b7bd7Xianzhu Wang    virtual ~SocketClient();
36fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
37fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat    int getSocket() { return mSocket; }
3830abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    pid_t getPid() const { return mPid; }
3930abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    uid_t getUid() const { return mUid; }
4030abb7234de2a9caa1add4b00a189436f0b24560Kenny Root    gid_t getGid() const { return mGid; }
418702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    void setCmdNum(int cmdNum) { android_atomic_release_store(cmdNum, &mCmdNum); }
428702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    int getCmdNum() { return mCmdNum; }
43fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
448c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick    // Send null-terminated C strings:
45db017545796747115b8797f03e662b0f398a7c7bSan Mehat    int sendMsg(int code, const char *msg, bool addErrno);
468702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    int sendMsg(int code, const char *msg, bool addErrno, bool useCmdNum);
478c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick
487599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt    // Provides a mechanism to send a response code to the client.
497599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt    // Sends the code and a null character.
507bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    int sendCode(int code);
517bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun
527599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt    // Provides a mechanism to send binary data to client.
537599bfcf13cf022333338b7a87aaddae69c48d73Robert Greenwalt    // Sends the code and a null character, followed by 4 bytes of
547bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // big-endian length, and the data.
557bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    int sendBinaryMsg(int code, const void *data, int len);
567bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun
577bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // Sending binary data:
588c5669f9f9a228efebf4059fd4ceace5cece578bBrad Fitzpatrick    int sendData(const void *data, int len);
59648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick
60648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    // Optional reference counting.  Reference count starts at 1.  If
61648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    // it's decremented to 0, it deletes itself.
62648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    // SocketListener creates a SocketClient (at refcount 1) and calls
63648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    // decRef() when it's done with the client.
64648ebad883e7825353c841950dd7d78664c238e6Brad Fitzpatrick    void incRef();
654be4e69f0128b7d9b0a29651ef4b79d806ae3ce7Brad Fitzpatrick    bool decRef(); // returns true at 0 (but note: SocketClient already deleted)
668702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt
67594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt    // return a new string in quotes with '\\' and '\"' escaped for "my arg" transmissions
68594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt    static char *quoteArg(const char *arg);
69594947793c98e8e7f58f0e9b2cb962c9ef23adebRobert Greenwalt
708702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwaltprivate:
718702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    // Send null-terminated C strings
728702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    int sendMsg(const char *msg);
738702bb17f40022e970e8acd40b348d074e39afc7Robert Greenwalt    void init(int socket, bool owned, bool useCmdNum);
747bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun
757bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // Sending binary data. The caller should use make sure this is protected
767bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // from multiple threads entering simultaneously.
777bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // returns 0 if successful, -1 if there is a 0 byte write and -2 if any other
787bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    // error occurred (use errno to get the error)
797bf4c45f842ded6d6ad6b2d80e052ddf56969723Selim Gurun    int sendDataLocked(const void *data, int len);
80fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat};
81fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat
82b7286aa02e1e554a1ef21a957fabe593f05c1260Mathias Agopiantypedef android::sysutils::List<SocketClient *> SocketClientCollection;
83fa644ffe944c01a9b00f8d7676d58394fabee285San Mehat#endif
84