| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/arc/arc_session.h" | 5 #include "components/arc/arc_session.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <grp.h> | 8 #include <grp.h> |
| 9 #include <poll.h> | 9 #include <poll.h> |
| 10 #include <unistd.h> | 10 #include <unistd.h> |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "chromeos/dbus/dbus_method_call_status.h" | 26 #include "chromeos/dbus/dbus_method_call_status.h" |
| 27 #include "chromeos/dbus/dbus_thread_manager.h" | 27 #include "chromeos/dbus/dbus_thread_manager.h" |
| 28 #include "chromeos/dbus/session_manager_client.h" | 28 #include "chromeos/dbus/session_manager_client.h" |
| 29 #include "components/arc/arc_bridge_host_impl.h" | 29 #include "components/arc/arc_bridge_host_impl.h" |
| 30 #include "components/arc/arc_features.h" | 30 #include "components/arc/arc_features.h" |
| 31 #include "components/arc/arc_session_observer.h" | 31 #include "components/arc/arc_session_observer.h" |
| 32 #include "components/user_manager/user_manager.h" | 32 #include "components/user_manager/user_manager.h" |
| 33 #include "mojo/edk/embedder/embedder.h" | 33 #include "mojo/edk/embedder/embedder.h" |
| 34 #include "mojo/edk/embedder/named_platform_handle.h" | 34 #include "mojo/edk/embedder/named_platform_handle.h" |
| 35 #include "mojo/edk/embedder/named_platform_handle_utils.h" | 35 #include "mojo/edk/embedder/named_platform_handle_utils.h" |
| 36 #include "mojo/edk/embedder/pending_process_connection.h" |
| 36 #include "mojo/edk/embedder/platform_channel_pair.h" | 37 #include "mojo/edk/embedder/platform_channel_pair.h" |
| 37 #include "mojo/edk/embedder/platform_channel_utils_posix.h" | 38 #include "mojo/edk/embedder/platform_channel_utils_posix.h" |
| 38 #include "mojo/edk/embedder/platform_handle_vector.h" | 39 #include "mojo/edk/embedder/platform_handle_vector.h" |
| 39 #include "mojo/edk/embedder/scoped_platform_handle.h" | 40 #include "mojo/edk/embedder/scoped_platform_handle.h" |
| 40 #include "mojo/public/cpp/bindings/binding.h" | 41 #include "mojo/public/cpp/bindings/binding.h" |
| 41 | 42 |
| 42 namespace arc { | 43 namespace arc { |
| 43 | 44 |
| 44 namespace { | 45 namespace { |
| 45 | 46 |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 mojo::edk::ScopedPlatformHandle scoped_fd; | 435 mojo::edk::ScopedPlatformHandle scoped_fd; |
| 435 if (!mojo::edk::ServerAcceptConnection(socket_fd.get(), &scoped_fd, | 436 if (!mojo::edk::ServerAcceptConnection(socket_fd.get(), &scoped_fd, |
| 436 /* check_peer_user = */ false) || | 437 /* check_peer_user = */ false) || |
| 437 !scoped_fd.is_valid()) { | 438 !scoped_fd.is_valid()) { |
| 438 return mojo::ScopedMessagePipeHandle(); | 439 return mojo::ScopedMessagePipeHandle(); |
| 439 } | 440 } |
| 440 | 441 |
| 441 // Hardcode pid 0 since it is unused in mojo. | 442 // Hardcode pid 0 since it is unused in mojo. |
| 442 const base::ProcessHandle kUnusedChildProcessHandle = 0; | 443 const base::ProcessHandle kUnusedChildProcessHandle = 0; |
| 443 mojo::edk::PlatformChannelPair channel_pair; | 444 mojo::edk::PlatformChannelPair channel_pair; |
| 444 std::string child_token = mojo::edk::GenerateRandomToken(); | 445 mojo::edk::PendingProcessConnection process; |
| 445 mojo::edk::ChildProcessLaunched(kUnusedChildProcessHandle, | 446 process.Connect(kUnusedChildProcessHandle, channel_pair.PassServerHandle()); |
| 446 channel_pair.PassServerHandle(), child_token); | |
| 447 | 447 |
| 448 mojo::edk::ScopedPlatformHandleVectorPtr handles( | 448 mojo::edk::ScopedPlatformHandleVectorPtr handles( |
| 449 new mojo::edk::PlatformHandleVector{ | 449 new mojo::edk::PlatformHandleVector{ |
| 450 channel_pair.PassClientHandle().release()}); | 450 channel_pair.PassClientHandle().release()}); |
| 451 | 451 |
| 452 std::string token = mojo::edk::GenerateRandomToken(); | 452 std::string token; |
| 453 ScopedMessagePipeHandle pipe = process.CreateMessagePipe(&token); |
| 454 |
| 453 // We need to send the length of the message as a single byte, so make sure it | 455 // We need to send the length of the message as a single byte, so make sure it |
| 454 // fits. | 456 // fits. |
| 455 DCHECK_LT(token.size(), 256u); | 457 DCHECK_LT(token.size(), 256u); |
| 456 uint8_t message_length = static_cast<uint8_t>(token.size()); | 458 uint8_t message_length = static_cast<uint8_t>(token.size()); |
| 457 struct iovec iov[] = {{&message_length, sizeof(message_length)}, | 459 struct iovec iov[] = {{&message_length, sizeof(message_length)}, |
| 458 {const_cast<char*>(token.c_str()), token.size()}}; | 460 {const_cast<char*>(token.c_str()), token.size()}}; |
| 459 ssize_t result = mojo::edk::PlatformChannelSendmsgWithHandles( | 461 ssize_t result = mojo::edk::PlatformChannelSendmsgWithHandles( |
| 460 scoped_fd.get(), iov, sizeof(iov) / sizeof(iov[0]), handles->data(), | 462 scoped_fd.get(), iov, sizeof(iov) / sizeof(iov[0]), handles->data(), |
| 461 handles->size()); | 463 handles->size()); |
| 462 if (result == -1) { | 464 if (result == -1) { |
| 463 PLOG(ERROR) << "sendmsg"; | 465 PLOG(ERROR) << "sendmsg"; |
| 464 return mojo::ScopedMessagePipeHandle(); | 466 return mojo::ScopedMessagePipeHandle(); |
| 465 } | 467 } |
| 466 | 468 |
| 467 return mojo::edk::CreateParentMessagePipe(token, child_token); | 469 return pipe; |
| 468 } | 470 } |
| 469 | 471 |
| 470 void ArcSessionImpl::OnMojoConnected( | 472 void ArcSessionImpl::OnMojoConnected( |
| 471 mojo::ScopedMessagePipeHandle server_pipe) { | 473 mojo::ScopedMessagePipeHandle server_pipe) { |
| 472 DCHECK(thread_checker_.CalledOnValidThread()); | 474 DCHECK(thread_checker_.CalledOnValidThread()); |
| 473 | 475 |
| 474 if (state_ == State::STOPPED) { | 476 if (state_ == State::STOPPED) { |
| 475 // This is the case that error is notified via DBus before the | 477 // This is the case that error is notified via DBus before the |
| 476 // OnMojoConnected() callback is invoked. The stopping procedure has | 478 // OnMojoConnected() callback is invoked. The stopping procedure has |
| 477 // been run, so do nothing. | 479 // been run, so do nothing. |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 | 644 |
| 643 // static | 645 // static |
| 644 std::unique_ptr<ArcSession> ArcSession::Create( | 646 std::unique_ptr<ArcSession> ArcSession::Create( |
| 645 ArcBridgeService* arc_bridge_service, | 647 ArcBridgeService* arc_bridge_service, |
| 646 const scoped_refptr<base::TaskRunner>& blocking_task_runner) { | 648 const scoped_refptr<base::TaskRunner>& blocking_task_runner) { |
| 647 return base::MakeUnique<ArcSessionImpl>(arc_bridge_service, | 649 return base::MakeUnique<ArcSessionImpl>(arc_bridge_service, |
| 648 blocking_task_runner); | 650 blocking_task_runner); |
| 649 } | 651 } |
| 650 | 652 |
| 651 } // namespace arc | 653 } // namespace arc |
| OLD | NEW |