Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / native_client_sdk / src / libraries / nacl_io / socket / udp_node.cc
index 7caef65..c84d212 100644 (file)
@@ -53,6 +53,10 @@ class UdpSendWork : public UdpWork {
     if (!node_->TestStreamFlags(SSF_CAN_SEND))
       return false;
 
+    // Check if we are already sending.
+    if (node_->TestStreamFlags(SSF_SENDING))
+      return false;
+
     packet_ = emitter_->ReadTXPacket_Locked();
     if (NULL == packet_)
       return false;
@@ -199,6 +203,37 @@ void UdpNode::QueueOutput() {
   stream()->EnqueueWork(work);
 }
 
+Error UdpNode::SetSockOpt(int lvl,
+                          int optname,
+                          const void* optval,
+                          socklen_t len) {
+  if (lvl == SOL_SOCKET && optname == SO_RCVBUF) {
+    if (static_cast<size_t>(len) < sizeof(int))
+      return EINVAL;
+    AUTO_LOCK(node_lock_);
+    int bufsize = *static_cast<const int*>(optval);
+    int32_t error =
+          UDPInterface()->SetOption(socket_resource_,
+                       PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE,
+                       PP_MakeInt32(bufsize),
+                       PP_BlockUntilComplete());
+    return PPErrorToErrno(error);
+  } else if (lvl == SOL_SOCKET && optname == SO_SNDBUF) {
+    if (static_cast<size_t>(len) < sizeof(int))
+      return EINVAL;
+    AUTO_LOCK(node_lock_);
+    int bufsize = *static_cast<const int*>(optval);
+    int32_t error =
+        UDPInterface()->SetOption(socket_resource_,
+                PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE,
+                PP_MakeInt32(bufsize),
+                PP_BlockUntilComplete());
+    return PPErrorToErrno(error);
+  }
+
+  return SocketNode::SetSockOpt(lvl, optname, optval, len);
+}
+
 Error UdpNode::Bind(const struct sockaddr* addr, socklen_t len) {
   if (0 == socket_resource_)
     return EBADF;