mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-05 00:42:48 +00:00
intial sceNetSetsockopt
This commit is contained in:
parent
5b5044d2b6
commit
ba78b25365
@ -312,6 +312,7 @@ set(NETWORK_LIBS src/core/libraries/network/http.cpp
|
|||||||
src/core/libraries/network/ssl2.h
|
src/core/libraries/network/ssl2.h
|
||||||
src/core/libraries/network/posix_sockets.cpp
|
src/core/libraries/network/posix_sockets.cpp
|
||||||
src/core/libraries/network/sockets.h
|
src/core/libraries/network/sockets.h
|
||||||
|
src/core/libraries/network/net_error.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp
|
set(AVPLAYER_LIB src/core/libraries/avplayer/avplayer_common.cpp
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "core/libraries/error_codes.h"
|
#include "core/libraries/error_codes.h"
|
||||||
#include "core/libraries/libs.h"
|
#include "core/libraries/libs.h"
|
||||||
#include "core/libraries/network/net.h"
|
#include "core/libraries/network/net.h"
|
||||||
|
#include "net_error.h"
|
||||||
#include "sockets.h"
|
#include "sockets.h"
|
||||||
|
|
||||||
namespace Libraries::Net {
|
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,
|
int PS4_SYSV_ABI sceNetSetsockopt(OrbisNetId s, int level, int optname, const void* optval,
|
||||||
u32 optlen) {
|
u32 optlen) {
|
||||||
LOG_ERROR(Lib_Net, "s = {} level = {} optname = {} optlen = {}", s, level, optname, 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() {
|
int PS4_SYSV_ABI sceNetShowIfconfig() {
|
||||||
|
11
src/core/libraries/network/net_error.h
Normal file
11
src/core/libraries/network/net_error.h
Normal 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;
|
@ -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
|
@ -32,20 +32,30 @@ typedef std::shared_ptr<Socket> SocketPtr;
|
|||||||
|
|
||||||
struct Socket {
|
struct Socket {
|
||||||
explicit Socket(int domain, int type, int protocol) {}
|
explicit Socket(int domain, int type, int protocol) {}
|
||||||
|
|
||||||
virtual ~Socket() = default;
|
virtual ~Socket() = default;
|
||||||
|
virtual int SetSocketOptions(int level, int optname, const void* optval,
|
||||||
|
unsigned int optlen) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PosixSocket : public Socket {
|
struct PosixSocket : public Socket {
|
||||||
net_socket sock;
|
net_socket sock;
|
||||||
explicit PosixSocket(int domain, int type, int protocol)
|
explicit PosixSocket(int domain, int type, int protocol)
|
||||||
: Socket(domain, type, protocol), sock(socket(domain, type, 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 {
|
class NetInternal {
|
||||||
public:
|
public:
|
||||||
explicit NetInternal() = default;
|
explicit NetInternal() = default;
|
||||||
~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:
|
public:
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
|
Loading…
Reference in New Issue
Block a user