mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-30 22:14:56 +00:00
some net calls implementation
This commit is contained in:
parent
1ef71f3588
commit
289c2943f0
@ -20,6 +20,14 @@ class SymbolsResolver;
|
||||
|
||||
namespace Libraries::Net {
|
||||
|
||||
enum OrbisNetSocketType : u32 {
|
||||
ORBIS_NET_SOCK_STREAM = 1,
|
||||
ORBIS_NET_SOCK_DGRAM = 2,
|
||||
ORBIS_NET_SOCK_RAW = 3,
|
||||
ORBIS_NET_SOCK_DGRAM_P2P = 6,
|
||||
ORBIS_NET_SOCK_STREAM_P2P = 10
|
||||
};
|
||||
|
||||
using OrbisNetId = s32;
|
||||
|
||||
struct OrbisNetSockaddr {
|
||||
|
@ -28,31 +28,31 @@ static int ConvertReturnErrorCode(int retval) {
|
||||
#ifndef _WIN32 // These errorcodes don't exist in WinSock
|
||||
ERROR_CASE(EPERM)
|
||||
ERROR_CASE(ENOENT)
|
||||
ERROR_CASE(ESRCH)
|
||||
ERROR_CASE(EIO)
|
||||
ERROR_CASE(ENXIO)
|
||||
ERROR_CASE(E2BIG)
|
||||
ERROR_CASE(ENOEXEC)
|
||||
ERROR_CASE(EDEADLK)
|
||||
//ERROR_CASE(ESRCH)
|
||||
//ERROR_CASE(EIO)
|
||||
//ERROR_CASE(ENXIO)
|
||||
//ERROR_CASE(E2BIG)
|
||||
//ERROR_CASE(ENOEXEC)
|
||||
//ERROR_CASE(EDEADLK)
|
||||
ERROR_CASE(ENOMEM)
|
||||
ERROR_CASE(ECHILD)
|
||||
ERROR_CASE(EBUSY)
|
||||
//ERROR_CASE(ECHILD)
|
||||
//ERROR_CASE(EBUSY)
|
||||
ERROR_CASE(EEXIST)
|
||||
ERROR_CASE(EXDEV)
|
||||
//ERROR_CASE(EXDEV)
|
||||
ERROR_CASE(ENODEV)
|
||||
ERROR_CASE(ENOTDIR)
|
||||
ERROR_CASE(EISDIR)
|
||||
//ERROR_CASE(ENOTDIR)
|
||||
//ERROR_CASE(EISDIR)
|
||||
ERROR_CASE(ENFILE)
|
||||
ERROR_CASE(ENOTTY)
|
||||
ERROR_CASE(ETXTBSY)
|
||||
ERROR_CASE(EFBIG)
|
||||
//ERROR_CASE(ENOTTY)
|
||||
//ERROR_CASE(ETXTBSY)
|
||||
//ERROR_CASE(EFBIG)
|
||||
ERROR_CASE(ENOSPC)
|
||||
ERROR_CASE(ESPIPE)
|
||||
ERROR_CASE(EROFS)
|
||||
ERROR_CASE(EMLINK)
|
||||
//ERROR_CASE(ESPIPE)
|
||||
//ERROR_CASE(EROFS)
|
||||
//ERROR_CASE(EMLINK)
|
||||
ERROR_CASE(EPIPE)
|
||||
ERROR_CASE(EDOM)
|
||||
ERROR_CASE(ERANGE)
|
||||
//ERROR_CASE(EDOM)
|
||||
//ERROR_CASE(ERANGE)
|
||||
ERROR_CASE(ENOLCK)
|
||||
ERROR_CASE(ENOSYS)
|
||||
ERROR_CASE(EIDRM)
|
||||
|
@ -1,17 +1,46 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <common/assert.h>
|
||||
#include <common/logging/log.h>
|
||||
#include <core/libraries/kernel/kernel.h>
|
||||
#include "common/singleton.h"
|
||||
#include "net_error.h"
|
||||
#include "sockets.h"
|
||||
#include "sys_net.h"
|
||||
|
||||
namespace Libraries::Net {
|
||||
|
||||
int PS4_SYSV_ABI sys_connect(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto sock = netcall->FindSocket(s);
|
||||
if (!sock) {
|
||||
*Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF;
|
||||
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
|
||||
return -1;
|
||||
}
|
||||
int returncode = sock->Connect(addr, addrlen);
|
||||
if (returncode >= 0) {
|
||||
return returncode;
|
||||
}
|
||||
*Libraries::Kernel::__Error() = returncode;
|
||||
LOG_ERROR(Lib_Net, "error code returned : {:#x}", returncode);
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_bind(OrbisNetId s, const OrbisNetSockaddr* addr, u32 addrlen) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto sock = netcall->FindSocket(s);
|
||||
if (!sock) {
|
||||
*Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF;
|
||||
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
|
||||
return -1;
|
||||
}
|
||||
int returncode = sock->Bind(addr, addrlen);
|
||||
if (returncode >= 0) {
|
||||
return returncode;
|
||||
}
|
||||
*Libraries::Kernel::__Error() = returncode;
|
||||
LOG_ERROR(Lib_Net, "error code returned : {:#x}", returncode);
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_accept(OrbisNetId s, const OrbisNetSockaddr* addr, u32* paddrlen) {
|
||||
@ -31,7 +60,19 @@ int PS4_SYSV_ABI sys_getsockopt(OrbisNetId s, int level, int optname, void* optv
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_listen(OrbisNetId s, int backlog) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto sock = netcall->FindSocket(s);
|
||||
if (!sock) {
|
||||
*Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF;
|
||||
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
|
||||
return -1;
|
||||
}
|
||||
int returncode = sock->Listen(backlog);
|
||||
if (returncode >= 0) {
|
||||
return returncode;
|
||||
}
|
||||
*Libraries::Kernel::__Error() = returncode;
|
||||
LOG_ERROR(Lib_Net, "error code returned : {:#x}", returncode);
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_setsockopt(OrbisNetId s, int level, int optname, const void* optval,
|
||||
@ -43,8 +84,31 @@ int PS4_SYSV_ABI sys_shutdown(OrbisNetId s, int how) {
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_socketex(const char* name, int family, int type, int protocol) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
return -1;
|
||||
if (name == nullptr) {
|
||||
LOG_INFO(Lib_Net, "name = no-named family = {} type = {} protocol = {}", family, type,
|
||||
protocol);
|
||||
} else {
|
||||
LOG_INFO(Lib_Net, "name = {} family = {} type = {} protocol = {}", std::string(name),
|
||||
family, type, protocol);
|
||||
}
|
||||
SocketPtr sock;
|
||||
switch (type) {
|
||||
case ORBIS_NET_SOCK_STREAM:
|
||||
case ORBIS_NET_SOCK_DGRAM:
|
||||
case ORBIS_NET_SOCK_RAW:
|
||||
sock = std::make_shared<PosixSocket>(family, type, protocol);
|
||||
break;
|
||||
case ORBIS_NET_SOCK_DGRAM_P2P:
|
||||
case ORBIS_NET_SOCK_STREAM_P2P:
|
||||
sock = std::make_shared<P2PSocket>(family, type, protocol);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE_MSG("Unknown type {}", type);
|
||||
}
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto id = ++netcall->next_sock_id;
|
||||
netcall->socks.emplace(id, sock);
|
||||
return id;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_netabort(OrbisNetId s, int flags) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
@ -56,7 +120,19 @@ int PS4_SYSV_ABI sys_socketclose(OrbisNetId s) {
|
||||
}
|
||||
int PS4_SYSV_ABI sys_sendto(OrbisNetId s, const void* buf, u64 len, int flags,
|
||||
const OrbisNetSockaddr* addr, u32 addrlen) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto sock = netcall->FindSocket(s);
|
||||
if (!sock) {
|
||||
*Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF;
|
||||
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
|
||||
return -1;
|
||||
}
|
||||
int returncode = sock->SendPacket(buf, len, flags, addr, addrlen);
|
||||
if (returncode >= 0) {
|
||||
return returncode;
|
||||
}
|
||||
*Libraries::Kernel::__Error() = returncode;
|
||||
LOG_ERROR(Lib_Net, "error code returned : {:#x}", returncode);
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_sendmsg(OrbisNetId s, const OrbisNetMsghdr* msg, int flags) {
|
||||
@ -65,7 +141,19 @@ int PS4_SYSV_ABI sys_sendmsg(OrbisNetId s, const OrbisNetMsghdr* msg, int flags)
|
||||
}
|
||||
int PS4_SYSV_ABI sys_recvfrom(OrbisNetId s, void* buf, u64 len, int flags, OrbisNetSockaddr* addr,
|
||||
u32* paddrlen) {
|
||||
LOG_ERROR(Lib_Net, "(STUBBED) called");
|
||||
auto* netcall = Common::Singleton<NetInternal>::Instance();
|
||||
auto sock = netcall->FindSocket(s);
|
||||
if (!sock) {
|
||||
*Libraries::Kernel::__Error() = ORBIS_NET_ERROR_EBADF;
|
||||
LOG_ERROR(Lib_Net, "socket id is invalid = {}", s);
|
||||
return -1;
|
||||
}
|
||||
int returncode = sock->ReceivePacket(buf, len, flags, addr, paddrlen);
|
||||
if (returncode >= 0) {
|
||||
return returncode;
|
||||
}
|
||||
*Libraries::Kernel::__Error() = returncode;
|
||||
LOG_ERROR(Lib_Net, "error code returned : {:#x}", returncode);
|
||||
return -1;
|
||||
}
|
||||
int PS4_SYSV_ABI sys_recvmsg(OrbisNetId s, OrbisNetMsghdr* msg, int flags) {
|
||||
|
Loading…
Reference in New Issue
Block a user