bind now seems to work

This commit is contained in:
georgemoralis 2024-12-28 23:22:23 +02:00
parent 13273c138d
commit 9befb9b189
3 changed files with 36 additions and 12 deletions

View File

@ -28,7 +28,7 @@
#include <Rpc.h>
#endif
#include <common/singleton.h>
#include "net.h"
#include "posix_net.h"
namespace Libraries::Kernel {

View File

@ -3,14 +3,15 @@
#include <common/singleton.h>
#include <core/libraries/libs.h>
#include "net.h"
#include "posix_net.h"
namespace Libraries::Kernel {
int PS4_SYSV_ABI posix_socket(int domain, int type, int protocol) {
auto* netcall = Common::Singleton<NetPosixInternal>::Instance();
return netcall->net_socket(domain, type, protocol);
int socket = netcall->net_socket(domain, type, protocol);
return socket;
}
int PS4_SYSV_ABI posix_connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen) {
int PS4_SYSV_ABI posix_connect(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen) {
return 0;
}
u32 PS4_SYSV_ABI posix_htonl(u32 hostlong) {
@ -19,7 +20,7 @@ u32 PS4_SYSV_ABI posix_htonl(u32 hostlong) {
u16 PS4_SYSV_ABI posix_htons(u16 hostshort) {
return ::htons(hostshort);
}
int PS4_SYSV_ABI posix_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen) {
int PS4_SYSV_ABI posix_bind(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen) {
auto* netcall = Common::Singleton<NetPosixInternal>::Instance();
int bind = netcall->net_bind(sockfd, addr, addrlen);
// todo check for errors
@ -28,7 +29,7 @@ int PS4_SYSV_ABI posix_bind(int sockfd, const struct sockaddr* addr, socklen_t a
int PS4_SYSV_ABI posix_listen(int sockfd, int backlog) {
return 0;
}
int PS4_SYSV_ABI posix_accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen) {
int PS4_SYSV_ABI posix_accept(int sockfd, struct OrbisNetSockaddr* addr, socklen_t* addrlen) {
return 0;
}
@ -49,12 +50,26 @@ int NetPosixInternal::net_socket(int domain, int type, int protocol) {
socks.emplace(id, sock);
return id;
}
int NetPosixInternal::net_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen) {
static void convertOrbisNetSockaddrToPosix(const OrbisNetSockaddr* src, sockaddr* dst) {
if (src == nullptr || dst == nullptr)
return;
memset(dst, 0, sizeof(sockaddr));
const OrbisNetSockaddr* src_in = (const OrbisNetSockaddr*)src;
sockaddr_in* dst_in = (sockaddr_in*)dst;
dst_in->sin_family = src_in->sa_family;
dst_in->sin_port = src_in->sin_port;
memcpy(&dst_in->sin_addr, &src_in->sin_addr, 4);
}
int NetPosixInternal::net_bind(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen) {
std::scoped_lock lock{m_mutex};
const auto it = socks.find(sockfd);
if (it != socks.end()) {
s_socket sock = it->second;
return ::bind(sock, addr, sizeof(sockaddr_in));
sockaddr addr2;
convertOrbisNetSockaddrToPosix(addr, &addr2);
return ::bind(sock, &addr2, sizeof(sockaddr_in));
}
return 0; // TODO logging and error return
}

View File

@ -30,13 +30,22 @@ class SymbolsResolver;
}
namespace Libraries::Kernel {
struct OrbisNetSockaddr {
u8 sa_len;
u8 sa_family;
u16 sin_port;
u32 sin_addr;
u16 sin_vport;
char sin_zero[6];
};
int PS4_SYSV_ABI posix_socket(int domain, int type, int protocol);
int PS4_SYSV_ABI posix_connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
int PS4_SYSV_ABI posix_connect(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen);
u32 PS4_SYSV_ABI posix_htonl(u32 hostlong);
u16 PS4_SYSV_ABI posix_htons(u16 hostshort);
int PS4_SYSV_ABI posix_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
int PS4_SYSV_ABI posix_bind(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen);
int PS4_SYSV_ABI posix_listen(int sockfd, int backlog);
int PS4_SYSV_ABI posix_accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
int PS4_SYSV_ABI posix_accept(int sockfd, struct OrbisNetSockaddr* addr, socklen_t* addrlen);
void RegisterNet(Core::Loader::SymbolsResolver* sym);
@ -45,7 +54,7 @@ public:
explicit NetPosixInternal() = default;
~NetPosixInternal() = default;
int net_socket(int domain, int type, int protocol);
int net_bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
int net_bind(int sockfd, const struct OrbisNetSockaddr* addr, socklen_t addrlen);
public:
s_socket sock;