1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "native_client/src/public/irt_core.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "native_client/src/trusted/service_runtime/include/sys/unistd.h"
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt_private.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/nacl_irt/irt_manifest.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/nacl_irt/irt_ppapi.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/plugin_main.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/public/irt_ppapi.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static struct PP_StartFunctions g_pp_functions;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int irt_ppapi_start(const struct PP_StartFunctions* funcs) {
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Disable NaCl's open_resource() interface on this thread.
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_is_main_thread = 1;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_pp_functions = *funcs;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return PpapiPluginMain();
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t PPP_InitializeModule(PP_Module module_id,
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             PPB_GetInterface get_browser_interface) {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_pp_functions.PPP_InitializeModule(module_id, get_browser_interface);
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PPP_ShutdownModule(void) {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  g_pp_functions.PPP_ShutdownModule();
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const void* PPP_GetInterface(const char* interface_name) {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_pp_functions.PPP_GetInterface(interface_name);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const struct nacl_irt_ppapihook nacl_irt_ppapihook = {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  irt_ppapi_start,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PpapiPluginRegisterThreadCreator,
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static int ppapihook_pnacl_private_filter(void) {
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE);
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (pnacl_mode == -1)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 0;
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return pnacl_mode;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const nacl_irt_resource_open kIrtResourceOpen = {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ppapi::IrtOpenResource,
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int not_pnacl_filter(void) {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pnacl_mode == -1)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 0;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !pnacl_mode;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const struct nacl_irt_interface irt_interfaces[] = {
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  { NACL_IRT_PPAPIHOOK_v0_1, &nacl_irt_ppapihook, sizeof(nacl_irt_ppapihook),
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NULL },
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  { NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1,
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    &nacl_irt_ppapihook_pnacl_private, sizeof(nacl_irt_ppapihook_pnacl_private),
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ppapihook_pnacl_private_filter },
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  { NACL_IRT_RESOURCE_OPEN_v0_1, &kIrtResourceOpen,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sizeof(kIrtResourceOpen), not_pnacl_filter },
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsize_t chrome_irt_query(const char* interface_ident,
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                        void* table, size_t tablesize) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t result = nacl_irt_query_list(interface_ident,
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      table,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      tablesize,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      irt_interfaces,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      sizeof(irt_interfaces));
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (result != 0)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return result;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return nacl_irt_query_core(interface_ident, table, tablesize);
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
82