diff options
author | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-21 23:07:04 +0000 |
---|---|---|
committer | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-21 23:07:04 +0000 |
commit | e46177921cafffdf8d911d92388f6d3b66483817 (patch) | |
tree | 7857dafa96f2eb9b76e1a013a875abc9d1120ac0 /chrome/nacl | |
parent | a86c93c574d51e430b89b41a18f72924614ade6e (diff) | |
download | chromium_src-e46177921cafffdf8d911d92388f6d3b66483817.zip chromium_src-e46177921cafffdf8d911d92388f6d3b66483817.tar.gz chromium_src-e46177921cafffdf8d911d92388f6d3b66483817.tar.bz2 |
Add an IPC channel between the NaCl loader process and the renderer.
BUG=116317
TEST=manual
Review URL: https://chromiumcodereview.appspot.com/10214007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@143483 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/nacl')
-rw-r--r-- | chrome/nacl/nacl_ipc_adapter.cc | 7 | ||||
-rw-r--r-- | chrome/nacl/nacl_ipc_adapter.h | 4 | ||||
-rw-r--r-- | chrome/nacl/nacl_listener.cc | 27 |
3 files changed, 37 insertions, 1 deletions
diff --git a/chrome/nacl/nacl_ipc_adapter.cc b/chrome/nacl/nacl_ipc_adapter.cc index f76fa0d..f915a6a 100644 --- a/chrome/nacl/nacl_ipc_adapter.cc +++ b/chrome/nacl/nacl_ipc_adapter.cc @@ -74,6 +74,7 @@ ssize_t NaClDescCustomRecvMsg(void* handle, NaClImcTypedMsgHdr* msg, int /* flags */) { if (msg->iov_length != 1) return -1; + msg->ndesc_length = 0; // Messages with descriptors aren't supported yet. return static_cast<ssize_t>( ToAdapter(handle)->BlockingReceive(static_cast<char*>(msg->iov[0].base), msg->iov[0].length)); @@ -281,6 +282,12 @@ NaClDesc* NaClIPCAdapter::MakeNaClDesc() { return MakeNaClDescCustom(this); } +#if defined(OS_POSIX) +int NaClIPCAdapter::TakeClientFileDescriptor() { + return io_thread_data_.channel_->TakeClientFileDescriptor(); +} +#endif + bool NaClIPCAdapter::OnMessageReceived(const IPC::Message& message) { { base::AutoLock lock(lock_); diff --git a/chrome/nacl/nacl_ipc_adapter.h b/chrome/nacl/nacl_ipc_adapter.h index 12500cd..8c3c493 100644 --- a/chrome/nacl/nacl_ipc_adapter.h +++ b/chrome/nacl/nacl_ipc_adapter.h @@ -77,6 +77,10 @@ class NaClIPCAdapter : public base::RefCountedThreadSafe<NaClIPCAdapter>, // NaClDesc is reference-counted, and a reference is returned. NaClDesc* MakeNaClDesc(); +#if defined(OS_POSIX) + int TakeClientFileDescriptor(); +#endif + // Listener implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; diff --git a/chrome/nacl/nacl_listener.cc b/chrome/nacl/nacl_listener.cc index a5433dc..7159749 100644 --- a/chrome/nacl/nacl_listener.cc +++ b/chrome/nacl/nacl_listener.cc @@ -13,13 +13,19 @@ #include "base/message_loop.h" #include "base/rand_util.h" #include "chrome/common/nacl_messages.h" +#include "chrome/nacl/nacl_ipc_adapter.h" #include "chrome/nacl/nacl_validation_db.h" #include "chrome/nacl/nacl_validation_query.h" +#include "ipc/ipc_channel_handle.h" +#include "ipc/ipc_switches.h" #include "ipc/ipc_sync_channel.h" #include "ipc/ipc_sync_message_filter.h" -#include "ipc/ipc_switches.h" #include "native_client/src/trusted/service_runtime/sel_main_chrome.h" +#if defined(OS_POSIX) +#include "base/file_descriptor_posix.h" +#endif + #if defined(OS_LINUX) #include "content/public/common/child_process_sandbox_support_linux.h" #endif @@ -188,6 +194,25 @@ void NaClListener::OnMsgStart(const nacl::NaClStartParams& params) { return; } + if (params.enable_ipc_proxy) { + // Create the server side of the channel and notify the process host so it + // can reply to the renderer, which will connect as client. + IPC::ChannelHandle channel_handle = + IPC::Channel::GenerateVerifiedChannelID("nacl"); + + scoped_refptr<NaClIPCAdapter> ipc_adapter(new NaClIPCAdapter( + channel_handle, io_thread_.message_loop_proxy())); + args->initial_ipc_desc = ipc_adapter.get()->MakeNaClDesc(); + +#if defined(OS_POSIX) + channel_handle.socket = base::FileDescriptor( + ipc_adapter.get()->TakeClientFileDescriptor(), true); +#endif + + if (!Send(new NaClProcessHostMsg_PpapiChannelCreated(channel_handle))) + LOG(ERROR) << "Failed to send IPC channel handle to renderer."; + } + std::vector<nacl::FileDescriptor> handles = params.handles; #if defined(OS_LINUX) || defined(OS_MACOSX) |