15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef IPC_IPC_CHANNEL_POSIX_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_IPC_CHANNEL_POSIX_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/socket.h>  // for CMSG macros
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <set>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/file_descriptor_set_posix.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_reader.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Linux, the seccomp sandbox makes it very expensive to call
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recvmsg() and sendmsg(). The restriction on calling read() and write(), which
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are cheap, is that we can't pass file descriptors over them.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// As we cannot anticipate when the sender will provide us with file
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descriptors, we have to make the decision about whether we call read() or
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// recvmsg() before we actually make the call. The easiest option is to
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// create a dedicated socketpair() for exchanging file descriptors. Any file
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descriptors are split out of a message, with the non-file-descriptor payload
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// going over the normal connection, and the file descriptors being sent
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separately over the other channel. When read()ing from a channel, we'll
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice if the message was supposed to have come with file descriptors and
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use recvmsg on the other socketpair to retrieve them and combine them
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// back with the rest of the message.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mac can also run in IPC_USES_READWRITE mode if necessary, but at this time
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// doesn't take a performance hit from recvmsg and sendmsg, so it doesn't
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// make sense to waste resources on having the separate dedicated socketpair.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is however useful for debugging between Linux and Mac to be able to turn
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this switch 'on' on the Mac as well.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HELLO message from the client to the server is always sent using
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sendmsg because it will contain the file descriptor that the server
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needs to send file descriptors in later messages.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IPC_USES_READWRITE 1
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class IPC_EXPORT ChannelPosix : public Channel,
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                public internal::ChannelReader,
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                public base::MessageLoopForIO::Watcher {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ChannelPosix(const IPC::ChannelHandle& channel_handle, Mode mode,
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               Listener* listener);
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~ChannelPosix();
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Channel implementation
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool Connect() OVERRIDE;
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Close() OVERRIDE;
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool Send(Message* message) OVERRIDE;
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual base::ProcessId GetPeerPID() const OVERRIDE;
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual base::ProcessId GetSelfPID() const OVERRIDE;
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int GetClientFileDescriptor() const OVERRIDE;
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int TakeClientFileDescriptor() OVERRIDE;
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if the channel supports listening for connections.
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool AcceptsConnections() const;
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if the channel supports listening for connections and is
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // currently connected.
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool HasAcceptedConnection() const;
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Closes any currently connected socket, and returns to a listening state
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // for more connections.
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ResetToAcceptingConnectionState();
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns true if the peer process' effective user id can be determined, in
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // which case the supplied peer_euid is updated with it.
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool GetPeerEuid(uid_t* peer_euid) const;
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseClientFileDescriptor();
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsNamedServerInitialized(const std::string& channel_id);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void SetGlobalPid(int pid);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_LINUX
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreatePipe(const IPC::ChannelHandle& channel_handle);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessOutgoingMessages();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AcceptConnection();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClosePipeOnError();
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int GetHelloMessageProcId() const;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueueHelloMessage();
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void CloseFileDescriptors(Message* msg);
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void QueueCloseFDMessage(int fd, int hops);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChannelReader implementation.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ReadState ReadData(char* buffer,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int buffer_len,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int* bytes_read) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool WillDispatchInputMessage(Message* msg) OVERRIDE;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool DidEmptyInputBuffers() OVERRIDE;
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void HandleInternalMessage(const Message& msg) OVERRIDE;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_USES_READWRITE)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the next message from the fd_pipe_ and appends them to the
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // input_fds_ queue. Returns false if there was a message receiving error.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True means there was a message and it was processed properly, or there was
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no messages.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReadFileDescriptorsFromFDPipe();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finds the set of file descriptors in the given message.  On success,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appends the descriptors to the input_fds_ member and returns true
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if the message was truncated. In this case, any handles that
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // were sent will be closed.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExtractFileDescriptorsFromMsghdr(msghdr* msg);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Closes all handles in the input_fds_ list and clears the list. This is
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used to clean up handles in error conditions to avoid leaking the handles.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearInputFDs();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MessageLoopForIO::Watcher implementation.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mode mode_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessId peer_pid_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After accepting one client connection on our server socket we want to
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stop listening.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForIO::FileDescriptorWatcher
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  server_listen_connection_watcher_;
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForIO::FileDescriptorWatcher read_watcher_;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForIO::FileDescriptorWatcher write_watcher_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates whether we're currently blocked waiting for a write to complete.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_blocked_on_write_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_connect_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If sending a message blocks then we use this variable
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to keep track of where we are.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t message_send_bytes_written_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // File descriptor we're listening on for new connections if we listen
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for connections.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int server_listen_pipe_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pipe used for communication.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pipe_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For a server, the client end of our socketpair() -- the other end of our
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pipe_ that is passed to the client.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int client_pipe_;
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  mutable base::Lock client_pipe_lock_;  // Lock that protects |client_pipe_|.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(IPC_USES_READWRITE)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Linux/BSD use a dedicated socketpair() for passing file descriptors.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd_pipe_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int remote_fd_pipe_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The "name" of our pipe.  On Windows this is the global identifier for
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pipe.  On POSIX it's used as a key in a local map of file descriptors.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string pipe_name_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Messages to be sent are queued here.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<Message*> output_queue_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We assume a worst case: kReadBufferSize bytes of messages, where each
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message has no payload and a full complement of descriptors.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMaxReadFDs =
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (Channel::kReadBufferSize / sizeof(IPC::Message::Header)) *
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FileDescriptorSet::kMaxDescriptorsPerMessage;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Buffer size for file descriptors used for recvmsg. On Mac the CMSG macros
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't seem to be constant so we have to pick a "large enough" value.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMaxReadFDBuffer = 1024;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMaxReadFDBuffer = CMSG_SPACE(sizeof(int) * kMaxReadFDs);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary buffer used to receive the file descriptors from recvmsg.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Code that writes into this should immediately read them out and save
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // them to input_fds_, since this buffer will be re-used anytime we call
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recvmsg.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char input_cmsg_buf_[kMaxReadFDBuffer];
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // File descriptors extracted from messages coming off of the channel. The
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handles may span messages and come off different channels from the message
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data (in the case of READWRITE), and are processed in FIFO here.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: The implementation assumes underlying storage here is contiguous, so
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't change to something like std::deque<> without changing the
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation!
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> input_fds_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX)
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // On OSX, sent FDs must not be closed until we get an ack.
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Keep track of sent FDs here to make sure the remote is not
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // trying to bamboozle us.
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::set<int> fds_to_close_;
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if we are responsible for unlinking the unix domain socket file.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool must_unlink_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If non-zero, overrides the process ID sent in the hello message.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int global_pid_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_LINUX
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(ChannelPosix);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // IPC_IPC_CHANNEL_POSIX_H_
227