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 #include "ipc/ipc_channel_posix.h" | 5 #include "ipc/ipc_channel_posix.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
(...skipping 20 matching lines...) Expand all Loading... |
31 #include "base/logging.h" | 31 #include "base/logging.h" |
32 #include "base/memory/scoped_ptr.h" | 32 #include "base/memory/scoped_ptr.h" |
33 #include "base/memory/singleton.h" | 33 #include "base/memory/singleton.h" |
34 #include "base/posix/eintr_wrapper.h" | 34 #include "base/posix/eintr_wrapper.h" |
35 #include "base/posix/global_descriptors.h" | 35 #include "base/posix/global_descriptors.h" |
36 #include "base/process/process_handle.h" | 36 #include "base/process/process_handle.h" |
37 #include "base/rand_util.h" | 37 #include "base/rand_util.h" |
38 #include "base/stl_util.h" | 38 #include "base/stl_util.h" |
39 #include "base/strings/string_util.h" | 39 #include "base/strings/string_util.h" |
40 #include "base/synchronization/lock.h" | 40 #include "base/synchronization/lock.h" |
| 41 #include "ipc/attachment_broker.h" |
41 #include "ipc/ipc_descriptors.h" | 42 #include "ipc/ipc_descriptors.h" |
42 #include "ipc/ipc_listener.h" | 43 #include "ipc/ipc_listener.h" |
43 #include "ipc/ipc_logging.h" | 44 #include "ipc/ipc_logging.h" |
44 #include "ipc/ipc_message_attachment_set.h" | 45 #include "ipc/ipc_message_attachment_set.h" |
45 #include "ipc/ipc_message_utils.h" | 46 #include "ipc/ipc_message_utils.h" |
46 #include "ipc/ipc_platform_file_attachment_posix.h" | 47 #include "ipc/ipc_platform_file_attachment_posix.h" |
47 #include "ipc/ipc_switches.h" | 48 #include "ipc/ipc_switches.h" |
48 #include "ipc/unix_domain_socket_util.h" | 49 #include "ipc/unix_domain_socket_util.h" |
49 | 50 |
50 namespace IPC { | 51 namespace IPC { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 #endif | 176 #endif |
176 | 177 |
177 //------------------------------------------------------------------------------ | 178 //------------------------------------------------------------------------------ |
178 | 179 |
179 #if defined(OS_LINUX) | 180 #if defined(OS_LINUX) |
180 int ChannelPosix::global_pid_ = 0; | 181 int ChannelPosix::global_pid_ = 0; |
181 #endif // OS_LINUX | 182 #endif // OS_LINUX |
182 | 183 |
183 ChannelPosix::ChannelPosix(const IPC::ChannelHandle& channel_handle, | 184 ChannelPosix::ChannelPosix(const IPC::ChannelHandle& channel_handle, |
184 Mode mode, | 185 Mode mode, |
185 Listener* listener, | 186 Listener* listener) |
186 AttachmentBroker* broker) | |
187 : ChannelReader(listener), | 187 : ChannelReader(listener), |
188 mode_(mode), | 188 mode_(mode), |
189 peer_pid_(base::kNullProcessId), | 189 peer_pid_(base::kNullProcessId), |
190 is_blocked_on_write_(false), | 190 is_blocked_on_write_(false), |
191 waiting_connect_(true), | 191 waiting_connect_(true), |
192 message_send_bytes_written_(0), | 192 message_send_bytes_written_(0), |
193 pipe_name_(channel_handle.name), | 193 pipe_name_(channel_handle.name), |
194 in_dtor_(false), | 194 in_dtor_(false), |
195 must_unlink_(false), | 195 must_unlink_(false) { |
196 broker_(broker) { | |
197 if (!CreatePipe(channel_handle)) { | 196 if (!CreatePipe(channel_handle)) { |
198 // The pipe may have been closed already. | 197 // The pipe may have been closed already. |
199 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client"; | 198 const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client"; |
200 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name | 199 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name |
201 << "\" in " << modestr << " mode"; | 200 << "\" in " << modestr << " mode"; |
202 } | 201 } |
203 } | 202 } |
204 | 203 |
205 ChannelPosix::~ChannelPosix() { | 204 ChannelPosix::~ChannelPosix() { |
206 in_dtor_ = true; | 205 in_dtor_ = true; |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 TRACE_EVENT_FLAG_FLOW_OUT); | 516 TRACE_EVENT_FLAG_FLOW_OUT); |
518 output_queue_.push(message); | 517 output_queue_.push(message); |
519 if (!is_blocked_on_write_ && !waiting_connect_) { | 518 if (!is_blocked_on_write_ && !waiting_connect_) { |
520 return ProcessOutgoingMessages(); | 519 return ProcessOutgoingMessages(); |
521 } | 520 } |
522 | 521 |
523 return true; | 522 return true; |
524 } | 523 } |
525 | 524 |
526 AttachmentBroker* ChannelPosix::GetAttachmentBroker() { | 525 AttachmentBroker* ChannelPosix::GetAttachmentBroker() { |
527 return broker_; | 526 return AttachmentBroker::GetGlobal(); |
528 } | 527 } |
529 | 528 |
530 int ChannelPosix::GetClientFileDescriptor() const { | 529 int ChannelPosix::GetClientFileDescriptor() const { |
531 base::AutoLock lock(client_pipe_lock_); | 530 base::AutoLock lock(client_pipe_lock_); |
532 return client_pipe_.get(); | 531 return client_pipe_.get(); |
533 } | 532 } |
534 | 533 |
535 base::ScopedFD ChannelPosix::TakeClientFileDescriptor() { | 534 base::ScopedFD ChannelPosix::TakeClientFileDescriptor() { |
536 base::AutoLock lock(client_pipe_lock_); | 535 base::AutoLock lock(client_pipe_lock_); |
537 if (!client_pipe_.is_valid()) | 536 if (!client_pipe_.is_valid()) |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 | 1015 |
1017 //------------------------------------------------------------------------------ | 1016 //------------------------------------------------------------------------------ |
1018 // Channel's methods | 1017 // Channel's methods |
1019 | 1018 |
1020 // static | 1019 // static |
1021 scoped_ptr<Channel> Channel::Create(const IPC::ChannelHandle& channel_handle, | 1020 scoped_ptr<Channel> Channel::Create(const IPC::ChannelHandle& channel_handle, |
1022 Mode mode, | 1021 Mode mode, |
1023 Listener* listener, | 1022 Listener* listener, |
1024 AttachmentBroker* broker) { | 1023 AttachmentBroker* broker) { |
1025 return make_scoped_ptr( | 1024 return make_scoped_ptr( |
1026 new ChannelPosix(channel_handle, mode, listener, broker)); | 1025 new ChannelPosix(channel_handle, mode, listener)); |
1027 } | 1026 } |
1028 | 1027 |
1029 // static | 1028 // static |
1030 std::string Channel::GenerateVerifiedChannelID(const std::string& prefix) { | 1029 std::string Channel::GenerateVerifiedChannelID(const std::string& prefix) { |
1031 // A random name is sufficient validation on posix systems, so we don't need | 1030 // A random name is sufficient validation on posix systems, so we don't need |
1032 // an additional shared secret. | 1031 // an additional shared secret. |
1033 | 1032 |
1034 std::string id = prefix; | 1033 std::string id = prefix; |
1035 if (!id.empty()) | 1034 if (!id.empty()) |
1036 id.append("."); | 1035 id.append("."); |
1037 | 1036 |
1038 return id.append(GenerateUniqueRandomChannelID()); | 1037 return id.append(GenerateUniqueRandomChannelID()); |
1039 } | 1038 } |
1040 | 1039 |
1041 bool Channel::IsNamedServerInitialized( | 1040 bool Channel::IsNamedServerInitialized( |
1042 const std::string& channel_id) { | 1041 const std::string& channel_id) { |
1043 return ChannelPosix::IsNamedServerInitialized(channel_id); | 1042 return ChannelPosix::IsNamedServerInitialized(channel_id); |
1044 } | 1043 } |
1045 | 1044 |
1046 #if defined(OS_LINUX) | 1045 #if defined(OS_LINUX) |
1047 // static | 1046 // static |
1048 void Channel::SetGlobalPid(int pid) { | 1047 void Channel::SetGlobalPid(int pid) { |
1049 ChannelPosix::SetGlobalPid(pid); | 1048 ChannelPosix::SetGlobalPid(pid); |
1050 } | 1049 } |
1051 #endif // OS_LINUX | 1050 #endif // OS_LINUX |
1052 | 1051 |
1053 } // namespace IPC | 1052 } // namespace IPC |
OLD | NEW |