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