From 3dc9a8b980303a6ce674a3417908a51f57500d88 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Fri, 13 May 2022 12:31:49 +0200 Subject: [PATCH] fix lv2_socket_native::accept --- rpcs3/Emu/Cell/lv2/sys_net.cpp | 21 ++++++++++++++++--- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h | 2 +- .../Cell/lv2/sys_net/lv2_socket_native.cpp | 14 ++++--------- .../Emu/Cell/lv2/sys_net/lv2_socket_native.h | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h | 2 +- .../Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp | 8 +++---- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h | 2 +- 10 files changed, 33 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 738206be9a..05c6fdb7ea 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -273,15 +273,17 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr s32 result = 0; sys_net_sockaddr sn_addr{}; + std::shared_ptr new_socket{}; const auto sock = idm::check(s, [&](lv2_socket& sock) { - const auto [success, res, res_addr] = sock.accept(); + const auto [success, res, res_socket, res_addr] = sock.accept(); if (success) { result = res; sn_addr = res_addr; + new_socket = std::move(res_socket); return true; } @@ -289,11 +291,12 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr { if (events & lv2_socket::poll_t::read) { - auto [success, res, res_addr] = sock.accept(false); + auto [success, res, res_socket, res_addr] = sock.accept(false); if (success) { result = res; sn_addr = res_addr; + new_socket = std::move(res_socket); lv2_obj::awake(&ppu); return success; } @@ -345,6 +348,18 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr return sys_net_error{result}; } + s32 id_ps3 = result; + + if (!id_ps3) + { + ensure(new_socket); + id_ps3 = idm::import_existing(new_socket); + if (id_ps3 == id_manager::id_traits::invalid) + { + return -SYS_NET_EMFILE; + } + } + if (ppu.is_stopped()) { return {}; @@ -357,7 +372,7 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr } // Socket ID - return not_an_error(result); + return not_an_error(id_ps3); } error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u32 addrlen) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h index d96ca0f0ed..9b2a1aea66 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket.h @@ -72,7 +72,7 @@ public: #endif public: - virtual std::tuple accept(bool is_lock = true) = 0; + virtual std::tuple, sys_net_sockaddr> accept(bool is_lock = true) = 0; virtual s32 bind(const sys_net_sockaddr& addr, s32 ps3_id) = 0; virtual std::optional connect(const sys_net_sockaddr& addr) = 0; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp index 1068c249fb..248b6a56bf 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.cpp @@ -62,7 +62,7 @@ void lv2_socket_native::set_socket(socket_type socket, lv2_socket_family family, set_non_blocking(); } -std::tuple lv2_socket_native::accept(bool is_lock) +std::tuple, sys_net_sockaddr> lv2_socket_native::accept(bool is_lock) { std::unique_lock lock(mutex, std::defer_lock); @@ -80,24 +80,18 @@ std::tuple lv2_socket_native::accept(bool is_lock) { auto newsock = std::make_shared(family, type, protocol); newsock->set_socket(native_socket, family, type, protocol); - s32 id_ps3 = idm::import_existing(newsock); - - if (id_ps3 == id_manager::id_traits::invalid) - { - return {true, -SYS_NET_EMFILE, {}}; - } sys_net_sockaddr ps3_addr = native_addr_to_sys_net_addr(native_addr); - return {true, id_ps3, ps3_addr}; + return {true, 0, std::move(newsock), ps3_addr}; } if (auto result = get_last_error(!so_nbio); result) { - return {true, -result, {}}; + return {true, -result, {}, {}}; } - return {false, {}, {}}; + return {false, {}, {}, {}}; } s32 lv2_socket_native::bind(const sys_net_sockaddr& addr, [[maybe_unused]] s32 ps3_id) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h index 9917cbf92b..35199e199e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_native.h @@ -34,7 +34,7 @@ public: ~lv2_socket_native(); s32 create_socket(); - std::tuple accept(bool is_lock = true) override; + std::tuple, sys_net_sockaddr> accept(bool is_lock = true) override; s32 bind(const sys_net_sockaddr& addr, s32 ps3_id) override; std::optional connect(const sys_net_sockaddr& addr) override; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp index 638cb0bbd0..c7c513be4f 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.cpp @@ -39,7 +39,7 @@ void lv2_socket_p2p::handle_new_data(sys_net_sockaddr_in_p2p p2p_addr, std::vect } } -std::tuple lv2_socket_p2p::accept([[maybe_unused]] bool is_lock) +std::tuple, sys_net_sockaddr> lv2_socket_p2p::accept([[maybe_unused]] bool is_lock) { sys_net.fatal("[P2P] accept() called on a P2P socket"); return {}; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h index 8a4ca4c407..cfe04dda54 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2p.h @@ -7,7 +7,7 @@ class lv2_socket_p2p : public lv2_socket public: lv2_socket_p2p(lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol); - std::tuple accept(bool is_lock = true) override; + std::tuple, sys_net_sockaddr> accept(bool is_lock = true) override; s32 bind(const sys_net_sockaddr& addr, s32 ps3_id) override; std::optional connect(const sys_net_sockaddr& addr) override; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp index 3f30a1fe55..99a74044d7 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.cpp @@ -481,7 +481,7 @@ void lv2_socket_p2ps::set_status(p2ps_stream_status new_status) status = new_status; } -std::tuple lv2_socket_p2ps::accept(bool is_lock) +std::tuple, sys_net_sockaddr> lv2_socket_p2ps::accept(bool is_lock) { std::unique_lock lock(mutex, std::defer_lock); @@ -494,10 +494,10 @@ std::tuple lv2_socket_p2ps::accept(bool is_lock) { if (so_nbio) { - return {true, -SYS_NET_EWOULDBLOCK, {}}; + return {true, -SYS_NET_EWOULDBLOCK, {}, {}}; } - return {false, {}, {}}; + return {false, {}, {}, {}}; } auto p2ps_client = backlog.front(); @@ -516,7 +516,7 @@ std::tuple lv2_socket_p2ps::accept(bool is_lock) paddr->sin_len = sizeof(sys_net_sockaddr_in_p2p); } - return {true, p2ps_client, ps3_addr}; + return {true, p2ps_client, {}, ps3_addr}; } s32 lv2_socket_p2ps::bind(const sys_net_sockaddr& addr, s32 ps3_id) diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h index a56f312c12..cba0182ebb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_p2ps.h @@ -66,7 +66,7 @@ public: bool handle_listening(p2ps_encapsulated_tcp* tcp_header, u8* data, ::sockaddr_storage* op_addr); void send_u2s_packet(std::vector data, const ::sockaddr_in* dst, u32 seq, bool require_ack); - std::tuple accept(bool is_lock = true) override; + std::tuple, sys_net_sockaddr> accept(bool is_lock = true) override; s32 bind(const sys_net_sockaddr& addr, s32 ps3_id) override; std::optional connect(const sys_net_sockaddr& addr) override; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp index 0591768782..96b10b5ffa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.cpp @@ -8,7 +8,7 @@ lv2_socket_raw::lv2_socket_raw(lv2_socket_family family, lv2_socket_type type, l { } -std::tuple lv2_socket_raw::accept([[maybe_unused]] bool is_lock) +std::tuple, sys_net_sockaddr> lv2_socket_raw::accept([[maybe_unused]] bool is_lock) { sys_net.todo("lv2_socket_raw::accept"); return {}; diff --git a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h index abab1a3e5d..63ca3ab830 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h +++ b/rpcs3/Emu/Cell/lv2/sys_net/lv2_socket_raw.h @@ -7,7 +7,7 @@ class lv2_socket_raw final : public lv2_socket public: lv2_socket_raw(lv2_socket_family family, lv2_socket_type type, lv2_ip_protocol protocol); - std::tuple accept(bool is_lock = true) override; + std::tuple, sys_net_sockaddr> accept(bool is_lock = true) override; s32 bind(const sys_net_sockaddr& addr, s32 ps3_id) override; std::optional connect(const sys_net_sockaddr& addr) override;