123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // 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_
|