From 6ad8b0a443f35e0c48efc64df32300216f5aaf39 Mon Sep 17 00:00:00 2001 From: Eladash Date: Thu, 21 Nov 2019 18:44:00 +0200 Subject: [PATCH] sys_net: Add error_code --- rpcs3/Emu/Cell/lv2/sys_net.cpp | 273 ++++++++++++++++++++++----------- rpcs3/Emu/Cell/lv2/sys_net.h | 61 ++++---- 2 files changed, 214 insertions(+), 120 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index e1ab60dda3..95aea97190 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "sys_net.h" #include "Emu/System.h" @@ -26,11 +26,65 @@ LOG_CHANNEL(sys_net); +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto error) + { + switch (error) + { +#define SYS_NET_ERROR_CASE(x) case -x: return #x + SYS_NET_ERROR_CASE(SYS_NET_ENOENT); + SYS_NET_ERROR_CASE(SYS_NET_EINTR); + SYS_NET_ERROR_CASE(SYS_NET_EBADF); + SYS_NET_ERROR_CASE(SYS_NET_ENOMEM); + SYS_NET_ERROR_CASE(SYS_NET_EACCES); + SYS_NET_ERROR_CASE(SYS_NET_EFAULT); + SYS_NET_ERROR_CASE(SYS_NET_EBUSY); + SYS_NET_ERROR_CASE(SYS_NET_EINVAL); + SYS_NET_ERROR_CASE(SYS_NET_EMFILE); + SYS_NET_ERROR_CASE(SYS_NET_ENOSPC); + SYS_NET_ERROR_CASE(SYS_NET_EPIPE); + case -SYS_NET_EAGAIN: + static_assert(SYS_NET_EWOULDBLOCK == SYS_NET_EAGAIN); + return "SYS_NET_EAGAIN/WOULDBLOCK"; + SYS_NET_ERROR_CASE(SYS_NET_EINPROGRESS); + SYS_NET_ERROR_CASE(SYS_NET_EALREADY); + SYS_NET_ERROR_CASE(SYS_NET_EDESTADDRREQ); + SYS_NET_ERROR_CASE(SYS_NET_EMSGSIZE); + SYS_NET_ERROR_CASE(SYS_NET_EPROTOTYPE); + SYS_NET_ERROR_CASE(SYS_NET_ENOPROTOOPT); + SYS_NET_ERROR_CASE(SYS_NET_EPROTONOSUPPORT); + SYS_NET_ERROR_CASE(SYS_NET_EOPNOTSUPP); + SYS_NET_ERROR_CASE(SYS_NET_EPFNOSUPPORT); + SYS_NET_ERROR_CASE(SYS_NET_EAFNOSUPPORT); + SYS_NET_ERROR_CASE(SYS_NET_EADDRINUSE); + SYS_NET_ERROR_CASE(SYS_NET_EADDRNOTAVAIL); + SYS_NET_ERROR_CASE(SYS_NET_ENETDOWN); + SYS_NET_ERROR_CASE(SYS_NET_ENETUNREACH); + SYS_NET_ERROR_CASE(SYS_NET_ECONNABORTED); + SYS_NET_ERROR_CASE(SYS_NET_ECONNRESET); + SYS_NET_ERROR_CASE(SYS_NET_ENOBUFS); + SYS_NET_ERROR_CASE(SYS_NET_EISCONN); + SYS_NET_ERROR_CASE(SYS_NET_ENOTCONN); + SYS_NET_ERROR_CASE(SYS_NET_ESHUTDOWN); + SYS_NET_ERROR_CASE(SYS_NET_ETOOMANYREFS); + SYS_NET_ERROR_CASE(SYS_NET_ETIMEDOUT); + SYS_NET_ERROR_CASE(SYS_NET_ECONNREFUSED); + SYS_NET_ERROR_CASE(SYS_NET_EHOSTDOWN); + SYS_NET_ERROR_CASE(SYS_NET_EHOSTUNREACH); +#undef SYS_NET_ERROR_CASE + } + + return unknown; + }); +} + // Error helper functions -static s32 get_last_error(bool is_blocking, int native_error = 0) +static sys_net_error get_last_error(bool is_blocking, int native_error = 0) { // Convert the error code for socket functions to a one for sys_net - s32 result; + sys_net_error result; const char* name{}; #ifdef _WIN32 @@ -66,12 +120,12 @@ static s32 get_last_error(bool is_blocking, int native_error = 0) if (is_blocking && result == SYS_NET_EWOULDBLOCK) { - return 0; + return {}; } if (is_blocking && result == SYS_NET_EINPROGRESS) { - return 0; + return {}; } return result; @@ -280,7 +334,7 @@ lv2_socket::~lv2_socket() #endif } -s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) +error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) { vm::temporary_unlock(ppu); @@ -348,7 +402,7 @@ s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, if (!sock.ret && result) { - return -result; + return -sys_net_error{result}; } if (!sock.ret) @@ -365,7 +419,7 @@ s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, if (result) { - return -result; + return -sys_net_error{result}; } if (ppu.gpr[3] == -SYS_NET_EINTR) @@ -407,10 +461,10 @@ s32 sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr addr, } // Socket id - return result; + return not_an_error(result); } -s32 sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u32 addrlen) +error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u32 addrlen) { vm::temporary_unlock(ppu); @@ -428,13 +482,13 @@ s32 sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u name.sin_addr.s_addr = htonl(((sys_net_sockaddr_in*)addr.get_ptr())->sin_addr); ::socklen_t namelen = sizeof(name); - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); if (::bind(sock.socket, (::sockaddr*)&name, namelen) == 0) { - return 0; + return {}; } return get_last_error(false); @@ -445,10 +499,15 @@ s32 sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr addr, u return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, u32 addrlen) +error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, u32 addrlen) { vm::temporary_unlock(ppu); @@ -570,7 +629,7 @@ s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, if (!sock.ret && result) { - return -result; + return -sys_net_error{result}; } if (!sock.ret) @@ -587,7 +646,7 @@ s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, if (result) { - return -result; + return -sys_net_error{result}; } if (ppu.gpr[3] == -SYS_NET_EINTR) @@ -599,13 +658,13 @@ s32 sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr addr, return CELL_OK; } -s32 sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) +error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) { vm::temporary_unlock(ppu); sys_net.warning("sys_net_bnet_getpeername(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); @@ -628,7 +687,7 @@ s32 sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr a paddr->sin_port = ntohs(((::sockaddr_in*)&native_addr)->sin_port); paddr->sin_addr = ntohl(((::sockaddr_in*)&native_addr)->sin_addr.s_addr); paddr->sin_zero = 0; - return 0; + return {}; } return get_last_error(false); @@ -639,16 +698,21 @@ s32 sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr a return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) +error_code sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr addr, vm::ptr paddrlen) { vm::temporary_unlock(ppu); sys_net.warning("sys_net_bnet_getsockname(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); @@ -671,7 +735,7 @@ s32 sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr a paddr->sin_port = ntohs(((::sockaddr_in*)&native_addr)->sin_port); paddr->sin_addr = ntohl(((::sockaddr_in*)&native_addr)->sin_addr.s_addr); paddr->sin_zero = 0; - return 0; + return {}; } return get_last_error(false); @@ -682,10 +746,15 @@ s32 sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr a return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::ptr optval, vm::ptr optlen) +error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::ptr optval, vm::ptr optlen) { vm::temporary_unlock(ppu); @@ -703,7 +772,7 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: } native_val; ::socklen_t native_len = sizeof(native_val); - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); @@ -722,13 +791,13 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { // Special *(be_t*)optval.get_ptr() = sock.so_nbio; - return 0; + return {}; } case SYS_NET_SO_ERROR: { // Special *(be_t*)optval.get_ptr() = std::exchange(sock.so_error, 0); - return 0; + return {}; } case SYS_NET_SO_KEEPALIVE: { @@ -764,12 +833,12 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: case SYS_NET_SO_REUSEADDR: { *(be_t*)optval.get_ptr() = sock.so_reuseaddr; - return 0; + return {}; } case SYS_NET_SO_REUSEPORT: { *(be_t*)optval.get_ptr() = sock.so_reuseport; - return 0; + return {}; } #else case SYS_NET_SO_REUSEADDR: @@ -817,7 +886,7 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { // Special (no effect) *(be_t*)optval.get_ptr() = sock.so_tcp_maxseg; - return 0; + return {}; } case SYS_NET_TCP_NODELAY: { @@ -851,20 +920,20 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { // TODO *(sys_net_timeval*)optval.get_ptr() = { ::narrow(native_val.timeo.tv_sec), ::narrow(native_val.timeo.tv_usec) }; - return 0; + return {}; } case SYS_NET_SO_LINGER: { // TODO *(sys_net_linger*)optval.get_ptr() = { ::narrow(native_val.linger.l_onoff), ::narrow(native_val.linger.l_linger) }; - return 0; + return {}; } } } // Fallback to int *(be_t*)optval.get_ptr() = native_val._int; - return 0; + return {}; }); if (!sock) @@ -872,22 +941,27 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) +error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) { vm::temporary_unlock(ppu); sys_net.warning("sys_net_bnet_listen(s=%d, backlog=%d)", s, backlog); - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); if (::listen(sock.socket, backlog) == 0) { - return 0; + return {}; } return get_last_error(false); @@ -898,10 +972,15 @@ s32 sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 len, s32 flags, vm::ptr addr, vm::ptr paddrlen) +error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 len, s32 flags, vm::ptr addr, vm::ptr paddrlen) { vm::temporary_unlock(ppu); @@ -916,7 +995,7 @@ s32 sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 len, s3 int native_result = -1; ::sockaddr_storage native_addr; ::socklen_t native_addrlen = sizeof(native_addr); - s32 result = 0; + sys_net_error result{}; if (flags & SYS_NET_MSG_PEEK) { @@ -1036,26 +1115,26 @@ s32 sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr buf, u32 len, s3 } // Length - return native_result; + return not_an_error(native_result); } -s32 sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr msg, s32 flags) +error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr msg, s32 flags) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_bnet_recvmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); - return 0; + return CELL_OK; } -s32 sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr msg, s32 flags) +error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr msg, s32 flags) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_bnet_sendmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); - return 0; + return CELL_OK; } -s32 sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 len, s32 flags, vm::cptr addr, u32 addrlen) +error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 len, s32 flags, vm::cptr addr, u32 addrlen) { vm::temporary_unlock(ppu); @@ -1090,7 +1169,7 @@ s32 sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 len, s32 } ::socklen_t namelen = sizeof(name); - s32 result = 0; + sys_net_error result{}; if (flags & SYS_NET_MSG_WAITALL) { @@ -1181,10 +1260,10 @@ s32 sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr buf, u32 len, s32 } // Length - return native_result; + return not_an_error(native_result); } -s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::cptr optval, u32 optlen) +error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::cptr optval, u32 optlen) { vm::temporary_unlock(ppu); @@ -1198,7 +1277,7 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: ::timeval native_timeo; ::linger native_linger; - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); @@ -1221,7 +1300,7 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { // Special sock.so_nbio = native_int; - return 0; + return {}; } case SYS_NET_SO_KEEPALIVE: { @@ -1310,13 +1389,13 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { //TODO sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): Stubbed option (0x%x) (SYS_NET_SO_USECRYPTO)", s, optname); - return 0; + return {}; } case SYS_NET_SO_USESIGNATURE: { //TODO sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): Stubbed option (0x%x) (SYS_NET_SO_USESIGNATURE)", s, optname); - return 0; + return {}; } default: { @@ -1335,7 +1414,7 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: { // Special (no effect) sock.so_tcp_maxseg = native_int; - return 0; + return {}; } case SYS_NET_TCP_NODELAY: { @@ -1357,7 +1436,7 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: if (::setsockopt(sock.socket, native_level, native_opt, (const char*)native_val, native_len) == 0) { - return 0; + return {}; } return get_last_error(false); @@ -1368,10 +1447,15 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) +error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) { vm::temporary_unlock(ppu); @@ -1382,7 +1466,7 @@ s32 sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) return -SYS_NET_EINVAL; } - const auto sock = idm::check(s, [&](lv2_socket& sock) -> s32 + const auto sock = idm::check(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); @@ -1398,7 +1482,7 @@ s32 sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) if (::shutdown(sock.socket, native_how) == 0) { - return 0; + return {}; } return get_last_error(false); @@ -1409,10 +1493,15 @@ s32 sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) return -SYS_NET_EBADF; } - return -sock.ret; + if (sock.ret) + { + return -sock.ret; + } + + return CELL_OK; } -s32 sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol) +error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol) { vm::temporary_unlock(ppu); @@ -1464,10 +1553,10 @@ s32 sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol) return -SYS_NET_EMFILE; } - return s; + return not_an_error(s); } -s32 sys_net_bnet_close(ppu_thread& ppu, s32 s) +error_code sys_net_bnet_close(ppu_thread& ppu, s32 s) { vm::temporary_unlock(ppu); @@ -1483,10 +1572,10 @@ s32 sys_net_bnet_close(ppu_thread& ppu, s32 s) if (!sock->queue.empty()) sys_net.error("CLOSE"); - return 0; + return CELL_OK; } -s32 sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s32 ms) +error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s32 ms) { vm::temporary_unlock(ppu); @@ -1568,7 +1657,7 @@ s32 sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s3 if (ms == 0 || signaled) { - return signaled; + return not_an_error(signaled); } for (s32 i = 0; i < nfds; i++) @@ -1618,7 +1707,7 @@ s32 sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s3 } else { - return 0; + return not_an_error(0); } while (!ppu.state.test_and_reset(cpu_flag::signal)) @@ -1650,10 +1739,10 @@ s32 sys_net_bnet_poll(ppu_thread& ppu, vm::ptr fds, s32 nfds, s3 } } - return signaled; + return not_an_error(signaled); } -s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr _timeout) +error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr _timeout) { vm::temporary_unlock(ppu); @@ -1757,7 +1846,7 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr readf *writefds = rwrite; if (exceptfds) *exceptfds = rexcept; - return signaled; + return not_an_error(signaled); } for (s32 i = 0; i < nfds; i++) @@ -1859,85 +1948,85 @@ s32 sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr readf if (exceptfds) *exceptfds = rexcept; - return signaled; + return not_an_error(signaled); } -s32 _sys_net_open_dump(ppu_thread& ppu, s32 len, s32 flags) +error_code _sys_net_open_dump(ppu_thread& ppu, s32 len, s32 flags) { vm::temporary_unlock(ppu); sys_net.todo("_sys_net_open_dump(len=%d, flags=0x%x)", len, flags); - return 0; + return CELL_OK; } -s32 _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr buf, s32 len, vm::ptr pflags) +error_code _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr buf, s32 len, vm::ptr pflags) { vm::temporary_unlock(ppu); sys_net.todo("_sys_net_read_dump(id=0x%x, buf=*0x%x, len=%d, pflags=*0x%x)", id, buf, len, pflags); - return 0; + return CELL_OK; } -s32 _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr pflags) +error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr pflags) { vm::temporary_unlock(ppu); sys_net.todo("_sys_net_close_dump(id=0x%x, pflags=*0x%x)", id, pflags); - return 0; + return CELL_OK; } -s32 _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr buf, s32 len, u32 unknown) +error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr buf, s32 len, u32 unknown) { vm::temporary_unlock(ppu); sys_net.todo(__func__); - return 0; + return CELL_OK; } -s32 sys_net_abort(ppu_thread& ppu, s32 type, u64 arg, s32 flags) +error_code sys_net_abort(ppu_thread& ppu, s32 type, u64 arg, s32 flags) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_abort(type=%d, arg=0x%x, flags=0x%x)", type, arg, flags); - return 0; + return CELL_OK; } -s32 sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr arg) +error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr arg) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_infoctl(cmd=%d, arg=*0x%x)", cmd, arg); - return 0; + return CELL_OK; } -s32 sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr arg3, s32 arg4) +error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr arg3, s32 arg4) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_control(0x%x, %d, *0x%x, %d)", arg1, arg2, arg3, arg4); - return 0; + return CELL_OK; } -s32 sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) +error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_bnet_ioctl(%d, 0x%x, 0x%x)", arg1, arg2, arg3); - return 0; + return CELL_OK; } -s32 sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm::ptr arg4, u32 arg5, u32 arg6) +error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm::ptr arg4, u32 arg5, u32 arg6) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_bnet_sysctl(0x%x, 0x%x, 0x%x, *0x%x, 0x%x, 0x%x)", arg1, arg2, arg3, arg4, arg5, arg6); - return 0; + return CELL_OK; } -s32 sys_net_eurus_post_command(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) +error_code sys_net_eurus_post_command(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) { vm::temporary_unlock(ppu); sys_net.todo("sys_net_eurus_post_command(%d, 0x%x, 0x%x)", arg1, arg2, arg3); - return 0; + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/lv2/sys_net.h b/rpcs3/Emu/Cell/lv2/sys_net.h index 891f57e3d1..eff1e2f19a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.h +++ b/rpcs3/Emu/Cell/lv2/sys_net.h @@ -10,7 +10,7 @@ #include // Error codes -enum +enum sys_net_error : s32 { SYS_NET_ENOENT = 2, SYS_NET_EINTR = 4, @@ -52,6 +52,11 @@ enum SYS_NET_EHOSTUNREACH = 65, }; +static constexpr sys_net_error operator-(sys_net_error v) +{ + return sys_net_error{-+v}; +} + // Socket types (prefixed with SYS_NET_) enum { @@ -362,30 +367,30 @@ class ppu_thread; // Syscalls -s32 sys_net_bnet_accept(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); -s32 sys_net_bnet_bind(ppu_thread&, s32 s, vm::cptr addr, u32 addrlen); -s32 sys_net_bnet_connect(ppu_thread&, s32 s, vm::ptr addr, u32 addrlen); -s32 sys_net_bnet_getpeername(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); -s32 sys_net_bnet_getsockname(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); -s32 sys_net_bnet_getsockopt(ppu_thread&, s32 s, s32 level, s32 optname, vm::ptr optval, vm::ptr optlen); -s32 sys_net_bnet_listen(ppu_thread&, s32 s, s32 backlog); -s32 sys_net_bnet_recvfrom(ppu_thread&, s32 s, vm::ptr buf, u32 len, s32 flags, vm::ptr addr, vm::ptr paddrlen); -s32 sys_net_bnet_recvmsg(ppu_thread&, s32 s, vm::ptr msg, s32 flags); -s32 sys_net_bnet_sendmsg(ppu_thread&, s32 s, vm::cptr msg, s32 flags); -s32 sys_net_bnet_sendto(ppu_thread&, s32 s, vm::cptr buf, u32 len, s32 flags, vm::cptr addr, u32 addrlen); -s32 sys_net_bnet_setsockopt(ppu_thread&, s32 s, s32 level, s32 optname, vm::cptr optval, u32 optlen); -s32 sys_net_bnet_shutdown(ppu_thread&, s32 s, s32 how); -s32 sys_net_bnet_socket(ppu_thread&, s32 family, s32 type, s32 protocol); -s32 sys_net_bnet_close(ppu_thread&, s32 s); -s32 sys_net_bnet_poll(ppu_thread&, vm::ptr fds, s32 nfds, s32 ms); -s32 sys_net_bnet_select(ppu_thread&, s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr timeout); -s32 _sys_net_open_dump(ppu_thread&, s32 len, s32 flags); -s32 _sys_net_read_dump(ppu_thread&, s32 id, vm::ptr buf, s32 len, vm::ptr pflags); -s32 _sys_net_close_dump(ppu_thread&, s32 id, vm::ptr pflags); -s32 _sys_net_write_dump(ppu_thread&, s32 id, vm::cptr buf, s32 len, u32 unknown); -s32 sys_net_abort(ppu_thread&, s32 type, u64 arg, s32 flags); -s32 sys_net_infoctl(ppu_thread&, s32 cmd, vm::ptr arg); -s32 sys_net_control(ppu_thread&, u32 arg1, s32 arg2, vm::ptr arg3, s32 arg4); -s32 sys_net_bnet_ioctl(ppu_thread&, s32 arg1, u32 arg2, u32 arg3); -s32 sys_net_bnet_sysctl(ppu_thread&, u32 arg1, u32 arg2, u32 arg3, vm::ptr arg4, u32 arg5, u32 arg6); -s32 sys_net_eurus_post_command(ppu_thread&, s32 arg1, u32 arg2, u32 arg3); +error_code sys_net_bnet_accept(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); +error_code sys_net_bnet_bind(ppu_thread&, s32 s, vm::cptr addr, u32 addrlen); +error_code sys_net_bnet_connect(ppu_thread&, s32 s, vm::ptr addr, u32 addrlen); +error_code sys_net_bnet_getpeername(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); +error_code sys_net_bnet_getsockname(ppu_thread&, s32 s, vm::ptr addr, vm::ptr paddrlen); +error_code sys_net_bnet_getsockopt(ppu_thread&, s32 s, s32 level, s32 optname, vm::ptr optval, vm::ptr optlen); +error_code sys_net_bnet_listen(ppu_thread&, s32 s, s32 backlog); +error_code sys_net_bnet_recvfrom(ppu_thread&, s32 s, vm::ptr buf, u32 len, s32 flags, vm::ptr addr, vm::ptr paddrlen); +error_code sys_net_bnet_recvmsg(ppu_thread&, s32 s, vm::ptr msg, s32 flags); +error_code sys_net_bnet_sendmsg(ppu_thread&, s32 s, vm::cptr msg, s32 flags); +error_code sys_net_bnet_sendto(ppu_thread&, s32 s, vm::cptr buf, u32 len, s32 flags, vm::cptr addr, u32 addrlen); +error_code sys_net_bnet_setsockopt(ppu_thread&, s32 s, s32 level, s32 optname, vm::cptr optval, u32 optlen); +error_code sys_net_bnet_shutdown(ppu_thread&, s32 s, s32 how); +error_code sys_net_bnet_socket(ppu_thread&, s32 family, s32 type, s32 protocol); +error_code sys_net_bnet_close(ppu_thread&, s32 s); +error_code sys_net_bnet_poll(ppu_thread&, vm::ptr fds, s32 nfds, s32 ms); +error_code sys_net_bnet_select(ppu_thread&, s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr timeout); +error_code _sys_net_open_dump(ppu_thread&, s32 len, s32 flags); +error_code _sys_net_read_dump(ppu_thread&, s32 id, vm::ptr buf, s32 len, vm::ptr pflags); +error_code _sys_net_close_dump(ppu_thread&, s32 id, vm::ptr pflags); +error_code _sys_net_write_dump(ppu_thread&, s32 id, vm::cptr buf, s32 len, u32 unknown); +error_code sys_net_abort(ppu_thread&, s32 type, u64 arg, s32 flags); +error_code sys_net_infoctl(ppu_thread&, s32 cmd, vm::ptr arg); +error_code sys_net_control(ppu_thread&, u32 arg1, s32 arg2, vm::ptr arg3, s32 arg4); +error_code sys_net_bnet_ioctl(ppu_thread&, s32 arg1, u32 arg2, u32 arg3); +error_code sys_net_bnet_sysctl(ppu_thread&, u32 arg1, u32 arg2, u32 arg3, vm::ptr arg4, u32 arg5, u32 arg6); +error_code sys_net_eurus_post_command(ppu_thread&, s32 arg1, u32 arg2, u32 arg3);