| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 <assert.h> | 8 #include <assert.h> |
| 9 #include <errno.h> | 9 #include <errno.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| 11 #include <algorithm> | 11 #include <algorithm> |
| 12 | 12 |
| 13 #include "nacl_io/kernel_handle.h" | 13 #include "nacl_io/kernel_handle.h" |
| 14 #include "nacl_io/log.h" |
| 14 #include "nacl_io/pepper_interface.h" | 15 #include "nacl_io/pepper_interface.h" |
| 15 #include "nacl_io/socket/tcp_node.h" | 16 #include "nacl_io/socket/tcp_node.h" |
| 16 #include "nacl_io/stream/stream_fs.h" | 17 #include "nacl_io/stream/stream_fs.h" |
| 17 | 18 |
| 18 namespace { | 19 namespace { |
| 19 const size_t kMaxPacketSize = 65536; | 20 const size_t kMaxPacketSize = 65536; |
| 20 const size_t kDefaultFifoSize = kMaxPacketSize * 8; | 21 const size_t kDefaultFifoSize = kMaxPacketSize * 8; |
| 21 } | 22 } |
| 22 | 23 |
| 23 namespace nacl_io { | 24 namespace nacl_io { |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 void TcpNode::Destroy() { | 281 void TcpNode::Destroy() { |
| 281 emitter_->DetachStream(); | 282 emitter_->DetachStream(); |
| 282 SocketNode::Destroy(); | 283 SocketNode::Destroy(); |
| 283 } | 284 } |
| 284 | 285 |
| 285 Error TcpNode::Init(int open_flags) { | 286 Error TcpNode::Init(int open_flags) { |
| 286 Error err = SocketNode::Init(open_flags); | 287 Error err = SocketNode::Init(open_flags); |
| 287 if (err != 0) | 288 if (err != 0) |
| 288 return err; | 289 return err; |
| 289 | 290 |
| 290 if (TCPInterface() == NULL) | 291 if (TCPInterface() == NULL) { |
| 292 LOG_ERROR("Got NULL interface: TCP"); |
| 291 return EACCES; | 293 return EACCES; |
| 294 } |
| 292 | 295 |
| 293 if (socket_resource_ != 0) { | 296 if (socket_resource_ != 0) { |
| 294 // TCP sockets that are contructed with an existing socket_resource_ | 297 // TCP sockets that are contructed with an existing socket_resource_ |
| 295 // are those that generated from calls to Accept() and therefore are | 298 // are those that generated from calls to Accept() and therefore are |
| 296 // already connected. | 299 // already connected. |
| 297 remote_addr_ = TCPInterface()->GetRemoteAddress(socket_resource_); | 300 remote_addr_ = TCPInterface()->GetRemoteAddress(socket_resource_); |
| 298 ConnectDone_Locked(); | 301 ConnectDone_Locked(); |
| 299 } else { | 302 } else { |
| 300 socket_resource_ = | 303 socket_resource_ = |
| 301 TCPInterface()->Create(filesystem_->ppapi()->GetInstance()); | 304 TCPInterface()->Create(filesystem_->ppapi()->GetInstance()); |
| 302 if (0 == socket_resource_) | 305 if (0 == socket_resource_) { |
| 306 LOG_ERROR("Unable to create TCP resource."); |
| 303 return EACCES; | 307 return EACCES; |
| 308 } |
| 304 SetStreamFlags(SSF_CAN_CONNECT); | 309 SetStreamFlags(SSF_CAN_CONNECT); |
| 305 } | 310 } |
| 306 | 311 |
| 307 return 0; | 312 return 0; |
| 308 } | 313 } |
| 309 | 314 |
| 310 EventEmitter* TcpNode::GetEventEmitter() { | 315 EventEmitter* TcpNode::GetEventEmitter() { |
| 311 return emitter_.get(); | 316 return emitter_.get(); |
| 312 } | 317 } |
| 313 | 318 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 } | 481 } |
| 477 | 482 |
| 478 ConnectDone_Locked(); | 483 ConnectDone_Locked(); |
| 479 return 0; | 484 return 0; |
| 480 } | 485 } |
| 481 | 486 |
| 482 Error TcpNode::Shutdown(int how) { | 487 Error TcpNode::Shutdown(int how) { |
| 483 AUTO_LOCK(node_lock_); | 488 AUTO_LOCK(node_lock_); |
| 484 if (!IsConnected()) | 489 if (!IsConnected()) |
| 485 return ENOTCONN; | 490 return ENOTCONN; |
| 491 |
| 486 { | 492 { |
| 487 AUTO_LOCK(emitter_->GetLock()); | 493 AUTO_LOCK(emitter_->GetLock()); |
| 488 emitter_->SetError_Locked(); | 494 emitter_->SetError_Locked(); |
| 489 } | 495 } |
| 490 return 0; | 496 return 0; |
| 491 } | 497 } |
| 492 | 498 |
| 493 void TcpNode::ConnectDone_Locked() { | 499 void TcpNode::ConnectDone_Locked() { |
| 494 local_addr_ = TCPInterface()->GetLocalAddress(socket_resource_); | 500 local_addr_ = TCPInterface()->GetLocalAddress(socket_resource_); |
| 495 | 501 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 assert(emitter_.get()); | 556 assert(emitter_.get()); |
| 551 if (emitter_->GetError_Locked()) | 557 if (emitter_->GetError_Locked()) |
| 552 return EPIPE; | 558 return EPIPE; |
| 553 *out_len = emitter_->WriteOut_Locked((char*)buf, len); | 559 *out_len = emitter_->WriteOut_Locked((char*)buf, len); |
| 554 return 0; | 560 return 0; |
| 555 } | 561 } |
| 556 | 562 |
| 557 } // namespace nacl_io | 563 } // namespace nacl_io |
| 558 | 564 |
| 559 #endif // PROVIDES_SOCKET_API | 565 #endif // PROVIDES_SOCKET_API |
| OLD | NEW |