1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker #include <sys/types.h> 11*6777b538SAndroid Build Coastguard Worker #include <vector> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_file.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h" 16*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker class Pickle; 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // Creates a connected pair of UNIX-domain SOCK_SEQPACKET sockets, and passes 23*6777b538SAndroid Build Coastguard Worker // ownership of the newly allocated file descriptors to |one| and |two|. 24*6777b538SAndroid Build Coastguard Worker // Returns true on success. 25*6777b538SAndroid Build Coastguard Worker bool BASE_EXPORT CreateSocketPair(ScopedFD* one, ScopedFD* two); 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT UnixDomainSocket { 28*6777b538SAndroid Build Coastguard Worker public: 29*6777b538SAndroid Build Coastguard Worker // Maximum number of file descriptors that can be read by RecvMsg(). 30*6777b538SAndroid Build Coastguard Worker static const size_t kMaxFileDescriptors; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // Use to enable receiving process IDs in RecvMsgWithPid. Should be called on 33*6777b538SAndroid Build Coastguard Worker // the receiving socket (i.e., the socket passed to RecvMsgWithPid). Returns 34*6777b538SAndroid Build Coastguard Worker // true if successful. 35*6777b538SAndroid Build Coastguard Worker static bool EnableReceiveProcessId(int fd); 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker // Use sendmsg to write the given msg and include a vector of file 38*6777b538SAndroid Build Coastguard Worker // descriptors. Returns true if successful. 39*6777b538SAndroid Build Coastguard Worker static bool SendMsg(int fd, 40*6777b538SAndroid Build Coastguard Worker const void* msg, 41*6777b538SAndroid Build Coastguard Worker size_t length, 42*6777b538SAndroid Build Coastguard Worker const std::vector<int>& fds); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Use recvmsg to read a message and an array of file descriptors. Returns 45*6777b538SAndroid Build Coastguard Worker // -1 on failure. Note: will read, at most, |kMaxFileDescriptors| descriptors. 46*6777b538SAndroid Build Coastguard Worker static ssize_t RecvMsg(int fd, 47*6777b538SAndroid Build Coastguard Worker void* msg, 48*6777b538SAndroid Build Coastguard Worker size_t length, 49*6777b538SAndroid Build Coastguard Worker std::vector<ScopedFD>* fds); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Same as RecvMsg above, but also returns the sender's process ID (as seen 52*6777b538SAndroid Build Coastguard Worker // from the caller's namespace). However, before using this function to 53*6777b538SAndroid Build Coastguard Worker // receive process IDs, EnableReceiveProcessId() should be called on the 54*6777b538SAndroid Build Coastguard Worker // receiving socket. 55*6777b538SAndroid Build Coastguard Worker static ssize_t RecvMsgWithPid(int fd, 56*6777b538SAndroid Build Coastguard Worker void* msg, 57*6777b538SAndroid Build Coastguard Worker size_t length, 58*6777b538SAndroid Build Coastguard Worker std::vector<ScopedFD>* fds, 59*6777b538SAndroid Build Coastguard Worker ProcessId* pid); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Perform a sendmsg/recvmsg pair. 62*6777b538SAndroid Build Coastguard Worker // 1. This process creates a UNIX SEQPACKET socketpair. Using 63*6777b538SAndroid Build Coastguard Worker // connection-oriented sockets (SEQPACKET or STREAM) is critical here, 64*6777b538SAndroid Build Coastguard Worker // because if one of the ends closes the other one must be notified. 65*6777b538SAndroid Build Coastguard Worker // 2. This process writes a request to |fd| with an SCM_RIGHTS control 66*6777b538SAndroid Build Coastguard Worker // message containing on end of the fresh socket pair. 67*6777b538SAndroid Build Coastguard Worker // 3. This process blocks reading from the other end of the fresh 68*6777b538SAndroid Build Coastguard Worker // socketpair. 69*6777b538SAndroid Build Coastguard Worker // 4. The target process receives the request, processes it and writes the 70*6777b538SAndroid Build Coastguard Worker // reply to the end of the socketpair contained in the request. 71*6777b538SAndroid Build Coastguard Worker // 5. This process wakes up and continues. 72*6777b538SAndroid Build Coastguard Worker // 73*6777b538SAndroid Build Coastguard Worker // fd: descriptor to send the request on 74*6777b538SAndroid Build Coastguard Worker // reply: buffer for the reply 75*6777b538SAndroid Build Coastguard Worker // reply_len: size of |reply| 76*6777b538SAndroid Build Coastguard Worker // result_fd: (may be NULL) the file descriptor returned in the reply 77*6777b538SAndroid Build Coastguard Worker // (if any) 78*6777b538SAndroid Build Coastguard Worker // request: the bytes to send in the request 79*6777b538SAndroid Build Coastguard Worker static ssize_t SendRecvMsg(int fd, 80*6777b538SAndroid Build Coastguard Worker uint8_t* reply, 81*6777b538SAndroid Build Coastguard Worker unsigned reply_len, 82*6777b538SAndroid Build Coastguard Worker int* result_fd, 83*6777b538SAndroid Build Coastguard Worker const Pickle& request); 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Similar to SendRecvMsg(), but |recvmsg_flags| allows to control the flags 86*6777b538SAndroid Build Coastguard Worker // of the recvmsg(2) call. 87*6777b538SAndroid Build Coastguard Worker static ssize_t SendRecvMsgWithFlags(int fd, 88*6777b538SAndroid Build Coastguard Worker uint8_t* reply, 89*6777b538SAndroid Build Coastguard Worker unsigned reply_len, 90*6777b538SAndroid Build Coastguard Worker int recvmsg_flags, 91*6777b538SAndroid Build Coastguard Worker int* result_fd, 92*6777b538SAndroid Build Coastguard Worker const Pickle& request); 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker private: 95*6777b538SAndroid Build Coastguard Worker // Similar to RecvMsg, but allows to specify |flags| for recvmsg(2). 96*6777b538SAndroid Build Coastguard Worker static ssize_t RecvMsgWithFlags(int fd, 97*6777b538SAndroid Build Coastguard Worker void* msg, 98*6777b538SAndroid Build Coastguard Worker size_t length, 99*6777b538SAndroid Build Coastguard Worker int flags, 100*6777b538SAndroid Build Coastguard Worker std::vector<ScopedFD>* fds, 101*6777b538SAndroid Build Coastguard Worker ProcessId* pid); 102*6777b538SAndroid Build Coastguard Worker }; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker } // namespace base 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker #endif // BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ 107