Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/mount_node_socket.cc

Issue 22587003: [NaCl SDK] Add UDP and TCP Sockets (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to browser tester fix. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "nacl_io/ossocket.h"
6 #ifdef PROVIDES_SOCKET_API
7
8 #include <errno.h>
9 #include <string.h>
10
11 #include "nacl_io/mount.h"
12 #include "nacl_io/mount_node_socket.h"
13 #include "nacl_io/pepper_interface.h"
14
15 #include "ppapi/c/pp_resource.h"
16 #include "ppapi/c/ppb_net_address.h"
17
18 namespace nacl_io {
19
20 MountNodeSocket::MountNodeSocket(Mount* mount)
21 : MountNode(mount),
22 socket_resource_(0),
23 local_addr_(0),
24 remote_addr_(0) {
25 stat_.st_mode |= S_IFSOCK;
26 }
27
28 void MountNodeSocket::Destroy() {
29 if (socket_resource_)
30 mount_->ppapi()->ReleaseResource(socket_resource_);
31 if (local_addr_)
32 mount_->ppapi()->ReleaseResource(local_addr_);
33 if (remote_addr_)
34 mount_->ppapi()->ReleaseResource(remote_addr_);
35 }
36
37 // Default to always signaled, until socket select support is added.
38 uint32_t MountNodeSocket::GetEventStatus() {
39 return POLLIN | POLLOUT;
40 }
41
42 // Assume that |addr| and |out_addr| are non-NULL.
43 Error MountNodeSocket::MMap(void* addr,
44 size_t length,
45 int prot,
46 int flags,
47 size_t offset,
48 void** out_addr) {
49 return EACCES;
50 }
51
52 // Normal read/write operations on a file
53 Error MountNodeSocket::Read(size_t offs,
54 void* buf,
55 size_t count,
56 int* out_bytes) {
57 return Recv(buf, count, 0, out_bytes);
58 }
59
60 Error MountNodeSocket::Write(size_t offs,
61 const void* buf,
62 size_t count,
63 int* out_bytes) {
64 if (0 == remote_addr_)
65 return EDESTADDRREQ;
66
67 return Send(buf, count, 0, out_bytes);
68 }
69
70 NetAddressInterface* MountNodeSocket::NetAddress() {
71 return mount_->ppapi()->GetNetAddressInterface();
72 }
73
74 PP_Resource MountNodeSocket::SockAddrToResource(const struct sockaddr* addr,
75 socklen_t len) {
76 if (AF_INET == addr->sa_family) {
77 PP_NetAddress_IPv4 addr4;
78 const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(addr);
79
80 if (len != sizeof(sockaddr_in))
81 return 0;
82
83 memset(&addr4, 0, sizeof(addr4));
84
85 addr4.port = sin->sin_port;
86 memcpy(addr4.addr, &sin->sin_addr, sizeof(addr4.addr));
87 return mount_->ppapi()->GetNetAddressInterface()->CreateFromIPv4Address(
88 mount_->ppapi()->GetInstance(), &addr4);
89 }
90
91 if (AF_INET6 == addr->sa_family) {
92 PP_NetAddress_IPv6 addr6;
93 const sockaddr_in6* sin = reinterpret_cast<const sockaddr_in6*>(addr);
94
95 if (len != sizeof(sockaddr_in6))
96 return 0;
97
98 memset(&addr6, 0, sizeof(addr6));
99
100 addr6.port = sin->sin6_port;
101 memcpy(addr6.addr, &sin->sin6_addr, sizeof(addr6.addr));
102 return mount_->ppapi()->GetNetAddressInterface()->CreateFromIPv6Address(
103 mount_->ppapi()->GetInstance(), &addr6);
104 }
105 return 0;
106 }
107
108
109 socklen_t MountNodeSocket::ResourceToSockAddr(PP_Resource addr,
110 socklen_t len,
111 struct sockaddr* out_addr) {
112 if (0 == addr)
113 return 0;
114
115 PP_NetAddress_IPv4 ipv4;
116 PP_NetAddress_IPv6 ipv6;
117
118 if (PP_TRUE == NetAddress()->DescribeAsIPv4Address(addr, &ipv4)) {
119 sockaddr_in addr4;
120 addr4.sin_family = AF_INET;
121 addr4.sin_port = ipv4.port;
122 memcpy(&addr4.sin_addr, ipv4.addr, sizeof(ipv4.addr));
123 memcpy(out_addr, &addr4, len);
124
125 // Returns required size not copied size like getpeername/getsockname.
126 return sizeof(sockaddr_in);
127 }
128
129 if (PP_TRUE == NetAddress()->DescribeAsIPv6Address(addr, &ipv6)) {
130 sockaddr_in6 addr6;
131 addr6.sin6_family = AF_INET6;
132 addr6.sin6_port = ipv6.port;
133 memcpy(&addr6.sin6_addr, ipv6.addr, sizeof(ipv6.addr));
134 memcpy(out_addr, &addr6, len);
135
136 // Returns required size not copied size like getpeername/getsockname.
137 return sizeof(sockaddr_in6);
138 }
139
140 return 0;
141 }
142
143 bool MountNodeSocket::IsEquivalentAddress(PP_Resource addr1,
144 PP_Resource addr2) {
145 if (addr1 == addr2)
146 return true;
147
148 char data1[sizeof(sockaddr_in6)];
149 char data2[sizeof(sockaddr_in6)];
150
151 sockaddr* saddr1 = reinterpret_cast<sockaddr*>(data1);
152 sockaddr* saddr2 = reinterpret_cast<sockaddr*>(data2);
153
154 socklen_t len1 = ResourceToSockAddr(addr1, sizeof(data1), saddr1);
155 socklen_t len2 = ResourceToSockAddr(addr2, sizeof(data2), saddr2);
156
157 if (len1 != len2)
158 return false;
159
160 return memcmp(saddr1, saddr2, len1) == 0;
161 }
162
163
164 Error MountNodeSocket::Accept(const struct sockaddr* addr, socklen_t len) {
165 return ENOSYS;
166 }
167
168 Error MountNodeSocket::Connect(const struct sockaddr* addr, socklen_t len) {
169 if (len < 1)
170 return EINVAL;
171
172 if (NULL == addr)
173 return EFAULT;
174
175 return EOPNOTSUPP;
176 }
177
178 Error MountNodeSocket::Listen(int backlog) {
179 return EOPNOTSUPP;
180 }
181
182 Error MountNodeSocket::GetSockOpt(int lvl,
183 int optname,
184 void* optval,
185 socklen_t* len) {
186 return EINVAL;
187 }
188
189 Error MountNodeSocket::SetSockOpt(int lvl,
190 int optname,
191 const void* optval,
192 socklen_t len) {
193 return EINVAL;
194 }
195
196 Error MountNodeSocket::Bind(const struct sockaddr* addr, socklen_t len) {
197 return EINVAL;
198 }
199
200 Error MountNodeSocket::Recv(void* buf, size_t len, int flags, int* out_len) {
201 return EINVAL;
202 }
203
204 Error MountNodeSocket::RecvFrom(void* buf,
205 size_t len,
206 int flags,
207 struct sockaddr* src_addr,
208 socklen_t* addrlen,
209 int* out_len) {
210 return EOPNOTSUPP;
211 }
212
213 Error MountNodeSocket::Send(const void* buf,
214 size_t len,
215 int flags,
216 int* out_len) {
217 return EOPNOTSUPP;
218 }
219
220 Error MountNodeSocket::SendTo(const void* buf,
221 size_t len,
222 int flags,
223 const struct sockaddr* dest_addr,
224 socklen_t addrlen,
225 int* out_len) {
226 return EOPNOTSUPP;
227 }
228
229 Error MountNodeSocket::Shutdown(int how) {
230 return EOPNOTSUPP;
231 }
232
233
234 Error MountNodeSocket::GetPeerName(struct sockaddr* addr, socklen_t* len) {
235 if (NULL == addr || NULL == len)
236 return EFAULT;
237
238 AUTO_LOCK(node_lock_);
239 if (remote_addr_ != 0) {
240 *len = ResourceToSockAddr(remote_addr_, *len, addr);
241 return 0;
242 }
243
244 return ENOTCONN;
245 }
246
247 Error MountNodeSocket::GetSockName(struct sockaddr* addr, socklen_t* len) {
248 if (NULL == addr || NULL == len)
249 return EFAULT;
250
251 AUTO_LOCK(node_lock_);
252 if (local_addr_ != 0) {
253 *len = ResourceToSockAddr(local_addr_, *len, addr);
254 return 0;
255 }
256
257 return ENOTCONN;
258 }
259
260
261 } // namespace nacl_io
262
263 #endif // PROVIDES_SOCKET_API
OLDNEW
« no previous file with comments | « native_client_sdk/src/libraries/nacl_io/mount_node_socket.h ('k') | native_client_sdk/src/libraries/nacl_io/mount_node_tcp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698