| 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  |  | 
|  261 }  // namespace nacl_io |  277 }  // namespace nacl_io | 
|  262  |  278  | 
|  263 #endif  // PROVIDES_SOCKET_API |  279 #endif  // PROVIDES_SOCKET_API | 
| OLD | NEW |