Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |