15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/shim_ppapi.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/public/irt_ppapi.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/native_client/src/shared/ppapi_proxy/ppruntime.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.h"
1558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Use local strcmp to avoid dependency on libc. */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int mystrcmp(const char* s1, const char *s2) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while((*s1 && *s2) && (*s1++ == *s2++));
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *(--s1) - *(--s2);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TYPE_nacl_irt_query __pnacl_real_irt_query_func = NULL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)size_t __pnacl_wrap_irt_query_func(const char *interface_ident,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     void *table, size_t tablesize) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Note there is a benign race in initializing the wrapper.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * We build the "hook" structure by copying from the IRT's hook and then
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * writing our wrapper for the ppapi method.  Two threads may end up
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * attempting to do this simultaneously, which should not be a problem,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * as they are writing the same values.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (0 != mystrcmp(interface_ident, NACL_IRT_PPAPIHOOK_v0_1)) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The interface is not wrapped, so use the real interface.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return (*__pnacl_real_irt_query_func)(interface_ident, table, tablesize);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef PNACL_SHIM_AOT
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /*
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   * For PNaCl in-the-browser, redirect to using
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   * NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1 instead of NACL_IRT_PPAPIHOOK_v0_1.
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   */
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return (*__pnacl_real_irt_query_func)(NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1,
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                        table, tablesize);
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /*
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   * For offline generated nexes, avoid depending on the private
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   * NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1 interface, and just do the
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   * overriding here manually.
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)   */
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct nacl_irt_ppapihook real_irt_ppapi_hook;
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if ((*__pnacl_real_irt_query_func)(NACL_IRT_PPAPIHOOK_v0_1,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     &real_irt_ppapi_hook,
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     sizeof real_irt_ppapi_hook) !=
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof real_irt_ppapi_hook) {
5758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    return 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  real_irt_ppapi_start = real_irt_ppapi_hook.ppapi_start;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Copy the interface structure into the client.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  struct nacl_irt_ppapihook *dest = table;
6458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (sizeof *dest <= tablesize) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    dest->ppapi_start = irt_shim_ppapi_start;
6658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    dest->ppapi_register_thread_creator =
6758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        real_irt_ppapi_hook.ppapi_register_thread_creator;
6858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    return sizeof *dest;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
73