OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2008 The Native Client Authors. All rights reserved. | 2 * Copyright 2008 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can | 3 * Use of this source code is governed by a BSD-style license that can |
4 * be found in the LICENSE file. | 4 * be found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 | 7 |
8 #include <signal.h> | 8 #include <signal.h> |
9 #include <string.h> | 9 #include <string.h> |
10 #include "native_client/src/trusted/plugin/srpc/browser_interface.h" | 10 #include "native_client/src/trusted/plugin/srpc/browser_interface.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 reinterpret_cast<plugin::SocketAddress*>(obj); | 23 reinterpret_cast<plugin::SocketAddress*>(obj); |
24 plugin::ScriptableHandle* connected_socket = socket_addr->Connect(); | 24 plugin::ScriptableHandle* connected_socket = socket_addr->Connect(); |
25 if (NULL == connected_socket) { | 25 if (NULL == connected_socket) { |
26 return false; | 26 return false; |
27 } | 27 } |
28 params->outs()[0]->tag = NACL_SRPC_ARG_TYPE_OBJECT; | 28 params->outs()[0]->tag = NACL_SRPC_ARG_TYPE_OBJECT; |
29 params->outs()[0]->u.oval = connected_socket; | 29 params->outs()[0]->u.oval = connected_socket; |
30 return true; | 30 return true; |
31 } | 31 } |
32 | 32 |
33 bool RpcToString(void* obj, plugin::SrpcParams *params) { | |
34 plugin::SocketAddress* socket_addr = | |
35 reinterpret_cast<plugin::SocketAddress*>(obj); | |
36 const char* str = socket_addr->wrapper()->conn_cap_path(); | |
37 if (NULL == str) { | |
38 return false; | |
39 } | |
40 size_t len = strnlen(str, NACL_PATH_MAX); | |
41 // strnlen ensures that len <= NACL_PATH_MAX < SIZE_T_MAX, so no overflow. | |
42 char* ret_string = reinterpret_cast<char*>(malloc(len + 1)); | |
43 if (NULL == ret_string) { | |
44 return false; | |
45 } | |
46 strncpy(ret_string, str, len + 1); | |
47 params->outs()[0]->tag = NACL_SRPC_ARG_TYPE_STRING; | |
48 params->outs()[0]->u.sval = ret_string; | |
49 return true; | |
50 } | |
51 | |
52 } // namespace | 33 } // namespace |
53 | 34 |
54 namespace plugin { | 35 namespace plugin { |
55 | 36 |
56 SocketAddress* SocketAddress::New(Plugin* plugin, nacl::DescWrapper* wrapper) { | 37 SocketAddress* SocketAddress::New(Plugin* plugin, nacl::DescWrapper* wrapper) { |
57 PLUGIN_PRINTF(("SocketAddress::New()\n")); | 38 PLUGIN_PRINTF(("SocketAddress::New()\n")); |
58 SocketAddress* socket_address = new(std::nothrow) SocketAddress(); | 39 SocketAddress* socket_address = new(std::nothrow) SocketAddress(); |
59 if (socket_address == NULL || !socket_address->Init(plugin, wrapper)) { | 40 if (socket_address == NULL || !socket_address->Init(plugin, wrapper)) { |
60 delete socket_address; | 41 delete socket_address; |
61 return NULL; | 42 return NULL; |
62 } | 43 } |
63 return socket_address; | 44 return socket_address; |
64 } | 45 } |
65 | 46 |
66 bool SocketAddress::Init(Plugin* plugin, nacl::DescWrapper* wrapper) { | 47 bool SocketAddress::Init(Plugin* plugin, nacl::DescWrapper* wrapper) { |
67 if (!DescBasedHandle::Init(plugin, wrapper)) { | 48 if (!DescBasedHandle::Init(plugin, wrapper)) { |
68 return false; | 49 return false; |
69 } | 50 } |
70 LoadMethods(); | 51 LoadMethods(); |
71 return true; | 52 return true; |
72 } | 53 } |
73 | 54 |
74 void SocketAddress::LoadMethods() { | 55 void SocketAddress::LoadMethods() { |
75 // Methods implemented by SocketAddresses. | 56 // Methods implemented by SocketAddresses. |
76 AddMethodCall(RpcConnect, "connect", "", "h"); | 57 AddMethodCall(RpcConnect, "connect", "", "h"); |
77 AddMethodCall(RpcToString, "toString", "", "s"); | |
78 } | 58 } |
79 | 59 |
80 SocketAddress::SocketAddress() { | 60 SocketAddress::SocketAddress() { |
81 PLUGIN_PRINTF(("SocketAddress::SocketAddress(%p)\n", | 61 PLUGIN_PRINTF(("SocketAddress::SocketAddress(%p)\n", |
82 static_cast<void*>(this))); | 62 static_cast<void*>(this))); |
83 } | 63 } |
84 | 64 |
85 SocketAddress::~SocketAddress() { | 65 SocketAddress::~SocketAddress() { |
86 PLUGIN_PRINTF(("SocketAddress::~SocketAddress(%p)\n", | 66 PLUGIN_PRINTF(("SocketAddress::~SocketAddress(%p)\n", |
87 static_cast<void*>(this))); | 67 static_cast<void*>(this))); |
(...skipping 14 matching lines...) Expand all Loading... |
102 ScriptableHandle* connected_socket = | 82 ScriptableHandle* connected_socket = |
103 plugin()->browser_interface()->NewScriptableHandle( | 83 plugin()->browser_interface()->NewScriptableHandle( |
104 portable_connected_socket); | 84 portable_connected_socket); |
105 PLUGIN_PRINTF(("SocketAddress::Connect: CS returned %p\n", | 85 PLUGIN_PRINTF(("SocketAddress::Connect: CS returned %p\n", |
106 static_cast<void*>(connected_socket))); | 86 static_cast<void*>(connected_socket))); |
107 return connected_socket; | 87 return connected_socket; |
108 } | 88 } |
109 } | 89 } |
110 | 90 |
111 } // namespace plugin | 91 } // namespace plugin |
OLD | NEW |