Add thunks for MojoGetRights(), etc.
I.e., this makes MojoGetRights() to apps.
R=azani@chromium.org
Review URL: https://codereview.chromium.org/1993283002 .
diff --git a/mojo/edk/embedder/entrypoints.cc b/mojo/edk/embedder/entrypoints.cc
index 44c1e22..b500f6b 100644
--- a/mojo/edk/embedder/entrypoints.cc
+++ b/mojo/edk/embedder/entrypoints.cc
@@ -27,6 +27,10 @@
return g_core->Close(handle);
}
+MojoResult MojoGetRights(MojoHandle handle, MojoHandleRights* rights) {
+ return g_core->GetRights(handle, MakeUserPointer(rights));
+}
+
MojoResult MojoWait(MojoHandle handle,
MojoHandleSignals signals,
MojoDeadline deadline,
diff --git a/mojo/edk/embedder/system_impl_private_entrypoints.cc b/mojo/edk/embedder/system_impl_private_entrypoints.cc
index f35c91f..0f1b18d 100644
--- a/mojo/edk/embedder/system_impl_private_entrypoints.cc
+++ b/mojo/edk/embedder/system_impl_private_entrypoints.cc
@@ -92,6 +92,14 @@
return core->Close(handle);
}
+MojoResult MojoSystemImplGetRights(MojoSystemImpl system,
+ MojoHandle handle,
+ MojoHandleRights* rights) {
+ mojo::system::Core* core = static_cast<mojo::system::Core*>(system);
+ DCHECK(core);
+ return core->GetRights(handle, MakeUserPointer(rights));
+}
+
MojoResult MojoSystemImplWait(MojoSystemImpl system,
MojoHandle handle,
MojoHandleSignals signals,
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
index 745b5af..c91ef7b 100644
--- a/mojo/edk/system/core_unittest.cc
+++ b/mojo/edk/system/core_unittest.cc
@@ -20,6 +20,17 @@
namespace system {
namespace {
+const MojoHandleRights kDefaultMessagePipeHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
+ MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeProducerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeConsumerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+
const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
@@ -44,7 +55,7 @@
EXPECT_EQ(1u, info.GetCtorCallCount());
EXPECT_NE(h, MOJO_HANDLE_INVALID);
- MojoHandleRights rights = 0;
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights)));
EXPECT_EQ(kDefaultMockHandleRights, rights);
@@ -210,7 +221,7 @@
// |GetRights()|:
{
- MojoHandleRights rights = 0;
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights)));
EXPECT_EQ(0u, rights);
@@ -670,16 +681,12 @@
EXPECT_NE(h[0], h[1]);
// Both should have the correct rights.
- static const MojoHandleRights kMessagePipeHandleRights =
- MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
- MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
- MOJO_HANDLE_RIGHT_SET_OPTIONS;
MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights)));
- EXPECT_EQ(kMessagePipeHandleRights, rights);
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights)));
- EXPECT_EQ(kMessagePipeHandleRights, rights);
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
// Neither should be readable.
MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
@@ -981,6 +988,12 @@
// fails. See above note.
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
+ // Check that |h_received| still has the expected rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK,
+ core()->GetRights(h_received, MakeUserPointer(&rights)));
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
+
// Write to |h_passed[0]|. Should receive on |h_received|.
EXPECT_EQ(MOJO_RESULT_OK,
core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello),
@@ -1027,18 +1040,12 @@
EXPECT_NE(ph, ch);
// Both should have the correct rights.
- static const MojoHandleRights kDataPipeProducerHandleRights =
- MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
- MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
- static const MojoHandleRights kDataPipeConsumerHandleRights =
- MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
- MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights)));
- EXPECT_EQ(kDataPipeProducerHandleRights, rights);
+ EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
rights = MOJO_HANDLE_RIGHT_NONE;
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights)));
- EXPECT_EQ(kDataPipeConsumerHandleRights, rights);
+ EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
// Producer should be never-readable, but already writable.
hss = kEmptyMojoHandleSignalsState;
@@ -1464,6 +1471,12 @@
// above note.
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
+ // Check that |ch_received| still has the expected rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK,
+ core()->GetRights(ch_received, MakeUserPointer(&rights)));
+ EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
+
// Write to |ph|. Should receive on |ch_received|.
num_bytes = kWorldSize;
EXPECT_EQ(MOJO_RESULT_OK,
@@ -1524,6 +1537,12 @@
// above note.
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
+ // Check that |ph_received| still has the expected rights.
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK,
+ core()->GetRights(ph_received, MakeUserPointer(&rights)));
+ EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
+
// Write to |ph_received|. Should receive on |ch_received|.
num_bytes = kHelloSize;
EXPECT_EQ(MOJO_RESULT_OK,
diff --git a/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc b/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
index 02ed73b..7ccdc84 100644
--- a/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
+++ b/mojo/nacl/nonsfi/irt_mojo_nonsfi.cc
@@ -24,6 +24,7 @@
nacl::MojoGetInitialHandle,
MojoGetTimeTicksNow,
MojoClose,
+ MojoGetRights,
MojoWait,
MojoWaitMany,
MojoCreateMessagePipe,
diff --git a/mojo/nacl/sfi/nacl_bindings/mojo_irt.c b/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
index 4da9e63..41c8c49 100644
--- a/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
+++ b/mojo/nacl/sfi/nacl_bindings/mojo_irt.c
@@ -57,6 +57,19 @@
return result;
};
+static MojoResult irt_MojoGetRights(
+ MojoHandle handle,
+ MojoHandleRights* rights) {
+ uint32_t params[4];
+ MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
+ params[0] = 3;
+ params[1] = (uint32_t)(&handle);
+ params[2] = (uint32_t)(rights);
+ params[3] = (uint32_t)(&result);
+ DoMojoCall(params, sizeof(params));
+ return result;
+};
+
static MojoResult irt_MojoWait(
MojoHandle handle,
MojoHandleSignals signals,
@@ -64,7 +77,7 @@
struct MojoHandleSignalsState* signals_state) {
uint32_t params[6];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 3;
+ params[0] = 4;
params[1] = (uint32_t)(&handle);
params[2] = (uint32_t)(&signals);
params[3] = (uint32_t)(&deadline);
@@ -83,7 +96,7 @@
struct MojoHandleSignalsState* signals_states) {
uint32_t params[8];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 4;
+ params[0] = 5;
params[1] = (uint32_t)(handles);
params[2] = (uint32_t)(signals);
params[3] = (uint32_t)(&num_handles);
@@ -101,7 +114,7 @@
MojoHandle* message_pipe_handle1) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 5;
+ params[0] = 6;
params[1] = (uint32_t)(options);
params[2] = (uint32_t)(message_pipe_handle0);
params[3] = (uint32_t)(message_pipe_handle1);
@@ -119,7 +132,7 @@
MojoWriteMessageFlags flags) {
uint32_t params[8];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 6;
+ params[0] = 7;
params[1] = (uint32_t)(&message_pipe_handle);
params[2] = (uint32_t)(bytes);
params[3] = (uint32_t)(&num_bytes);
@@ -140,7 +153,7 @@
MojoReadMessageFlags flags) {
uint32_t params[8];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 7;
+ params[0] = 8;
params[1] = (uint32_t)(&message_pipe_handle);
params[2] = (uint32_t)(bytes);
params[3] = (uint32_t)(num_bytes);
@@ -158,7 +171,7 @@
MojoHandle* data_pipe_consumer_handle) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 8;
+ params[0] = 9;
params[1] = (uint32_t)(options);
params[2] = (uint32_t)(data_pipe_producer_handle);
params[3] = (uint32_t)(data_pipe_consumer_handle);
@@ -172,7 +185,7 @@
const struct MojoDataPipeProducerOptions* options) {
uint32_t params[4];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 9;
+ params[0] = 10;
params[1] = (uint32_t)(&data_pipe_producer_handle);
params[2] = (uint32_t)(options);
params[3] = (uint32_t)(&result);
@@ -186,7 +199,7 @@
uint32_t options_num_bytes) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 10;
+ params[0] = 11;
params[1] = (uint32_t)(&data_pipe_producer_handle);
params[2] = (uint32_t)(options);
params[3] = (uint32_t)(&options_num_bytes);
@@ -202,7 +215,7 @@
MojoWriteDataFlags flags) {
uint32_t params[6];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 11;
+ params[0] = 12;
params[1] = (uint32_t)(&data_pipe_producer_handle);
params[2] = (uint32_t)(elements);
params[3] = (uint32_t)(num_bytes);
@@ -219,7 +232,7 @@
MojoWriteDataFlags flags) {
uint32_t params[6];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 12;
+ params[0] = 13;
params[1] = (uint32_t)(&data_pipe_producer_handle);
params[2] = (uint32_t)(buffer);
params[3] = (uint32_t)(buffer_num_bytes);
@@ -234,7 +247,7 @@
uint32_t num_bytes_written) {
uint32_t params[4];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 13;
+ params[0] = 14;
params[1] = (uint32_t)(&data_pipe_producer_handle);
params[2] = (uint32_t)(&num_bytes_written);
params[3] = (uint32_t)(&result);
@@ -247,7 +260,7 @@
const struct MojoDataPipeConsumerOptions* options) {
uint32_t params[4];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 14;
+ params[0] = 15;
params[1] = (uint32_t)(&data_pipe_consumer_handle);
params[2] = (uint32_t)(options);
params[3] = (uint32_t)(&result);
@@ -261,7 +274,7 @@
uint32_t options_num_bytes) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 15;
+ params[0] = 16;
params[1] = (uint32_t)(&data_pipe_consumer_handle);
params[2] = (uint32_t)(options);
params[3] = (uint32_t)(&options_num_bytes);
@@ -277,7 +290,7 @@
MojoReadDataFlags flags) {
uint32_t params[6];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 16;
+ params[0] = 17;
params[1] = (uint32_t)(&data_pipe_consumer_handle);
params[2] = (uint32_t)(elements);
params[3] = (uint32_t)(num_bytes);
@@ -294,7 +307,7 @@
MojoReadDataFlags flags) {
uint32_t params[6];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 17;
+ params[0] = 18;
params[1] = (uint32_t)(&data_pipe_consumer_handle);
params[2] = (uint32_t)(buffer);
params[3] = (uint32_t)(buffer_num_bytes);
@@ -309,7 +322,7 @@
uint32_t num_bytes_read) {
uint32_t params[4];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 18;
+ params[0] = 19;
params[1] = (uint32_t)(&data_pipe_consumer_handle);
params[2] = (uint32_t)(&num_bytes_read);
params[3] = (uint32_t)(&result);
@@ -323,7 +336,7 @@
MojoHandle* shared_buffer_handle) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 19;
+ params[0] = 20;
params[1] = (uint32_t)(options);
params[2] = (uint32_t)(&num_bytes);
params[3] = (uint32_t)(shared_buffer_handle);
@@ -338,7 +351,7 @@
MojoHandle* new_buffer_handle) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 20;
+ params[0] = 21;
params[1] = (uint32_t)(&buffer_handle);
params[2] = (uint32_t)(options);
params[3] = (uint32_t)(new_buffer_handle);
@@ -353,7 +366,7 @@
uint32_t info_num_bytes) {
uint32_t params[5];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 21;
+ params[0] = 22;
params[1] = (uint32_t)(&buffer_handle);
params[2] = (uint32_t)(info);
params[3] = (uint32_t)(&info_num_bytes);
@@ -370,7 +383,7 @@
MojoMapBufferFlags flags) {
uint32_t params[7];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 22;
+ params[0] = 23;
params[1] = (uint32_t)(&buffer_handle);
params[2] = (uint32_t)(&offset);
params[3] = (uint32_t)(&num_bytes);
@@ -384,7 +397,7 @@
static MojoResult irt_MojoUnmapBuffer(void* buffer) {
uint32_t params[3];
MojoResult result = MOJO_RESULT_INVALID_ARGUMENT;
- params[0] = 23;
+ params[0] = 24;
params[1] = (uint32_t)(&buffer);
params[2] = (uint32_t)(&result);
DoMojoCall(params, sizeof(params));
@@ -395,6 +408,7 @@
&irt__MojoGetInitialHandle,
&irt_MojoGetTimeTicksNow,
&irt_MojoClose,
+ &irt_MojoGetRights,
&irt_MojoWait,
&irt_MojoWaitMany,
&irt_MojoCreateMessagePipe,
diff --git a/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc b/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
index 21b2110..cbc89d8 100644
--- a/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
+++ b/mojo/nacl/sfi/nacl_bindings/mojo_syscall.cc
@@ -130,6 +130,40 @@
return 0;
}
case 3: {
+ if (num_params != 4) {
+ return -1;
+ }
+ MojoHandle handle_value;
+ MojoHandleRights volatile* rights_ptr;
+ MojoHandleRights rights_value;
+ MojoResult volatile* result_ptr;
+ MojoResult result_value;
+ {
+ ScopedCopyLock copy_lock(nap);
+ if (!ConvertScalarInput(nap, params[1], &handle_value)) {
+ return -1;
+ }
+ if (!ConvertScalarInOut(nap, params[2], false, &rights_value,
+ &rights_ptr)) {
+ return -1;
+ }
+ if (!ConvertScalarOutput(nap, params[3], false, &result_ptr)) {
+ return -1;
+ }
+ }
+
+ result_value =
+ MojoSystemImplGetRights(g_mojo_system, handle_value, &rights_value);
+
+ {
+ ScopedCopyLock copy_lock(nap);
+ *rights_ptr = rights_value;
+ *result_ptr = result_value;
+ }
+
+ return 0;
+ }
+ case 4: {
if (num_params != 6) {
return -1;
}
@@ -174,7 +208,7 @@
return 0;
}
- case 4: {
+ case 5: {
if (num_params != 8) {
return -1;
}
@@ -230,7 +264,7 @@
return 0;
}
- case 5: {
+ case 6: {
if (num_params != 5) {
return -1;
}
@@ -274,7 +308,7 @@
return 0;
}
- case 6: {
+ case 7: {
if (num_params != 8) {
return -1;
}
@@ -323,7 +357,7 @@
return 0;
}
- case 7: {
+ case 8: {
if (num_params != 8) {
return -1;
}
@@ -383,7 +417,7 @@
return 0;
}
- case 8: {
+ case 9: {
if (num_params != 5) {
return -1;
}
@@ -427,7 +461,7 @@
return 0;
}
- case 9: {
+ case 10: {
if (num_params != 4) {
return -1;
}
@@ -459,7 +493,7 @@
return 0;
}
- case 10: {
+ case 11: {
if (num_params != 5) {
return -1;
}
@@ -497,7 +531,7 @@
return 0;
}
- case 11: {
+ case 12: {
if (num_params != 6) {
return -1;
}
@@ -542,10 +576,10 @@
return 0;
}
- case 12:
+ case 13:
fprintf(stderr, "MojoBeginWriteData not implemented\n");
return -1;
- case 13: {
+ case 14: {
if (num_params != 4) {
return -1;
}
@@ -578,7 +612,7 @@
return 0;
}
- case 14: {
+ case 15: {
if (num_params != 4) {
return -1;
}
@@ -610,7 +644,7 @@
return 0;
}
- case 15: {
+ case 16: {
if (num_params != 5) {
return -1;
}
@@ -648,7 +682,7 @@
return 0;
}
- case 16: {
+ case 17: {
if (num_params != 6) {
return -1;
}
@@ -693,10 +727,10 @@
return 0;
}
- case 17:
+ case 18:
fprintf(stderr, "MojoBeginReadData not implemented\n");
return -1;
- case 18: {
+ case 19: {
if (num_params != 4) {
return -1;
}
@@ -728,7 +762,7 @@
return 0;
}
- case 19: {
+ case 20: {
if (num_params != 5) {
return -1;
}
@@ -767,7 +801,7 @@
return 0;
}
- case 20: {
+ case 21: {
if (num_params != 5) {
return -1;
}
@@ -806,7 +840,7 @@
return 0;
}
- case 21: {
+ case 22: {
if (num_params != 5) {
return -1;
}
@@ -842,10 +876,10 @@
return 0;
}
- case 22:
+ case 23:
fprintf(stderr, "MojoMapBuffer not implemented\n");
return -1;
- case 23:
+ case 24:
fprintf(stderr, "MojoUnmapBuffer not implemented\n");
return -1;
}
diff --git a/mojo/nacl/sfi/nacl_bindings_generator/interface.py b/mojo/nacl/sfi/nacl_bindings_generator/interface.py
index dd51977..725f118 100644
--- a/mojo/nacl/sfi/nacl_bindings_generator/interface.py
+++ b/mojo/nacl/sfi/nacl_bindings_generator/interface.py
@@ -20,6 +20,10 @@
f = mojo.Func('MojoClose', 'MojoResult')
f.Param('handle').In('MojoHandle')
+ f = mojo.Func('MojoGetRights', 'MojoResult')
+ f.Param('handle').In('MojoHandle')
+ f.Param('rights').Out('MojoHandleRights')
+
f = mojo.Func('MojoWait', 'MojoResult')
f.Param('handle').In('MojoHandle')
f.Param('signals').In('MojoHandleSignals')
diff --git a/mojo/public/c/system/tests/core_unittest.cc b/mojo/public/c/system/tests/core_unittest.cc
index b8667fd..4e36860 100644
--- a/mojo/public/c/system/tests/core_unittest.cc
+++ b/mojo/public/c/system/tests/core_unittest.cc
@@ -24,6 +24,22 @@
namespace mojo {
namespace {
+const MojoHandleRights kDefaultMessagePipeHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
+ MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeProducerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeConsumerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultSharedBufferHandleRights =
+ MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS |
+ MOJO_HANDLE_RIGHT_MAP_READABLE | MOJO_HANDLE_RIGHT_MAP_WRITABLE |
+ MOJO_HANDLE_RIGHT_MAP_EXECUTABLE;
+
TEST(CoreTest, GetTimeTicksNow) {
const MojoTimeTicks start = MojoGetTimeTicksNow();
EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
@@ -42,6 +58,11 @@
// Close:
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID));
+ // GetRights:
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+ MojoGetRights(MOJO_HANDLE_INVALID, &rights));
+
// Wait:
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
MojoWait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 1000000u,
@@ -129,6 +150,15 @@
EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1));
EXPECT_NE(h0, MOJO_HANDLE_INVALID);
EXPECT_NE(h1, MOJO_HANDLE_INVALID);
+ EXPECT_NE(h0, h1);
+
+ // Both handles should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h0, &rights));
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h1, &rights));
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
// Shouldn't be readable, we haven't written anything.
MojoHandleSignalsState state;
@@ -225,6 +255,15 @@
EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc));
EXPECT_NE(hp, MOJO_HANDLE_INVALID);
EXPECT_NE(hc, MOJO_HANDLE_INVALID);
+ EXPECT_NE(hp, hc);
+
+ // Both handles should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(hp, &rights));
+ EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(hc, &rights));
+ EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
// The consumer |hc| shouldn't be readable.
MojoHandleSignalsState state;
@@ -583,6 +622,11 @@
EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0));
EXPECT_NE(h0, MOJO_HANDLE_INVALID);
+ // The handle should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h0, &rights));
+ EXPECT_EQ(kDefaultSharedBufferHandleRights, rights);
+
// Check information about the buffer from |h0|.
MojoBufferInformation info = {};
static const uint32_t kInfoSize = static_cast<uint32_t>(sizeof(info));
@@ -603,6 +647,11 @@
EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1));
EXPECT_NE(h1, MOJO_HANDLE_INVALID);
+ // The new handle should have the correct rights.
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(h1, &rights));
+ EXPECT_EQ(kDefaultSharedBufferHandleRights, rights);
+
// Check information about the buffer from |h1|.
info = MojoBufferInformation();
EXPECT_EQ(MOJO_RESULT_OK, MojoGetBufferInformation(h1, &info, kInfoSize));
diff --git a/mojo/public/platform/nacl/libmojo.cc b/mojo/public/platform/nacl/libmojo.cc
index 415d950..716877c 100644
--- a/mojo/public/platform/nacl/libmojo.cc
+++ b/mojo/public/platform/nacl/libmojo.cc
@@ -53,6 +53,13 @@
return irt_mojo->MojoClose(handle);
}
+MojoResult MojoGetRights(MojoHandle handle, MojoHandleRights* rights) {
+ struct nacl_irt_mojo* irt_mojo = get_irt_mojo();
+ if (!irt_mojo)
+ abort();
+ return irt_mojo->MojoGetRights(handle, rights);
+}
+
MojoResult MojoWait(MojoHandle handle,
MojoHandleSignals signals,
MojoDeadline deadline,
diff --git a/mojo/public/platform/nacl/mojo_irt.h b/mojo/public/platform/nacl/mojo_irt.h
index 6259eca..4a7edc3 100644
--- a/mojo/public/platform/nacl/mojo_irt.h
+++ b/mojo/public/platform/nacl/mojo_irt.h
@@ -21,6 +21,7 @@
MojoResult (*_MojoGetInitialHandle)(MojoHandle* handle);
MojoTimeTicks (*MojoGetTimeTicksNow)();
MojoResult (*MojoClose)(MojoHandle handle);
+ MojoResult (*MojoGetRights)(MojoHandle handle, MojoHandleRights* rights);
MojoResult (*MojoWait)(MojoHandle handle,
MojoHandleSignals signals,
MojoDeadline deadline,
diff --git a/mojo/public/platform/native/system_impl_private.h b/mojo/public/platform/native/system_impl_private.h
index 6aeba44..58b3560 100644
--- a/mojo/public/platform/native/system_impl_private.h
+++ b/mojo/public/platform/native/system_impl_private.h
@@ -51,6 +51,9 @@
// APIs mirroring the Mojo system APIs, but also taking a MojoSystemImpl param.
MojoTimeTicks MojoSystemImplGetTimeTicksNow(MojoSystemImpl system);
MojoResult MojoSystemImplClose(MojoSystemImpl system, MojoHandle handle);
+MojoResult MojoSystemImplGetRights(MojoSystemImpl system,
+ MojoHandle handle,
+ MojoHandleRights* rights);
MojoResult MojoSystemImplWait(MojoSystemImpl system,
MojoHandle handle,
MojoHandleSignals signals,
diff --git a/mojo/public/platform/native/system_impl_private_thunks.c b/mojo/public/platform/native/system_impl_private_thunks.c
index 4666685..82f2ac1 100644
--- a/mojo/public/platform/native/system_impl_private_thunks.c
+++ b/mojo/public/platform/native/system_impl_private_thunks.c
@@ -41,6 +41,13 @@
return g_system_impl_thunks.Close(system, handle);
}
+MojoResult MojoSystemImplGetRights(MojoSystemImpl system,
+ MojoHandle handle,
+ MojoHandleRights* rights) {
+ assert(g_system_impl_thunks.GetRights);
+ return g_system_impl_thunks.GetRights(system, handle, rights);
+}
+
MojoResult MojoSystemImplWait(MojoSystemImpl system,
MojoHandle handle,
MojoHandleSignals signals,
diff --git a/mojo/public/platform/native/system_impl_private_thunks.h b/mojo/public/platform/native/system_impl_private_thunks.h
index 2f8b24d..e29fc8e 100644
--- a/mojo/public/platform/native/system_impl_private_thunks.h
+++ b/mojo/public/platform/native/system_impl_private_thunks.h
@@ -34,6 +34,9 @@
size_t size; // Should be set to sizeof(MojoExplicitThunksPrivate).
MojoTimeTicks (*GetTimeTicksNow)(MojoSystemImpl system);
MojoResult (*Close)(MojoSystemImpl system, MojoHandle handle);
+ MojoResult (*GetRights)(MojoSystemImpl system,
+ MojoHandle handle,
+ MojoHandleRights* rights);
MojoResult (*Wait)(MojoSystemImpl system,
MojoHandle handle,
MojoHandleSignals signals,
@@ -153,6 +156,7 @@
sizeof(MojoSystemImplThunksPrivate),
MojoSystemImplGetTimeTicksNow,
MojoSystemImplClose,
+ MojoSystemImplGetRights,
MojoSystemImplWait,
MojoSystemImplWaitMany,
MojoSystemImplCreateMessagePipe,
diff --git a/mojo/public/platform/native/system_impl_private_unittest.cc b/mojo/public/platform/native/system_impl_private_unittest.cc
index 871d055..215ccd4 100644
--- a/mojo/public/platform/native/system_impl_private_unittest.cc
+++ b/mojo/public/platform/native/system_impl_private_unittest.cc
@@ -12,6 +12,22 @@
namespace mojo {
namespace {
+const MojoHandleRights kDefaultMessagePipeHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
+ MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeProducerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultDataPipeConsumerHandleRights =
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
+const MojoHandleRights kDefaultSharedBufferHandleRights =
+ MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER |
+ MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS |
+ MOJO_HANDLE_RIGHT_MAP_READABLE | MOJO_HANDLE_RIGHT_MAP_WRITABLE |
+ MOJO_HANDLE_RIGHT_MAP_EXECUTABLE;
+
TEST(SystemImplTest, GetTimeTicksNow) {
MojoSystemImpl system = MojoSystemImplCreateImpl();
const MojoTimeTicks start = MojoSystemImplGetTimeTicksNow(system);
@@ -37,6 +53,15 @@
MojoSystemImplCreateMessagePipe(sys0, nullptr, &h0, &h1));
EXPECT_NE(h0, MOJO_HANDLE_INVALID);
EXPECT_NE(h1, MOJO_HANDLE_INVALID);
+ EXPECT_NE(h0, h1);
+
+ // Both handles should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, h0, &rights));
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, h1, &rights));
+ EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
// Move the other end of the pipe to a different SystemImpl.
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, h1, sys1, &h1));
@@ -147,6 +172,15 @@
MojoSystemImplCreateDataPipe(sys0, nullptr, &hp, &hc));
EXPECT_NE(hp, MOJO_HANDLE_INVALID);
EXPECT_NE(hc, MOJO_HANDLE_INVALID);
+ EXPECT_NE(hp, hc);
+
+ // Both handles should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, hp, &rights));
+ EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, hc, &rights));
+ EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
// Move the other end of the pipe to a different SystemImpl.
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, hc, sys1, &hc));
@@ -574,6 +608,11 @@
MojoSystemImplCreateSharedBuffer(sys0, nullptr, kSize, &h0));
EXPECT_NE(h0, MOJO_HANDLE_INVALID);
+ // The handle should have the correct rights.
+ MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, h0, &rights));
+ EXPECT_EQ(kDefaultSharedBufferHandleRights, rights);
+
// Check the buffer information.
{
MojoBufferInformation info = {};
@@ -598,6 +637,11 @@
MojoSystemImplDuplicateBufferHandle(sys0, h0, nullptr, &h1));
EXPECT_NE(h1, MOJO_HANDLE_INVALID);
+ // The new handle should have the correct rights.
+ rights = MOJO_HANDLE_RIGHT_NONE;
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, h1, &rights));
+ EXPECT_EQ(kDefaultSharedBufferHandleRights, rights);
+
// Move the other end of the pipe to a different SystemImpl.
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, h1, sys1, &h1));
EXPECT_NE(h1, MOJO_HANDLE_INVALID);
diff --git a/mojo/public/platform/native/system_thunks.c b/mojo/public/platform/native/system_thunks.c
index 2ac8e8c..9ed890f 100644
--- a/mojo/public/platform/native/system_thunks.c
+++ b/mojo/public/platform/native/system_thunks.c
@@ -20,6 +20,11 @@
return g_thunks.Close(handle);
}
+MojoResult MojoGetRights(MojoHandle handle, MojoHandleRights* rights) {
+ assert(g_thunks.GetRights);
+ return g_thunks.GetRights(handle, rights);
+}
+
MojoResult MojoWait(MojoHandle handle,
MojoHandleSignals signals,
MojoDeadline deadline,
diff --git a/mojo/public/platform/native/system_thunks.h b/mojo/public/platform/native/system_thunks.h
index 8ada0f0..23f7d69 100644
--- a/mojo/public/platform/native/system_thunks.h
+++ b/mojo/public/platform/native/system_thunks.h
@@ -126,6 +126,7 @@
MojoHandle data_pipe_producer_handle,
struct MojoDataPipeProducerOptions* options,
uint32_t options_num_bytes);
+ MojoResult (*GetRights)(MojoHandle handle, MojoHandleRights* rights);
};
#pragma pack(pop)
@@ -159,6 +160,7 @@
MojoGetDataPipeConsumerOptions,
MojoSetDataPipeProducerOptions,
MojoGetDataPipeProducerOptions,
+ MojoGetRights,
};
return system_thunks;
}