| 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/socket/socket_node.h" | 5 #include "nacl_io/socket/socket_node.h" |
| 6 | 6 |
| 7 #include "nacl_io/ossocket.h" | 7 #include "nacl_io/ossocket.h" |
| 8 #ifdef PROVIDES_SOCKET_API | 8 #ifdef PROVIDES_SOCKET_API |
| 9 | 9 |
| 10 #include <errno.h> | 10 #include <errno.h> |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 368 } |
| 369 | 369 |
| 370 Error SocketNode::RecvFrom(const HandleAttr& attr, | 370 Error SocketNode::RecvFrom(const HandleAttr& attr, |
| 371 void* buf, | 371 void* buf, |
| 372 size_t len, | 372 size_t len, |
| 373 int flags, | 373 int flags, |
| 374 struct sockaddr* src_addr, | 374 struct sockaddr* src_addr, |
| 375 socklen_t* addrlen, | 375 socklen_t* addrlen, |
| 376 int* out_len) { | 376 int* out_len) { |
| 377 PP_Resource addr = 0; | 377 PP_Resource addr = 0; |
| 378 if (0 == socket_resource_) |
| 379 return EBADF; |
| 378 Error err = RecvHelper(attr, buf, len, flags, &addr, out_len); | 380 Error err = RecvHelper(attr, buf, len, flags, &addr, out_len); |
| 379 if (0 == err && 0 != addr) { | 381 if (0 == err && 0 != addr) { |
| 380 if (src_addr) | 382 if (src_addr) |
| 381 *addrlen = ResourceToSockAddr(addr, *addrlen, src_addr); | 383 *addrlen = ResourceToSockAddr(addr, *addrlen, src_addr); |
| 382 | 384 |
| 383 filesystem_->ppapi()->ReleaseResource(addr); | 385 filesystem_->ppapi()->ReleaseResource(addr); |
| 384 } | 386 } |
| 385 | 387 |
| 386 return err; | 388 return err; |
| 387 } | 389 } |
| 388 | 390 |
| 389 Error SocketNode::RecvHelper(const HandleAttr& attr, | 391 Error SocketNode::RecvHelper(const HandleAttr& attr, |
| 390 void* buf, | 392 void* buf, |
| 391 size_t len, | 393 size_t len, |
| 392 int flags, | 394 int flags, |
| 393 PP_Resource* addr, | 395 PP_Resource* addr, |
| 394 int* out_len) { | 396 int* out_len) { |
| 395 if (0 == socket_resource_) | |
| 396 return EBADF; | |
| 397 | |
| 398 if (TestStreamFlags(SSF_RECV_ENDOFSTREAM)) { | 397 if (TestStreamFlags(SSF_RECV_ENDOFSTREAM)) { |
| 399 *out_len = 0; | 398 *out_len = 0; |
| 400 return 0; | 399 return 0; |
| 401 } | 400 } |
| 402 | 401 |
| 403 int ms = read_timeout_; | 402 int ms = read_timeout_; |
| 404 if ((flags & MSG_DONTWAIT) || !attr.IsBlocking()) | 403 if ((flags & MSG_DONTWAIT) || !attr.IsBlocking()) |
| 405 ms = 0; | 404 ms = 0; |
| 406 | 405 |
| 407 // TODO(bradnelson) BUG=295177 | 406 // TODO(bradnelson) BUG=295177 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 422 if ((err == 0) && *out_len) | 421 if ((err == 0) && *out_len) |
| 423 QueueInput(); | 422 QueueInput(); |
| 424 return err; | 423 return err; |
| 425 } | 424 } |
| 426 | 425 |
| 427 Error SocketNode::Send(const HandleAttr& attr, | 426 Error SocketNode::Send(const HandleAttr& attr, |
| 428 const void* buf, | 427 const void* buf, |
| 429 size_t len, | 428 size_t len, |
| 430 int flags, | 429 int flags, |
| 431 int* out_len) { | 430 int* out_len) { |
| 431 if (0 == socket_resource_) |
| 432 return EBADF; |
| 433 |
| 434 if (0 == remote_addr_) |
| 435 return ENOTCONN; |
| 432 return SendHelper(attr, buf, len, flags, remote_addr_, out_len); | 436 return SendHelper(attr, buf, len, flags, remote_addr_, out_len); |
| 433 } | 437 } |
| 434 | 438 |
| 435 Error SocketNode::SendTo(const HandleAttr& attr, | 439 Error SocketNode::SendTo(const HandleAttr& attr, |
| 436 const void* buf, | 440 const void* buf, |
| 437 size_t len, | 441 size_t len, |
| 438 int flags, | 442 int flags, |
| 439 const struct sockaddr* dest_addr, | 443 const struct sockaddr* dest_addr, |
| 440 socklen_t addrlen, | 444 socklen_t addrlen, |
| 441 int* out_len) { | 445 int* out_len) { |
| 442 if ((NULL == dest_addr) && (0 == remote_addr_)) | 446 if ((NULL == dest_addr) && (0 == remote_addr_)) |
| 443 return EDESTADDRREQ; | 447 return EDESTADDRREQ; |
| 444 | 448 |
| 445 PP_Resource addr = SockAddrToResource(dest_addr, addrlen); | 449 PP_Resource addr = SockAddrToResource(dest_addr, addrlen); |
| 446 if (0 == addr) | 450 if (0 == addr) |
| 447 return EINVAL; | 451 return EINVAL; |
| 448 | 452 |
| 453 if (0 == socket_resource_) |
| 454 return EBADF; |
| 455 |
| 449 Error err = SendHelper(attr, buf, len, flags, addr, out_len); | 456 Error err = SendHelper(attr, buf, len, flags, addr, out_len); |
| 450 filesystem_->ppapi()->ReleaseResource(addr); | 457 filesystem_->ppapi()->ReleaseResource(addr); |
| 451 return err; | 458 return err; |
| 452 } | 459 } |
| 453 | 460 |
| 454 Error SocketNode::SendHelper(const HandleAttr& attr, | 461 Error SocketNode::SendHelper(const HandleAttr& attr, |
| 455 const void* buf, | 462 const void* buf, |
| 456 size_t len, | 463 size_t len, |
| 457 int flags, | 464 int flags, |
| 458 PP_Resource addr, | 465 PP_Resource addr, |
| 459 int* out_len) { | 466 int* out_len) { |
| 460 if (0 == socket_resource_) | |
| 461 return EBADF; | |
| 462 | |
| 463 if (0 == addr) | |
| 464 return ENOTCONN; | |
| 465 | |
| 466 int ms = write_timeout_; | 467 int ms = write_timeout_; |
| 467 if ((flags & MSG_DONTWAIT) || !attr.IsBlocking()) | 468 if ((flags & MSG_DONTWAIT) || !attr.IsBlocking()) |
| 468 ms = 0; | 469 ms = 0; |
| 469 | 470 |
| 470 EventListenerLock wait(GetEventEmitter()); | 471 EventListenerLock wait(GetEventEmitter()); |
| 471 Error err = wait.WaitOnEvent(POLLOUT, ms); | 472 Error err = wait.WaitOnEvent(POLLOUT, ms); |
| 472 | 473 |
| 473 // Timeout is treated as a would block for sockets. | 474 // Timeout is treated as a would block for sockets. |
| 474 if (ETIMEDOUT == err) | 475 if (ETIMEDOUT == err) |
| 475 return EWOULDBLOCK; | 476 return EWOULDBLOCK; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 return 0; | 521 return 0; |
| 521 } | 522 } |
| 522 | 523 |
| 523 *len = ResourceToSockAddr(local_addr_, *len, addr); | 524 *len = ResourceToSockAddr(local_addr_, *len, addr); |
| 524 return 0; | 525 return 0; |
| 525 } | 526 } |
| 526 | 527 |
| 527 } // namespace nacl_io | 528 } // namespace nacl_io |
| 528 | 529 |
| 529 #endif // PROVIDES_SOCKET_API | 530 #endif // PROVIDES_SOCKET_API |
| OLD | NEW |