Home | History | Annotate | Download | only in sysutils
      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
     89