| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ | 
 | #define BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ | 
 |  | 
 | #include <stddef.h> | 
 | #include <stdint.h> | 
 | #include <sys/types.h> | 
 | #include <vector> | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/files/scoped_file.h" | 
 | #include "base/process/process_handle.h" | 
 | #include "build/build_config.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | class Pickle; | 
 |  | 
 | #if !defined(OS_NACL_NONSFI) | 
 | // Creates a connected pair of UNIX-domain SOCK_SEQPACKET sockets, and passes | 
 | // ownership of the newly allocated file descriptors to |one| and |two|. | 
 | // Returns true on success. | 
 | bool BASE_EXPORT CreateSocketPair(ScopedFD* one, ScopedFD* two); | 
 | #endif | 
 |  | 
 | class BASE_EXPORT UnixDomainSocket { | 
 |  public: | 
 |   // Maximum number of file descriptors that can be read by RecvMsg(). | 
 |   static const size_t kMaxFileDescriptors; | 
 |  | 
 | #if !defined(OS_NACL_NONSFI) | 
 |   // Use to enable receiving process IDs in RecvMsgWithPid.  Should be called on | 
 |   // the receiving socket (i.e., the socket passed to RecvMsgWithPid). Returns | 
 |   // true if successful. | 
 |   static bool EnableReceiveProcessId(int fd); | 
 | #endif  // !defined(OS_NACL_NONSFI) | 
 |  | 
 |   // Use sendmsg to write the given msg and include a vector of file | 
 |   // descriptors. Returns true if successful. | 
 |   static bool SendMsg(int fd, | 
 |                       const void* msg, | 
 |                       size_t length, | 
 |                       const std::vector<int>& fds); | 
 |  | 
 |   // Use recvmsg to read a message and an array of file descriptors. Returns | 
 |   // -1 on failure. Note: will read, at most, |kMaxFileDescriptors| descriptors. | 
 |   static ssize_t RecvMsg(int fd, | 
 |                          void* msg, | 
 |                          size_t length, | 
 |                          std::vector<ScopedFD>* fds); | 
 |  | 
 |   // Same as RecvMsg above, but also returns the sender's process ID (as seen | 
 |   // from the caller's namespace).  However, before using this function to | 
 |   // receive process IDs, EnableReceiveProcessId() should be called on the | 
 |   // receiving socket. | 
 |   static ssize_t RecvMsgWithPid(int fd, | 
 |                                 void* msg, | 
 |                                 size_t length, | 
 |                                 std::vector<ScopedFD>* fds, | 
 |                                 ProcessId* pid); | 
 |  | 
 | #if !defined(OS_NACL_NONSFI) | 
 |   // Perform a sendmsg/recvmsg pair. | 
 |   //   1. This process creates a UNIX SEQPACKET socketpair. Using | 
 |   //      connection-oriented sockets (SEQPACKET or STREAM) is critical here, | 
 |   //      because if one of the ends closes the other one must be notified. | 
 |   //   2. This process writes a request to |fd| with an SCM_RIGHTS control | 
 |   //      message containing on end of the fresh socket pair. | 
 |   //   3. This process blocks reading from the other end of the fresh | 
 |   //      socketpair. | 
 |   //   4. The target process receives the request, processes it and writes the | 
 |   //      reply to the end of the socketpair contained in the request. | 
 |   //   5. This process wakes up and continues. | 
 |   // | 
 |   //   fd: descriptor to send the request on | 
 |   //   reply: buffer for the reply | 
 |   //   reply_len: size of |reply| | 
 |   //   result_fd: (may be NULL) the file descriptor returned in the reply | 
 |   //              (if any) | 
 |   //   request: the bytes to send in the request | 
 |   static ssize_t SendRecvMsg(int fd, | 
 |                              uint8_t* reply, | 
 |                              unsigned reply_len, | 
 |                              int* result_fd, | 
 |                              const Pickle& request); | 
 |  | 
 |   // Similar to SendRecvMsg(), but |recvmsg_flags| allows to control the flags | 
 |   // of the recvmsg(2) call. | 
 |   static ssize_t SendRecvMsgWithFlags(int fd, | 
 |                                       uint8_t* reply, | 
 |                                       unsigned reply_len, | 
 |                                       int recvmsg_flags, | 
 |                                       int* result_fd, | 
 |                                       const Pickle& request); | 
 | #endif  // !defined(OS_NACL_NONSFI) | 
 |  private: | 
 |   // Similar to RecvMsg, but allows to specify |flags| for recvmsg(2). | 
 |   static ssize_t RecvMsgWithFlags(int fd, | 
 |                                   void* msg, | 
 |                                   size_t length, | 
 |                                   int flags, | 
 |                                   std::vector<ScopedFD>* fds, | 
 |                                   ProcessId* pid); | 
 | }; | 
 |  | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_POSIX_UNIX_DOMAIN_SOCKET_H_ |