summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/soc_u.cpp71
1 files changed, 32 insertions, 39 deletions
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp
index dcc5c3c90..530614e6f 100644
--- a/src/core/hle/service/soc_u.cpp
+++ b/src/core/hle/service/soc_u.cpp
@@ -362,18 +362,18 @@ static void Socket(Interface* self) {
362 return; 362 return;
363 } 363 }
364 364
365 u32 socket_handle = static_cast<u32>(::socket(domain, type, protocol)); 365 u32 ret = static_cast<u32>(::socket(domain, type, protocol));
366 366
367 if ((s32)socket_handle != SOCKET_ERROR_VALUE) 367 if ((s32)ret != SOCKET_ERROR_VALUE)
368 open_sockets[socket_handle] = {socket_handle, true}; 368 open_sockets[ret] = {ret, true};
369 369
370 int result = 0; 370 int result = 0;
371 if ((s32)socket_handle == SOCKET_ERROR_VALUE) 371 if ((s32)ret == SOCKET_ERROR_VALUE)
372 result = TranslateError(GET_ERRNO); 372 ret = TranslateError(GET_ERRNO);
373 373
374 cmd_buffer[0] = IPC::MakeHeader(2, 2, 0); 374 cmd_buffer[0] = IPC::MakeHeader(2, 2, 0);
375 cmd_buffer[1] = result; 375 cmd_buffer[1] = result;
376 cmd_buffer[2] = socket_handle; 376 cmd_buffer[2] = ret;
377} 377}
378 378
379static void Bind(Interface* self) { 379static void Bind(Interface* self) {
@@ -393,15 +393,15 @@ static void Bind(Interface* self) {
393 393
394 sockaddr sock_addr = CTRSockAddr::ToPlatform(ctr_sock_addr); 394 sockaddr sock_addr = CTRSockAddr::ToPlatform(ctr_sock_addr);
395 395
396 int res = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len)); 396 int ret = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len));
397 397
398 int result = 0; 398 int result = 0;
399 if (res != 0) 399 if (ret != 0)
400 result = TranslateError(GET_ERRNO); 400 ret = TranslateError(GET_ERRNO);
401 401
402 cmd_buffer[0] = IPC::MakeHeader(5, 2, 0); 402 cmd_buffer[0] = IPC::MakeHeader(5, 2, 0);
403 cmd_buffer[1] = result; 403 cmd_buffer[1] = result;
404 cmd_buffer[2] = res; 404 cmd_buffer[2] = ret;
405} 405}
406 406
407static void Fcntl(Interface* self) { 407static void Fcntl(Interface* self) {
@@ -426,8 +426,7 @@ static void Fcntl(Interface* self) {
426#else 426#else
427 int ret = ::fcntl(socket_handle, F_GETFL, 0); 427 int ret = ::fcntl(socket_handle, F_GETFL, 0);
428 if (ret == SOCKET_ERROR_VALUE) { 428 if (ret == SOCKET_ERROR_VALUE) {
429 result = TranslateError(GET_ERRNO); 429 posix_ret = TranslateError(GET_ERRNO);
430 posix_ret = -1;
431 return; 430 return;
432 } 431 }
433 posix_ret = 0; 432 posix_ret = 0;
@@ -439,8 +438,7 @@ static void Fcntl(Interface* self) {
439 unsigned long tmp = (ctr_arg & 4 /* O_NONBLOCK */) ? 1 : 0; 438 unsigned long tmp = (ctr_arg & 4 /* O_NONBLOCK */) ? 1 : 0;
440 int ret = ioctlsocket(socket_handle, FIONBIO, &tmp); 439 int ret = ioctlsocket(socket_handle, FIONBIO, &tmp);
441 if (ret == SOCKET_ERROR_VALUE) { 440 if (ret == SOCKET_ERROR_VALUE) {
442 result = TranslateError(GET_ERRNO); 441 posix_ret = TranslateError(GET_ERRNO);
443 posix_ret = -1;
444 return; 442 return;
445 } 443 }
446 auto iter = open_sockets.find(socket_handle); 444 auto iter = open_sockets.find(socket_handle);
@@ -449,8 +447,7 @@ static void Fcntl(Interface* self) {
449#else 447#else
450 int flags = ::fcntl(socket_handle, F_GETFL, 0); 448 int flags = ::fcntl(socket_handle, F_GETFL, 0);
451 if (flags == SOCKET_ERROR_VALUE) { 449 if (flags == SOCKET_ERROR_VALUE) {
452 result = TranslateError(GET_ERRNO); 450 posix_ret = TranslateError(GET_ERRNO);
453 posix_ret = -1;
454 return; 451 return;
455 } 452 }
456 453
@@ -460,15 +457,13 @@ static void Fcntl(Interface* self) {
460 457
461 int ret = ::fcntl(socket_handle, F_SETFL, flags); 458 int ret = ::fcntl(socket_handle, F_SETFL, flags);
462 if (ret == SOCKET_ERROR_VALUE) { 459 if (ret == SOCKET_ERROR_VALUE) {
463 result = TranslateError(GET_ERRNO); 460 posix_ret = TranslateError(GET_ERRNO);
464 posix_ret = -1;
465 return; 461 return;
466 } 462 }
467#endif 463#endif
468 } else { 464 } else {
469 LOG_ERROR(Service_SOC, "Unsupported command (%d) in fcntl call", ctr_cmd); 465 LOG_ERROR(Service_SOC, "Unsupported command (%d) in fcntl call", ctr_cmd);
470 result = TranslateError(EINVAL); // TODO: Find the correct error 466 posix_ret = TranslateError(EINVAL); // TODO: Find the correct error
471 posix_ret = -1;
472 return; 467 return;
473 } 468 }
474} 469}
@@ -481,7 +476,7 @@ static void Listen(Interface* self) {
481 int ret = ::listen(socket_handle, backlog); 476 int ret = ::listen(socket_handle, backlog);
482 int result = 0; 477 int result = 0;
483 if (ret != 0) 478 if (ret != 0)
484 result = TranslateError(GET_ERRNO); 479 ret = TranslateError(GET_ERRNO);
485 480
486 cmd_buffer[0] = IPC::MakeHeader(3, 2, 0); 481 cmd_buffer[0] = IPC::MakeHeader(3, 2, 0);
487 cmd_buffer[1] = result; 482 cmd_buffer[1] = result;
@@ -504,7 +499,7 @@ static void Accept(Interface* self) {
504 499
505 int result = 0; 500 int result = 0;
506 if ((s32)ret == SOCKET_ERROR_VALUE) { 501 if ((s32)ret == SOCKET_ERROR_VALUE) {
507 result = TranslateError(GET_ERRNO); 502 ret = TranslateError(GET_ERRNO);
508 } else { 503 } else {
509 CTRSockAddr ctr_addr = CTRSockAddr::FromPlatform(addr); 504 CTRSockAddr ctr_addr = CTRSockAddr::FromPlatform(addr);
510 Memory::WriteBlock(cmd_buffer[0x104 >> 2], &ctr_addr, sizeof(ctr_addr)); 505 Memory::WriteBlock(cmd_buffer[0x104 >> 2], &ctr_addr, sizeof(ctr_addr));
@@ -545,7 +540,7 @@ static void Close(Interface* self) {
545 540
546 int result = 0; 541 int result = 0;
547 if (ret != 0) 542 if (ret != 0)
548 result = TranslateError(GET_ERRNO); 543 ret = TranslateError(GET_ERRNO);
549 544
550 cmd_buffer[2] = ret; 545 cmd_buffer[2] = ret;
551 cmd_buffer[1] = result; 546 cmd_buffer[1] = result;
@@ -589,7 +584,7 @@ static void SendTo(Interface* self) {
589 584
590 int result = 0; 585 int result = 0;
591 if (ret == SOCKET_ERROR_VALUE) 586 if (ret == SOCKET_ERROR_VALUE)
592 result = TranslateError(GET_ERRNO); 587 ret = TranslateError(GET_ERRNO);
593 588
594 cmd_buffer[2] = ret; 589 cmd_buffer[2] = ret;
595 cmd_buffer[1] = result; 590 cmd_buffer[1] = result;
@@ -638,7 +633,7 @@ static void RecvFrom(Interface* self) {
638 int result = 0; 633 int result = 0;
639 int total_received = ret; 634 int total_received = ret;
640 if (ret == SOCKET_ERROR_VALUE) { 635 if (ret == SOCKET_ERROR_VALUE) {
641 result = TranslateError(GET_ERRNO); 636 ret = TranslateError(GET_ERRNO);
642 total_received = 0; 637 total_received = 0;
643 } else { 638 } else {
644 // Write only the data we received to avoid overwriting parts of the buffer with zeros 639 // Write only the data we received to avoid overwriting parts of the buffer with zeros
@@ -673,7 +668,7 @@ static void Poll(Interface* self) {
673 std::vector<pollfd> platform_pollfd(nfds); 668 std::vector<pollfd> platform_pollfd(nfds);
674 std::transform(ctr_fds.begin(), ctr_fds.end(), platform_pollfd.begin(), CTRPollFD::ToPlatform); 669 std::transform(ctr_fds.begin(), ctr_fds.end(), platform_pollfd.begin(), CTRPollFD::ToPlatform);
675 670
676 const int ret = ::poll(platform_pollfd.data(), nfds, timeout); 671 int ret = ::poll(platform_pollfd.data(), nfds, timeout);
677 672
678 // Now update the output pollfd structure 673 // Now update the output pollfd structure
679 std::transform(platform_pollfd.begin(), platform_pollfd.end(), ctr_fds.begin(), 674 std::transform(platform_pollfd.begin(), platform_pollfd.end(), ctr_fds.begin(),
@@ -683,7 +678,7 @@ static void Poll(Interface* self) {
683 678
684 int result = 0; 679 int result = 0;
685 if (ret == SOCKET_ERROR_VALUE) 680 if (ret == SOCKET_ERROR_VALUE)
686 result = TranslateError(GET_ERRNO); 681 ret = TranslateError(GET_ERRNO);
687 682
688 cmd_buffer[1] = result; 683 cmd_buffer[1] = result;
689 cmd_buffer[2] = ret; 684 cmd_buffer[2] = ret;
@@ -710,7 +705,7 @@ static void GetSockName(Interface* self) {
710 705
711 int result = 0; 706 int result = 0;
712 if (ret != 0) 707 if (ret != 0)
713 result = TranslateError(GET_ERRNO); 708 ret = TranslateError(GET_ERRNO);
714 709
715 cmd_buffer[2] = ret; 710 cmd_buffer[2] = ret;
716 cmd_buffer[1] = result; 711 cmd_buffer[1] = result;
@@ -724,7 +719,7 @@ static void Shutdown(Interface* self) {
724 int ret = ::shutdown(socket_handle, how); 719 int ret = ::shutdown(socket_handle, how);
725 int result = 0; 720 int result = 0;
726 if (ret != 0) 721 if (ret != 0)
727 result = TranslateError(GET_ERRNO); 722 ret = TranslateError(GET_ERRNO);
728 cmd_buffer[2] = ret; 723 cmd_buffer[2] = ret;
729 cmd_buffer[1] = result; 724 cmd_buffer[1] = result;
730} 725}
@@ -750,7 +745,7 @@ static void GetPeerName(Interface* self) {
750 745
751 int result = 0; 746 int result = 0;
752 if (ret != 0) 747 if (ret != 0)
753 result = TranslateError(GET_ERRNO); 748 ret = TranslateError(GET_ERRNO);
754 749
755 cmd_buffer[2] = ret; 750 cmd_buffer[2] = ret;
756 cmd_buffer[1] = result; 751 cmd_buffer[1] = result;
@@ -777,7 +772,7 @@ static void Connect(Interface* self) {
777 int ret = ::connect(socket_handle, &input_addr, sizeof(input_addr)); 772 int ret = ::connect(socket_handle, &input_addr, sizeof(input_addr));
778 int result = 0; 773 int result = 0;
779 if (ret != 0) 774 if (ret != 0)
780 result = TranslateError(GET_ERRNO); 775 ret = TranslateError(GET_ERRNO);
781 776
782 cmd_buffer[0] = IPC::MakeHeader(6, 2, 0); 777 cmd_buffer[0] = IPC::MakeHeader(6, 2, 0);
783 cmd_buffer[1] = result; 778 cmd_buffer[1] = result;
@@ -815,7 +810,7 @@ static void GetSockOpt(Interface* self) {
815 int optname = TranslateSockOpt(cmd_buffer[3]); 810 int optname = TranslateSockOpt(cmd_buffer[3]);
816 socklen_t optlen = (socklen_t)cmd_buffer[4]; 811 socklen_t optlen = (socklen_t)cmd_buffer[4];
817 812
818 int ret = -1; 813 int ret = 0;
819 int err = 0; 814 int err = 0;
820 815
821 if (optname < 0) { 816 if (optname < 0) {
@@ -830,9 +825,8 @@ static void GetSockOpt(Interface* self) {
830 // >> 2 = convert to u32 offset instead of byte offset (cmd_buffer = u32*) 825 // >> 2 = convert to u32 offset instead of byte offset (cmd_buffer = u32*)
831 char* optval = reinterpret_cast<char*>(Memory::GetPointer(cmd_buffer[0x104 >> 2])); 826 char* optval = reinterpret_cast<char*>(Memory::GetPointer(cmd_buffer[0x104 >> 2]));
832 827
833 ret = ::getsockopt(socket_handle, level, optname, optval, &optlen); 828 err = ::getsockopt(socket_handle, level, optname, optval, &optlen);
834 err = 0; 829 if (err == SOCKET_ERROR_VALUE) {
835 if (ret == SOCKET_ERROR_VALUE) {
836 err = TranslateError(GET_ERRNO); 830 err = TranslateError(GET_ERRNO);
837 } 831 }
838 } 832 }
@@ -849,7 +843,7 @@ static void SetSockOpt(Interface* self) {
849 u32 level = cmd_buffer[2]; 843 u32 level = cmd_buffer[2];
850 int optname = TranslateSockOpt(cmd_buffer[3]); 844 int optname = TranslateSockOpt(cmd_buffer[3]);
851 845
852 int ret = -1; 846 int ret = 0;
853 int err = 0; 847 int err = 0;
854 848
855 if (optname < 0) { 849 if (optname < 0) {
@@ -862,9 +856,8 @@ static void SetSockOpt(Interface* self) {
862 socklen_t optlen = static_cast<socklen_t>(cmd_buffer[4]); 856 socklen_t optlen = static_cast<socklen_t>(cmd_buffer[4]);
863 const char* optval = reinterpret_cast<const char*>(Memory::GetPointer(cmd_buffer[8])); 857 const char* optval = reinterpret_cast<const char*>(Memory::GetPointer(cmd_buffer[8]));
864 858
865 ret = static_cast<u32>(::setsockopt(socket_handle, level, optname, optval, optlen)); 859 err = static_cast<u32>(::setsockopt(socket_handle, level, optname, optval, optlen));
866 err = 0; 860 if (err == SOCKET_ERROR_VALUE) {
867 if (ret == SOCKET_ERROR_VALUE) {
868 err = TranslateError(GET_ERRNO); 861 err = TranslateError(GET_ERRNO);
869 } 862 }
870 } 863 }