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