| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <sys/types.h> | 10 #include <sys/types.h> |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 } | 266 } |
| 267 | 267 |
| 268 } // namespace | 268 } // namespace |
| 269 //------------------------------------------------------------------------------ | 269 //------------------------------------------------------------------------------ |
| 270 | 270 |
| 271 Channel::ChannelImpl::ChannelImpl(const std::string& channel_id, Mode mode, | 271 Channel::ChannelImpl::ChannelImpl(const std::string& channel_id, Mode mode, |
| 272 Listener* listener) | 272 Listener* listener) |
| 273 : mode_(mode), | 273 : mode_(mode), |
| 274 is_blocked_on_write_(false), | 274 is_blocked_on_write_(false), |
| 275 message_send_bytes_written_(0), | 275 message_send_bytes_written_(0), |
| 276 uses_fifo_(CommandLine::ForCurrentProcess()->HasSwitch( | 276 uses_fifo_( |
| 277 switches::kIPCUseFIFO)), | 277 CommandLine::ForCurrentProcess()->HasSwitch(switches::kIPCUseFIFO) || |
| 278 mode == MODE_NAMED_SERVER || mode == MODE_NAMED_CLIENT), |
| 278 server_listen_pipe_(-1), | 279 server_listen_pipe_(-1), |
| 279 pipe_(-1), | 280 pipe_(-1), |
| 280 client_pipe_(-1), | 281 client_pipe_(-1), |
| 281 #if !defined(OS_MACOSX) | 282 #if !defined(OS_MACOSX) |
| 282 fd_pipe_(-1), | 283 fd_pipe_(-1), |
| 283 remote_fd_pipe_(-1), | 284 remote_fd_pipe_(-1), |
| 284 #endif | 285 #endif |
| 285 listener_(listener), | 286 listener_(listener), |
| 286 waiting_connect_(true), | 287 waiting_connect_(true), |
| 287 factory_(this) { | 288 factory_(this) { |
| 288 if (!CreatePipe(channel_id, mode)) { | 289 if (mode_ == MODE_NAMED_SERVER) |
| 290 mode_ = MODE_SERVER; |
| 291 if (mode_ == MODE_NAMED_CLIENT) |
| 292 mode_ = MODE_CLIENT; |
| 293 |
| 294 if (!CreatePipe(channel_id, mode_)) { |
| 289 // The pipe may have been closed already. | 295 // The pipe may have been closed already. |
| 290 PLOG(WARNING) << "Unable to create pipe named \"" << channel_id | 296 PLOG(WARNING) << "Unable to create pipe named \"" << channel_id |
| 291 << "\" in " << (mode == MODE_SERVER ? "server" : "client") | 297 << "\" in " << (mode_ == MODE_SERVER ? "server" : "client") |
| 292 << " mode"; | 298 << " mode"; |
| 293 } | 299 } |
| 294 } | 300 } |
| 295 | 301 |
| 296 Channel::ChannelImpl::~ChannelImpl() { | 302 Channel::ChannelImpl::~ChannelImpl() { |
| 297 Close(); | 303 Close(); |
| 298 } | 304 } |
| 299 | 305 |
| 300 // static | 306 // static |
| 301 void AddChannelSocket(const std::string& name, int socket) { | 307 void AddChannelSocket(const std::string& name, int socket) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 | 345 |
| 340 bool Channel::ChannelImpl::CreatePipe(const std::string& channel_id, | 346 bool Channel::ChannelImpl::CreatePipe(const std::string& channel_id, |
| 341 Mode mode) { | 347 Mode mode) { |
| 342 DCHECK(server_listen_pipe_ == -1 && pipe_ == -1); | 348 DCHECK(server_listen_pipe_ == -1 && pipe_ == -1); |
| 343 | 349 |
| 344 if (uses_fifo_) { | 350 if (uses_fifo_) { |
| 345 // This only happens in unit tests; see the comment above PipeMap. | 351 // This only happens in unit tests; see the comment above PipeMap. |
| 346 // TODO(playmobil): We shouldn't need to create fifos on disk. | 352 // TODO(playmobil): We shouldn't need to create fifos on disk. |
| 347 // TODO(playmobil): If we do, they should be in the user data directory. | 353 // TODO(playmobil): If we do, they should be in the user data directory. |
| 348 // TODO(playmobil): Cleanup any stale fifos. | 354 // TODO(playmobil): Cleanup any stale fifos. |
| 349 pipe_name_ = "/var/tmp/chrome_" + channel_id; | 355 pipe_name_ = channel_id; |
| 350 if (mode == MODE_SERVER) { | 356 if (mode == MODE_SERVER) { |
| 351 if (!CreateServerFifo(pipe_name_, &server_listen_pipe_)) { | 357 if (!CreateServerFifo(pipe_name_, &server_listen_pipe_)) { |
| 352 return false; | 358 return false; |
| 353 } | 359 } |
| 354 } else { | 360 } else { |
| 355 if (!ClientConnectToFifo(pipe_name_, &pipe_)) { | 361 if (!ClientConnectToFifo(pipe_name_, &pipe_)) { |
| 356 return false; | 362 return false; |
| 357 } | 363 } |
| 358 waiting_connect_ = false; | 364 waiting_connect_ = false; |
| 359 } | 365 } |
| (...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1076 | 1082 |
| 1077 bool Channel::Send(Message* message) { | 1083 bool Channel::Send(Message* message) { |
| 1078 return channel_impl_->Send(message); | 1084 return channel_impl_->Send(message); |
| 1079 } | 1085 } |
| 1080 | 1086 |
| 1081 int Channel::GetClientFileDescriptor() const { | 1087 int Channel::GetClientFileDescriptor() const { |
| 1082 return channel_impl_->GetClientFileDescriptor(); | 1088 return channel_impl_->GetClientFileDescriptor(); |
| 1083 } | 1089 } |
| 1084 | 1090 |
| 1085 } // namespace IPC | 1091 } // namespace IPC |
| OLD | NEW |