From ba78b2536539b91d97435dfcbc18a82d9e55fcf1 Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Sun, 5 Jan 2025 16:57:44 +0200 Subject: [PATCH] intial sceNetSetsockopt --- CMakeLists.txt | 1 + src/core/libraries/network/net.cpp | 10 +++++- src/core/libraries/network/net_error.h | 11 +++++++ src/core/libraries/network/posix_sockets.cpp | 33 ++++++++++++++++++++ src/core/libraries/network/sockets.h | 12 ++++++- 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/core/libraries/network/net_error.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 191bc6cfc..47546d423 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp src/core/libraries/network/ssl2.h src/core/libraries/network/posix_sockets.cpp src/core/libraries/network/sockets.h + src/core/libraries/network/net_error.h ) set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp diff --git a/src/core/libraries/network/net.cpp b/src/core/libraries/network/net.cpp index 3137268c0..a83f6ef8a 100644 --- a/src/core/libraries/network/net.cpp +++ b/src/core/libraries/network/net.cpp @@ -16,6 +16,7 @@ #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" #include "core/libraries/network/net.h" +#include "net_error.h" #include "sockets.h" namespace Libraries::Net { @@ -959,7 +960,14 @@ int PS4_SYSV_ABI sceNetSetDnsInfoToKernel() { int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval, u32 optlen) { LOG_ERROR(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, optlen); - return ORBIS_OK; + auto* netcall = Common::Singleton::Instance(); + auto sock = netcall->FindSocket(s); + if (!sock) { + net_errno = ORBIS_NET_EBADF; + LOG_ERROR(Lib_Net, "socket id is invalid = {}", s); + return ORBIS_NET_ERROR_EBADF; + } + return sock->SetSocketOptions(level, optname, optval, optlen); } int PS4_SYSV_ABI sceNetShowIfconfig() { diff --git a/src/core/libraries/network/net_error.h b/src/core/libraries/network/net_error.h new file mode 100644 index 000000000..740590472 --- /dev/null +++ b/src/core/libraries/network/net_error.h @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +// net errno codes + +constexpr int ORBIS_NET_EBADF = 9; + +// error codes +constexpr int ORBIS_NET_ERROR_EBADF = 0x80410109; diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index e69de29bb..36a6aba5c 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include "net.h" +#include "sockets.h" + +namespace Libraries::Net { + +static int ConvertLevels(int level) { + switch (level) { + case ORBIS_NET_SOL_SOCKET: + return SOL_SOCKET; + case ORBIS_NET_IPPROTO_IP: + return IPPROTO_IP; + case ORBIS_NET_IPPROTO_TCP: + return IPPROTO_TCP; + } + return -1; +} + +int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) { + level = ConvertLevels(level); + if (level == SOL_SOCKET) { + switch (optname) { + case ORBIS_NET_SO_REUSEADDR: + return setsockopt(sock, level, SO_REUSEADDR, (const char*)optval, optlen); + } + } + UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); + return 0; +} +} // namespace Libraries::Net \ No newline at end of file diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index 6ef2da3e7..1369451a8 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -32,20 +32,30 @@ typedef std::shared_ptr SocketPtr; struct Socket { explicit Socket(int domain, int type, int protocol) {} - virtual ~Socket() = default; + virtual int SetSocketOptions(int level, int optname, const void* optval, + unsigned int optlen) = 0; }; struct PosixSocket : public Socket { net_socket sock; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} + int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override; }; class NetInternal { public: explicit NetInternal() = default; ~NetInternal() = default; + SocketPtr FindSocket(int sockid) { + std::scoped_lock lock{m_mutex}; + const auto it = socks.find(sockid); + if (it != socks.end()) { + return it->second; + } + return nullptr; + } public: std::mutex m_mutex;