some net calls implementation

This commit is contained in:
georgemoralis 2025-04-27 19:06:30 +03:00
parent 1ef71f3588
commit 289c2943f0
3 changed files with 122 additions and 26 deletions

View File

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

View File

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

View File

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