Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/socket/socket_node.cc

Issue 1335783005: [NaCl SDK] nacl_io: Add support for basic socketpairs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698