Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: ipc/mojo/ipc_channel_mojo.cc

Issue 866223005: IPC: Add MojoHandleAttachment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing windows buld error Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/mojo/ipc_channel_mojo.h" 5 #include "ipc/mojo/ipc_channel_mojo.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "ipc/ipc_listener.h" 10 #include "ipc/ipc_listener.h"
11 #include "ipc/ipc_logging.h" 11 #include "ipc/ipc_logging.h"
12 #include "ipc/ipc_message_attachment_set.h" 12 #include "ipc/ipc_message_attachment_set.h"
13 #include "ipc/ipc_message_macros.h" 13 #include "ipc/ipc_message_macros.h"
14 #include "ipc/mojo/client_channel.mojom.h" 14 #include "ipc/mojo/client_channel.mojom.h"
15 #include "ipc/mojo/ipc_mojo_bootstrap.h" 15 #include "ipc/mojo/ipc_mojo_bootstrap.h"
16 #include "ipc/mojo/ipc_mojo_handle_attachment.h"
16 #include "third_party/mojo/src/mojo/edk/embedder/embedder.h" 17 #include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
17 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" 18 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h"
18 19
19 #if defined(OS_POSIX) && !defined(OS_NACL) 20 #if defined(OS_POSIX) && !defined(OS_NACL)
20 #include "ipc/ipc_platform_file_attachment_posix.h" 21 #include "ipc/ipc_platform_file_attachment_posix.h"
21 #endif 22 #endif
22 23
23 namespace IPC { 24 namespace IPC {
24 25
25 namespace { 26 namespace {
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 } 335 }
335 336
336 #if defined(OS_POSIX) && !defined(OS_NACL) 337 #if defined(OS_POSIX) && !defined(OS_NACL)
337 int ChannelMojo::GetClientFileDescriptor() const { 338 int ChannelMojo::GetClientFileDescriptor() const {
338 return bootstrap_->GetClientFileDescriptor(); 339 return bootstrap_->GetClientFileDescriptor();
339 } 340 }
340 341
341 base::ScopedFD ChannelMojo::TakeClientFileDescriptor() { 342 base::ScopedFD ChannelMojo::TakeClientFileDescriptor() {
342 return bootstrap_->TakeClientFileDescriptor(); 343 return bootstrap_->TakeClientFileDescriptor();
343 } 344 }
344 345 #endif // defined(OS_POSIX) && !defined(OS_NACL)
345 // static
346 MojoResult ChannelMojo::WriteToMessageAttachmentSet(
347 const std::vector<MojoHandle>& handle_buffer,
348 Message* message) {
349 for (size_t i = 0; i < handle_buffer.size(); ++i) {
350 mojo::embedder::ScopedPlatformHandle platform_handle;
351 MojoResult unwrap_result = mojo::embedder::PassWrappedPlatformHandle(
352 handle_buffer[i], &platform_handle);
353 if (unwrap_result != MOJO_RESULT_OK) {
354 DLOG(WARNING) << "Pipe failed to covert handles. Closing: "
355 << unwrap_result;
356 return unwrap_result;
357 }
358
359 bool ok = message->attachment_set()->AddAttachment(
360 new internal::PlatformFileAttachment(
361 base::ScopedFD(platform_handle.release().fd)));
362 DCHECK(ok);
363 }
364
365 return MOJO_RESULT_OK;
366 }
367 346
368 // static 347 // static
369 MojoResult ChannelMojo::ReadFromMessageAttachmentSet( 348 MojoResult ChannelMojo::ReadFromMessageAttachmentSet(
370 Message* message, 349 Message* message,
371 std::vector<MojoHandle>* handles) { 350 std::vector<MojoHandle>* handles) {
372 // We dup() the handles in IPC::Message to transmit. 351 // We dup() the handles in IPC::Message to transmit.
373 // IPC::MessageAttachmentSet has intricate lifecycle semantics 352 // IPC::MessageAttachmentSet has intricate lifecycle semantics
374 // of FDs, so just to dup()-and-own them is the safest option. 353 // of FDs, so just to dup()-and-own them is the safest option.
375 if (message->HasAttachments()) { 354 if (message->HasAttachments()) {
376 MessageAttachmentSet* fdset = message->attachment_set(); 355 MessageAttachmentSet* set = message->attachment_set();
377 std::vector<base::PlatformFile> fds_to_send(fdset->size()); 356 for (size_t i = 0; i < set->size(); ++i) {
378 fdset->PeekDescriptors(&fds_to_send[0]); 357 scoped_refptr<MessageAttachment> attachment = set->GetAttachmentAt(i);
379 for (size_t i = 0; i < fds_to_send.size(); ++i) { 358 switch (attachment->GetType()) {
380 int fd_to_send = dup(fds_to_send[i]); 359 case MessageAttachment::TYPE_PLATFORM_FILE:
381 if (-1 == fd_to_send) { 360 #if defined(OS_POSIX) && !defined(OS_NACL)
382 DPLOG(WARNING) << "Failed to dup FD to transmit."; 361 {
383 fdset->CommitAll(); 362 base::PlatformFile file =
384 return MOJO_RESULT_UNKNOWN; 363 dup(static_cast<IPC::internal::PlatformFileAttachment*>(
364 attachment.get())->file());
365 if (file == -1) {
366 DPLOG(WARNING) << "Failed to dup FD to transmit.";
367 set->CommitAll();
368 return MOJO_RESULT_UNKNOWN;
369 }
370
371 MojoHandle wrapped_handle;
372 MojoResult wrap_result = CreatePlatformHandleWrapper(
373 mojo::embedder::ScopedPlatformHandle(
374 mojo::embedder::PlatformHandle(file)),
375 &wrapped_handle);
376 if (MOJO_RESULT_OK != wrap_result) {
377 DLOG(WARNING) << "Pipe failed to wrap handles. Closing: "
378 << wrap_result;
379 set->CommitAll();
380 return wrap_result;
381 }
382
383 handles->push_back(wrapped_handle);
384 }
385 #else
386 NOTREACHED();
agl 2015/02/04 00:17:47 I think the indentation of this line is wrong.
Hajime Morrita 2015/02/04 00:44:51 Done.
387 #endif // defined(OS_POSIX) && !defined(OS_NACL)
388 break;
389 case MessageAttachment::TYPE_MOJO_HANDLE: {
agl 2015/02/04 00:17:46 blank line before this.
Hajime Morrita 2015/02/04 00:44:51 Done.
agl 2015/02/04 00:49:06 Not clear from codereview that this happened.
Hajime Morrita 2015/02/05 00:42:06 Hmm. I guess The tool shows you an older revision?
390 mojo::ScopedHandle handle =
391 static_cast<IPC::internal::MojoHandleAttachment*>(
392 attachment.get())->TakeHandle();
393 handles->push_back(handle.release().value());
394 } break;
385 } 395 }
386
387 MojoHandle wrapped_handle;
388 MojoResult wrap_result = CreatePlatformHandleWrapper(
389 mojo::embedder::ScopedPlatformHandle(
390 mojo::embedder::PlatformHandle(fd_to_send)),
391 &wrapped_handle);
392 if (MOJO_RESULT_OK != wrap_result) {
393 DLOG(WARNING) << "Pipe failed to wrap handles. Closing: "
394 << wrap_result;
395 fdset->CommitAll();
396 return wrap_result;
397 }
398
399 handles->push_back(wrapped_handle);
400 } 396 }
401 397
402 fdset->CommitAll(); 398 set->CommitAll();
403 } 399 }
404 400
405 return MOJO_RESULT_OK; 401 return MOJO_RESULT_OK;
406 } 402 }
407 403
408 #endif // defined(OS_POSIX) && !defined(OS_NACL) 404 // static
405 MojoResult ChannelMojo::WriteToMessageAttachmentSet(
406 const std::vector<MojoHandle>& handle_buffer,
407 Message* message) {
408 for (size_t i = 0; i < handle_buffer.size(); ++i) {
409 bool ok = message->attachment_set()->AddAttachment(
410 new IPC::internal::MojoHandleAttachment(
411 mojo::MakeScopedHandle(mojo::Handle(handle_buffer[i]))));
412 DCHECK(ok);
agl 2015/02/04 00:17:46 if (!ok) { return <some error value> } ?
Hajime Morrita 2015/02/04 00:44:51 There is no upper bound of mojo handles. Might be
413 }
414
415 return MOJO_RESULT_OK;
416 }
409 417
410 } // namespace IPC 418 } // namespace IPC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698