|  | // Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // WARNING this file was generated by generate_nacl_bindings.py | 
|  | // Do not edit by hand. | 
|  |  | 
|  | #include "nacl_bindings/mojo_syscall.h" | 
|  |  | 
|  | #include <stdio.h> | 
|  |  | 
|  | #include "mojo/public/c/system/core.h" | 
|  | #include "mojo/public/platform/native/system_impl_private.h" | 
|  | #include "nacl_bindings/mojo_syscall_internal.h" | 
|  | #include "native_client/src/public/chrome_main.h" | 
|  | #include "native_client/src/public/nacl_app.h" | 
|  | #include "native_client/src/trusted/desc/nacl_desc_custom.h" | 
|  |  | 
|  | MojoHandle g_mojo_handle = MOJO_HANDLE_INVALID; | 
|  | MojoSystemImpl g_mojo_system = nullptr; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | MojoResult _MojoGetInitialHandle(MojoHandle* handle) { | 
|  | *handle = g_mojo_handle; | 
|  | return MOJO_RESULT_OK; | 
|  | } | 
|  |  | 
|  | void MojoDescDestroy(void* handle) { | 
|  | } | 
|  |  | 
|  | ssize_t MojoDescSendMsg(void* handle, | 
|  | const struct NaClImcTypedMsgHdr* msg, | 
|  | int flags) { | 
|  | struct NaClApp* nap = static_cast<struct NaClApp*>(handle); | 
|  |  | 
|  | if (msg->iov_length != 1 || msg->ndesc_length != 0) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | uint32_t volatile* params = static_cast<uint32_t volatile*>(msg->iov[0].base); | 
|  | size_t num_params = msg->iov[0].length / sizeof(*params); | 
|  |  | 
|  | if (num_params < 1) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | uint32_t msg_type = params[0]; | 
|  | switch (msg_type) { | 
|  | case 0: { | 
|  | if (num_params != 5) { | 
|  | return -1; | 
|  | } | 
|  | const struct MojoCreateSharedBufferOptions* options; | 
|  | uint64_t num_bytes_value; | 
|  | MojoHandle volatile* shared_buffer_handle_ptr; | 
|  | MojoHandle shared_buffer_handle_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[2], &num_bytes_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, | 
|  | &shared_buffer_handle_value, | 
|  | &shared_buffer_handle_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplCreateSharedBuffer( | 
|  | g_mojo_system, options, num_bytes_value, &shared_buffer_handle_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *shared_buffer_handle_ptr = shared_buffer_handle_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 1: { | 
|  | if (num_params != 5) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle buffer_handle_value; | 
|  | const struct MojoDuplicateBufferHandleOptions* options; | 
|  | MojoHandle volatile* new_buffer_handle_ptr; | 
|  | MojoHandle new_buffer_handle_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], &buffer_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertExtensibleStructInput(nap, params[2], true, &options)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, &new_buffer_handle_value, | 
|  | &new_buffer_handle_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplDuplicateBufferHandle( | 
|  | g_mojo_system, buffer_handle_value, options, | 
|  | &new_buffer_handle_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *new_buffer_handle_ptr = new_buffer_handle_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 2: | 
|  | fprintf(stderr, "MojoMapBuffer not implemented\n"); | 
|  | return -1; | 
|  | case 3: | 
|  | fprintf(stderr, "MojoUnmapBuffer not implemented\n"); | 
|  | return -1; | 
|  | case 4: { | 
|  | if (num_params != 5) { | 
|  | return -1; | 
|  | } | 
|  | const struct MojoCreateDataPipeOptions* options; | 
|  | MojoHandle volatile* data_pipe_producer_handle_ptr; | 
|  | MojoHandle data_pipe_producer_handle_value; | 
|  | MojoHandle volatile* data_pipe_consumer_handle_ptr; | 
|  | MojoHandle data_pipe_consumer_handle_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[2], false, | 
|  | &data_pipe_producer_handle_value, | 
|  | &data_pipe_producer_handle_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, | 
|  | &data_pipe_consumer_handle_value, | 
|  | &data_pipe_consumer_handle_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplCreateDataPipe( | 
|  | g_mojo_system, options, &data_pipe_producer_handle_value, | 
|  | &data_pipe_consumer_handle_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *data_pipe_producer_handle_ptr = data_pipe_producer_handle_value; | 
|  | *data_pipe_consumer_handle_ptr = data_pipe_consumer_handle_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 5: { | 
|  | if (num_params != 6) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle data_pipe_producer_handle_value; | 
|  | const void* elements; | 
|  | uint32_t volatile* num_bytes_ptr; | 
|  | uint32_t num_bytes_value; | 
|  | MojoWriteDataFlags flags_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], | 
|  | &data_pipe_producer_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, &num_bytes_value, | 
|  | &num_bytes_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[4], &flags_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[2], num_bytes_value, 1, false, | 
|  | &elements)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplWriteData( | 
|  | g_mojo_system, data_pipe_producer_handle_value, elements, | 
|  | &num_bytes_value, flags_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *num_bytes_ptr = num_bytes_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 6: | 
|  | fprintf(stderr, "MojoBeginWriteData not implemented\n"); | 
|  | return -1; | 
|  | case 7: { | 
|  | if (num_params != 4) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle data_pipe_producer_handle_value; | 
|  | uint32_t num_bytes_written_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], | 
|  | &data_pipe_producer_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[2], &num_bytes_written_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplEndWriteData(g_mojo_system, | 
|  | data_pipe_producer_handle_value, | 
|  | num_bytes_written_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 8: { | 
|  | if (num_params != 6) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle data_pipe_consumer_handle_value; | 
|  | void* elements; | 
|  | uint32_t volatile* num_bytes_ptr; | 
|  | uint32_t num_bytes_value; | 
|  | MojoReadDataFlags flags_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], | 
|  | &data_pipe_consumer_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, &num_bytes_value, | 
|  | &num_bytes_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[4], &flags_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[2], num_bytes_value, 1, false, | 
|  | &elements)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = | 
|  | MojoSystemImplReadData(g_mojo_system, data_pipe_consumer_handle_value, | 
|  | elements, &num_bytes_value, flags_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *num_bytes_ptr = num_bytes_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 9: | 
|  | fprintf(stderr, "MojoBeginReadData not implemented\n"); | 
|  | return -1; | 
|  | case 10: { | 
|  | if (num_params != 4) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle data_pipe_consumer_handle_value; | 
|  | uint32_t num_bytes_read_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], | 
|  | &data_pipe_consumer_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[2], &num_bytes_read_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplEndReadData( | 
|  | g_mojo_system, data_pipe_consumer_handle_value, num_bytes_read_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 11: { | 
|  | if (num_params != 2) { | 
|  | return -1; | 
|  | } | 
|  | MojoTimeTicks volatile* result_ptr; | 
|  | MojoTimeTicks result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarOutput(nap, params[1], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplGetTimeTicksNow(g_mojo_system); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 12: { | 
|  | if (num_params != 3) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle handle_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], &handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[2], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplClose(g_mojo_system, handle_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 13: { | 
|  | if (num_params != 6) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle handle_value; | 
|  | MojoHandleSignals signals_value; | 
|  | MojoDeadline deadline_value; | 
|  | MojoHandleSignalsState volatile* signals_state_ptr; | 
|  | MojoHandleSignalsState signals_state_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], &handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[2], &signals_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[3], &deadline_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[4], true, &signals_state_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[5], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplWait( | 
|  | g_mojo_system, handle_value, signals_value, deadline_value, | 
|  | signals_state_ptr ? &signals_state_value : NULL); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (signals_state_ptr != NULL) { | 
|  | memcpy_volatile_out(signals_state_ptr, &signals_state_value, | 
|  | sizeof(MojoHandleSignalsState)); | 
|  | } | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 14: { | 
|  | if (num_params != 8) { | 
|  | return -1; | 
|  | } | 
|  | const MojoHandle* handles; | 
|  | const MojoHandleSignals* signals; | 
|  | uint32_t num_handles_value; | 
|  | MojoDeadline deadline_value; | 
|  | uint32_t volatile* result_index_ptr; | 
|  | uint32_t result_index_value; | 
|  | struct MojoHandleSignalsState* signals_states; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[3], &num_handles_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[4], &deadline_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[5], true, &result_index_value, | 
|  | &result_index_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[1], num_handles_value, sizeof(*handles), | 
|  | false, &handles)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[2], num_handles_value, sizeof(*signals), | 
|  | false, &signals)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[6], num_handles_value, | 
|  | sizeof(*signals_states), true, &signals_states)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplWaitMany( | 
|  | g_mojo_system, handles, signals, num_handles_value, deadline_value, | 
|  | result_index_ptr ? &result_index_value : NULL, signals_states); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (result_index_ptr != NULL) { | 
|  | *result_index_ptr = result_index_value; | 
|  | } | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 15: { | 
|  | if (num_params != 5) { | 
|  | return -1; | 
|  | } | 
|  | const struct MojoCreateMessagePipeOptions* options; | 
|  | MojoHandle volatile* message_pipe_handle0_ptr; | 
|  | MojoHandle message_pipe_handle0_value; | 
|  | MojoHandle volatile* message_pipe_handle1_ptr; | 
|  | MojoHandle message_pipe_handle1_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertExtensibleStructInput(nap, params[1], true, &options)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[2], false, | 
|  | &message_pipe_handle0_value, | 
|  | &message_pipe_handle0_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], false, | 
|  | &message_pipe_handle1_value, | 
|  | &message_pipe_handle1_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[4], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplCreateMessagePipe( | 
|  | g_mojo_system, options, &message_pipe_handle0_value, | 
|  | &message_pipe_handle1_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *message_pipe_handle0_ptr = message_pipe_handle0_value; | 
|  | *message_pipe_handle1_ptr = message_pipe_handle1_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 16: { | 
|  | if (num_params != 8) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle message_pipe_handle_value; | 
|  | const void* bytes; | 
|  | uint32_t num_bytes_value; | 
|  | const MojoHandle* handles; | 
|  | uint32_t num_handles_value; | 
|  | MojoWriteMessageFlags flags_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], &message_pipe_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[3], &num_bytes_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[5], &num_handles_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[6], &flags_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[2], num_bytes_value, 1, true, &bytes)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[4], num_handles_value, sizeof(*handles), | 
|  | true, &handles)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplWriteMessage( | 
|  | g_mojo_system, message_pipe_handle_value, bytes, num_bytes_value, | 
|  | handles, num_handles_value, flags_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 17: { | 
|  | if (num_params != 8) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle message_pipe_handle_value; | 
|  | void* bytes; | 
|  | uint32_t volatile* num_bytes_ptr; | 
|  | uint32_t num_bytes_value; | 
|  | MojoHandle* handles; | 
|  | uint32_t volatile* num_handles_ptr; | 
|  | uint32_t num_handles_value; | 
|  | MojoReadMessageFlags flags_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInput(nap, params[1], &message_pipe_handle_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[3], true, &num_bytes_value, | 
|  | &num_bytes_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInOut(nap, params[5], true, &num_handles_value, | 
|  | &num_handles_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarInput(nap, params[6], &flags_value)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[7], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[2], num_bytes_value, 1, true, &bytes)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertArray(nap, params[4], num_handles_value, sizeof(*handles), | 
|  | true, &handles)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = MojoSystemImplReadMessage( | 
|  | g_mojo_system, message_pipe_handle_value, bytes, | 
|  | num_bytes_ptr ? &num_bytes_value : NULL, handles, | 
|  | num_handles_ptr ? &num_handles_value : NULL, flags_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (num_bytes_ptr != NULL) { | 
|  | *num_bytes_ptr = num_bytes_value; | 
|  | } | 
|  | if (num_handles_ptr != NULL) { | 
|  | *num_handles_ptr = num_handles_value; | 
|  | } | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | case 18: { | 
|  | if (num_params != 3) { | 
|  | return -1; | 
|  | } | 
|  | MojoHandle volatile* handle_ptr; | 
|  | MojoHandle handle_value; | 
|  | MojoResult volatile* result_ptr; | 
|  | MojoResult result_value; | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | if (!ConvertScalarInOut(nap, params[1], false, &handle_value, | 
|  | &handle_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | if (!ConvertScalarOutput(nap, params[2], false, &result_ptr)) { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | result_value = _MojoGetInitialHandle(&handle_value); | 
|  |  | 
|  | { | 
|  | ScopedCopyLock copy_lock(nap); | 
|  | *handle_ptr = handle_value; | 
|  | *result_ptr = result_value; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | ssize_t MojoDescRecvMsg(void* handle, | 
|  | struct NaClImcTypedMsgHdr* msg, | 
|  | int flags) { | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | struct NaClDesc* MakeMojoDesc(struct NaClApp* nap) { | 
|  | struct NaClDescCustomFuncs funcs = NACL_DESC_CUSTOM_FUNCS_INITIALIZER; | 
|  | funcs.Destroy = MojoDescDestroy; | 
|  | funcs.SendMsg = MojoDescSendMsg; | 
|  | funcs.RecvMsg = MojoDescRecvMsg; | 
|  | return NaClDescMakeCustomDesc(nap, &funcs); | 
|  | } | 
|  |  | 
|  | void MojoDisabledDescDestroy(void* handle) { | 
|  | } | 
|  |  | 
|  | ssize_t MojoDisabledDescSendMsg(void* handle, | 
|  | const struct NaClImcTypedMsgHdr* msg, | 
|  | int flags) { | 
|  | fprintf(stderr, "Mojo is not currently supported."); | 
|  | abort(); | 
|  | } | 
|  |  | 
|  | ssize_t MojoDisabledDescRecvMsg(void* handle, | 
|  | struct NaClImcTypedMsgHdr* msg, | 
|  | int flags) { | 
|  | fprintf(stderr, "Mojo is not currently supported."); | 
|  | abort(); | 
|  | } | 
|  |  | 
|  | struct NaClDesc* MakeDisabledMojoDesc(struct NaClApp* nap) { | 
|  | struct NaClDescCustomFuncs funcs = NACL_DESC_CUSTOM_FUNCS_INITIALIZER; | 
|  | funcs.Destroy = MojoDisabledDescDestroy; | 
|  | funcs.SendMsg = MojoDisabledDescSendMsg; | 
|  | funcs.RecvMsg = MojoDisabledDescRecvMsg; | 
|  | return NaClDescMakeCustomDesc(nap, &funcs); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | // The value for this FD must not conflict with uses inside Chromium. However, | 
|  | // mojo/nacl doesn't depend on any Chromium headers, so we can't use a #define | 
|  | // from there. | 
|  | #define NACL_MOJO_DESC (NACL_CHROME_DESC_BASE + 3) | 
|  |  | 
|  | MojoResult InjectMojo(struct NaClApp* nap, MojoHandle handle) { | 
|  | NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeMojoDesc(nap)); | 
|  | g_mojo_system = MojoSystemImplCreateImpl(); | 
|  | return MojoSystemImplTransferHandle(MojoSystemImplGetDefaultImpl(), handle, | 
|  | g_mojo_system, &g_mojo_handle); | 
|  | } | 
|  |  | 
|  | void InjectDisabledMojo(struct NaClApp* nap) { | 
|  | NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeDisabledMojoDesc(nap)); | 
|  | } |