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

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

Issue 23498015: [NaCl SDK] Support non blocking TCP/UDP (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added Fifo Tests Created 7 years, 3 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
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "nacl_io/ossocket.h" 5 #include "nacl_io/ossocket.h"
6 #ifdef PROVIDES_SOCKET_API 6 #ifdef PROVIDES_SOCKET_API
7 7
8 #include <errno.h> 8 #include <errno.h>
9 #include <string.h> 9 #include <string.h>
10 10
11 #include "nacl_io/mount.h" 11 #include "nacl_io/mount.h"
12 #include "nacl_io/mount_node_socket.h" 12 #include "nacl_io/mount_node_socket.h"
13 #include "nacl_io/pepper_interface.h" 13 #include "nacl_io/pepper_interface.h"
14 14
15 #include "ppapi/c/pp_resource.h" 15 #include "ppapi/c/pp_resource.h"
16 #include "ppapi/c/ppb_net_address.h" 16 #include "ppapi/c/ppb_net_address.h"
17 17
18 namespace nacl_io { 18 namespace nacl_io {
19 19
20 MountNodeSocket::MountNodeSocket(Mount* mount) 20 MountNodeSocket::MountNodeSocket(Mount* mount)
21 : MountNode(mount), 21 : MountNodeStream(mount),
22 socket_resource_(0), 22 socket_resource_(0),
23 local_addr_(0), 23 local_addr_(0),
24 remote_addr_(0) { 24 remote_addr_(0),
25 socket_flags_(0) {
25 stat_.st_mode |= S_IFSOCK; 26 stat_.st_mode |= S_IFSOCK;
26 } 27 }
27 28
28 void MountNodeSocket::Destroy() { 29 void MountNodeSocket::Destroy() {
29 if (socket_resource_) 30 if (socket_resource_)
30 mount_->ppapi()->ReleaseResource(socket_resource_); 31 mount_->ppapi()->ReleaseResource(socket_resource_);
31 if (local_addr_) 32 if (local_addr_)
32 mount_->ppapi()->ReleaseResource(local_addr_); 33 mount_->ppapi()->ReleaseResource(local_addr_);
33 if (remote_addr_) 34 if (remote_addr_)
34 mount_->ppapi()->ReleaseResource(remote_addr_); 35 mount_->ppapi()->ReleaseResource(remote_addr_);
35 }
36 36
37 // Default to always signaled, until socket select support is added. 37 socket_resource_ = 0;
38 uint32_t MountNodeSocket::GetEventStatus() { 38 local_addr_ = 0;
39 return POLLIN | POLLOUT; 39 remote_addr_ = 0;
40 } 40 }
41 41
42 // Assume that |addr| and |out_addr| are non-NULL. 42 // Assume that |addr| and |out_addr| are non-NULL.
43 Error MountNodeSocket::MMap(void* addr, 43 Error MountNodeSocket::MMap(void* addr,
44 size_t length, 44 size_t length,
45 int prot, 45 int prot,
46 int flags, 46 int flags,
47 size_t offset, 47 size_t offset,
48 void** out_addr) { 48 void** out_addr) {
49 return EACCES; 49 return EACCES;
(...skipping 10 matching lines...) Expand all
60 Error MountNodeSocket::Write(size_t offs, 60 Error MountNodeSocket::Write(size_t offs,
61 const void* buf, 61 const void* buf,
62 size_t count, 62 size_t count,
63 int* out_bytes) { 63 int* out_bytes) {
64 if (0 == remote_addr_) 64 if (0 == remote_addr_)
65 return EDESTADDRREQ; 65 return EDESTADDRREQ;
66 66
67 return Send(buf, count, 0, out_bytes); 67 return Send(buf, count, 0, out_bytes);
68 } 68 }
69 69
70 NetAddressInterface* MountNodeSocket::NetAddress() { 70 NetAddressInterface* MountNodeSocket::NetInterface() {
71 if (mount_->ppapi() == NULL)
72 return NULL;
73
71 return mount_->ppapi()->GetNetAddressInterface(); 74 return mount_->ppapi()->GetNetAddressInterface();
72 } 75 }
73 76
77 TCPSocketInterface* MountNodeSocket::TCPInterface() {
78 if (mount_->ppapi() == NULL)
79 return NULL;
80
81 return mount_->ppapi()->GetTCPSocketInterface();
82 }
83
84 UDPSocketInterface* MountNodeSocket::UDPInterface() {
85 if (mount_->ppapi() == NULL)
86 return NULL;
87
88 return mount_->ppapi()->GetUDPSocketInterface();
89 }
90
74 PP_Resource MountNodeSocket::SockAddrToResource(const struct sockaddr* addr, 91 PP_Resource MountNodeSocket::SockAddrToResource(const struct sockaddr* addr,
75 socklen_t len) { 92 socklen_t len) {
76 if (AF_INET == addr->sa_family) { 93 if (AF_INET == addr->sa_family) {
77 PP_NetAddress_IPv4 addr4; 94 PP_NetAddress_IPv4 addr4;
78 const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(addr); 95 const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(addr);
79 96
80 if (len != sizeof(sockaddr_in)) 97 if (len != sizeof(sockaddr_in))
81 return 0; 98 return 0;
82 99
83 memset(&addr4, 0, sizeof(addr4)); 100 memset(&addr4, 0, sizeof(addr4));
(...skipping 24 matching lines...) Expand all
108 125
109 socklen_t MountNodeSocket::ResourceToSockAddr(PP_Resource addr, 126 socklen_t MountNodeSocket::ResourceToSockAddr(PP_Resource addr,
110 socklen_t len, 127 socklen_t len,
111 struct sockaddr* out_addr) { 128 struct sockaddr* out_addr) {
112 if (0 == addr) 129 if (0 == addr)
113 return 0; 130 return 0;
114 131
115 PP_NetAddress_IPv4 ipv4; 132 PP_NetAddress_IPv4 ipv4;
116 PP_NetAddress_IPv6 ipv6; 133 PP_NetAddress_IPv6 ipv6;
117 134
118 if (PP_TRUE == NetAddress()->DescribeAsIPv4Address(addr, &ipv4)) { 135 if (PP_TRUE == NetInterface()->DescribeAsIPv4Address(addr, &ipv4)) {
119 sockaddr_in addr4; 136 sockaddr_in addr4;
120 addr4.sin_family = AF_INET; 137 addr4.sin_family = AF_INET;
121 addr4.sin_port = ipv4.port; 138 addr4.sin_port = ipv4.port;
122 memcpy(&addr4.sin_addr, ipv4.addr, sizeof(ipv4.addr)); 139 memcpy(&addr4.sin_addr, ipv4.addr, sizeof(ipv4.addr));
123 memcpy(out_addr, &addr4, len); 140 memcpy(out_addr, &addr4, len);
124 141
125 // Returns required size not copied size like getpeername/getsockname. 142 // Returns required size not copied size like getpeername/getsockname.
126 return sizeof(sockaddr_in); 143 return sizeof(sockaddr_in);
127 } 144 }
128 145
129 if (PP_TRUE == NetAddress()->DescribeAsIPv6Address(addr, &ipv6)) { 146 if (PP_TRUE == NetInterface()->DescribeAsIPv6Address(addr, &ipv6)) {
130 sockaddr_in6 addr6; 147 sockaddr_in6 addr6;
131 addr6.sin6_family = AF_INET6; 148 addr6.sin6_family = AF_INET6;
132 addr6.sin6_port = ipv6.port; 149 addr6.sin6_port = ipv6.port;
133 memcpy(&addr6.sin6_addr, ipv6.addr, sizeof(ipv6.addr)); 150 memcpy(&addr6.sin6_addr, ipv6.addr, sizeof(ipv6.addr));
134 memcpy(out_addr, &addr6, len); 151 memcpy(out_addr, &addr6, len);
135 152
136 // Returns required size not copied size like getpeername/getsockname. 153 // Returns required size not copied size like getpeername/getsockname.
137 return sizeof(sockaddr_in6); 154 return sizeof(sockaddr_in6);
138 } 155 }
139 156
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 267
251 AUTO_LOCK(node_lock_); 268 AUTO_LOCK(node_lock_);
252 if (local_addr_ != 0) { 269 if (local_addr_ != 0) {
253 *len = ResourceToSockAddr(local_addr_, *len, addr); 270 *len = ResourceToSockAddr(local_addr_, *len, addr);
254 return 0; 271 return 0;
255 } 272 }
256 273
257 return ENOTCONN; 274 return ENOTCONN;
258 } 275 }
259 276
260 277
binji 2013/09/15 22:18:58 nit: remove extra lines
noelallen1 2013/09/17 21:21:54 Done.
278
279
261 } // namespace nacl_io 280 } // namespace nacl_io
262 281
263 #endif // PROVIDES_SOCKET_API 282 #endif // PROVIDES_SOCKET_API
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698