intial sceNetSetsockopt

This commit is contained in:
georgemoralis 2025-01-05 16:57:44 +02:00
parent 5b5044d2b6
commit ba78b25365
5 changed files with 65 additions and 2 deletions

View File

@ -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

View File

@ -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<NetInternal>::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() {

View File

@ -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;

View File

@ -0,0 +1,33 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <common/assert.h>
#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

View File

@ -32,20 +32,30 @@ typedef std::shared_ptr<Socket> 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;