| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef IPC_IPC_CHANNEL_POSIX_H_ | 5 #ifndef IPC_IPC_CHANNEL_POSIX_H_ |
| 6 #define IPC_IPC_CHANNEL_POSIX_H_ | 6 #define IPC_IPC_CHANNEL_POSIX_H_ |
| 7 | 7 |
| 8 #include "ipc/ipc_channel.h" | 8 #include "ipc/ipc_channel.h" |
| 9 | 9 |
| 10 #include <sys/socket.h> // for CMSG macros | 10 #include <sys/socket.h> // for CMSG macros |
| 11 | 11 |
| 12 #include <queue> | 12 #include <queue> |
| 13 #include <set> |
| 13 #include <string> | 14 #include <string> |
| 14 #include <vector> | 15 #include <vector> |
| 15 | 16 |
| 16 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
| 17 #include "base/process/process.h" | 18 #include "base/process/process.h" |
| 18 #include "ipc/file_descriptor_set_posix.h" | 19 #include "ipc/file_descriptor_set_posix.h" |
| 19 #include "ipc/ipc_channel_reader.h" | 20 #include "ipc/ipc_channel_reader.h" |
| 20 | 21 |
| 21 #if !defined(OS_MACOSX) | 22 #if !defined(OS_MACOSX) |
| 22 // On Linux, the seccomp sandbox makes it very expensive to call | 23 // On Linux, the seccomp sandbox makes it very expensive to call |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 | 74 |
| 74 private: | 75 private: |
| 75 bool CreatePipe(const IPC::ChannelHandle& channel_handle); | 76 bool CreatePipe(const IPC::ChannelHandle& channel_handle); |
| 76 | 77 |
| 77 bool ProcessOutgoingMessages(); | 78 bool ProcessOutgoingMessages(); |
| 78 | 79 |
| 79 bool AcceptConnection(); | 80 bool AcceptConnection(); |
| 80 void ClosePipeOnError(); | 81 void ClosePipeOnError(); |
| 81 int GetHelloMessageProcId(); | 82 int GetHelloMessageProcId(); |
| 82 void QueueHelloMessage(); | 83 void QueueHelloMessage(); |
| 84 void CloseFileDescriptors(Message* msg); |
| 85 void QueueCloseFDMessage(int fd, int hops); |
| 83 | 86 |
| 84 // ChannelReader implementation. | 87 // ChannelReader implementation. |
| 85 virtual ReadState ReadData(char* buffer, | 88 virtual ReadState ReadData(char* buffer, |
| 86 int buffer_len, | 89 int buffer_len, |
| 87 int* bytes_read) OVERRIDE; | 90 int* bytes_read) OVERRIDE; |
| 88 virtual bool WillDispatchInputMessage(Message* msg) OVERRIDE; | 91 virtual bool WillDispatchInputMessage(Message* msg) OVERRIDE; |
| 89 virtual bool DidEmptyInputBuffers() OVERRIDE; | 92 virtual bool DidEmptyInputBuffers() OVERRIDE; |
| 90 virtual void HandleHelloMessage(const Message& msg) OVERRIDE; | 93 virtual void HandleInternalMessage(const Message& msg) OVERRIDE; |
| 91 | 94 |
| 92 #if defined(IPC_USES_READWRITE) | 95 #if defined(IPC_USES_READWRITE) |
| 93 // Reads the next message from the fd_pipe_ and appends them to the | 96 // Reads the next message from the fd_pipe_ and appends them to the |
| 94 // input_fds_ queue. Returns false if there was a message receiving error. | 97 // input_fds_ queue. Returns false if there was a message receiving error. |
| 95 // True means there was a message and it was processed properly, or there was | 98 // True means there was a message and it was processed properly, or there was |
| 96 // no messages. | 99 // no messages. |
| 97 bool ReadFileDescriptorsFromFDPipe(); | 100 bool ReadFileDescriptorsFromFDPipe(); |
| 98 #endif | 101 #endif |
| 99 | 102 |
| 100 // Finds the set of file descriptors in the given message. On success, | 103 // Finds the set of file descriptors in the given message. On success, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 char input_cmsg_buf_[kMaxReadFDBuffer]; | 180 char input_cmsg_buf_[kMaxReadFDBuffer]; |
| 178 | 181 |
| 179 // File descriptors extracted from messages coming off of the channel. The | 182 // File descriptors extracted from messages coming off of the channel. The |
| 180 // handles may span messages and come off different channels from the message | 183 // handles may span messages and come off different channels from the message |
| 181 // data (in the case of READWRITE), and are processed in FIFO here. | 184 // data (in the case of READWRITE), and are processed in FIFO here. |
| 182 // NOTE: The implementation assumes underlying storage here is contiguous, so | 185 // NOTE: The implementation assumes underlying storage here is contiguous, so |
| 183 // don't change to something like std::deque<> without changing the | 186 // don't change to something like std::deque<> without changing the |
| 184 // implementation! | 187 // implementation! |
| 185 std::vector<int> input_fds_; | 188 std::vector<int> input_fds_; |
| 186 | 189 |
| 190 #if defined(OS_MACOSX) |
| 191 // On OSX, sent FDs must not be closed until we get an ack. |
| 192 // Keep track of sent FDs here to make sure the remote is not |
| 193 // trying to bamboozle us. |
| 194 std::set<int> fds_to_close_; |
| 195 #endif |
| 196 |
| 187 // True if we are responsible for unlinking the unix domain socket file. | 197 // True if we are responsible for unlinking the unix domain socket file. |
| 188 bool must_unlink_; | 198 bool must_unlink_; |
| 189 | 199 |
| 190 #if defined(OS_LINUX) | 200 #if defined(OS_LINUX) |
| 191 // If non-zero, overrides the process ID sent in the hello message. | 201 // If non-zero, overrides the process ID sent in the hello message. |
| 192 static int global_pid_; | 202 static int global_pid_; |
| 193 #endif // OS_LINUX | 203 #endif // OS_LINUX |
| 194 | 204 |
| 195 DISALLOW_IMPLICIT_CONSTRUCTORS(ChannelImpl); | 205 DISALLOW_IMPLICIT_CONSTRUCTORS(ChannelImpl); |
| 196 }; | 206 }; |
| 197 | 207 |
| 198 } // namespace IPC | 208 } // namespace IPC |
| 199 | 209 |
| 200 #endif // IPC_IPC_CHANNEL_POSIX_H_ | 210 #endif // IPC_IPC_CHANNEL_POSIX_H_ |
| OLD | NEW |