Home | History | Annotate | Download | only in nacl_irt
      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
      3 // found in the LICENSE file.
      4 
      5 #include "native_client/src/public/irt_core.h"
      6 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h"
      7 #include "native_client/src/untrusted/irt/irt.h"
      8 #include "native_client/src/untrusted/irt/irt_private.h"
      9 #include "ppapi/nacl_irt/irt_manifest.h"
     10 #include "ppapi/nacl_irt/irt_ppapi.h"
     11 #include "ppapi/nacl_irt/plugin_main.h"
     12 #include "ppapi/nacl_irt/public/irt_ppapi.h"
     13 #include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h"
     14 
     15 static struct PP_StartFunctions g_pp_functions;
     16 
     17 int irt_ppapi_start(const struct PP_StartFunctions* funcs) {
     18   // Disable NaCl's open_resource() interface on this thread.
     19   g_is_main_thread = 1;
     20 
     21   g_pp_functions = *funcs;
     22   return PpapiPluginMain();
     23 }
     24 
     25 int32_t PPP_InitializeModule(PP_Module module_id,
     26                              PPB_GetInterface get_browser_interface) {
     27   return g_pp_functions.PPP_InitializeModule(module_id, get_browser_interface);
     28 }
     29 
     30 void PPP_ShutdownModule(void) {
     31   g_pp_functions.PPP_ShutdownModule();
     32 }
     33 
     34 const void* PPP_GetInterface(const char* interface_name) {
     35   return g_pp_functions.PPP_GetInterface(interface_name);
     36 }
     37 
     38 static const struct nacl_irt_ppapihook nacl_irt_ppapihook = {
     39   irt_ppapi_start,
     40   PpapiPluginRegisterThreadCreator,
     41 };
     42 
     43 static int ppapihook_pnacl_private_filter(void) {
     44   int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE);
     45   if (pnacl_mode == -1)
     46     return 0;
     47   return pnacl_mode;
     48 }
     49 
     50 static const nacl_irt_resource_open kIrtResourceOpen = {
     51   ppapi::IrtOpenResource,
     52 };
     53 
     54 static int not_pnacl_filter(void) {
     55   int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE);
     56   if (pnacl_mode == -1)
     57     return 0;
     58   return !pnacl_mode;
     59 }
     60 
     61 static const struct nacl_irt_interface irt_interfaces[] = {
     62   { NACL_IRT_PPAPIHOOK_v0_1, &nacl_irt_ppapihook, sizeof(nacl_irt_ppapihook),
     63     NULL },
     64   { NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1,
     65     &nacl_irt_ppapihook_pnacl_private, sizeof(nacl_irt_ppapihook_pnacl_private),
     66     ppapihook_pnacl_private_filter },
     67   { NACL_IRT_RESOURCE_OPEN_v0_1, &kIrtResourceOpen,
     68     sizeof(kIrtResourceOpen), not_pnacl_filter },
     69 };
     70 
     71 size_t chrome_irt_query(const char* interface_ident,
     72                         void* table, size_t tablesize) {
     73   size_t result = nacl_irt_query_list(interface_ident,
     74                                       table,
     75                                       tablesize,
     76                                       irt_interfaces,
     77                                       sizeof(irt_interfaces));
     78   if (result != 0)
     79     return result;
     80   return nacl_irt_query_core(interface_ident, table, tablesize);
     81 }
     82